From 57520f0ba3071cc117aa9fb28f249865cd89a3bf Mon Sep 17 00:00:00 2001 From: Jonathan Thomas Date: Fri, 15 Jun 2012 17:46:13 -0500 Subject: [PATCH] Removed juce files to their own library --- .bzrignore | 2 - .cproject | 9 +- .project | 5 +- .pydevproject | 7 - README | 42 +- cmake/Modules/FindJuce.cmake | 24 +- include/AudioBufferSource.h | 2 +- src/juce/JuceLibraryCode/AppConfig.h | 158 - src/juce/JuceLibraryCode/JuceHeader.h | 41 - src/juce/JuceLibraryCode/ReadMe.txt | 12 - .../buffers/juce_AudioDataConverters.cpp | 601 - .../buffers/juce_AudioDataConverters.h | 644 - .../buffers/juce_AudioSampleBuffer.cpp | 551 - .../buffers/juce_AudioSampleBuffer.h | 430 - .../juce_audio_basics/effects/juce_Decibels.h | 104 - .../effects/juce_IIRFilter.cpp | 252 - .../effects/juce_IIRFilter.h | 149 - .../juce_audio_basics/effects/juce_Reverb.h | 325 - .../juce_audio_basics/juce_audio_basics.cpp | 63 - .../juce_audio_basics/juce_audio_basics.h | 100 - .../juce_audio_basics/juce_audio_basics.mm | 26 - .../juce_audio_basics/juce_module_info | 21 - .../midi/juce_MidiBuffer.cpp | 290 - .../juce_audio_basics/midi/juce_MidiBuffer.h | 236 - .../juce_audio_basics/midi/juce_MidiFile.cpp | 427 - .../juce_audio_basics/midi/juce_MidiFile.h | 187 - .../midi/juce_MidiKeyboardState.cpp | 184 - .../midi/juce_MidiKeyboardState.h | 209 - .../midi/juce_MidiMessage.cpp | 1048 - .../juce_audio_basics/midi/juce_MidiMessage.h | 940 - .../midi/juce_MidiMessageSequence.cpp | 327 - .../midi/juce_MidiMessageSequence.h | 276 - .../sources/juce_AudioSource.h | 159 - .../sources/juce_BufferingAudioSource.cpp | 269 - .../sources/juce_BufferingAudioSource.h | 115 - .../juce_ChannelRemappingAudioSource.cpp | 190 - .../juce_ChannelRemappingAudioSource.h | 149 - .../sources/juce_IIRFilterAudioSource.cpp | 72 - .../sources/juce_IIRFilterAudioSource.h | 71 - .../sources/juce_MixerAudioSource.cpp | 161 - .../sources/juce_MixerAudioSource.h | 104 - .../sources/juce_PositionableAudioSource.h | 81 - .../sources/juce_ResamplingAudioSource.cpp | 258 - .../sources/juce_ResamplingAudioSource.h | 106 - .../sources/juce_ReverbAudioSource.cpp | 81 - .../sources/juce_ReverbAudioSource.h | 80 - .../sources/juce_ToneGeneratorAudioSource.cpp | 77 - .../sources/juce_ToneGeneratorAudioSource.h | 76 - .../synthesisers/juce_Synthesiser.cpp | 433 - .../synthesisers/juce_Synthesiser.h | 494 - .../audio_cd/juce_AudioCDBurner.h | 170 - .../audio_cd/juce_AudioCDReader.cpp | 58 - .../audio_cd/juce_AudioCDReader.h | 175 - .../audio_io/juce_AudioDeviceManager.cpp | 944 - .../audio_io/juce_AudioDeviceManager.h | 517 - .../audio_io/juce_AudioIODevice.cpp | 49 - .../audio_io/juce_AudioIODevice.h | 333 - .../audio_io/juce_AudioIODeviceType.cpp | 79 - .../audio_io/juce_AudioIODeviceType.h | 186 - .../juce_audio_devices/juce_audio_devices.cpp | 238 - .../juce_audio_devices/juce_audio_devices.h | 139 - .../juce_audio_devices/juce_audio_devices.mm | 26 - .../juce_audio_devices/juce_module_info | 26 - .../midi_io/juce_MidiInput.h | 183 - .../midi_io/juce_MidiMessageCollector.cpp | 153 - .../midi_io/juce_MidiMessageCollector.h | 105 - .../midi_io/juce_MidiOutput.cpp | 163 - .../midi_io/juce_MidiOutput.h | 148 - .../native/juce_MidiDataConcatenator.h | 142 - .../native/juce_android_Audio.cpp | 444 - .../native/juce_android_Midi.cpp | 85 - .../native/juce_android_OpenSL.cpp | 633 - .../native/juce_ios_Audio.cpp | 541 - .../native/juce_linux_ALSA.cpp | 1012 - .../native/juce_linux_AudioCDReader.cpp | 78 - .../native/juce_linux_JackAudio.cpp | 587 - .../native/juce_linux_Midi.cpp | 460 - .../native/juce_mac_AudioCDBurner.mm | 561 - .../native/juce_mac_AudioCDReader.mm | 262 - .../native/juce_mac_CoreAudio.cpp | 1270 -- .../native/juce_mac_CoreMidi.cpp | 541 - .../native/juce_win32_ASIO.cpp | 1631 -- .../native/juce_win32_AudioCDBurner.cpp | 415 - .../native/juce_win32_AudioCDReader.cpp | 1310 -- .../native/juce_win32_DirectSound.cpp | 1369 -- .../native/juce_win32_Midi.cpp | 495 - .../native/juce_win32_WASAPI.cpp | 1170 -- .../sources/juce_AudioSourcePlayer.cpp | 182 - .../sources/juce_AudioSourcePlayer.h | 114 - .../sources/juce_AudioTransportSource.cpp | 302 - .../sources/juce_AudioTransportSource.h | 187 - .../codecs/flac/Flac Licence.txt | 49 - .../juce_audio_formats/codecs/flac/all.h | 402 - .../juce_audio_formats/codecs/flac/alloc.h | 212 - .../juce_audio_formats/codecs/flac/assert.h | 45 - .../juce_audio_formats/codecs/flac/callback.h | 184 - .../juce_audio_formats/codecs/flac/export.h | 91 - .../juce_audio_formats/codecs/flac/format.h | 1010 - .../codecs/flac/libFLAC/bitmath.c | 149 - .../codecs/flac/libFLAC/bitreader.c | 1350 -- .../codecs/flac/libFLAC/bitwriter.c | 880 - .../codecs/flac/libFLAC/cpu.c | 418 - .../codecs/flac/libFLAC/crc.c | 142 - .../codecs/flac/libFLAC/fixed.c | 435 - .../codecs/flac/libFLAC/float.c | 308 - .../codecs/flac/libFLAC/format.c | 598 - .../codecs/flac/libFLAC/include/private/all.h | 49 - .../flac/libFLAC/include/private/bitmath.h | 42 - .../flac/libFLAC/include/private/bitreader.h | 99 - .../flac/libFLAC/include/private/bitwriter.h | 103 - .../codecs/flac/libFLAC/include/private/cpu.h | 88 - .../codecs/flac/libFLAC/include/private/crc.h | 61 - .../flac/libFLAC/include/private/fixed.h | 97 - .../flac/libFLAC/include/private/float.h | 97 - .../flac/libFLAC/include/private/format.h | 44 - .../codecs/flac/libFLAC/include/private/lpc.h | 214 - .../codecs/flac/libFLAC/include/private/md5.h | 44 - .../flac/libFLAC/include/private/memory.h | 56 - .../flac/libFLAC/include/private/metadata.h | 45 - .../include/private/stream_encoder_framing.h | 45 - .../flac/libFLAC/include/private/window.h | 71 - .../flac/libFLAC/include/protected/all.h | 38 - .../include/protected/stream_decoder.h | 58 - .../include/protected/stream_encoder.h | 110 - .../codecs/flac/libFLAC/lpc_flac.c | 1377 -- .../codecs/flac/libFLAC/md5.c | 425 - .../codecs/flac/libFLAC/memory.c | 206 - .../codecs/flac/libFLAC/stream_decoder.c | 3386 ---- .../codecs/flac/libFLAC/stream_encoder.c | 4364 ----- .../flac/libFLAC/stream_encoder_framing.c | 553 - .../codecs/flac/libFLAC/window_flac.c | 225 - .../juce_audio_formats/codecs/flac/metadata.h | 2181 --- .../juce_audio_formats/codecs/flac/ordinals.h | 80 - .../codecs/flac/stream_decoder.h | 1559 -- .../codecs/flac/stream_encoder.h | 1768 -- .../codecs/juce_AiffAudioFormat.cpp | 719 - .../codecs/juce_AiffAudioFormat.h | 66 - .../codecs/juce_CoreAudioFormat.cpp | 261 - .../codecs/juce_CoreAudioFormat.h | 68 - .../codecs/juce_FlacAudioFormat.cpp | 536 - .../codecs/juce_FlacAudioFormat.h | 66 - .../codecs/juce_MP3AudioFormat.cpp | 3148 --- .../codecs/juce_MP3AudioFormat.h | 65 - .../codecs/juce_OggVorbisAudioFormat.cpp | 484 - .../codecs/juce_OggVorbisAudioFormat.h | 86 - .../codecs/juce_QuickTimeAudioFormat.cpp | 388 - .../codecs/juce_QuickTimeAudioFormat.h | 70 - .../codecs/juce_WavAudioFormat.cpp | 1110 -- .../codecs/juce_WavAudioFormat.h | 143 - .../codecs/juce_WindowsMediaAudioFormat.cpp | 352 - .../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 | 1036 - .../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 | 456 - .../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 | 2335 --- .../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 | 49 - .../format/juce_AudioFormat.h | 172 - .../format/juce_AudioFormatManager.cpp | 193 - .../format/juce_AudioFormatManager.h | 140 - .../format/juce_AudioFormatReader.cpp | 388 - .../format/juce_AudioFormatReader.h | 265 - .../format/juce_AudioFormatReaderSource.cpp | 86 - .../format/juce_AudioFormatReaderSource.h | 105 - .../format/juce_AudioFormatWriter.cpp | 297 - .../format/juce_AudioFormatWriter.h | 259 - .../format/juce_AudioSubsectionReader.cpp | 83 - .../format/juce_AudioSubsectionReader.h | 90 - .../juce_audio_formats/juce_audio_formats.cpp | 120 - .../juce_audio_formats/juce_audio_formats.h | 116 - .../juce_audio_formats/juce_audio_formats.mm | 26 - .../juce_audio_formats/juce_module_info | 22 - .../sampler/juce_Sampler.cpp | 236 - .../juce_audio_formats/sampler/juce_Sampler.h | 154 - .../format/juce_AudioPluginFormat.cpp | 27 - .../format/juce_AudioPluginFormat.h | 115 - .../format/juce_AudioPluginFormatManager.cpp | 125 - .../format/juce_AudioPluginFormatManager.h | 102 - .../format_types/juce_AudioUnitPluginFormat.h | 61 - .../juce_AudioUnitPluginFormat.mm | 1465 -- .../format_types/juce_DirectXPluginFormat.h | 62 - .../format_types/juce_LADSPAPluginFormat.h | 62 - .../format_types/juce_VSTMidiEventList.h | 190 - .../format_types/juce_VSTPluginFormat.cpp | 2924 --- .../format_types/juce_VSTPluginFormat.h | 64 - .../juce_audio_processors.cpp | 79 - .../juce_audio_processors.h | 125 - .../juce_audio_processors.mm | 26 - .../juce_audio_processors/juce_module_info | 25 - .../processors/juce_AudioPlayHead.h | 139 - .../processors/juce_AudioPluginInstance.h | 73 - .../processors/juce_AudioProcessor.cpp | 311 - .../processors/juce_AudioProcessor.h | 593 - .../processors/juce_AudioProcessorEditor.cpp | 38 - .../processors/juce_AudioProcessorEditor.h | 67 - .../processors/juce_AudioProcessorGraph.cpp | 1508 -- .../processors/juce_AudioProcessorGraph.h | 427 - .../processors/juce_AudioProcessorListener.h | 108 - .../juce_GenericAudioProcessorEditor.cpp | 162 - .../juce_GenericAudioProcessorEditor.h | 61 - .../processors/juce_PluginDescription.cpp | 128 - .../processors/juce_PluginDescription.h | 143 - .../scanning/juce_KnownPluginList.cpp | 436 - .../scanning/juce_KnownPluginList.h | 164 - .../scanning/juce_PluginDirectoryScanner.cpp | 121 - .../scanning/juce_PluginDirectoryScanner.h | 125 - .../scanning/juce_PluginListComponent.cpp | 297 - .../scanning/juce_PluginListComponent.h | 97 - .../containers/juce_AbstractFifo.cpp | 233 - .../juce_core/containers/juce_AbstractFifo.h | 219 - .../modules/juce_core/containers/juce_Array.h | 1035 - .../containers/juce_ArrayAllocationBase.h | 135 - .../containers/juce_DynamicObject.cpp | 76 - .../juce_core/containers/juce_DynamicObject.h | 122 - .../containers/juce_ElementComparator.h | 276 - .../juce_core/containers/juce_HashMap.h | 447 - .../containers/juce_LinkedListPointer.h | 370 - .../containers/juce_NamedValueSet.cpp | 277 - .../juce_core/containers/juce_NamedValueSet.h | 166 - .../juce_core/containers/juce_OwnedArray.h | 822 - .../juce_core/containers/juce_PropertySet.cpp | 220 - .../juce_core/containers/juce_PropertySet.h | 226 - .../containers/juce_ReferenceCountedArray.h | 857 - .../containers/juce_ScopedValueSetter.h | 97 - .../juce_core/containers/juce_SortedSet.h | 594 - .../juce_core/containers/juce_SparseSet.h | 299 - .../juce_core/containers/juce_Variant.cpp | 647 - .../juce_core/containers/juce_Variant.h | 280 - .../files/juce_DirectoryIterator.cpp | 137 - .../juce_core/files/juce_DirectoryIterator.h | 154 - .../modules/juce_core/files/juce_File.cpp | 1061 -- .../modules/juce_core/files/juce_File.h | 964 - .../juce_core/files/juce_FileInputStream.cpp | 89 - .../juce_core/files/juce_FileInputStream.h | 96 - .../juce_core/files/juce_FileOutputStream.cpp | 133 - .../juce_core/files/juce_FileOutputStream.h | 116 - .../juce_core/files/juce_FileSearchPath.cpp | 168 - .../juce_core/files/juce_FileSearchPath.h | 166 - .../juce_core/files/juce_MemoryMappedFile.h | 89 - .../juce_core/files/juce_TemporaryFile.cpp | 112 - .../juce_core/files/juce_TemporaryFile.h | 160 - .../modules/juce_core/json/juce_JSON.cpp | 634 - .../modules/juce_core/json/juce_JSON.h | 115 - .../modules/juce_core/juce_core.cpp | 196 - .../modules/juce_core/juce_core.h | 428 - .../modules/juce_core/juce_core.mm | 26 - .../modules/juce_core/juce_module_info | 36 - .../juce_core/logging/juce_FileLogger.cpp | 132 - .../juce_core/logging/juce_FileLogger.h | 108 - .../modules/juce_core/logging/juce_Logger.cpp | 63 - .../modules/juce_core/logging/juce_Logger.h | 97 - .../juce_core/maths/juce_BigInteger.cpp | 1018 - .../modules/juce_core/maths/juce_BigInteger.h | 336 - .../juce_core/maths/juce_Expression.cpp | 1178 -- .../modules/juce_core/maths/juce_Expression.h | 271 - .../juce_core/maths/juce_MathsFunctions.h | 507 - .../modules/juce_core/maths/juce_Random.cpp | 173 - .../modules/juce_core/maths/juce_Random.h | 137 - .../modules/juce_core/maths/juce_Range.h | 267 - .../modules/juce_core/memory/juce_Atomic.h | 390 - .../modules/juce_core/memory/juce_ByteOrder.h | 183 - .../modules/juce_core/memory/juce_HeapBlock.h | 294 - .../memory/juce_LeakedObjectDetector.h | 145 - .../modules/juce_core/memory/juce_Memory.h | 96 - .../juce_core/memory/juce_MemoryBlock.cpp | 408 - .../juce_core/memory/juce_MemoryBlock.h | 252 - .../memory/juce_OptionalScopedPointer.h | 147 - .../memory/juce_ReferenceCountedObject.h | 385 - .../juce_core/memory/juce_ScopedPointer.h | 230 - .../modules/juce_core/memory/juce_Singleton.h | 289 - .../juce_core/memory/juce_WeakReference.h | 211 - .../modules/juce_core/misc/juce_Result.cpp | 83 - .../modules/juce_core/misc/juce_Result.h | 121 - .../modules/juce_core/misc/juce_Uuid.cpp | 111 - .../modules/juce_core/misc/juce_Uuid.h | 111 - .../juce_core/misc/juce_WindowsRegistry.h | 118 - .../native/java/ComponentPeerView.java | 124 - .../native/java/JuceAppActivity.java | 498 - .../native/juce_BasicNativeHeaders.h | 213 - .../juce_core/native/juce_android_Files.cpp | 237 - .../native/juce_android_JNIHelpers.h | 402 - .../juce_core/native/juce_android_Misc.cpp | 29 - .../juce_core/native/juce_android_Network.cpp | 173 - .../native/juce_android_SystemStats.cpp | 296 - .../juce_core/native/juce_android_Threads.cpp | 79 - .../juce_core/native/juce_linux_Files.cpp | 345 - .../juce_core/native/juce_linux_Network.cpp | 458 - .../native/juce_linux_SystemStats.cpp | 168 - .../juce_core/native/juce_linux_Threads.cpp | 98 - .../juce_core/native/juce_mac_Files.mm | 475 - .../juce_core/native/juce_mac_Network.mm | 473 - .../juce_core/native/juce_mac_ObjCSuffix.h | 52 - .../juce_core/native/juce_mac_Strings.mm | 91 - .../juce_core/native/juce_mac_SystemStats.mm | 263 - .../juce_core/native/juce_mac_Threads.mm | 81 - .../juce_core/native/juce_osx_ObjCHelpers.h | 58 - .../juce_core/native/juce_posix_NamedPipe.cpp | 209 - .../juce_core/native/juce_posix_SharedCode.h | 1086 -- .../juce_core/native/juce_win32_ComSmartPtr.h | 146 - .../juce_core/native/juce_win32_Files.cpp | 958 - .../juce_core/native/juce_win32_Network.cpp | 486 - .../juce_core/native/juce_win32_Registry.cpp | 208 - .../native/juce_win32_SystemStats.cpp | 372 - .../juce_core/native/juce_win32_Threads.cpp | 581 - .../juce_core/network/juce_MACAddress.cpp | 75 - .../juce_core/network/juce_MACAddress.h | 86 - .../juce_core/network/juce_NamedPipe.cpp | 43 - .../juce_core/network/juce_NamedPipe.h | 111 - .../modules/juce_core/network/juce_Socket.cpp | 580 - .../modules/juce_core/network/juce_Socket.h | 300 - .../modules/juce_core/network/juce_URL.cpp | 471 - .../modules/juce_core/network/juce_URL.h | 347 - .../streams/juce_BufferedInputStream.cpp | 196 - .../streams/juce_BufferedInputStream.h | 93 - .../streams/juce_FileInputSource.cpp | 53 - .../juce_core/streams/juce_FileInputSource.h | 66 - .../juce_core/streams/juce_InputSource.h | 76 - .../juce_core/streams/juce_InputStream.cpp | 233 - .../juce_core/streams/juce_InputStream.h | 295 - .../streams/juce_MemoryInputStream.cpp | 157 - .../streams/juce_MemoryInputStream.h | 91 - .../streams/juce_MemoryOutputStream.cpp | 167 - .../streams/juce_MemoryOutputStream.h | 132 - .../juce_core/streams/juce_OutputStream.cpp | 317 - .../juce_core/streams/juce_OutputStream.h | 261 - .../streams/juce_SubregionStream.cpp | 84 - .../juce_core/streams/juce_SubregionStream.h | 89 - .../juce_core/system/juce_PlatformDefs.h | 320 - .../juce_core/system/juce_StandardHeader.h | 200 - .../juce_core/system/juce_SystemStats.cpp | 61 - .../juce_core/system/juce_SystemStats.h | 178 - .../juce_core/system/juce_TargetPlatform.h | 189 - .../juce_core/text/juce_CharPointer_ASCII.h | 384 - .../juce_core/text/juce_CharPointer_UTF16.h | 498 - .../juce_core/text/juce_CharPointer_UTF32.h | 375 - .../juce_core/text/juce_CharPointer_UTF8.h | 571 - .../text/juce_CharacterFunctions.cpp | 151 - .../juce_core/text/juce_CharacterFunctions.h | 581 - .../juce_core/text/juce_Identifier.cpp | 72 - .../modules/juce_core/text/juce_Identifier.h | 99 - .../juce_core/text/juce_LocalisedStrings.cpp | 188 - .../juce_core/text/juce_LocalisedStrings.h | 214 - .../modules/juce_core/text/juce_NewLine.h | 75 - .../modules/juce_core/text/juce_String.cpp | 2389 --- .../modules/juce_core/text/juce_String.h | 1327 -- .../juce_core/text/juce_StringArray.cpp | 487 - .../modules/juce_core/text/juce_StringArray.h | 348 - .../juce_core/text/juce_StringPairArray.cpp | 139 - .../juce_core/text/juce_StringPairArray.h | 160 - .../juce_core/text/juce_StringPool.cpp | 111 - .../modules/juce_core/text/juce_StringPool.h | 92 - .../juce_core/threads/juce_ChildProcess.cpp | 90 - .../juce_core/threads/juce_ChildProcess.h | 93 - .../juce_core/threads/juce_CriticalSection.h | 254 - .../juce_core/threads/juce_DynamicLibrary.h | 82 - .../juce_core/threads/juce_InterProcessLock.h | 132 - .../modules/juce_core/threads/juce_Process.h | 144 - .../juce_core/threads/juce_ReadWriteLock.cpp | 161 - .../juce_core/threads/juce_ReadWriteLock.h | 138 - .../juce_core/threads/juce_ScopedLock.h | 234 - .../juce_core/threads/juce_ScopedReadLock.h | 89 - .../juce_core/threads/juce_ScopedWriteLock.h | 89 - .../modules/juce_core/threads/juce_SpinLock.h | 90 - .../modules/juce_core/threads/juce_Thread.cpp | 356 - .../modules/juce_core/threads/juce_Thread.h | 289 - .../juce_core/threads/juce_ThreadLocalValue.h | 196 - .../juce_core/threads/juce_ThreadPool.cpp | 377 - .../juce_core/threads/juce_ThreadPool.h | 315 - .../threads/juce_TimeSliceThread.cpp | 169 - .../juce_core/threads/juce_TimeSliceThread.h | 149 - .../juce_core/threads/juce_WaitableEvent.h | 110 - .../time/juce_PerformanceCounter.cpp | 92 - .../juce_core/time/juce_PerformanceCounter.h | 105 - .../juce_core/time/juce_RelativeTime.cpp | 167 - .../juce_core/time/juce_RelativeTime.h | 178 - .../modules/juce_core/time/juce_Time.cpp | 485 - .../modules/juce_core/time/juce_Time.h | 403 - .../juce_core/unit_tests/juce_UnitTest.cpp | 234 - .../juce_core/unit_tests/juce_UnitTest.h | 287 - .../juce_core/xml/juce_XmlDocument.cpp | 852 - .../modules/juce_core/xml/juce_XmlDocument.h | 183 - .../modules/juce_core/xml/juce_XmlElement.cpp | 840 - .../modules/juce_core/xml/juce_XmlElement.h | 729 - .../zip/juce_GZIPCompressorOutputStream.cpp | 209 - .../zip/juce_GZIPCompressorOutputStream.h | 102 - .../zip/juce_GZIPDecompressorInputStream.cpp | 275 - .../zip/juce_GZIPDecompressorInputStream.h | 99 - .../modules/juce_core/zip/juce_ZipFile.cpp | 578 - .../modules/juce_core/zip/juce_ZipFile.h | 246 - .../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 | 1678 -- .../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 - .../juce_ApplicationProperties.cpp | 103 - .../juce_ApplicationProperties.h | 130 - .../app_properties/juce_PropertiesFile.cpp | 339 - .../app_properties/juce_PropertiesFile.h | 237 - .../juce_data_structures.cpp | 52 - .../juce_data_structures.h | 58 - .../juce_data_structures.mm | 26 - .../juce_data_structures/juce_module_info | 20 - .../undomanager/juce_UndoManager.cpp | 273 - .../undomanager/juce_UndoManager.h | 225 - .../undomanager/juce_UndoableAction.h | 100 - .../values/juce_Value.cpp | 228 - .../juce_data_structures/values/juce_Value.h | 233 - .../values/juce_ValueTree.cpp | 1107 -- .../values/juce_ValueTree.h | 511 - .../broadcasters/juce_ActionBroadcaster.cpp | 94 - .../broadcasters/juce_ActionBroadcaster.h | 86 - .../broadcasters/juce_ActionListener.h | 54 - .../broadcasters/juce_AsyncUpdater.cpp | 88 - .../broadcasters/juce_AsyncUpdater.h | 111 - .../broadcasters/juce_ChangeBroadcaster.cpp | 97 - .../broadcasters/juce_ChangeBroadcaster.h | 110 - .../broadcasters/juce_ChangeListener.h | 65 - .../broadcasters/juce_ListenerList.h | 339 - .../juce_InterprocessConnection.cpp | 368 - .../juce_InterprocessConnection.h | 204 - .../juce_InterprocessConnectionServer.cpp | 78 - .../juce_InterprocessConnectionServer.h | 96 - .../modules/juce_events/juce_events.cpp | 107 - .../modules/juce_events/juce_events.h | 92 - .../modules/juce_events/juce_events.mm | 26 - .../modules/juce_events/juce_module_info | 21 - .../messages/juce_ApplicationBase.cpp | 55 - .../messages/juce_ApplicationBase.h | 163 - .../messages/juce_CallbackMessage.h | 76 - .../messages/juce_DeletedAtShutdown.cpp | 80 - .../messages/juce_DeletedAtShutdown.h | 69 - .../juce_events/messages/juce_Message.h | 66 - .../messages/juce_MessageListener.cpp | 51 - .../messages/juce_MessageListener.h | 75 - .../messages/juce_MessageManager.cpp | 339 - .../messages/juce_MessageManager.h | 329 - .../juce_events/native/juce_ScopedXLock.h | 51 - .../native/juce_android_Messaging.cpp | 80 - .../native/juce_ios_MessageManager.mm | 84 - .../native/juce_linux_Messaging.cpp | 396 - .../native/juce_mac_MessageManager.mm | 379 - .../native/juce_osx_MessageQueue.h | 103 - .../native/juce_win32_HiddenMessageWindow.h | 132 - .../native/juce_win32_Messaging.cpp | 192 - .../juce_events/timers/juce_MultiTimer.cpp | 121 - .../juce_events/timers/juce_MultiTimer.h | 130 - .../modules/juce_events/timers/juce_Timer.cpp | 386 - .../modules/juce_events/timers/juce_Timer.h | 135 - .../juce_graphics/colour/juce_Colour.cpp | 405 - .../juce_graphics/colour/juce_Colour.h | 363 - .../colour/juce_ColourGradient.cpp | 221 - .../colour/juce_ColourGradient.h | 185 - .../juce_graphics/colour/juce_Colours.cpp | 321 - .../juce_graphics/colour/juce_Colours.h | 110 - .../juce_graphics/colour/juce_FillType.cpp | 149 - .../juce_graphics/colour/juce_FillType.h | 153 - .../juce_graphics/colour/juce_PixelFormats.h | 592 - .../contexts/juce_GraphicsContext.cpp | 728 - .../contexts/juce_GraphicsContext.h | 706 - .../contexts/juce_LowLevelGraphicsContext.h | 110 - ...uce_LowLevelGraphicsPostScriptRenderer.cpp | 542 - .../juce_LowLevelGraphicsPostScriptRenderer.h | 127 - .../juce_LowLevelGraphicsSoftwareRenderer.cpp | 2237 --- .../juce_LowLevelGraphicsSoftwareRenderer.h | 100 - .../effects/juce_DropShadowEffect.cpp | 107 - .../effects/juce_DropShadowEffect.h | 92 - .../juce_graphics/effects/juce_GlowEffect.cpp | 59 - .../juce_graphics/effects/juce_GlowEffect.h | 77 - .../effects/juce_ImageEffectFilter.h | 68 - .../fonts/juce_AttributedString.cpp | 217 - .../fonts/juce_AttributedString.h | 211 - .../fonts/juce_CustomTypeface.cpp | 408 - .../juce_graphics/fonts/juce_CustomTypeface.h | 143 - .../modules/juce_graphics/fonts/juce_Font.cpp | 583 - .../modules/juce_graphics/fonts/juce_Font.h | 382 - .../fonts/juce_GlyphArrangement.cpp | 801 - .../fonts/juce_GlyphArrangement.h | 315 - .../juce_graphics/fonts/juce_TextLayout.cpp | 618 - .../juce_graphics/fonts/juce_TextLayout.h | 181 - .../juce_graphics/fonts/juce_Typeface.cpp | 50 - .../juce_graphics/fonts/juce_Typeface.h | 136 - .../geometry/juce_AffineTransform.cpp | 247 - .../geometry/juce_AffineTransform.h | 262 - .../juce_graphics/geometry/juce_BorderSize.h | 158 - .../juce_graphics/geometry/juce_EdgeTable.cpp | 741 - .../juce_graphics/geometry/juce_EdgeTable.h | 211 - .../juce_graphics/geometry/juce_Line.h | 406 - .../juce_graphics/geometry/juce_Path.cpp | 1570 -- .../juce_graphics/geometry/juce_Path.h | 766 - .../geometry/juce_PathIterator.cpp | 289 - .../geometry/juce_PathIterator.h | 116 - .../geometry/juce_PathStrokeType.cpp | 741 - .../geometry/juce_PathStrokeType.h | 204 - .../juce_graphics/geometry/juce_Point.h | 185 - .../juce_graphics/geometry/juce_Rectangle.h | 712 - .../geometry/juce_RectangleList.cpp | 515 - .../geometry/juce_RectangleList.h | 256 - .../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 | 421 - .../image_formats/juce_PNGLoader.cpp | 350 - .../image_formats/pnglib/LICENSE | 109 - .../image_formats/pnglib/libpng_readme.txt | 2 - .../juce_graphics/image_formats/pnglib/png.c | 798 - .../juce_graphics/image_formats/pnglib/png.h | 3539 ---- .../image_formats/pnglib/pngconf.h | 1505 -- .../image_formats/pnglib/pngerror.c | 341 - .../image_formats/pnglib/pngget.c | 901 - .../image_formats/pnglib/pngmem.c | 608 - .../image_formats/pnglib/pngpread.c | 1586 -- .../image_formats/pnglib/pngread.c | 1472 -- .../image_formats/pnglib/pngrio.c | 167 - .../image_formats/pnglib/pngrtran.c | 4287 ----- .../image_formats/pnglib/pngrutil.c | 3162 ---- .../image_formats/pnglib/pngset.c | 1243 -- .../image_formats/pnglib/pngtrans.c | 662 - .../image_formats/pnglib/pngwio.c | 234 - .../image_formats/pnglib/pngwrite.c | 1514 -- .../image_formats/pnglib/pngwtran.c | 572 - .../image_formats/pnglib/pngwutil.c | 2792 --- .../juce_graphics/images/juce_Image.cpp | 639 - .../modules/juce_graphics/images/juce_Image.h | 518 - .../juce_graphics/images/juce_ImageCache.cpp | 163 - .../juce_graphics/images/juce_ImageCache.h | 124 - .../images/juce_ImageConvolutionKernel.cpp | 244 - .../images/juce_ImageConvolutionKernel.h | 114 - .../images/juce_ImageFileFormat.cpp | 88 - .../images/juce_ImageFileFormat.h | 209 - .../modules/juce_graphics/juce_graphics.cpp | 131 - .../modules/juce_graphics/juce_graphics.h | 176 - .../modules/juce_graphics/juce_graphics.mm | 26 - .../modules/juce_graphics/juce_module_info | 29 - .../native/juce_RenderingHelpers.h | 433 - .../native/juce_android_Fonts.cpp | 227 - .../native/juce_android_GraphicsContext.cpp | 61 - .../juce_graphics/native/juce_linux_Fonts.cpp | 549 - .../native/juce_mac_CoreGraphicsContext.h | 120 - .../native/juce_mac_CoreGraphicsContext.mm | 871 - .../native/juce_mac_CoreGraphicsHelpers.h | 56 - .../juce_graphics/native/juce_mac_Fonts.mm | 1087 -- .../juce_win32_Direct2DGraphicsContext.cpp | 908 - .../juce_win32_DirectWriteTypeLayout.cpp | 357 - .../native/juce_win32_DirectWriteTypeface.cpp | 253 - .../juce_graphics/native/juce_win32_Fonts.cpp | 427 - .../placement/juce_Justification.cpp | 45 - .../placement/juce_Justification.h | 189 - .../placement/juce_RectanglePlacement.cpp | 128 - .../placement/juce_RectanglePlacement.h | 173 - .../application/juce_Application.cpp | 262 - .../application/juce_Application.h | 246 - .../application/juce_Initialisation.h | 135 - .../buttons/juce_ArrowButton.cpp | 71 - .../buttons/juce_ArrowButton.h | 80 - .../juce_gui_basics/buttons/juce_Button.cpp | 691 - .../juce_gui_basics/buttons/juce_Button.h | 518 - .../buttons/juce_DrawableButton.cpp | 290 - .../buttons/juce_DrawableButton.h | 195 - .../buttons/juce_HyperlinkButton.cpp | 123 - .../buttons/juce_HyperlinkButton.h | 127 - .../buttons/juce_ImageButton.cpp | 243 - .../buttons/juce_ImageButton.h | 164 - .../buttons/juce_ShapeButton.cpp | 118 - .../buttons/juce_ShapeButton.h | 108 - .../buttons/juce_TextButton.cpp | 71 - .../juce_gui_basics/buttons/juce_TextButton.h | 110 - .../buttons/juce_ToggleButton.cpp | 55 - .../buttons/juce_ToggleButton.h | 97 - .../buttons/juce_ToolbarButton.cpp | 107 - .../buttons/juce_ToolbarButton.h | 100 - .../commands/juce_ApplicationCommandID.h | 83 - .../commands/juce_ApplicationCommandInfo.cpp | 62 - .../commands/juce_ApplicationCommandInfo.h | 194 - .../juce_ApplicationCommandManager.cpp | 311 - .../commands/juce_ApplicationCommandManager.h | 365 - .../juce_ApplicationCommandTarget.cpp | 191 - .../commands/juce_ApplicationCommandTarget.h | 249 - .../commands/juce_KeyPressMappingSet.cpp | 425 - .../commands/juce_KeyPressMappingSet.h | 259 - .../components/juce_CachedComponentImage.h | 67 - .../components/juce_Component.cpp | 2937 --- .../components/juce_Component.h | 2379 --- .../components/juce_ComponentListener.cpp | 32 - .../components/juce_ComponentListener.h | 113 - .../components/juce_Desktop.cpp | 447 - .../juce_gui_basics/components/juce_Desktop.h | 412 - .../components/juce_ModalComponentManager.cpp | 285 - .../components/juce_ModalComponentManager.h | 365 - .../drawables/juce_Drawable.cpp | 240 - .../juce_gui_basics/drawables/juce_Drawable.h | 258 - .../drawables/juce_DrawableComposite.cpp | 340 - .../drawables/juce_DrawableComposite.h | 162 - .../drawables/juce_DrawableImage.cpp | 290 - .../drawables/juce_DrawableImage.h | 142 - .../drawables/juce_DrawablePath.cpp | 571 - .../drawables/juce_DrawablePath.h | 149 - .../drawables/juce_DrawableRectangle.cpp | 183 - .../drawables/juce_DrawableRectangle.h | 107 - .../drawables/juce_DrawableShape.cpp | 455 - .../drawables/juce_DrawableShape.h | 184 - .../drawables/juce_DrawableText.cpp | 341 - .../drawables/juce_DrawableText.h | 151 - .../drawables/juce_SVGParser.cpp | 1296 -- ...juce_DirectoryContentsDisplayComponent.cpp | 72 - .../juce_DirectoryContentsDisplayComponent.h | 116 - .../juce_DirectoryContentsList.cpp | 267 - .../filebrowser/juce_DirectoryContentsList.h | 218 - .../filebrowser/juce_FileBrowserComponent.cpp | 569 - .../filebrowser/juce_FileBrowserComponent.h | 252 - .../filebrowser/juce_FileBrowserListener.h | 60 - .../filebrowser/juce_FileChooser.cpp | 170 - .../filebrowser/juce_FileChooser.h | 193 - .../filebrowser/juce_FileChooserDialogBox.cpp | 275 - .../filebrowser/juce_FileChooserDialogBox.h | 169 - .../filebrowser/juce_FileFilter.cpp | 38 - .../filebrowser/juce_FileFilter.h | 74 - .../filebrowser/juce_FileListComponent.cpp | 258 - .../filebrowser/juce_FileListComponent.h | 107 - .../filebrowser/juce_FilePreviewComponent.h | 68 - .../juce_FileSearchPathListComponent.cpp | 265 - .../juce_FileSearchPathListComponent.h | 123 - .../filebrowser/juce_FileTreeComponent.cpp | 269 - .../filebrowser/juce_FileTreeComponent.h | 101 - .../filebrowser/juce_FilenameComponent.cpp | 245 - .../filebrowser/juce_FilenameComponent.h | 219 - .../juce_ImagePreviewComponent.cpp | 117 - .../filebrowser/juce_ImagePreviewComponent.h | 69 - .../filebrowser/juce_WildcardFileFilter.cpp | 74 - .../filebrowser/juce_WildcardFileFilter.h | 85 - .../juce_gui_basics/juce_gui_basics.cpp | 293 - .../modules/juce_gui_basics/juce_gui_basics.h | 446 - .../juce_gui_basics/juce_gui_basics.mm | 26 - .../modules/juce_gui_basics/juce_module_info | 39 - .../keyboard/juce_CaretComponent.cpp | 58 - .../keyboard/juce_CaretComponent.h | 83 - .../keyboard/juce_KeyListener.cpp | 29 - .../keyboard/juce_KeyListener.h | 80 - .../keyboard/juce_KeyPress.cpp | 305 - .../juce_gui_basics/keyboard/juce_KeyPress.h | 252 - .../keyboard/juce_KeyboardFocusTraverser.cpp | 137 - .../keyboard/juce_KeyboardFocusTraverser.h | 92 - .../keyboard/juce_ModifierKeys.cpp | 63 - .../keyboard/juce_ModifierKeys.h | 221 - .../keyboard/juce_SystemClipboard.h | 48 - .../keyboard/juce_TextEditorKeyMapper.h | 104 - .../keyboard/juce_TextInputTarget.h | 78 - .../layout/juce_ComponentAnimator.cpp | 340 - .../layout/juce_ComponentAnimator.h | 164 - .../juce_ComponentBoundsConstrainer.cpp | 327 - .../layout/juce_ComponentBoundsConstrainer.h | 200 - .../layout/juce_ComponentBuilder.cpp | 441 - .../layout/juce_ComponentBuilder.h | 267 - .../layout/juce_ComponentMovementWatcher.cpp | 137 - .../layout/juce_ComponentMovementWatcher.h | 98 - .../layout/juce_GroupComponent.cpp | 92 - .../layout/juce_GroupComponent.h | 112 - .../layout/juce_MultiDocumentPanel.cpp | 526 - .../layout/juce_MultiDocumentPanel.h | 308 - .../layout/juce_ResizableBorderComponent.cpp | 200 - .../layout/juce_ResizableBorderComponent.h | 202 - .../layout/juce_ResizableCornerComponent.cpp | 102 - .../layout/juce_ResizableCornerComponent.h | 94 - .../layout/juce_ResizableEdgeComponent.cpp | 110 - .../layout/juce_ResizableEdgeComponent.h | 102 - .../juce_gui_basics/layout/juce_ScrollBar.cpp | 430 - .../juce_gui_basics/layout/juce_ScrollBar.h | 333 - .../layout/juce_StretchableLayoutManager.cpp | 358 - .../layout/juce_StretchableLayoutManager.h | 263 - .../juce_StretchableLayoutResizerBar.cpp | 74 - .../layout/juce_StretchableLayoutResizerBar.h | 98 - .../layout/juce_StretchableObjectResizer.cpp | 121 - .../layout/juce_StretchableObjectResizer.h | 102 - .../layout/juce_TabbedButtonBar.cpp | 496 - .../layout/juce_TabbedButtonBar.h | 307 - .../layout/juce_TabbedComponent.cpp | 307 - .../layout/juce_TabbedComponent.h | 242 - .../juce_gui_basics/layout/juce_Viewport.cpp | 442 - .../juce_gui_basics/layout/juce_Viewport.h | 291 - .../lookandfeel/juce_LookAndFeel.cpp | 3054 --- .../lookandfeel/juce_LookAndFeel.h | 683 - .../menus/juce_MenuBarComponent.cpp | 344 - .../menus/juce_MenuBarComponent.h | 123 - .../menus/juce_MenuBarModel.cpp | 85 - .../juce_gui_basics/menus/juce_MenuBarModel.h | 178 - .../juce_gui_basics/menus/juce_PopupMenu.cpp | 1698 -- .../juce_gui_basics/menus/juce_PopupMenu.h | 500 - .../misc/juce_BubbleComponent.cpp | 190 - .../misc/juce_BubbleComponent.h | 156 - .../misc/juce_DropShadower.cpp | 297 - .../juce_gui_basics/misc/juce_DropShadower.h | 96 - .../mouse/juce_ComponentDragger.cpp | 62 - .../mouse/juce_ComponentDragger.h | 105 - .../mouse/juce_DragAndDropContainer.cpp | 443 - .../mouse/juce_DragAndDropContainer.h | 183 - .../mouse/juce_DragAndDropTarget.h | 153 - .../mouse/juce_FileDragAndDropTarget.h | 109 - .../mouse/juce_LassoComponent.h | 244 - .../mouse/juce_MouseCursor.cpp | 185 - .../juce_gui_basics/mouse/juce_MouseCursor.h | 165 - .../juce_gui_basics/mouse/juce_MouseEvent.cpp | 112 - .../juce_gui_basics/mouse/juce_MouseEvent.h | 322 - .../mouse/juce_MouseInputSource.cpp | 533 - .../mouse/juce_MouseInputSource.h | 186 - .../mouse/juce_MouseListener.cpp | 33 - .../mouse/juce_MouseListener.h | 166 - .../mouse/juce_SelectedItemSet.h | 314 - .../mouse/juce_TooltipClient.h | 86 - .../native/juce_MultiTouchMapper.h | 78 - .../native/juce_android_FileChooser.cpp | 45 - .../native/juce_android_Windowing.cpp | 787 - .../native/juce_ios_UIViewComponentPeer.mm | 1022 - .../native/juce_ios_Windowing.mm | 288 - .../native/juce_linux_Clipboard.cpp | 241 - .../native/juce_linux_FileChooser.cpp | 78 - .../native/juce_linux_Windowing.cpp | 3132 --- .../native/juce_mac_FileChooser.mm | 249 - .../native/juce_mac_MainMenu.mm | 616 - .../native/juce_mac_MouseCursor.mm | 154 - .../native/juce_mac_NSViewComponentPeer.mm | 1927 -- .../native/juce_mac_Windowing.mm | 364 - .../native/juce_win32_DragAndDrop.cpp | 294 - .../native/juce_win32_FileChooser.cpp | 280 - .../native/juce_win32_Windowing.cpp | 3195 ---- .../positioning/juce_MarkerList.cpp | 286 - .../positioning/juce_MarkerList.h | 188 - .../positioning/juce_RelativeCoordinate.cpp | 171 - .../positioning/juce_RelativeCoordinate.h | 148 - .../juce_RelativeCoordinatePositioner.cpp | 337 - .../juce_RelativeCoordinatePositioner.h | 97 - .../juce_RelativeParallelogram.cpp | 135 - .../positioning/juce_RelativeParallelogram.h | 68 - .../positioning/juce_RelativePoint.cpp | 95 - .../positioning/juce_RelativePoint.h | 93 - .../positioning/juce_RelativePointPath.cpp | 293 - .../positioning/juce_RelativePointPath.h | 194 - .../positioning/juce_RelativeRectangle.cpp | 262 - .../positioning/juce_RelativeRectangle.h | 109 - .../juce_BooleanPropertyComponent.cpp | 86 - .../juce_BooleanPropertyComponent.h | 97 - .../juce_ButtonPropertyComponent.cpp | 47 - .../properties/juce_ButtonPropertyComponent.h | 82 - .../juce_ChoicePropertyComponent.cpp | 150 - .../properties/juce_ChoicePropertyComponent.h | 130 - .../properties/juce_PropertyComponent.cpp | 54 - .../properties/juce_PropertyComponent.h | 124 - .../properties/juce_PropertyPanel.cpp | 397 - .../properties/juce_PropertyPanel.h | 164 - .../juce_SliderPropertyComponent.cpp | 81 - .../properties/juce_SliderPropertyComponent.h | 107 - .../properties/juce_TextPropertyComponent.cpp | 123 - .../properties/juce_TextPropertyComponent.h | 98 - .../juce_gui_basics/widgets/juce_ComboBox.cpp | 636 - .../juce_gui_basics/widgets/juce_ComboBox.h | 415 - .../widgets/juce_ImageComponent.cpp | 103 - .../widgets/juce_ImageComponent.h | 91 - .../juce_gui_basics/widgets/juce_Label.cpp | 469 - .../juce_gui_basics/widgets/juce_Label.h | 344 - .../juce_gui_basics/widgets/juce_ListBox.cpp | 958 - .../juce_gui_basics/widgets/juce_ListBox.h | 576 - .../widgets/juce_ProgressBar.cpp | 112 - .../widgets/juce_ProgressBar.h | 120 - .../juce_gui_basics/widgets/juce_Slider.cpp | 1446 -- .../juce_gui_basics/widgets/juce_Slider.h | 886 - .../widgets/juce_TableHeaderComponent.cpp | 929 - .../widgets/juce_TableHeaderComponent.h | 433 - .../widgets/juce_TableListBox.cpp | 485 - .../widgets/juce_TableListBox.h | 336 - .../widgets/juce_TextEditor.cpp | 2671 --- .../juce_gui_basics/widgets/juce_TextEditor.h | 720 - .../juce_gui_basics/widgets/juce_Toolbar.cpp | 829 - .../juce_gui_basics/widgets/juce_Toolbar.h | 314 - .../widgets/juce_ToolbarItemComponent.cpp | 248 - .../widgets/juce_ToolbarItemComponent.h | 210 - .../widgets/juce_ToolbarItemFactory.h | 111 - .../widgets/juce_ToolbarItemPalette.cpp | 108 - .../widgets/juce_ToolbarItemPalette.h | 80 - .../juce_gui_basics/widgets/juce_TreeView.cpp | 1845 -- .../juce_gui_basics/widgets/juce_TreeView.h | 828 - .../windows/juce_AlertWindow.cpp | 759 - .../windows/juce_AlertWindow.h | 470 - .../windows/juce_CallOutBox.cpp | 261 - .../juce_gui_basics/windows/juce_CallOutBox.h | 127 - .../windows/juce_ComponentPeer.cpp | 572 - .../windows/juce_ComponentPeer.h | 392 - .../windows/juce_DialogWindow.cpp | 116 - .../windows/juce_DialogWindow.h | 178 - .../windows/juce_DocumentWindow.cpp | 382 - .../windows/juce_DocumentWindow.h | 276 - .../windows/juce_NativeMessageBox.h | 157 - .../windows/juce_ResizableWindow.cpp | 620 - .../windows/juce_ResizableWindow.h | 392 - .../windows/juce_ThreadWithProgressWindow.cpp | 99 - .../windows/juce_ThreadWithProgressWindow.h | 155 - .../windows/juce_TooltipWindow.cpp | 188 - .../windows/juce_TooltipWindow.h | 119 - .../windows/juce_TopLevelWindow.cpp | 341 - .../windows/juce_TopLevelWindow.h | 171 - .../juce_CPlusPlusCodeTokeniser.cpp | 608 - .../code_editor/juce_CPlusPlusCodeTokeniser.h | 75 - .../code_editor/juce_CodeDocument.cpp | 964 - .../code_editor/juce_CodeDocument.h | 401 - .../code_editor/juce_CodeEditorComponent.cpp | 1188 -- .../code_editor/juce_CodeEditorComponent.h | 311 - .../code_editor/juce_CodeTokeniser.h | 72 - .../documents/juce_FileBasedDocument.cpp | 285 - .../documents/juce_FileBasedDocument.h | 298 - .../embedding/juce_ActiveXControlComponent.h | 123 - .../embedding/juce_NSViewComponent.h | 87 - .../embedding/juce_UIViewComponent.h | 87 - .../modules/juce_gui_extra/juce_gui_extra.cpp | 147 - .../modules/juce_gui_extra/juce_gui_extra.h | 104 - .../modules/juce_gui_extra/juce_gui_extra.mm | 26 - .../modules/juce_gui_extra/juce_module_info | 24 - .../lookandfeel/juce_OldSchoolLookAndFeel.cpp | 593 - .../lookandfeel/juce_OldSchoolLookAndFeel.h | 157 - .../juce_gui_extra/misc/juce_AppleRemote.h | 115 - .../misc/juce_BubbleMessageComponent.cpp | 123 - .../misc/juce_BubbleMessageComponent.h | 133 - .../misc/juce_ColourSelector.cpp | 579 - .../juce_gui_extra/misc/juce_ColourSelector.h | 170 - .../misc/juce_KeyMappingEditorComponent.cpp | 487 - .../misc/juce_KeyMappingEditorComponent.h | 134 - .../misc/juce_PreferencesPanel.cpp | 142 - .../misc/juce_PreferencesPanel.h | 149 - .../misc/juce_RecentlyOpenedFilesList.cpp | 132 - .../misc/juce_RecentlyOpenedFilesList.h | 159 - .../juce_gui_extra/misc/juce_SplashScreen.cpp | 106 - .../juce_gui_extra/misc/juce_SplashScreen.h | 146 - .../misc/juce_SystemTrayIconComponent.cpp | 37 - .../misc/juce_SystemTrayIconComponent.h | 81 - .../misc/juce_WebBrowserComponent.h | 131 - .../juce_android_WebBrowserComponent.cpp | 113 - .../native/juce_ios_UIViewComponent.mm | 128 - .../native/juce_linux_SystemTrayIcon.cpp | 124 - .../native/juce_linux_WebBrowserComponent.cpp | 118 - .../native/juce_mac_AppleRemote.mm | 264 - .../juce_mac_CarbonViewWrapperComponent.h | 297 - .../native/juce_mac_NSViewComponent.mm | 150 - .../native/juce_mac_WebBrowserComponent.mm | 360 - .../native/juce_win32_ActiveXComponent.cpp | 411 - .../native/juce_win32_SystemTrayIcon.cpp | 216 - .../native/juce_win32_WebBrowserComponent.cpp | 315 - src/juce/OpenShotLibrary.jucer | 35 - src/juce/Source/Main.cpp | 22 - 993 files changed, 18 insertions(+), 379984 deletions(-) delete mode 100644 .pydevproject delete mode 100644 src/juce/JuceLibraryCode/AppConfig.h delete mode 100644 src/juce/JuceLibraryCode/JuceHeader.h delete mode 100644 src/juce/JuceLibraryCode/ReadMe.txt delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioDataConverters.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioDataConverters.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_basics/effects/juce_Decibels.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_basics/effects/juce_IIRFilter.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_basics/effects/juce_IIRFilter.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_basics/effects/juce_Reverb.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_basics/juce_audio_basics.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_basics/juce_audio_basics.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_basics/juce_audio_basics.mm delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_basics/juce_module_info delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiBuffer.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiBuffer.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiFile.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiFile.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiKeyboardState.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiKeyboardState.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessage.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessage.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessageSequence.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessageSequence.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_basics/sources/juce_AudioSource.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_basics/sources/juce_BufferingAudioSource.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_basics/sources/juce_BufferingAudioSource.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_basics/sources/juce_MixerAudioSource.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_basics/sources/juce_MixerAudioSource.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_basics/sources/juce_PositionableAudioSource.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ResamplingAudioSource.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ResamplingAudioSource.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ReverbAudioSource.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ReverbAudioSource.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_basics/synthesisers/juce_Synthesiser.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_basics/synthesisers/juce_Synthesiser.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_devices/audio_cd/juce_AudioCDBurner.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_devices/audio_cd/juce_AudioCDReader.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_devices/audio_cd/juce_AudioCDReader.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioIODevice.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioIODevice.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_devices/juce_audio_devices.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_devices/juce_audio_devices.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_devices/juce_audio_devices.mm delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_devices/juce_module_info delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiInput.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiOutput.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiOutput.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_devices/native/juce_MidiDataConcatenator.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_devices/native/juce_android_Audio.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_devices/native/juce_android_Midi.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_devices/native/juce_android_OpenSL.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_devices/native/juce_ios_Audio.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_devices/native/juce_linux_ALSA.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_devices/native/juce_linux_AudioCDReader.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_devices/native/juce_linux_JackAudio.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_devices/native/juce_linux_Midi.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_devices/native/juce_mac_AudioCDBurner.mm delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_devices/native/juce_mac_AudioCDReader.mm delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_devices/native/juce_mac_CoreAudio.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_devices/native/juce_mac_CoreMidi.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_ASIO.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_AudioCDBurner.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_AudioCDReader.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_DirectSound.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_Midi.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_WASAPI.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_devices/sources/juce_AudioSourcePlayer.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_devices/sources/juce_AudioSourcePlayer.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_devices/sources/juce_AudioTransportSource.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_devices/sources/juce_AudioTransportSource.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/Flac Licence.txt delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/all.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/alloc.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/assert.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/callback.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/export.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/format.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/bitmath.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/bitreader.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/bitwriter.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/cpu.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/crc.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/fixed.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/float.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/format.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/all.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitmath.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitreader.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitwriter.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/cpu.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/crc.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/fixed.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/float.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/format.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/lpc.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/md5.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/memory.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/metadata.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/stream_encoder_framing.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/window.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/all.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/stream_decoder.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/stream_encoder.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/lpc_flac.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/md5.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/memory.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/stream_decoder.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/stream_encoder.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/stream_encoder_framing.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/window_flac.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/metadata.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/ordinals.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/stream_decoder.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/stream_encoder.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_AiffAudioFormat.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_AiffAudioFormat.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_CoreAudioFormat.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_CoreAudioFormat.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_FlacAudioFormat.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_FlacAudioFormat.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_MP3AudioFormat.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_MP3AudioFormat.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_QuickTimeAudioFormat.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_QuickTimeAudioFormat.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_WavAudioFormat.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_WavAudioFormat.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/Ogg Vorbis Licence.txt delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/bitwise.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/codec.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/config_types.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/framing.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/AUTHORS delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/CHANGES delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/COPYING delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/README delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/analysis.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/backends.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/bitrate.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/bitrate.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/block.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/books/coupled/res_books_51.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/books/coupled/res_books_stereo.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/books/floor/floor_books.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/books/uncoupled/res_books_uncoupled.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/codebook.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/codebook.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/codec_internal.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/envelope.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/envelope.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/floor0.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/floor1.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/highlevel.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/info.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/lookup.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/lookup.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/lookup_data.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/lpc.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/lpc.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/lsp.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/lsp.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/mapping0.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/masking.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/mdct.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/mdct.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/misc.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/floor_all.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/psych_11.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/psych_16.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/psych_44.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/psych_8.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/residue_16.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/residue_44.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/residue_44p51.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/residue_44u.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/residue_8.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_11.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_16.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_22.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_32.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_44.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_44p51.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_44u.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_8.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_X.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/os.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/psy.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/psy.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/registry.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/registry.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/res0.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/scales.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/sharedbook.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/smallft.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/smallft.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/synthesis.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/vorbisenc.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/vorbisfile.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/window.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/window.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/ogg.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/os_types.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/vorbisenc.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/vorbisfile.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormat.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormat.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatManager.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatManager.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatReader.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatReader.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatReaderSource.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatReaderSource.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatWriter.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatWriter.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioSubsectionReader.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioSubsectionReader.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/juce_audio_formats.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/juce_audio_formats.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/juce_audio_formats.mm delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/juce_module_info delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/sampler/juce_Sampler.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_formats/sampler/juce_Sampler.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormat.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormat.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormatManager.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormatManager.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_DirectXPluginFormat.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VSTMidiEventList.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_processors/juce_audio_processors.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_processors/juce_audio_processors.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_processors/juce_audio_processors.mm delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_processors/juce_module_info delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioPlayHead.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioPluginInstance.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessor.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessor.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorEditor.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorEditor.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorListener.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_processors/processors/juce_PluginDescription.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_processors/processors/juce_PluginDescription.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_KnownPluginList.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_KnownPluginList.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginListComponent.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginListComponent.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/containers/juce_AbstractFifo.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/containers/juce_AbstractFifo.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/containers/juce_Array.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/containers/juce_ArrayAllocationBase.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/containers/juce_DynamicObject.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/containers/juce_DynamicObject.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/containers/juce_ElementComparator.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/containers/juce_HashMap.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/containers/juce_LinkedListPointer.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/containers/juce_NamedValueSet.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/containers/juce_NamedValueSet.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/containers/juce_OwnedArray.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/containers/juce_PropertySet.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/containers/juce_PropertySet.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/containers/juce_ReferenceCountedArray.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/containers/juce_ScopedValueSetter.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/containers/juce_SortedSet.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/containers/juce_SparseSet.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/containers/juce_Variant.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/containers/juce_Variant.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/files/juce_DirectoryIterator.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/files/juce_DirectoryIterator.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/files/juce_File.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/files/juce_File.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/files/juce_FileInputStream.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/files/juce_FileInputStream.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/files/juce_FileOutputStream.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/files/juce_FileOutputStream.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/files/juce_FileSearchPath.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/files/juce_FileSearchPath.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/files/juce_MemoryMappedFile.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/files/juce_TemporaryFile.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/files/juce_TemporaryFile.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/json/juce_JSON.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/json/juce_JSON.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/juce_core.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/juce_core.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/juce_core.mm delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/juce_module_info delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/logging/juce_FileLogger.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/logging/juce_FileLogger.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/logging/juce_Logger.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/logging/juce_Logger.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/maths/juce_BigInteger.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/maths/juce_BigInteger.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/maths/juce_Expression.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/maths/juce_Expression.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/maths/juce_MathsFunctions.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/maths/juce_Random.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/maths/juce_Random.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/maths/juce_Range.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/memory/juce_Atomic.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/memory/juce_ByteOrder.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/memory/juce_HeapBlock.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/memory/juce_LeakedObjectDetector.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/memory/juce_Memory.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/memory/juce_MemoryBlock.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/memory/juce_MemoryBlock.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/memory/juce_OptionalScopedPointer.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/memory/juce_ReferenceCountedObject.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/memory/juce_ScopedPointer.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/memory/juce_Singleton.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/memory/juce_WeakReference.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/misc/juce_Result.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/misc/juce_Result.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/misc/juce_Uuid.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/misc/juce_Uuid.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/misc/juce_WindowsRegistry.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/native/java/ComponentPeerView.java delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/native/java/JuceAppActivity.java delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/native/juce_BasicNativeHeaders.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/native/juce_android_Files.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/native/juce_android_JNIHelpers.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/native/juce_android_Misc.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/native/juce_android_Network.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/native/juce_android_SystemStats.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/native/juce_android_Threads.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/native/juce_linux_Files.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/native/juce_linux_Network.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/native/juce_linux_SystemStats.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/native/juce_linux_Threads.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/native/juce_mac_Files.mm delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/native/juce_mac_Network.mm delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/native/juce_mac_ObjCSuffix.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/native/juce_mac_Strings.mm delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/native/juce_mac_SystemStats.mm delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/native/juce_mac_Threads.mm delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/native/juce_osx_ObjCHelpers.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/native/juce_posix_NamedPipe.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/native/juce_posix_SharedCode.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/native/juce_win32_ComSmartPtr.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/native/juce_win32_Files.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/native/juce_win32_Network.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/native/juce_win32_Registry.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/native/juce_win32_SystemStats.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/native/juce_win32_Threads.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/network/juce_MACAddress.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/network/juce_MACAddress.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/network/juce_NamedPipe.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/network/juce_NamedPipe.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/network/juce_Socket.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/network/juce_Socket.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/network/juce_URL.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/network/juce_URL.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/streams/juce_BufferedInputStream.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/streams/juce_BufferedInputStream.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/streams/juce_FileInputSource.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/streams/juce_FileInputSource.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/streams/juce_InputSource.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/streams/juce_InputStream.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/streams/juce_InputStream.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/streams/juce_MemoryInputStream.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/streams/juce_MemoryInputStream.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/streams/juce_MemoryOutputStream.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/streams/juce_MemoryOutputStream.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/streams/juce_OutputStream.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/streams/juce_OutputStream.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/streams/juce_SubregionStream.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/streams/juce_SubregionStream.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/system/juce_PlatformDefs.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/system/juce_StandardHeader.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/system/juce_SystemStats.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/system/juce_SystemStats.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/system/juce_TargetPlatform.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/text/juce_CharPointer_ASCII.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/text/juce_CharPointer_UTF16.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/text/juce_CharPointer_UTF32.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/text/juce_CharPointer_UTF8.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/text/juce_CharacterFunctions.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/text/juce_CharacterFunctions.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/text/juce_Identifier.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/text/juce_Identifier.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/text/juce_LocalisedStrings.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/text/juce_LocalisedStrings.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/text/juce_NewLine.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/text/juce_String.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/text/juce_String.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/text/juce_StringArray.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/text/juce_StringArray.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/text/juce_StringPairArray.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/text/juce_StringPairArray.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/text/juce_StringPool.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/text/juce_StringPool.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/threads/juce_ChildProcess.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/threads/juce_ChildProcess.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/threads/juce_CriticalSection.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/threads/juce_DynamicLibrary.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/threads/juce_InterProcessLock.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/threads/juce_Process.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/threads/juce_ReadWriteLock.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/threads/juce_ReadWriteLock.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/threads/juce_ScopedLock.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/threads/juce_ScopedReadLock.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/threads/juce_ScopedWriteLock.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/threads/juce_SpinLock.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/threads/juce_Thread.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/threads/juce_Thread.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/threads/juce_ThreadLocalValue.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/threads/juce_ThreadPool.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/threads/juce_ThreadPool.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/threads/juce_TimeSliceThread.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/threads/juce_TimeSliceThread.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/threads/juce_WaitableEvent.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/time/juce_PerformanceCounter.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/time/juce_PerformanceCounter.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/time/juce_RelativeTime.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/time/juce_RelativeTime.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/time/juce_Time.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/time/juce_Time.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/unit_tests/juce_UnitTest.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/unit_tests/juce_UnitTest.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/xml/juce_XmlDocument.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/xml/juce_XmlDocument.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/xml/juce_XmlElement.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/xml/juce_XmlElement.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/zip/juce_GZIPCompressorOutputStream.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/zip/juce_GZIPCompressorOutputStream.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/zip/juce_GZIPDecompressorInputStream.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/zip/juce_GZIPDecompressorInputStream.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/zip/juce_ZipFile.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/zip/juce_ZipFile.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/zip/zlib/README delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/zip/zlib/adler32.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/zip/zlib/compress.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/zip/zlib/crc32.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/zip/zlib/crc32.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/zip/zlib/deflate.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/zip/zlib/deflate.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/zip/zlib/infback.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/zip/zlib/inffast.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/zip/zlib/inffast.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/zip/zlib/inffixed.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/zip/zlib/inflate.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/zip/zlib/inflate.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/zip/zlib/inftrees.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/zip/zlib/inftrees.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/zip/zlib/trees.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/zip/zlib/trees.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/zip/zlib/uncompr.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/zip/zlib/zconf.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/zip/zlib/zconf.in.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/zip/zlib/zlib.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/zip/zlib/zutil.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_core/zip/zlib/zutil.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_data_structures/app_properties/juce_ApplicationProperties.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_data_structures/app_properties/juce_ApplicationProperties.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_data_structures/app_properties/juce_PropertiesFile.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_data_structures/app_properties/juce_PropertiesFile.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_data_structures/juce_data_structures.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_data_structures/juce_data_structures.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_data_structures/juce_data_structures.mm delete mode 100644 src/juce/JuceLibraryCode/modules/juce_data_structures/juce_module_info delete mode 100644 src/juce/JuceLibraryCode/modules/juce_data_structures/undomanager/juce_UndoManager.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_data_structures/undomanager/juce_UndoManager.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_data_structures/undomanager/juce_UndoableAction.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_data_structures/values/juce_Value.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_data_structures/values/juce_Value.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_data_structures/values/juce_ValueTree.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_data_structures/values/juce_ValueTree.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_events/broadcasters/juce_ActionBroadcaster.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_events/broadcasters/juce_ActionBroadcaster.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_events/broadcasters/juce_ActionListener.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_events/broadcasters/juce_AsyncUpdater.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_events/broadcasters/juce_AsyncUpdater.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_events/broadcasters/juce_ChangeBroadcaster.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_events/broadcasters/juce_ChangeBroadcaster.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_events/broadcasters/juce_ChangeListener.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_events/broadcasters/juce_ListenerList.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_events/interprocess/juce_InterprocessConnection.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_events/interprocess/juce_InterprocessConnection.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_events/interprocess/juce_InterprocessConnectionServer.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_events/interprocess/juce_InterprocessConnectionServer.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_events/juce_events.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_events/juce_events.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_events/juce_events.mm delete mode 100644 src/juce/JuceLibraryCode/modules/juce_events/juce_module_info delete mode 100644 src/juce/JuceLibraryCode/modules/juce_events/messages/juce_ApplicationBase.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_events/messages/juce_ApplicationBase.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_events/messages/juce_CallbackMessage.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_events/messages/juce_DeletedAtShutdown.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_events/messages/juce_DeletedAtShutdown.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_events/messages/juce_Message.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_events/messages/juce_MessageListener.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_events/messages/juce_MessageListener.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_events/messages/juce_MessageManager.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_events/messages/juce_MessageManager.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_events/native/juce_ScopedXLock.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_events/native/juce_android_Messaging.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_events/native/juce_ios_MessageManager.mm delete mode 100644 src/juce/JuceLibraryCode/modules/juce_events/native/juce_linux_Messaging.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_events/native/juce_mac_MessageManager.mm delete mode 100644 src/juce/JuceLibraryCode/modules/juce_events/native/juce_osx_MessageQueue.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_events/native/juce_win32_HiddenMessageWindow.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_events/native/juce_win32_Messaging.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_events/timers/juce_MultiTimer.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_events/timers/juce_MultiTimer.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_events/timers/juce_Timer.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_events/timers/juce_Timer.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/colour/juce_Colour.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/colour/juce_Colour.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/colour/juce_ColourGradient.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/colour/juce_ColourGradient.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/colour/juce_Colours.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/colour/juce_Colours.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/colour/juce_FillType.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/colour/juce_FillType.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/colour/juce_PixelFormats.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/contexts/juce_GraphicsContext.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/contexts/juce_GraphicsContext.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsContext.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/effects/juce_DropShadowEffect.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/effects/juce_DropShadowEffect.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/effects/juce_GlowEffect.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/effects/juce_GlowEffect.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/effects/juce_ImageEffectFilter.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/fonts/juce_AttributedString.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/fonts/juce_AttributedString.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/fonts/juce_CustomTypeface.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/fonts/juce_CustomTypeface.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/fonts/juce_Font.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/fonts/juce_Font.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/fonts/juce_GlyphArrangement.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/fonts/juce_GlyphArrangement.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/fonts/juce_TextLayout.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/fonts/juce_TextLayout.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/fonts/juce_Typeface.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/fonts/juce_Typeface.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/geometry/juce_AffineTransform.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/geometry/juce_AffineTransform.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/geometry/juce_BorderSize.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/geometry/juce_EdgeTable.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/geometry/juce_EdgeTable.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/geometry/juce_Line.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/geometry/juce_Path.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/geometry/juce_Path.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/geometry/juce_PathIterator.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/geometry/juce_PathIterator.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/geometry/juce_PathStrokeType.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/geometry/juce_PathStrokeType.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/geometry/juce_Point.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/geometry/juce_Rectangle.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/geometry/juce_RectangleList.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/geometry/juce_RectangleList.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/README delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/cderror.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/changes to libjpeg for JUCE.txt delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcapimin.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcapistd.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jccoefct.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jccolor.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcdctmgr.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jchuff.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jchuff.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcinit.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcmainct.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcmarker.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcmaster.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcomapi.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jconfig.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcparam.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcphuff.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcprepct.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcsample.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jctrans.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdapimin.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdapistd.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdatasrc.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdcoefct.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdcolor.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdct.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jddctmgr.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdhuff.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdhuff.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdinput.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdmainct.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdmarker.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdmaster.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdmerge.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdphuff.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdpostct.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdsample.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdtrans.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jerror.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jerror.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jfdctflt.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jfdctfst.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jfdctint.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jidctflt.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jidctfst.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jidctint.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jidctred.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jinclude.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jmemmgr.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jmemnobs.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jmemsys.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jmorecfg.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jpegint.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jpeglib.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jquant1.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jquant2.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jutils.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jversion.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/transupp.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/transupp.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/juce_GIFLoader.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/juce_JPEGLoader.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/juce_PNGLoader.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/LICENSE delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/libpng_readme.txt delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/png.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/png.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngconf.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngerror.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngget.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngmem.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngpread.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngread.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngrio.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngrtran.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngrutil.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngset.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngtrans.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngwio.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngwrite.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngwtran.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngwutil.c delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/images/juce_Image.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/images/juce_Image.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/images/juce_ImageCache.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/images/juce_ImageCache.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/images/juce_ImageConvolutionKernel.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/images/juce_ImageConvolutionKernel.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/images/juce_ImageFileFormat.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/images/juce_ImageFileFormat.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/juce_graphics.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/juce_graphics.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/juce_graphics.mm delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/juce_module_info delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/native/juce_RenderingHelpers.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/native/juce_android_Fonts.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/native/juce_android_GraphicsContext.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/native/juce_linux_Fonts.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/native/juce_mac_CoreGraphicsContext.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/native/juce_mac_CoreGraphicsContext.mm delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/native/juce_mac_CoreGraphicsHelpers.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/native/juce_mac_Fonts.mm delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/native/juce_win32_DirectWriteTypeLayout.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/native/juce_win32_DirectWriteTypeface.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/native/juce_win32_Fonts.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/placement/juce_Justification.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/placement/juce_Justification.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/placement/juce_RectanglePlacement.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_graphics/placement/juce_RectanglePlacement.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/application/juce_Application.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/application/juce_Application.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/application/juce_Initialisation.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ArrowButton.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ArrowButton.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_Button.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_Button.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_DrawableButton.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_DrawableButton.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_HyperlinkButton.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_HyperlinkButton.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ImageButton.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ImageButton.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ShapeButton.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ShapeButton.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_TextButton.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_TextButton.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ToggleButton.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ToggleButton.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ToolbarButton.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ToolbarButton.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandID.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandManager.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandManager.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/commands/juce_KeyPressMappingSet.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/commands/juce_KeyPressMappingSet.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/components/juce_CachedComponentImage.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/components/juce_Component.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/components/juce_Component.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/components/juce_ComponentListener.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/components/juce_ComponentListener.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/components/juce_Desktop.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/components/juce_Desktop.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/components/juce_ModalComponentManager.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/components/juce_ModalComponentManager.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_Drawable.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_Drawable.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableComposite.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableComposite.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableImage.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableImage.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawablePath.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawablePath.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableRectangle.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableRectangle.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableShape.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableShape.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableText.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableText.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_SVGParser.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileBrowserListener.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileChooser.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileChooser.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileChooserDialogBox.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileChooserDialogBox.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileFilter.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileFilter.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileListComponent.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileListComponent.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FilePreviewComponent.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileSearchPathListComponent.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileSearchPathListComponent.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileTreeComponent.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileTreeComponent.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FilenameComponent.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FilenameComponent.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_ImagePreviewComponent.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_ImagePreviewComponent.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_WildcardFileFilter.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_WildcardFileFilter.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/juce_gui_basics.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/juce_gui_basics.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/juce_gui_basics.mm delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/juce_module_info delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_CaretComponent.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_CaretComponent.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_KeyListener.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_KeyListener.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_KeyPress.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_KeyPress.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_KeyboardFocusTraverser.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_KeyboardFocusTraverser.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_ModifierKeys.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_ModifierKeys.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_SystemClipboard.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_TextEditorKeyMapper.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_TextInputTarget.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentAnimator.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentAnimator.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentBoundsConstrainer.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentBoundsConstrainer.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentBuilder.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentBuilder.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentMovementWatcher.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentMovementWatcher.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/layout/juce_GroupComponent.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/layout/juce_GroupComponent.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/layout/juce_MultiDocumentPanel.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/layout/juce_MultiDocumentPanel.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ResizableBorderComponent.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ResizableBorderComponent.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ResizableCornerComponent.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ResizableCornerComponent.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ResizableEdgeComponent.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ResizableEdgeComponent.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ScrollBar.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ScrollBar.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/layout/juce_StretchableLayoutManager.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/layout/juce_StretchableLayoutManager.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/layout/juce_StretchableLayoutResizerBar.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/layout/juce_StretchableLayoutResizerBar.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/layout/juce_StretchableObjectResizer.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/layout/juce_StretchableObjectResizer.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/layout/juce_TabbedButtonBar.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/layout/juce_TabbedButtonBar.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/layout/juce_TabbedComponent.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/layout/juce_TabbedComponent.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/layout/juce_Viewport.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/layout/juce_Viewport.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/menus/juce_MenuBarComponent.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/menus/juce_MenuBarComponent.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/menus/juce_MenuBarModel.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/menus/juce_MenuBarModel.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/menus/juce_PopupMenu.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/menus/juce_PopupMenu.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/misc/juce_BubbleComponent.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/misc/juce_BubbleComponent.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/misc/juce_DropShadower.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/misc/juce_DropShadower.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_ComponentDragger.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_ComponentDragger.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_DragAndDropContainer.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_DragAndDropContainer.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_DragAndDropTarget.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_FileDragAndDropTarget.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_LassoComponent.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseCursor.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseCursor.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseEvent.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseEvent.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseInputSource.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseInputSource.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseListener.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseListener.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_SelectedItemSet.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_TooltipClient.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/native/juce_MultiTouchMapper.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/native/juce_android_FileChooser.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/native/juce_android_Windowing.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/native/juce_ios_UIViewComponentPeer.mm delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/native/juce_ios_Windowing.mm delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/native/juce_linux_Clipboard.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/native/juce_linux_FileChooser.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/native/juce_linux_Windowing.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/native/juce_mac_FileChooser.mm delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/native/juce_mac_MainMenu.mm delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/native/juce_mac_MouseCursor.mm delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/native/juce_mac_Windowing.mm delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/native/juce_win32_DragAndDrop.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/native/juce_win32_FileChooser.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/native/juce_win32_Windowing.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/positioning/juce_MarkerList.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/positioning/juce_MarkerList.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeCoordinate.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeCoordinate.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeCoordinatePositioner.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeCoordinatePositioner.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeParallelogram.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeParallelogram.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativePoint.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativePoint.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativePointPath.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativePointPath.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeRectangle.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeRectangle.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/properties/juce_BooleanPropertyComponent.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/properties/juce_BooleanPropertyComponent.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/properties/juce_ButtonPropertyComponent.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/properties/juce_ButtonPropertyComponent.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/properties/juce_ChoicePropertyComponent.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/properties/juce_ChoicePropertyComponent.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/properties/juce_PropertyComponent.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/properties/juce_PropertyComponent.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/properties/juce_PropertyPanel.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/properties/juce_PropertyPanel.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/properties/juce_SliderPropertyComponent.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/properties/juce_SliderPropertyComponent.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/properties/juce_TextPropertyComponent.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/properties/juce_TextPropertyComponent.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ComboBox.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ComboBox.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ImageComponent.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ImageComponent.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/widgets/juce_Label.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/widgets/juce_Label.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ListBox.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ListBox.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ProgressBar.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ProgressBar.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/widgets/juce_Slider.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/widgets/juce_Slider.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/widgets/juce_TableHeaderComponent.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/widgets/juce_TableHeaderComponent.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/widgets/juce_TableListBox.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/widgets/juce_TableListBox.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/widgets/juce_TextEditor.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/widgets/juce_TextEditor.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/widgets/juce_Toolbar.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/widgets/juce_Toolbar.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ToolbarItemFactory.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ToolbarItemPalette.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ToolbarItemPalette.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/widgets/juce_TreeView.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/widgets/juce_TreeView.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/windows/juce_AlertWindow.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/windows/juce_AlertWindow.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/windows/juce_CallOutBox.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/windows/juce_CallOutBox.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/windows/juce_ComponentPeer.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/windows/juce_ComponentPeer.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/windows/juce_DialogWindow.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/windows/juce_DialogWindow.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/windows/juce_DocumentWindow.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/windows/juce_DocumentWindow.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/windows/juce_NativeMessageBox.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/windows/juce_ResizableWindow.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/windows/juce_ResizableWindow.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/windows/juce_ThreadWithProgressWindow.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/windows/juce_ThreadWithProgressWindow.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/windows/juce_TooltipWindow.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/windows/juce_TooltipWindow.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/windows/juce_TopLevelWindow.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_basics/windows/juce_TopLevelWindow.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniser.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniser.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_CodeDocument.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_CodeDocument.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_CodeTokeniser.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_extra/documents/juce_FileBasedDocument.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_extra/documents/juce_FileBasedDocument.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_extra/embedding/juce_ActiveXControlComponent.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_extra/embedding/juce_NSViewComponent.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_extra/embedding/juce_UIViewComponent.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_extra/juce_gui_extra.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_extra/juce_gui_extra.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_extra/juce_gui_extra.mm delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_extra/juce_module_info delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_extra/lookandfeel/juce_OldSchoolLookAndFeel.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_extra/lookandfeel/juce_OldSchoolLookAndFeel.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_extra/misc/juce_AppleRemote.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_extra/misc/juce_BubbleMessageComponent.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_extra/misc/juce_BubbleMessageComponent.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_extra/misc/juce_ColourSelector.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_extra/misc/juce_ColourSelector.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_extra/misc/juce_KeyMappingEditorComponent.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_extra/misc/juce_KeyMappingEditorComponent.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_extra/misc/juce_PreferencesPanel.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_extra/misc/juce_PreferencesPanel.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_extra/misc/juce_RecentlyOpenedFilesList.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_extra/misc/juce_RecentlyOpenedFilesList.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_extra/misc/juce_SplashScreen.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_extra/misc/juce_SplashScreen.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_extra/misc/juce_WebBrowserComponent.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_extra/native/juce_android_WebBrowserComponent.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_extra/native/juce_ios_UIViewComponent.mm delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_extra/native/juce_linux_SystemTrayIcon.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_extra/native/juce_linux_WebBrowserComponent.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_extra/native/juce_mac_AppleRemote.mm delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_extra/native/juce_mac_CarbonViewWrapperComponent.h delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_extra/native/juce_mac_NSViewComponent.mm delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_extra/native/juce_mac_WebBrowserComponent.mm delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_extra/native/juce_win32_ActiveXComponent.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_extra/native/juce_win32_SystemTrayIcon.cpp delete mode 100644 src/juce/JuceLibraryCode/modules/juce_gui_extra/native/juce_win32_WebBrowserComponent.cpp delete mode 100644 src/juce/OpenShotLibrary.jucer delete mode 100644 src/juce/Source/Main.cpp diff --git a/.bzrignore b/.bzrignore index 71bbd128..50b043f5 100644 --- a/.bzrignore +++ b/.bzrignore @@ -1,4 +1,2 @@ build/ build/* -src/juce/Builds/ -src/juce/Builds/* diff --git a/.cproject b/.cproject index 016719ad..4fbd4303 100644 --- a/.cproject +++ b/.cproject @@ -20,14 +20,12 @@ - + - + @@ -42,6 +40,7 @@ + @@ -322,7 +321,7 @@ - + diff --git a/.project b/.project index 029b2640..c2cd6a22 100644 --- a/.project +++ b/.project @@ -1,6 +1,6 @@ - OpenShotLibrary + libopenshot @@ -36,7 +36,7 @@ org.eclipse.cdt.make.core.buildLocation - ${workspace_loc:/OpenShotLibrary/build} + ${workspace_loc:/libopenshot/build} org.eclipse.cdt.make.core.cleanBuildTarget @@ -83,6 +83,5 @@ org.eclipse.cdt.core.ccnature org.eclipse.cdt.managedbuilder.core.managedBuildNature org.eclipse.cdt.managedbuilder.core.ScannerConfigNature - org.python.pydev.pythonNature diff --git a/.pydevproject b/.pydevproject deleted file mode 100644 index f8c0075c..00000000 --- a/.pydevproject +++ /dev/null @@ -1,7 +0,0 @@ - - - - -Default -python 2.6 - diff --git a/README b/README index bc63d127..3aa7c5af 100644 --- a/README +++ b/README @@ -1,5 +1,5 @@ OpenShot Video Library is a program that creates, modifies, and edits video files. -Copyright (C) 2011 Jonathan Thomas +Copyright (C) 2011 OpenShot Studios, LLC OpenShot Video Editor is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -21,43 +21,3 @@ along with OpenShot Video Editor. If not, see . Please see /doc/InstallationGuide.pdf for a very detailed Linux and Windows compiling instruction guide. - - - -################# - WEBSITES -################# - -http://www.openshotvideo.com/ (PROJECT WEBSITE and BLOG) -http://launchpad.net/openshot/ (SOURCE CODE, BUG TRACKER, TRANSLATIONS) -http://freshmeat.net/projects/openshot-video-editor/ -https://sourceforge.net/projects/openshotvideo/ -https://www.ohloh.net/p/openshot-video-editor/ - - - -#################### - REPORT A BUG -#################### - -https://bugs.launchpad.net/openshot - - - -#################### - TRANSLATIONS -#################### - -https://translations.launchpad.net/openshot - - - -#################### - ASK A QUESTION -#################### - -https://answers.launchpad.net/openshot - - - - diff --git a/cmake/Modules/FindJuce.cmake b/cmake/Modules/FindJuce.cmake index b0002012..db653337 100644 --- a/cmake/Modules/FindJuce.cmake +++ b/cmake/Modules/FindJuce.cmake @@ -1,16 +1,16 @@ -# - Try to find JUCE Audio Libraries -# libjuce; +# - Try to find JUCE-based OpenShot Audio Library +# libopenshot-audio; # Once done this will define # LIBJUCE_FOUND - System has libjuce.so # LIBJUCE_INCLUDE_DIRS - The juce.h include directories # LIBJUCE_LIBRARIES - The libraries needed to use juce # Find the base directory of juce includes -find_path(LIBJUCE_BASE_DIR juce_amalgamated.h - PATHS /usr/include/juce/ - /usr/local/include/juce/ - $ENV{JUCE_DIR}/include/juce/ - $ENV{JUCE_DIR}/includes/juce/ ) +find_path(LIBJUCE_BASE_DIR JuceHeader.h + PATHS /usr/include/libopenshot-audio/ + /usr/local/include/libopenshot-audio/ + $ENV{JUCE_DIR}/include/libopenshot-audio/ + $ENV{JUCE_DIR}/includes/libopenshot-audio/ ) # Get a list of all header file paths FILE(GLOB_RECURSE JUCE_HEADER_FILES @@ -31,25 +31,21 @@ ENDFOREACH(HEADER_PATH) # Remove duplicates from the header directories list LIST(REMOVE_DUPLICATES HEADER_DIRECTORIES) -# Find the juce.so / juce.dll library +# Find the libopenshot-audio.so / libopenshot-audio.dll library find_library(LIBJUCE_LIBRARY - NAMES libjuce juce + NAMES libopenshot-audio openshot-audio HINTS /usr/lib/ - /usr/lib/juce/ + /usr/lib/libopenshot-audio/ /usr/local/lib/ $ENV{JUCE_DIR}/lib/ ) set(LIBJUCE_LIBRARIES ${LIBJUCE_LIBRARY}) set(LIBJUCE_LIBRARY ${LIBJUCE_LIBRARIES}) -#set(LIBJUCE_INCLUDE_DIR ${HEADER_DIRECTORIES} ) -#set(LIBJUCE_INCLUDE_DIRS ${LIBJUCE_INCLUDE_DIR} ) # Seems to work fine with just the base dir (rather than all the actual include folders) set(LIBJUCE_INCLUDE_DIR ${LIBJUCE_BASE_DIR} ) set(LIBJUCE_INCLUDE_DIRS ${LIBJUCE_BASE_DIR} ) - - include(FindPackageHandleStandardArgs) # handle the QUIETLY and REQUIRED arguments and set LIBJUCE_FOUND to TRUE # if all listed variables are TRUE diff --git a/include/AudioBufferSource.h b/include/AudioBufferSource.h index 0ad964af..6707e93c 100644 --- a/include/AudioBufferSource.h +++ b/include/AudioBufferSource.h @@ -11,7 +11,7 @@ #define __JUCE_UNITTEST_JUCEHEADER__ #include -#include "juce.h" +#include "JuceLibraryCode/JuceHeader.h using namespace std; diff --git a/src/juce/JuceLibraryCode/AppConfig.h b/src/juce/JuceLibraryCode/AppConfig.h deleted file mode 100644 index cc2ff361..00000000 --- a/src/juce/JuceLibraryCode/AppConfig.h +++ /dev/null @@ -1,158 +0,0 @@ -/* - - IMPORTANT! This file is auto-generated each time you save your - 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. - - Any commented-out settings will assume their default values. - -*/ - -#ifndef __JUCE_APPCONFIG_IIUU5J__ -#define __JUCE_APPCONFIG_IIUU5J__ - -//============================================================================== -// [BEGIN_USER_CODE_SECTION] - -// (You can add your own code in this section, and the Introjucer will not overwrite it) - -// [END_USER_CODE_SECTION] - -//============================================================================== -#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_processors 1 -#define JUCE_MODULE_AVAILABLE_juce_core 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 - -//============================================================================== -// juce_audio_devices flags: - -#ifndef JUCE_ASIO - //#define JUCE_ASIO -#endif - -#ifndef JUCE_WASAPI - //#define JUCE_WASAPI -#endif - -#ifndef JUCE_DIRECTSOUND - //#define JUCE_DIRECTSOUND -#endif - -#ifndef JUCE_ALSA - //#define JUCE_ALSA -#endif - -#ifndef JUCE_JACK - //#define JUCE_JACK -#endif - -#ifndef JUCE_USE_ANDROID_OPENSLES - //#define JUCE_USE_ANDROID_OPENSLES -#endif - -#ifndef JUCE_USE_CDREADER - //#define JUCE_USE_CDREADER -#endif - -#ifndef JUCE_USE_CDBURNER - //#define JUCE_USE_CDBURNER -#endif - -//============================================================================== -// juce_audio_formats flags: - -#ifndef JUCE_USE_FLAC - #define JUCE_USE_FLAC 0 -#endif - -#ifndef JUCE_USE_OGGVORBIS - #define JUCE_USE_OGGVORBIS 0 -#endif - -#ifndef JUCE_USE_MP3AUDIOFORMAT - #define JUCE_USE_MP3AUDIOFORMAT 0 -#endif - -#ifndef JUCE_USE_WINDOWS_MEDIA_FORMAT - #define JUCE_USE_WINDOWS_MEDIA_FORMAT 0 -#endif - -//============================================================================== -// juce_audio_processors flags: - -#ifndef JUCE_PLUGINHOST_VST - //#define JUCE_PLUGINHOST_VST -#endif - -#ifndef JUCE_PLUGINHOST_AU - //#define JUCE_PLUGINHOST_AU -#endif - -//============================================================================== -// juce_core flags: - -#ifndef JUCE_FORCE_DEBUG - //#define JUCE_FORCE_DEBUG -#endif - -#ifndef JUCE_LOG_ASSERTIONS - //#define JUCE_LOG_ASSERTIONS -#endif - -#ifndef JUCE_CHECK_MEMORY_LEAKS - //#define JUCE_CHECK_MEMORY_LEAKS -#endif - -#ifndef JUCE_DONT_AUTOLINK_TO_WIN32_LIBRARIES - //#define JUCE_DONT_AUTOLINK_TO_WIN32_LIBRARIES -#endif - -//============================================================================== -// juce_graphics flags: - -#ifndef JUCE_USE_COREIMAGE_LOADER - #define JUCE_USE_COREIMAGE_LOADER 0 -#endif - -#ifndef JUCE_USE_DIRECTWRITE - #define JUCE_USE_DIRECTWRITE 0 -#endif - -//============================================================================== -// juce_gui_basics flags: - -#ifndef JUCE_ENABLE_REPAINT_DEBUGGING - //#define JUCE_ENABLE_REPAINT_DEBUGGING -#endif - -#ifndef JUCE_USE_XSHM - //#define JUCE_USE_XSHM -#endif - -#ifndef JUCE_USE_XRENDER - //#define JUCE_USE_XRENDER -#endif - -#ifndef JUCE_USE_XCURSOR - //#define JUCE_USE_XCURSOR -#endif - -//============================================================================== -// juce_gui_extra flags: - -#ifndef JUCE_WEB_BROWSER - #define JUCE_WEB_BROWSER 0 -#endif - - -#endif // __JUCE_APPCONFIG_IIUU5J__ diff --git a/src/juce/JuceLibraryCode/JuceHeader.h b/src/juce/JuceLibraryCode/JuceHeader.h deleted file mode 100644 index 171f798d..00000000 --- a/src/juce/JuceLibraryCode/JuceHeader.h +++ /dev/null @@ -1,41 +0,0 @@ -/* - - IMPORTANT! This file is auto-generated each time you save your - project - if you alter its contents, your changes may be overwritten! - - This is the header file that your files should include in order to get all the - JUCE library headers. You should avoid including the JUCE headers directly in - your own source files, because that wouldn't pick up the correct configuration - options for your app. - -*/ - -#ifndef __APPHEADERFILE_IIUU5J__ -#define __APPHEADERFILE_IIUU5J__ - -#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_processors/juce_audio_processors.h" -#include "modules/juce_core/juce_core.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" - -#if ! DONT_SET_USING_JUCE_NAMESPACE - // If your code uses a lot of JUCE classes, then this will obviously save you - // a lot of typing, but can be disabled by setting DONT_SET_USING_JUCE_NAMESPACE. - using namespace juce; -#endif - -namespace ProjectInfo -{ - const char* const projectName = "OpenShotLibrary"; - const char* const versionString = "1.0.0"; - const int versionNumber = 0x10000; -} - -#endif // __APPHEADERFILE_IIUU5J__ diff --git a/src/juce/JuceLibraryCode/ReadMe.txt b/src/juce/JuceLibraryCode/ReadMe.txt deleted file mode 100644 index f6c3564e..00000000 --- a/src/juce/JuceLibraryCode/ReadMe.txt +++ /dev/null @@ -1,12 +0,0 @@ - - Important Note!! - ================ - -The purpose of this folder is to contain files that are auto-generated by the Introjucer, -and ALL files in this folder will be mercilessly DELETED and completely re-written whenever -the Introjucer 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). diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioDataConverters.cpp b/src/juce/JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioDataConverters.cpp deleted file mode 100644 index 0bd62d55..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioDataConverters.cpp +++ /dev/null @@ -1,601 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce 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) - { - test (unitTest, false); - test (unitTest, true); - } - - static void test (UnitTest& unitTest, bool inPlace) - { - const int numSamples = 2048; - int32 original [numSamples], converted [numSamples], reversed [numSamples]; - Random r; - - { - 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) - { - Test5 ::test (unitTest); - Test5 ::test (unitTest); - } - }; - - template - struct Test2 - { - static void test (UnitTest& unitTest) - { - Test3 ::test (unitTest); - Test3 ::test (unitTest); - Test3 ::test (unitTest); - Test3 ::test (unitTest); - Test3 ::test (unitTest); - Test3 ::test (unitTest); - } - }; - - template - struct Test1 - { - static void test (UnitTest& unitTest) - { - Test2 ::test (unitTest); - Test2 ::test (unitTest); - } - }; - - void runTest() - { - beginTest ("Round-trip conversion: Int8"); - Test1 ::test (*this); - beginTest ("Round-trip conversion: Int16"); - Test1 ::test (*this); - beginTest ("Round-trip conversion: Int24"); - Test1 ::test (*this); - beginTest ("Round-trip conversion: Int32"); - Test1 ::test (*this); - beginTest ("Round-trip conversion: Float32"); - Test1 ::test (*this); - } -}; - -static AudioConversionTests audioConversionUnitTests; - -#endif diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioDataConverters.h b/src/juce/JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioDataConverters.h deleted file mode 100644 index e7055146..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioDataConverters.h +++ /dev/null @@ -1,644 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_AUDIODATACONVERTERS_JUCEHEADER__ -#define __JUCE_AUDIODATACONVERTERS_JUCEHEADER__ - - -//============================================================================== -/** - 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* data_) noexcept : data (static_cast (data_)) {} - - 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* data_) noexcept : data (static_cast (data_)) {} - - 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* data_) noexcept : data (static_cast (data_)) {} - - 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* data_) noexcept : data (static_cast (data_)) {} - - 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* data_) noexcept : data (static_cast (data_)) {} - - 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 }; - }; - - class Float32 - { - public: - inline Float32 (void* data_) noexcept : data (static_cast (data_)) {} - - 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 numInterleavedChannels_) noexcept : numInterleavedChannels (numInterleavedChannels_) {} - 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 numInterleavedChannels) noexcept - : InterleavingType (numInterleavedChannels), 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! - - Pointer dest (*this); - while (--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); - } - - /** 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) - {} - - ~ConverterInstance() {} - - void convertSamples (void* dest, const void* source, int numSamples) const - { - 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 - { - 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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.cpp b/src/juce/JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.cpp deleted file mode 100644 index 2d464825..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.cpp +++ /dev/null @@ -1,551 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -AudioSampleBuffer::AudioSampleBuffer (const int numChannels_, - const int numSamples) noexcept - : numChannels (numChannels_), - size (numSamples) -{ - jassert (numSamples >= 0); - jassert (numChannels_ > 0); - - allocateData(); -} - -AudioSampleBuffer::AudioSampleBuffer (const AudioSampleBuffer& other) noexcept - : numChannels (other.numChannels), - size (other.size) -{ - allocateData(); - const size_t numBytes = sizeof (float) * (size_t) size; - - for (int i = 0; i < numChannels; ++i) - memcpy (channels[i], other.channels[i], numBytes); -} - -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] = 0; -} - -AudioSampleBuffer::AudioSampleBuffer (float** dataToReferTo, - const int numChannels_, - const int numSamples) noexcept - : numChannels (numChannels_), - size (numSamples), - allocatedBytes (0) -{ - jassert (numChannels_ > 0); - allocateChannels (dataToReferTo, 0); -} - -AudioSampleBuffer::AudioSampleBuffer (float** dataToReferTo, - const int numChannels_, - const int startSample, - const int numSamples) noexcept - : numChannels (numChannels_), - size (numSamples), - allocatedBytes (0) -{ - jassert (numChannels_ > 0); - allocateChannels (dataToReferTo, startSample); -} - -void AudioSampleBuffer::setDataToReferTo (float** dataToReferTo, - const int newNumChannels, - const int newNumSamples) noexcept -{ - jassert (newNumChannels > 0); - - allocatedBytes = 0; - allocatedData.free(); - - numChannels = newNumChannels; - size = newNumSamples; - - allocateChannels (dataToReferTo, 0); -} - -void AudioSampleBuffer::allocateChannels (float** const dataToReferTo, int offset) -{ - // (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] = 0; -} - -AudioSampleBuffer& AudioSampleBuffer::operator= (const AudioSampleBuffer& other) noexcept -{ - if (this != &other) - { - setSize (other.getNumChannels(), other.getNumSamples(), false, false, false); - - const size_t numBytes = sizeof (float) * (size_t) size; - - for (int i = 0; i < numChannels; ++i) - memcpy (channels[i], other.channels[i], numBytes); - } - - 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 channelListSize = sizeof (float*) * (size_t) (newNumChannels + 1); - const size_t newTotalBytes = ((size_t) newNumChannels * (size_t) newNumSamples * sizeof (float)) + channelListSize + 32; - - if (keepExistingContent) - { - HeapBlock newData; - newData.allocate (newTotalBytes, clearExtraSpace); - - const size_t numBytesToCopy = sizeof (float) * (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 += newNumSamples; - } - - const int numChansToCopy = jmin (numChannels, newNumChannels); - for (int i = 0; i < numChansToCopy; ++i) - memcpy (newChannels[i], channels[i], numBytesToCopy); - - allocatedData.swapWith (newData); - allocatedBytes = newTotalBytes; - channels = newChannels; - } - else - { - if (avoidReallocating && allocatedBytes >= newTotalBytes) - { - if (clearExtraSpace) - allocatedData.clear (newTotalBytes); - } - else - { - allocatedBytes = newTotalBytes; - allocatedData.allocate (newTotalBytes, clearExtraSpace); - channels = reinterpret_cast (allocatedData.getData()); - } - - float* chan = reinterpret_cast (allocatedData + channelListSize); - for (int i = 0; i < newNumChannels; ++i) - { - channels[i] = chan; - chan += newNumSamples; - } - } - - channels [newNumChannels] = 0; - size = newNumSamples; - numChannels = newNumChannels; - } -} - -void AudioSampleBuffer::clear() noexcept -{ - for (int i = 0; i < numChannels; ++i) - zeromem (channels[i], sizeof (float) * (size_t) size); -} - -void AudioSampleBuffer::clear (const int startSample, - const int numSamples) noexcept -{ - jassert (startSample >= 0 && startSample + numSamples <= size); - - for (int i = 0; i < numChannels; ++i) - zeromem (channels [i] + startSample, sizeof (float) * (size_t) numSamples); -} - -void AudioSampleBuffer::clear (const int channel, - const int startSample, - const int numSamples) noexcept -{ - jassert (isPositiveAndBelow (channel, numChannels)); - jassert (startSample >= 0 && startSample + numSamples <= size); - - zeromem (channels [channel] + startSample, sizeof (float) * (size_t) numSamples); -} - -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) - { - float* d = channels [channel] + startSample; - - if (gain == 0.0f) - { - zeromem (d, sizeof (float) * (size_t) numSamples); - } - else - { - while (--numSamples >= 0) - *d++ *= gain; - } - } -} - -void AudioSampleBuffer::applyGainRamp (const int channel, - const int startSample, - int numSamples, - float startGain, - float endGain) noexcept -{ - 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 (const int startSample, - const int numSamples, - const float gain) noexcept -{ - for (int i = 0; i < numChannels; ++i) - applyGain (i, startSample, numSamples, gain); -} - -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) - { - float* d = channels [destChannel] + destStartSample; - const float* s = source.channels [sourceChannel] + sourceStartSample; - - if (gain != 1.0f) - { - while (--numSamples >= 0) - *d++ += gain * *s++; - } - else - { - while (--numSamples >= 0) - *d++ += *s++; - } - } -} - -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* d = channels [destChannel] + destStartSample; - - if (gain != 1.0f) - { - while (--numSamples >= 0) - *d++ += gain * *source++; - } - else - { - while (--numSamples >= 0) - *d++ += *source++; - } - } -} - -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)) - { - 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) - { - memcpy (channels [destChannel] + destStartSample, - source.channels [sourceChannel] + sourceStartSample, - sizeof (float) * (size_t) 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) - { - memcpy (channels [destChannel] + destStartSample, - source, - sizeof (float) * (size_t) 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* d = channels [destChannel] + destStartSample; - - if (gain != 1.0f) - { - if (gain == 0) - { - zeromem (d, sizeof (float) * (size_t) numSamples); - } - else - { - while (--numSamples >= 0) - *d++ = gain * *source++; - } - } - else - { - memcpy (d, source, sizeof (float) * (size_t) 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)) - { - const float increment = (endGain - startGain) / numSamples; - float* d = channels [destChannel] + destStartSample; - - while (--numSamples >= 0) - { - *d++ = startGain * *source++; - startGain += increment; - } - } - } -} - -void AudioSampleBuffer::findMinMax (const int channel, - const int startSample, - int numSamples, - float& minVal, - float& maxVal) const noexcept -{ - jassert (isPositiveAndBelow (channel, numChannels)); - jassert (startSample >= 0 && startSample + numSamples <= size); - - findMinAndMax (channels [channel] + startSample, numSamples, minVal, maxVal); -} - -float AudioSampleBuffer::getMagnitude (const int channel, - const int startSample, - const int numSamples) const noexcept -{ - jassert (isPositiveAndBelow (channel, numChannels)); - jassert (startSample >= 0 && startSample + numSamples <= size); - - float mn, mx; - findMinMax (channel, startSample, numSamples, mn, mx); - - return jmax (mn, -mn, mx, -mx); -} - -float AudioSampleBuffer::getMagnitude (const int startSample, - const int numSamples) const noexcept -{ - float mag = 0.0f; - - 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) - 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/src/juce/JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.h b/src/juce/JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.h deleted file mode 100644 index 485df1af..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.h +++ /dev/null @@ -1,430 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_AUDIOSAMPLEBUFFER_JUCEHEADER__ -#define __JUCE_AUDIOSAMPLEBUFFER_JUCEHEADER__ - - -//============================================================================== -/** - A multi-channel buffer of 32-bit floating point audio samples. - -*/ -class JUCE_API AudioSampleBuffer -{ -public: - //============================================================================== - /** 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** 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** 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& other) noexcept; - - /** Copies another buffer onto this one. - - This buffer's size will be changed to that of the other buffer. - */ - AudioSampleBuffer& operator= (const AudioSampleBuffer& other) noexcept; - - /** Destructor. - - This will free any memory allocated by the buffer. - */ - virtual ~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 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! - */ - float* getSampleData (const int channelNumber) const noexcept - { - jassert (isPositiveAndBelow (channelNumber, numChannels)); - return channels [channelNumber]; - } - - /** Returns a pointer to a sample in one of the buffer's channels. - - For speed, this doesn't check whether the channel and sample number - are out-of-range, so be careful when using it! - */ - float* getSampleData (const int channelNumber, - const int sampleOffset) const noexcept - { - jassert (isPositiveAndBelow (channelNumber, numChannels)); - jassert (isPositiveAndBelow (sampleOffset, size)); - return channels [channelNumber] + sampleOffset; - } - - /** 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** getArrayOfChannels() const noexcept { 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; - - /** 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 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; - - /** 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; - - - /** Finds the highest and lowest sample values in a given range. - - @param channel the channel to read from - @param startSample the start sample within the channel - @param numSamples the number of samples to check - @param minVal on return, the lowest value that was found - @param maxVal on return, the highest value that was found - */ - void findMinMax (int channel, - int startSample, - int numSamples, - float& minVal, - float& maxVal) 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; - -private: - //============================================================================== - int numChannels, size; - size_t allocatedBytes; - float** channels; - HeapBlock allocatedData; - float* preallocatedChannelSpace [32]; - - void allocateData(); - void allocateChannels (float** dataToReferTo, int offset); - - JUCE_LEAK_DETECTOR (AudioSampleBuffer); -}; - - -#endif // __JUCE_AUDIOSAMPLEBUFFER_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_basics/effects/juce_Decibels.h b/src/juce/JuceLibraryCode/modules/juce_audio_basics/effects/juce_Decibels.h deleted file mode 100644 index f139be00..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_basics/effects/juce_Decibels.h +++ /dev/null @@ -1,104 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_DECIBELS_JUCEHEADER__ -#define __JUCE_DECIBELS_JUCEHEADER__ - -//============================================================================== -/** - 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 ? powf ((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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_basics/effects/juce_IIRFilter.cpp b/src/juce/JuceLibraryCode/modules/juce_audio_basics/effects/juce_IIRFilter.cpp deleted file mode 100644 index c09b41a8..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_basics/effects/juce_IIRFilter.cpp +++ /dev/null @@ -1,252 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#if JUCE_INTEL - #define JUCE_SNAP_TO_ZERO(n) if (! (n < -1.0e-8 || n > 1.0e-8)) n = 0; -#else - #define JUCE_SNAP_TO_ZERO(n) -#endif - -//============================================================================== -IIRFilter::IIRFilter() - : active (false) -{ - reset(); -} - -IIRFilter::IIRFilter (const IIRFilter& other) - : active (other.active) -{ - const ScopedLock sl (other.processLock); - memcpy (coefficients, other.coefficients, sizeof (coefficients)); - reset(); -} - -IIRFilter::~IIRFilter() -{ -} - -//============================================================================== -void IIRFilter::reset() noexcept -{ - const ScopedLock sl (processLock); - - x1 = 0; - x2 = 0; - y1 = 0; - y2 = 0; -} - -float IIRFilter::processSingleSampleRaw (const float in) noexcept -{ - float out = coefficients[0] * in - + coefficients[1] * x1 - + coefficients[2] * x2 - - coefficients[4] * y1 - - coefficients[5] * y2; - - JUCE_SNAP_TO_ZERO (out); - - x2 = x1; - x1 = in; - y2 = y1; - y1 = out; - - return out; -} - -void IIRFilter::processSamples (float* const samples, - const int numSamples) noexcept -{ - const ScopedLock sl (processLock); - - if (active) - { - for (int i = 0; i < numSamples; ++i) - { - const float in = samples[i]; - - float out = coefficients[0] * in - + coefficients[1] * x1 - + coefficients[2] * x2 - - coefficients[4] * y1 - - coefficients[5] * y2; - - JUCE_SNAP_TO_ZERO (out); - - x2 = x1; - x1 = in; - y2 = y1; - y1 = out; - - samples[i] = out; - } - } -} - -//============================================================================== -void IIRFilter::makeLowPass (const double sampleRate, - const double frequency) noexcept -{ - jassert (sampleRate > 0); - - const double n = 1.0 / tan (double_Pi * frequency / sampleRate); - const double nSquared = n * n; - const double c1 = 1.0 / (1.0 + std::sqrt (2.0) * n + nSquared); - - setCoefficients (c1, - c1 * 2.0f, - c1, - 1.0, - c1 * 2.0 * (1.0 - nSquared), - c1 * (1.0 - std::sqrt (2.0) * n + nSquared)); -} - -void IIRFilter::makeHighPass (const double sampleRate, - const double frequency) noexcept -{ - const double n = tan (double_Pi * frequency / sampleRate); - const double nSquared = n * n; - const double c1 = 1.0 / (1.0 + std::sqrt (2.0) * n + nSquared); - - setCoefficients (c1, - c1 * -2.0f, - c1, - 1.0, - c1 * 2.0 * (nSquared - 1.0), - c1 * (1.0 - std::sqrt (2.0) * n + nSquared)); -} - -void IIRFilter::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, 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; - - setCoefficients (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); -} - -void IIRFilter::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, 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; - - setCoefficients (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); -} - -void IIRFilter::makeBandPass (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, 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; - - setCoefficients (1.0 + alphaTimesA, - c2, - 1.0 - alphaTimesA, - 1.0 + alphaOverA, - c2, - 1.0 - alphaOverA); -} - -void IIRFilter::makeInactive() noexcept -{ - const ScopedLock sl (processLock); - active = false; -} - -//============================================================================== -void IIRFilter::copyCoefficientsFrom (const IIRFilter& other) noexcept -{ - const ScopedLock sl (processLock); - - memcpy (coefficients, other.coefficients, sizeof (coefficients)); - active = other.active; -} - -//============================================================================== -void IIRFilter::setCoefficients (double c1, double c2, double c3, - double c4, double c5, double c6) noexcept -{ - const double a = 1.0 / c4; - - c1 *= a; - c2 *= a; - c3 *= a; - c5 *= a; - c6 *= a; - - const ScopedLock sl (processLock); - - coefficients[0] = (float) c1; - coefficients[1] = (float) c2; - coefficients[2] = (float) c3; - coefficients[3] = (float) c4; - coefficients[4] = (float) c5; - coefficients[5] = (float) c6; - - active = true; -} - -#undef JUCE_SNAP_TO_ZERO diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_basics/effects/juce_IIRFilter.h b/src/juce/JuceLibraryCode/modules/juce_audio_basics/effects/juce_IIRFilter.h deleted file mode 100644 index 78e2df6a..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_basics/effects/juce_IIRFilter.h +++ /dev/null @@ -1,149 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_IIRFILTER_JUCEHEADER__ -#define __JUCE_IIRFILTER_JUCEHEADER__ - - -//============================================================================== -/** - An IIR filter that can perform low, high, or band-pass filtering on an - audio signal. - - @see 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 appropriate method to turn it into the type - of filter needed. - */ - IIRFilter(); - - /** Creates a copy of another filter. */ - IIRFilter (const IIRFilter& other); - - /** Destructor. */ - ~IIRFilter(); - - //============================================================================== - /** 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; - - //============================================================================== - /** Sets the filter up to act as a low-pass filter. - */ - void makeLowPass (double sampleRate, - double frequency) noexcept; - - /** Sets the filter up to act as a high-pass filter. - */ - void makeHighPass (double sampleRate, - double frequency) noexcept; - - //============================================================================== - /** Sets the filter up to act as 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. - */ - void makeLowShelf (double sampleRate, - double cutOffFrequency, - double Q, - float gainFactor) noexcept; - - /** Sets the filter up to act as 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. - */ - void makeHighShelf (double sampleRate, - double cutOffFrequency, - double Q, - float gainFactor) noexcept; - - /** Sets the filter up to act as a band pass filter centred around a - 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. - */ - void makeBandPass (double sampleRate, - double centreFrequency, - double Q, - float gainFactor) noexcept; - - /** Clears the filter's coefficients so that it becomes inactive. - */ - void makeInactive() noexcept; - - //============================================================================== - /** Makes this filter duplicate the set-up of another one. - */ - void copyCoefficientsFrom (const IIRFilter& other) noexcept; - - -protected: - //============================================================================== - CriticalSection processLock; - - void setCoefficients (double c1, double c2, double c3, - double c4, double c5, double c6) noexcept; - - bool active; - float coefficients[6]; - float x1, x2, y1, y2; - - // (use the copyCoefficientsFrom() method instead of this operator) - IIRFilter& operator= (const IIRFilter&); - JUCE_LEAK_DETECTOR (IIRFilter); -}; - - -#endif // __JUCE_IIRFILTER_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_basics/effects/juce_Reverb.h b/src/juce/JuceLibraryCode/modules/juce_audio_basics/effects/juce_Reverb.h deleted file mode 100644 index e4daa01c..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_basics/effects/juce_Reverb.h +++ /dev/null @@ -1,325 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_REVERB_JUCEHEADER__ -#define __JUCE_REVERB_JUCEHEADER__ - - -//============================================================================== -/** - 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; - wet1 = wet * (newParams.width * 0.5f + 0.5f); - wet2 = wet * (1.0f - newParams.width) * 0.5f; - dry = newParams.dryLevel * dryScaleFactor; - gain = isFrozen (newParams.freezeMode) ? 0.0f : 0.015f; - parameters = newParams; - shouldUpdateDamping = true; - } - - //============================================================================== - /** 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; - - int i; - for (i = 0; i < numCombs; ++i) - { - comb[0][i].setSize ((intSampleRate * combTunings[i]) / 44100); - comb[1][i].setSize ((intSampleRate * (combTunings[i] + stereoSpread)) / 44100); - } - - for (i = 0; i < numAllPasses; ++i) - { - allPass[0][i].setSize ((intSampleRate * allPassTunings[i]) / 44100); - allPass[1][i].setSize ((intSampleRate * (allPassTunings[i] + stereoSpread)) / 44100); - } - - shouldUpdateDamping = true; - } - - /** Clears the reverb's buffers. */ - void reset() - { - for (int j = 0; j < numChannels; ++j) - { - int i; - for (i = 0; i < numCombs; ++i) - comb[j][i].clear(); - - for (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); - - if (shouldUpdateDamping) - updateDamping(); - - for (int i = 0; i < numSamples; ++i) - { - const float input = (left[i] + right[i]) * gain; - float outL = 0, outR = 0; - - int j; - for (j = 0; j < numCombs; ++j) // accumulate the comb filters in parallel - { - outL += comb[0][j].process (input); - outR += comb[1][j].process (input); - } - - for (j = 0; j < numAllPasses; ++j) // run the allpass filters in series - { - outL = allPass[0][j].process (outL); - outR = allPass[1][j].process (outR); - } - - 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); - - if (shouldUpdateDamping) - updateDamping(); - - for (int i = 0; i < numSamples; ++i) - { - const float input = samples[i] * gain; - float output = 0; - - int j; - for (j = 0; j < numCombs; ++j) // accumulate the comb filters in parallel - output += comb[0][j].process (input); - - for (j = 0; j < numAllPasses; ++j) // run the allpass filters in series - output = allPass[0][j].process (output); - - samples[i] = output * wet1 + input * dry; - } - } - -private: - //============================================================================== - Parameters parameters; - - volatile bool shouldUpdateDamping; - float gain, wet1, wet2, dry; - - inline 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; - - shouldUpdateDamping = false; - - if (isFrozen (parameters.freezeMode)) - setDamping (1.0f, 0.0f); - else - setDamping (parameters.damping * dampScaleFactor, - parameters.roomSize * roomScaleFactor + roomOffset); - } - - void setDamping (const float dampingToUse, const float roomSizeToUse) noexcept - { - for (int j = 0; j < numChannels; ++j) - for (int i = numCombs; --i >= 0;) - comb[j][i].setFeedbackAndDamp (roomSizeToUse, dampingToUse); - } - - //============================================================================== - class CombFilter - { - public: - CombFilter() 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 - { - last = 0; - buffer.clear ((size_t) bufferSize); - } - - void setFeedbackAndDamp (const float f, const float d) noexcept - { - damp1 = d; - damp2 = 1.0f - d; - feedback = f; - } - - inline float process (const float input) noexcept - { - const float output = buffer [bufferIndex]; - last = (output * damp2) + (last * damp1); - JUCE_UNDENORMALISE (last); - - float temp = input + (last * feedback); - JUCE_UNDENORMALISE (temp); - buffer [bufferIndex] = temp; - bufferIndex = (bufferIndex + 1) % bufferSize; - return output; - } - - private: - HeapBlock buffer; - int bufferSize, bufferIndex; - float feedback, last, damp1, damp2; - - 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); - } - - inline 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); - }; - - enum { numCombs = 8, numAllPasses = 4, numChannels = 2 }; - - CombFilter comb [numChannels][numCombs]; - AllPassFilter allPass [numChannels][numAllPasses]; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Reverb); -}; - - -#endif // __JUCE_REVERB_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_basics/juce_audio_basics.cpp b/src/juce/JuceLibraryCode/modules/juce_audio_basics/juce_audio_basics.cpp deleted file mode 100644 index 45e87a6c..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_basics/juce_audio_basics.cpp +++ /dev/null @@ -1,63 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#if defined (__JUCE_AUDIO_BASICS_JUCEHEADER__) && ! 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" - -namespace juce -{ - -// START_AUTOINCLUDE buffers/*.cpp, effects/*.cpp, midi/*.cpp, sources/*.cpp, synthesisers/*.cpp -#include "buffers/juce_AudioDataConverters.cpp" -#include "buffers/juce_AudioSampleBuffer.cpp" -#include "effects/juce_IIRFilter.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" -// END_AUTOINCLUDE - -} diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_basics/juce_audio_basics.h b/src/juce/JuceLibraryCode/modules/juce_audio_basics/juce_audio_basics.h deleted file mode 100644 index fe513ba0..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_basics/juce_audio_basics.h +++ /dev/null @@ -1,100 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_AUDIO_BASICS_JUCEHEADER__ -#define __JUCE_AUDIO_BASICS_JUCEHEADER__ - -#include "../juce_core/juce_core.h" - -//============================================================================= -namespace juce -{ - -// START_AUTOINCLUDE buffers, effects, midi, sources, synthesisers -#ifndef __JUCE_AUDIODATACONVERTERS_JUCEHEADER__ - #include "buffers/juce_AudioDataConverters.h" -#endif -#ifndef __JUCE_AUDIOSAMPLEBUFFER_JUCEHEADER__ - #include "buffers/juce_AudioSampleBuffer.h" -#endif -#ifndef __JUCE_DECIBELS_JUCEHEADER__ - #include "effects/juce_Decibels.h" -#endif -#ifndef __JUCE_IIRFILTER_JUCEHEADER__ - #include "effects/juce_IIRFilter.h" -#endif -#ifndef __JUCE_REVERB_JUCEHEADER__ - #include "effects/juce_Reverb.h" -#endif -#ifndef __JUCE_MIDIBUFFER_JUCEHEADER__ - #include "midi/juce_MidiBuffer.h" -#endif -#ifndef __JUCE_MIDIFILE_JUCEHEADER__ - #include "midi/juce_MidiFile.h" -#endif -#ifndef __JUCE_MIDIKEYBOARDSTATE_JUCEHEADER__ - #include "midi/juce_MidiKeyboardState.h" -#endif -#ifndef __JUCE_MIDIMESSAGE_JUCEHEADER__ - #include "midi/juce_MidiMessage.h" -#endif -#ifndef __JUCE_MIDIMESSAGESEQUENCE_JUCEHEADER__ - #include "midi/juce_MidiMessageSequence.h" -#endif -#ifndef __JUCE_AUDIOSOURCE_JUCEHEADER__ - #include "sources/juce_AudioSource.h" -#endif -#ifndef __JUCE_BUFFERINGAUDIOSOURCE_JUCEHEADER__ - #include "sources/juce_BufferingAudioSource.h" -#endif -#ifndef __JUCE_CHANNELREMAPPINGAUDIOSOURCE_JUCEHEADER__ - #include "sources/juce_ChannelRemappingAudioSource.h" -#endif -#ifndef __JUCE_IIRFILTERAUDIOSOURCE_JUCEHEADER__ - #include "sources/juce_IIRFilterAudioSource.h" -#endif -#ifndef __JUCE_MIXERAUDIOSOURCE_JUCEHEADER__ - #include "sources/juce_MixerAudioSource.h" -#endif -#ifndef __JUCE_POSITIONABLEAUDIOSOURCE_JUCEHEADER__ - #include "sources/juce_PositionableAudioSource.h" -#endif -#ifndef __JUCE_RESAMPLINGAUDIOSOURCE_JUCEHEADER__ - #include "sources/juce_ResamplingAudioSource.h" -#endif -#ifndef __JUCE_REVERBAUDIOSOURCE_JUCEHEADER__ - #include "sources/juce_ReverbAudioSource.h" -#endif -#ifndef __JUCE_TONEGENERATORAUDIOSOURCE_JUCEHEADER__ - #include "sources/juce_ToneGeneratorAudioSource.h" -#endif -#ifndef __JUCE_SYNTHESISER_JUCEHEADER__ - #include "synthesisers/juce_Synthesiser.h" -#endif -// END_AUTOINCLUDE - -} - -#endif // __JUCE_AUDIO_BASICS_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_basics/juce_audio_basics.mm b/src/juce/JuceLibraryCode/modules/juce_audio_basics/juce_audio_basics.mm deleted file mode 100644 index 3feb355d..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_basics/juce_audio_basics.mm +++ /dev/null @@ -1,26 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#include "juce_audio_basics.cpp" diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_basics/juce_module_info b/src/juce/JuceLibraryCode/modules/juce_audio_basics/juce_module_info deleted file mode 100644 index 15121efa..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_basics/juce_module_info +++ /dev/null @@ -1,21 +0,0 @@ -{ - "id": "juce_audio_basics", - "name": "JUCE audio and midi data classes", - "version": "2.0.21", - "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/*" ] -} diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiBuffer.cpp b/src/juce/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiBuffer.cpp deleted file mode 100644 index 51bf691e..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiBuffer.cpp +++ /dev/null @@ -1,290 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce 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 (int)); - } - - inline uint16 getEventTotalSize (const void* const d) noexcept - { - return getEventDataSize (d) + sizeof (int) + 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; - } -} - -//============================================================================== -MidiBuffer::MidiBuffer() noexcept - : bytesUsed (0) -{ -} - -MidiBuffer::MidiBuffer (const MidiMessage& message) noexcept - : bytesUsed (0) -{ - addEvent (message, 0); -} - -MidiBuffer::MidiBuffer (const MidiBuffer& other) noexcept - : data (other.data), - bytesUsed (other.bytesUsed) -{ -} - -MidiBuffer& MidiBuffer::operator= (const MidiBuffer& other) noexcept -{ - bytesUsed = other.bytesUsed; - data = other.data; - - return *this; -} - -void MidiBuffer::swapWith (MidiBuffer& other) noexcept -{ - data.swapWith (other.data); - std::swap (bytesUsed, other.bytesUsed); -} - -MidiBuffer::~MidiBuffer() -{ -} - -inline uint8* MidiBuffer::getData() const noexcept -{ - return static_cast (data.getData()); -} - -void MidiBuffer::clear() noexcept -{ - bytesUsed = 0; -} - -void MidiBuffer::clear (const int startSample, const int numSamples) -{ - uint8* const start = findEventAfter (getData(), startSample - 1); - uint8* const end = findEventAfter (start, startSample + numSamples - 1); - - if (end > start) - { - const int bytesToMove = bytesUsed - (int) (end - getData()); - - if (bytesToMove > 0) - memmove (start, end, (size_t) bytesToMove); - - bytesUsed -= (int) (end - start); - } -} - -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) - { - size_t spaceNeeded = (size_t) bytesUsed + (size_t) numBytes + sizeof (int) + sizeof (uint16); - data.ensureSize ((spaceNeeded + spaceNeeded / 2 + 8) & ~(size_t) 7); - - uint8* d = findEventAfter (getData(), sampleNumber); - const int bytesToMove = bytesUsed - (int) (d - getData()); - - if (bytesToMove > 0) - memmove (d + numBytes + sizeof (int) + sizeof (uint16), d, (size_t) bytesToMove); - - *reinterpret_cast (d) = sampleNumber; - d += sizeof (int); - *reinterpret_cast (d) = (uint16) numBytes; - d += sizeof (uint16); - - memcpy (d, newData, (size_t) numBytes); - - bytesUsed += sizeof (int) + sizeof (uint16) + (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); - } -} - -void MidiBuffer::ensureSize (size_t minimumNumBytes) -{ - data.ensureSize (minimumNumBytes); -} - -bool MidiBuffer::isEmpty() const noexcept -{ - return bytesUsed == 0; -} - -int MidiBuffer::getNumEvents() const noexcept -{ - int n = 0; - const uint8* d = getData(); - const uint8* const end = d + bytesUsed; - - while (d < end) - { - d += MidiBufferHelpers::getEventTotalSize (d); - ++n; - } - - return n; -} - -int MidiBuffer::getFirstEventTime() const noexcept -{ - return bytesUsed > 0 ? MidiBufferHelpers::getEventTime (data.getData()) : 0; -} - -int MidiBuffer::getLastEventTime() const noexcept -{ - if (bytesUsed == 0) - return 0; - - const uint8* d = getData(); - const uint8* const endData = d + bytesUsed; - - for (;;) - { - const uint8* const nextOne = d + MidiBufferHelpers::getEventTotalSize (d); - - if (nextOne >= endData) - return MidiBufferHelpers::getEventTime (d); - - d = nextOne; - } -} - -uint8* MidiBuffer::findEventAfter (uint8* d, const int samplePosition) const noexcept -{ - const uint8* const endData = getData() + bytesUsed; - - while (d < endData && MidiBufferHelpers::getEventTime (d) <= samplePosition) - d += MidiBufferHelpers::getEventTotalSize (d); - - return d; -} - -//============================================================================== -MidiBuffer::Iterator::Iterator (const MidiBuffer& buffer_) noexcept - : buffer (buffer_), - data (buffer_.getData()) -{ -} - -MidiBuffer::Iterator::~Iterator() noexcept -{ -} - -//============================================================================== -void MidiBuffer::Iterator::setNextSamplePosition (const int samplePosition) noexcept -{ - data = buffer.getData(); - const uint8* dataEnd = data + buffer.bytesUsed; - - 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.getData() + buffer.bytesUsed) - return false; - - samplePosition = MidiBufferHelpers::getEventTime (data); - numBytes = MidiBufferHelpers::getEventDataSize (data); - data += sizeof (int) + sizeof (uint16); - midiData = data; - data += numBytes; - - return true; -} - -bool MidiBuffer::Iterator::getNextEvent (MidiMessage& result, int& samplePosition) noexcept -{ - if (data >= buffer.getData() + buffer.bytesUsed) - return false; - - samplePosition = MidiBufferHelpers::getEventTime (data); - const int numBytes = MidiBufferHelpers::getEventDataSize (data); - data += sizeof (int) + sizeof (uint16); - result = MidiMessage (data, numBytes, samplePosition); - data += numBytes; - - return true; -} diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiBuffer.h b/src/juce/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiBuffer.h deleted file mode 100644 index c30d725e..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiBuffer.h +++ /dev/null @@ -1,236 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_MIDIBUFFER_JUCEHEADER__ -#define __JUCE_MIDIBUFFER_JUCEHEADER__ - -#include "juce_MidiMessage.h" - - -//============================================================================== -/** - 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. - - @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& other) noexcept; - - /** Makes a copy of another MidiBuffer. */ - MidiBuffer& operator= (const MidiBuffer& other) 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& other) 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& buffer) 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 not set) - @param samplePosition on return, this will be the position of the event - @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 - @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); - }; - -private: - //============================================================================== - friend class MidiBuffer::Iterator; - MemoryBlock data; - int bytesUsed; - - uint8* getData() const noexcept; - uint8* findEventAfter (uint8*, int samplePosition) const noexcept; - - JUCE_LEAK_DETECTOR (MidiBuffer); -}; - - -#endif // __JUCE_MIDIBUFFER_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiFile.cpp b/src/juce/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiFile.cpp deleted file mode 100644 index 043775a9..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiFile.cpp +++ /dev/null @@ -1,427 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce 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) - { - 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; - } - else - { - return time / (((timeFormat & 0x7fff) >> 8) * (timeFormat & 0xff)); - } - } - - // 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; - } - }; -} - -//============================================================================== -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& tempoChangeEvents) const -{ - for (int i = tracks.size(); --i >= 0;) - { - const int numEvents = tracks.getUnchecked(i)->getNumEvents(); - - for (int j = 0; j < numEvents; ++j) - { - const MidiMessage& m = tracks.getUnchecked(i)->getEventPointer (j)->message; - - if (m.isTempoMetaEvent()) - tempoChangeEvents.addEvent (m); - } - } -} - -void MidiFile::findAllTimeSigEvents (MidiMessageSequence& timeSigEvents) const -{ - for (int i = tracks.size(); --i >= 0;) - { - const int numEvents = tracks.getUnchecked(i)->getNumEvents(); - - for (int j = 0; j < numEvents; ++j) - { - const MidiMessage& m = tracks.getUnchecked(i)->getEventPointer (j)->message; - - if (m.isTimeSignatureMetaEvent()) - timeSigEvents.addEvent (m); - } - } -} - -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); - - result.updateMatchedPairs(); - - addTrack (result); -} - -//============================================================================== -void MidiFile::convertTimestampTicksToSeconds() -{ - MidiMessageSequence tempoEvents; - findAllTempoEvents (tempoEvents); - findAllTimeSigEvents (tempoEvents); - - 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) -{ - out.writeIntBigEndian ((int) ByteOrder::bigEndianInt ("MThd")); - out.writeIntBigEndian (6); - out.writeShortBigEndian (1); // type - 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; - - for (int i = 0; i < ms.getNumEvents(); ++i) - { - const MidiMessage& mm = ms.getEventPointer(i)->message; - - if (! mm.isEndOfTrackMetaEvent()) - { - 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, dataSize); - lastStatusByte = statusByte; - } - } - - { - out.writeByte (0); // (tick delta) - const MidiMessage m (MidiMessage::endOfTrack()); - out.write (m.getRawData(), m.getRawDataSize()); - } - - mainOut.writeIntBigEndian ((int) ByteOrder::bigEndianInt ("MTrk")); - mainOut.writeIntBigEndian ((int) out.getDataSize()); - mainOut << out; -} diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiFile.h b/src/juce/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiFile.h deleted file mode 100644 index b98cf842..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiFile.h +++ /dev/null @@ -1,187 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_MIDIFILE_JUCEHEADER__ -#define __JUCE_MIDIFILE_JUCEHEADER__ - -#include "juce_MidiMessageSequence.h" - - -//============================================================================== -/** - 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 0 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; - - /** 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. - - @returns true if the operation succeeded. - */ - bool writeTo (OutputStream& destStream); - - /** 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* data, int size); - void writeTrack (OutputStream& mainOut, int trackNum); - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MidiFile); -}; - - -#endif // __JUCE_MIDIFILE_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiKeyboardState.cpp b/src/juce/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiKeyboardState.cpp deleted file mode 100644 index d3e37116..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiKeyboardState.cpp +++ /dev/null @@ -1,184 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce 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.removeValue (listener); -} diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiKeyboardState.h b/src/juce/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiKeyboardState.h deleted file mode 100644 index 90910ff6..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiKeyboardState.h +++ /dev/null @@ -1,209 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_MIDIKEYBOARDSTATE_JUCEHEADER__ -#define __JUCE_MIDIKEYBOARDSTATE_JUCEHEADER__ - -#include "juce_MidiBuffer.h" -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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessage.cpp b/src/juce/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessage.cpp deleted file mode 100644 index d8125b6c..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessage.cpp +++ /dev/null @@ -1,1048 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce 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; - int 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]; -} - -//============================================================================== -inline void MidiMessage::setToUseInternalData() noexcept -{ - data = static_cast (preallocatedData.asBytes); -} - -inline bool MidiMessage::usesAllocatedData() const noexcept -{ - return data != static_cast (preallocatedData.asBytes); -} - -inline void MidiMessage::freeData() noexcept -{ - if (usesAllocatedData()) - delete[] data; -} - -//============================================================================== -MidiMessage::MidiMessage() noexcept - : timeStamp (0), - data (static_cast (preallocatedData.asBytes)), - 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); - - if (dataSize <= 4) - setToUseInternalData(); - else - data = new uint8 [dataSize]; - - memcpy (data, d, (size_t) dataSize); - - // check that the length matches the data.. - jassert (size > 3 || data[0] >= 0xf0 || getMessageLengthFromFirstByte (data[0]) == size); -} - -MidiMessage::MidiMessage (const int byte1, const double t) noexcept - : timeStamp (t), - data (static_cast (preallocatedData.asBytes)), - 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), - data (static_cast (preallocatedData.asBytes)), - 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), - data (static_cast (preallocatedData.asBytes)), - 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.usesAllocatedData()) - { - data = new uint8 [size]; - memcpy (data, other.data, (size_t) size); - } - else - { - setToUseInternalData(); - preallocatedData.asInt32 = other.preallocatedData.asInt32; - } -} - -MidiMessage::MidiMessage (const MidiMessage& other, const double newTimeStamp) - : timeStamp (newTimeStamp), - size (other.size) -{ - if (other.usesAllocatedData()) - { - data = new uint8 [size]; - memcpy (data, other.data, (size_t) size); - } - else - { - setToUseInternalData(); - preallocatedData.asInt32 = other.preallocatedData.asInt32; - } -} - -MidiMessage::MidiMessage (const void* src_, int sz, int& numBytesUsed, const uint8 lastStatusByte, double t) - : timeStamp (t), - data (static_cast (preallocatedData.asBytes)) -{ - const uint8* src = static_cast (src_); - 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 = false; - 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; - ++d; - continue; - } - - if (! haveReadAllLengthBytes) - { - haveReadAllLengthBytes = true; - ++numVariableLengthSysexBytes; - } - - ++d; - } - - size = 1 + (int) (d - src); - - data = new uint8 [size - numVariableLengthSysexBytes]; - *data = (uint8) byte; - memcpy (data + 1, src + numVariableLengthSysexBytes, (size_t) (size - numVariableLengthSysexBytes - 1)); - } - else if (byte == 0xff) - { - int n; - const int bytesLeft = readVariableLengthVal (src + 1, n); - size = jmin (sz + 1, n + 2 + bytesLeft); - - data = new uint8 [size]; - *data = (uint8) byte; - memcpy (data + 1, src, (size_t) size - 1); - } - else - { - preallocatedData.asInt32 = 0; - size = getMessageLengthFromFirstByte ((uint8) byte); - data[0] = (uint8) byte; - - if (size > 1) - { - data[1] = src[0]; - - if (size > 2) - data[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; - - freeData(); - - if (other.usesAllocatedData()) - { - data = new uint8 [size]; - memcpy (data, other.data, (size_t) size); - } - else - { - setToUseInternalData(); - 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.usesAllocatedData()) - { - data = other.data; - other.setToUseInternalData(); - } - else - { - setToUseInternalData(); - preallocatedData.asInt32 = other.preallocatedData.asInt32; - } -} - -MidiMessage& MidiMessage::operator= (MidiMessage&& other) noexcept -{ - jassert (this != &other); // shouldn't be possible - - timeStamp = other.timeStamp; - size = other.size; - - freeData(); - - if (other.usesAllocatedData()) - { - data = other.data; - other.setToUseInternalData(); - } - else - { - setToUseInternalData(); - preallocatedData.asInt32 = other.preallocatedData.asInt32; - } - - return *this; -} -#endif - -MidiMessage::~MidiMessage() -{ - freeData(); -} - -int MidiMessage::getChannel() const noexcept -{ - 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 - - 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 - - if ((data[0] & 0xf0) != (uint8) 0xf0) - data[0] = (uint8) ((data[0] & (uint8) 0xf0) - | (uint8)(channel - 1)); -} - -bool MidiMessage::isNoteOn (const bool returnTrueForVelocity0) const noexcept -{ - return ((data[0] & 0xf0) == 0x90) - && (returnTrueForVelocity0 || data[2] != 0); -} - -bool MidiMessage::isNoteOff (const bool returnTrueForNoteOnVelocity0) const noexcept -{ - return ((data[0] & 0xf0) == 0x80) - || (returnTrueForNoteOnVelocity0 && (data[2] == 0) && ((data[0] & 0xf0) == 0x90)); -} - -bool MidiMessage::isNoteOnOrOff() const noexcept -{ - const int d = data[0] & 0xf0; - return (d == 0x90) || (d == 0x80); -} - -int MidiMessage::getNoteNumber() const noexcept -{ - return data[1]; -} - -void MidiMessage::setNoteNumber (const int newNoteNumber) noexcept -{ - if (isNoteOnOrOff()) - data[1] = (uint8) (newNoteNumber & 127); -} - -uint8 MidiMessage::getVelocity() const noexcept -{ - if (isNoteOnOrOff()) - return data[2]; - - return 0; -} - -float MidiMessage::getFloatVelocity() const noexcept -{ - return getVelocity() * (1.0f / 127.0f); -} - -void MidiMessage::setVelocity (const float newVelocity) noexcept -{ - if (isNoteOnOrOff()) - data[2] = MidiHelpers::validVelocity (roundToInt (newVelocity * 127.0f)); -} - -void MidiMessage::multiplyVelocity (const float scaleFactor) noexcept -{ - if (isNoteOnOrOff()) - data[2] = MidiHelpers::validVelocity (roundToInt (scaleFactor * data[2])); -} - -bool MidiMessage::isAftertouch() const noexcept -{ - return (data[0] & 0xf0) == 0xa0; -} - -int MidiMessage::getAfterTouchValue() const noexcept -{ - jassert (isAftertouch()); - return data[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 (data[0] & 0xf0) == 0xd0; -} - -int MidiMessage::getChannelPressureValue() const noexcept -{ - jassert (isChannelPressure()); - return data[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) && data[2] >= 64; } -bool MidiMessage::isSustainPedalOff() const noexcept { return isControllerOfType (0x40) && data[2] < 64; } - -bool MidiMessage::isSostenutoPedalOn() const noexcept { return isControllerOfType (0x42) && data[2] >= 64; } -bool MidiMessage::isSostenutoPedalOff() const noexcept { return isControllerOfType (0x42) && data[2] < 64; } - -bool MidiMessage::isSoftPedalOn() const noexcept { return isControllerOfType (0x43) && data[2] >= 64; } -bool MidiMessage::isSoftPedalOff() const noexcept { return isControllerOfType (0x43) && data[2] < 64; } - - -bool MidiMessage::isProgramChange() const noexcept -{ - return (data[0] & 0xf0) == 0xc0; -} - -int MidiMessage::getProgramChangeNumber() const noexcept -{ - jassert (isProgramChange()); - return data[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 (data[0] & 0xf0) == 0xe0; -} - -int MidiMessage::getPitchWheelValue() const noexcept -{ - jassert (isPitchWheel()); - 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 (data[0] & 0xf0) == 0xb0; -} - -bool MidiMessage::isControllerOfType (const int controllerType) const noexcept -{ - return (data[0] & 0xf0) == 0xb0 && data[1] == controllerType; -} - -int MidiMessage::getControllerNumber() const noexcept -{ - jassert (isController()); - return data[1]; -} - -int MidiMessage::getControllerValue() const noexcept -{ - jassert (isController()); - return data[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 -{ - 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 -{ - 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 *data == 0xf0; -} - -MidiMessage MidiMessage::createSysExMessage (const uint8* 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 *data == 0xff; } -bool MidiMessage::isActiveSense() const noexcept { return *data == 0xfe; } - -int MidiMessage::getMetaEventType() const noexcept -{ - return *data != 0xff ? -1 : data[1]; -} - -int MidiMessage::getMetaEventLength() const noexcept -{ - 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 = data + 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 -{ - return String (reinterpret_cast (getMetaEventData()), (size_t) getMetaEventLength()); -} - -bool MidiMessage::isTrackNameEvent() const noexcept { return (data[1] == 3) && (*data == 0xff); } -bool MidiMessage::isTempoMetaEvent() const noexcept { return (data[1] == 81) && (*data == 0xff); } -bool MidiMessage::isMidiChannelMetaEvent() const noexcept { return (data[1] == 0x20) && (*data == 0xff) && (data[2] == 1); } - -int MidiMessage::getMidiChannelMetaEventChannel() const noexcept -{ - jassert (isMidiChannelMetaEvent()); - return data[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 -{ - 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() == 89; -} - -int MidiMessage::getKeySignatureNumberOfSharpsOrFlats() const noexcept -{ - return (int) *getMetaEventData(); -} - -MidiMessage MidiMessage::endOfTrack() noexcept -{ - return MidiMessage (0xff, 0x2f, 0, 0.0); -} - -//============================================================================== -bool MidiMessage::isSongPositionPointer() const noexcept { return *data == 0xf2; } -int MidiMessage::getSongPositionPointerMidiBeat() const noexcept { 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 *data == 0xfa; } -MidiMessage MidiMessage::midiStart() noexcept { return MidiMessage (0xfa); } - -bool MidiMessage::isMidiContinue() const noexcept { return *data == 0xfb; } -MidiMessage MidiMessage::midiContinue() noexcept { return MidiMessage (0xfb); } - -bool MidiMessage::isMidiStop() const noexcept { return *data == 0xfc; } -MidiMessage MidiMessage::midiStop() noexcept { return MidiMessage (0xfc); } - -bool MidiMessage::isMidiClock() const noexcept { return *data == 0xf8; } -MidiMessage MidiMessage::midiClock() noexcept { return MidiMessage (0xf8); } - -bool MidiMessage::isQuarterFrame() const noexcept { return *data == 0xf1; } -int MidiMessage::getQuarterFrameSequenceNumber() const noexcept { return ((int) data[1]) >> 4; } -int MidiMessage::getQuarterFrameValue() const noexcept { return ((int) data[1]) & 0x0f; } - -MidiMessage MidiMessage::quarterFrame (const int sequenceNumber, const int value) noexcept -{ - return MidiMessage (0xf1, (sequenceNumber << 4) | value); -} - -bool MidiMessage::isFullFrame() const noexcept -{ - 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()); - - 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 -{ - return data[0] == 0xf0 - && data[1] == 0x7f - && data[3] == 0x06 - && size > 5; -} - -MidiMessage::MidiMachineControlCommand MidiMessage::getMidiMachineControlCommand() const noexcept -{ - jassert (isMidiMachineControlMessage()); - - return (MidiMachineControlCommand) data[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 -{ - 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; -} - -const double MidiMessage::getMidiNoteInHertz (int noteNumber, const double frequencyOfA) noexcept -{ - noteNumber -= 12 * 6 + 9; // now 0 = A - return frequencyOfA * pow (2.0, noteNumber / 12.0); -} - -String MidiMessage::getGMInstrumentName (const int n) -{ - const char* names[] = - { - "Acoustic Grand Piano", "Bright Acoustic Piano", "Electric Grand Piano", "Honky-tonk Piano", - "Electric Piano 1", "Electric Piano 2", "Harpsichord", "Clavinet", "Celesta", "Glockenspiel", - "Music Box", "Vibraphone", "Marimba", "Xylophone", "Tubular Bells", "Dulcimer", "Drawbar Organ", - "Percussive Organ", "Rock Organ", "Church Organ", "Reed Organ", "Accordion", "Harmonica", - "Tango Accordion", "Acoustic Guitar (nylon)", "Acoustic Guitar (steel)", "Electric Guitar (jazz)", - "Electric Guitar (clean)", "Electric Guitar (mute)", "Overdriven Guitar", "Distortion Guitar", - "Guitar Harmonics", "Acoustic Bass", "Electric Bass (finger)", "Electric Bass (pick)", - "Fretless Bass", "Slap Bass 1", "Slap Bass 2", "Synth Bass 1", "Synth Bass 2", "Violin", - "Viola", "Cello", "Contrabass", "Tremolo Strings", "Pizzicato Strings", "Orchestral Harp", - "Timpani", "String Ensemble 1", "String Ensemble 2", "SynthStrings 1", "SynthStrings 2", - "Choir Aahs", "Voice Oohs", "Synth Voice", "Orchestra Hit", "Trumpet", "Trombone", "Tuba", - "Muted Trumpet", "French Horn", "Brass Section", "SynthBrass 1", "SynthBrass 2", "Soprano Sax", - "Alto Sax", "Tenor Sax", "Baritone Sax", "Oboe", "English Horn", "Bassoon", "Clarinet", - "Piccolo", "Flute", "Recorder", "Pan Flute", "Blown Bottle", "Shakuhachi", "Whistle", - "Ocarina", "Lead 1 (square)", "Lead 2 (sawtooth)", "Lead 3 (calliope)", "Lead 4 (chiff)", - "Lead 5 (charang)", "Lead 6 (voice)", "Lead 7 (fifths)", "Lead 8 (bass+lead)", "Pad 1 (new age)", - "Pad 2 (warm)", "Pad 3 (polysynth)", "Pad 4 (choir)", "Pad 5 (bowed)", "Pad 6 (metallic)", - "Pad 7 (halo)", "Pad 8 (sweep)", "FX 1 (rain)", "FX 2 (soundtrack)", "FX 3 (crystal)", - "FX 4 (atmosphere)", "FX 5 (brightness)", "FX 6 (goblins)", "FX 7 (echoes)", "FX 8 (sci-fi)", - "Sitar", "Banjo", "Shamisen", "Koto", "Kalimba", "Bag pipe", "Fiddle", "Shanai", "Tinkle Bell", - "Agogo", "Steel Drums", "Woodblock", "Taiko Drum", "Melodic Tom", "Synth Drum", "Reverse Cymbal", - "Guitar Fret Noise", "Breath Noise", "Seashore", "Bird Tweet", "Telephone Ring", "Helicopter", - "Applause", "Gunshot" - }; - - return isPositiveAndBelow (n, (int) 128) ? names[n] : (const char*) 0; -} - -String MidiMessage::getGMInstrumentBankName (const int n) -{ - const char* names[] = - { - "Piano", "Chromatic Percussion", "Organ", "Guitar", - "Bass", "Strings", "Ensemble", "Brass", - "Reed", "Pipe", "Synth Lead", "Synth Pad", - "Synth Effects", "Ethnic", "Percussive", "Sound Effects" - }; - - return isPositiveAndBelow (n, (int) 16) ? names[n] : (const char*) 0; -} - -String MidiMessage::getRhythmInstrumentName (const int n) -{ - const char* names[] = - { - "Acoustic Bass Drum", "Bass Drum 1", "Side Stick", "Acoustic Snare", - "Hand Clap", "Electric Snare", "Low Floor Tom", "Closed Hi-Hat", "High Floor Tom", - "Pedal Hi-Hat", "Low Tom", "Open Hi-Hat", "Low-Mid Tom", "Hi-Mid Tom", "Crash Cymbal 1", - "High Tom", "Ride Cymbal 1", "Chinese Cymbal", "Ride Bell", "Tambourine", "Splash Cymbal", - "Cowbell", "Crash Cymbal 2", "Vibraslap", "Ride Cymbal 2", "Hi Bongo", "Low Bongo", - "Mute Hi Conga", "Open Hi Conga", "Low Conga", "High Timbale", "Low Timbale", "High Agogo", - "Low Agogo", "Cabasa", "Maracas", "Short Whistle", "Long Whistle", "Short Guiro", - "Long Guiro", "Claves", "Hi Wood Block", "Low Wood Block", "Mute Cuica", "Open Cuica", - "Mute Triangle", "Open Triangle" - }; - - return (n >= 35 && n <= 81) ? names [n - 35] : (const char*) nullptr; -} - -String MidiMessage::getControllerName (const int n) -{ - const char* names[] = - { - "Bank Select", "Modulation Wheel (coarse)", "Breath controller (coarse)", - 0, "Foot Pedal (coarse)", "Portamento Time (coarse)", - "Data Entry (coarse)", "Volume (coarse)", "Balance (coarse)", - 0, "Pan position (coarse)", "Expression (coarse)", "Effect Control 1 (coarse)", - "Effect Control 2 (coarse)", 0, 0, "General Purpose Slider 1", "General Purpose Slider 2", - "General Purpose Slider 3", "General Purpose Slider 4", 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, "Bank Select (fine)", "Modulation Wheel (fine)", "Breath controller (fine)", - 0, "Foot Pedal (fine)", "Portamento Time (fine)", "Data Entry (fine)", "Volume (fine)", - "Balance (fine)", 0, "Pan position (fine)", "Expression (fine)", "Effect Control 1 (fine)", - "Effect Control 2 (fine)", 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - "Hold Pedal (on/off)", "Portamento (on/off)", "Sustenuto Pedal (on/off)", "Soft Pedal (on/off)", - "Legato Pedal (on/off)", "Hold 2 Pedal (on/off)", "Sound Variation", "Sound Timbre", - "Sound Release Time", "Sound Attack Time", "Sound Brightness", "Sound Control 6", - "Sound Control 7", "Sound Control 8", "Sound Control 9", "Sound Control 10", - "General Purpose Button 1 (on/off)", "General Purpose Button 2 (on/off)", - "General Purpose Button 3 (on/off)", "General Purpose Button 4 (on/off)", - 0, 0, 0, 0, 0, 0, 0, "Reverb Level", "Tremolo Level", "Chorus Level", "Celeste Level", - "Phaser Level", "Data Button increment", "Data Button decrement", "Non-registered Parameter (fine)", - "Non-registered Parameter (coarse)", "Registered Parameter (fine)", "Registered Parameter (coarse)", - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "All Sound Off", "All Controllers Off", - "Local Keyboard (on/off)", "All Notes Off", "Omni Mode Off", "Omni Mode On", "Mono Operation", - "Poly Operation" - }; - - return isPositiveAndBelow (n, (int) 128) ? names[n] : (const char*) nullptr; -} diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessage.h b/src/juce/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessage.h deleted file mode 100644 index 7813f6fb..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessage.h +++ /dev/null @@ -1,940 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_MIDIMESSAGE_JUCEHEADER__ -#define __JUCE_MIDIMESSAGE_JUCEHEADER__ - - -//============================================================================== -/** - 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 - */ - MidiMessage (const void* data, int maxBytesToUse, - int& numBytesUsed, uint8 lastStatusByte, - double timeStamp = 0); - - /** 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& other); - - /** Creates a copy of another midi message, with a different timestamp. */ - MidiMessage (const MidiMessage& other, double newTimeStamp); - - /** Destructor. */ - ~MidiMessage(); - - /** Copies this message from another one. */ - MidiMessage& operator= (const MidiMessage& other); - - #if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS - MidiMessage (MidiMessage&& other) noexcept; - MidiMessage& operator= (MidiMessage&& other) noexcept; - #endif - - //============================================================================== - /** Returns a pointer to the raw midi data. - - @see getRawDataSize - */ - uint8* getRawData() const noexcept { return data; } - - /** 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 will be - nonsense. - - @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; - - //============================================================================== - /** 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 - */ - bool isKeySignatureMetaEvent() const noexcept; - - /** Returns the key from a key-signature meta-event. - - @see isKeySignatureMetaEvent - */ - int getKeySignatureNumberOfSharpsOrFlats() const noexcept; - - //============================================================================== - /** 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 uint8* 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 const double getMidiNoteInHertz (int noteNumber, const double frequencyOfA = 440.0) noexcept; - - /** Returns the standard name of a GM instrument. - - @param midiInstrumentNumber the program number 0 to 127 - @see getProgramChangeNumber - */ - static String getGMInstrumentName (int midiInstrumentNumber); - - /** Returns the name of a bank of GM instruments. - - @param midiBankNumber the bank, 0 to 15 - */ - static String getGMInstrumentBankName (int midiBankNumber); - - /** Returns the standard name of a channel 10 percussion sound. - - @param midiNoteNumber the key number, 35 to 81 - */ - static String getRhythmInstrumentName (int midiNoteNumber); - - /** Returns the name of a controller type number. - - @see getControllerNumber - */ - static String getControllerName (int controllerNumber); - -private: - //============================================================================== - double timeStamp; - uint8* data; - int size; - - #ifndef DOXYGEN - union - { - uint8 asBytes[4]; - uint32 asInt32; - } preallocatedData; - #endif - - void freeData() noexcept; - void setToUseInternalData() noexcept; - bool usesAllocatedData() const noexcept; -}; - -#endif // __JUCE_MIDIMESSAGE_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessageSequence.cpp b/src/juce/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessageSequence.cpp deleted file mode 100644 index 3493fb5a..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessageSequence.cpp +++ /dev/null @@ -1,327 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -MidiMessageSequence::MidiMessageSequence() -{ -} - -MidiMessageSequence::MidiMessageSequence (const MidiMessageSequence& other) -{ - list.ensureStorageAllocated (other.list.size()); - - for (int i = 0; i < other.list.size(); ++i) - list.add (new MidiEventHolder (other.list.getUnchecked(i)->message)); -} - -MidiMessageSequence& MidiMessageSequence::operator= (const MidiMessageSequence& other) -{ - MidiMessageSequence otherCopy (other); - swapWith (otherCopy); - return *this; -} - -void MidiMessageSequence::swapWith (MidiMessageSequence& other) noexcept -{ - list.swapWithArray (other.list); -} - -MidiMessageSequence::~MidiMessageSequence() -{ -} - -void MidiMessageSequence::clear() -{ - list.clear(); -} - -int MidiMessageSequence::getNumEvents() const -{ - return list.size(); -} - -MidiMessageSequence::MidiEventHolder* MidiMessageSequence::getEventPointer (const int index) const -{ - return list [index]; -} - -double MidiMessageSequence::getTimeOfMatchingKeyUp (const int index) const -{ - const MidiEventHolder* const meh = list [index]; - - if (meh != nullptr && meh->noteOffObject != nullptr) - return meh->noteOffObject->message.getTimeStamp(); - else - return 0.0; -} - -int MidiMessageSequence::getIndexOfMatchingKeyUp (const int index) const -{ - const MidiEventHolder* const meh = list [index]; - - return meh != nullptr ? list.indexOf (meh->noteOffObject) : -1; -} - -int MidiMessageSequence::getIndexOf (MidiEventHolder* const event) const -{ - return list.indexOf (event); -} - -int MidiMessageSequence::getNextIndexAtTime (const double timeStamp) const -{ - 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 -{ - return getEventTime (0); -} - -double MidiMessageSequence::getEndTime() const -{ - return getEventTime (list.size() - 1); -} - -double MidiMessageSequence::getEventTime (const int index) const -{ - const MidiEventHolder* const e = list [index]; - return e != nullptr ? e->message.getTimeStamp() : 0.0; -} - -//============================================================================== -void 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); -} - -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); - } - } - - MidiMessageSequenceSorter sorter; - list.sort (sorter, true); -} - -//============================================================================== -void MidiMessageSequence::updateMatchedPairs() -{ - for (int i = 0; i < list.size(); ++i) - { - const MidiMessage& m1 = list.getUnchecked(i)->message; - - if (m1.isNoteOn()) - { - list.getUnchecked(i)->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()) - { - list.getUnchecked(i)->noteOffObject = list[j]; - break; - } - else if (m.isNoteOn()) - { - list.insert (j, new MidiEventHolder (MidiMessage::noteOff (chan, note))); - list.getUnchecked(j)->message.setTimeStamp (m.getTimeStamp()); - list.getUnchecked(i)->noteOffObject = list[j]; - break; - } - } - } - } - } -} - -void MidiMessageSequence::addTimeToMessages (const double delta) -{ - for (int i = list.size(); --i >= 0;) - list.getUnchecked (i)->message.setTimeStamp (list.getUnchecked (i)->message.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& message_) - : message (message_), - noteOffObject (nullptr) -{ -} - -MidiMessageSequence::MidiEventHolder::~MidiEventHolder() -{ -} diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessageSequence.h b/src/juce/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessageSequence.h deleted file mode 100644 index 942c716e..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessageSequence.h +++ /dev/null @@ -1,276 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_MIDIMESSAGESEQUENCE_JUCEHEADER__ -#define __JUCE_MIDIMESSAGESEQUENCE_JUCEHEADER__ - -#include "juce_MidiMessage.h" - - -//============================================================================== -/** - 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& other); - - /** Replaces this sequence with another one. */ - MidiMessageSequence& operator= (const MidiMessageSequence& other); - - /** 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 null. - - 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& message); - JUCE_LEAK_DETECTOR (MidiEventHolder); - }; - - //============================================================================== - /** Clears the sequence. */ - void clear(); - - /** Returns the number of events in the sequence. */ - int getNumEvents() const; - - /** Returns a pointer to one of the events. */ - MidiEventHolder* getEventPointer (int index) const; - - /** 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; - - /** 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; - - /** Returns the index of an event. */ - int getIndexOf (MidiEventHolder* event) const; - - /** 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; - - //============================================================================== - /** Returns the timestamp of the first event in the sequence. - - @see getEndTime - */ - double getStartTime() const; - - /** Returns the timestamp of the last event in the sequence. - - @see getStartTime - */ - double getEndTime() const; - - /** 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; - - //============================================================================== - /** 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 - */ - void 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 moving messages about 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(); - - - //============================================================================== - /** 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); - - //============================================================================== - /** 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& other) noexcept; - -private: - //============================================================================== - friend class MidiFile; - OwnedArray list; - - JUCE_LEAK_DETECTOR (MidiMessageSequence); -}; - - -#endif // __JUCE_MIDIMESSAGESEQUENCE_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_basics/sources/juce_AudioSource.h b/src/juce/JuceLibraryCode/modules/juce_audio_basics/sources/juce_AudioSource.h deleted file mode 100644 index 3fb1fea4..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_basics/sources/juce_AudioSource.h +++ /dev/null @@ -1,159 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_AUDIOSOURCE_JUCEHEADER__ -#define __JUCE_AUDIOSOURCE_JUCEHEADER__ - -#include "../buffers/juce_AudioSampleBuffer.h" - - -//============================================================================== -/** - Used by AudioSource::getNextAudioBlock(). -*/ -struct JUCE_API AudioSourceChannelInfo -{ - /** 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 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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_basics/sources/juce_BufferingAudioSource.cpp b/src/juce/JuceLibraryCode/modules/juce_audio_basics/sources/juce_BufferingAudioSource.cpp deleted file mode 100644 index 9d33d8af..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_basics/sources/juce_BufferingAudioSource.cpp +++ /dev/null @@ -1,269 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -BufferingAudioSource::BufferingAudioSource (PositionableAudioSource* source_, - TimeSliceThread& backgroundThread_, - const bool deleteSourceWhenDeleted, - const int numberOfSamplesToBuffer_, - const int numberOfChannels_) - : source (source_, deleteSourceWhenDeleted), - backgroundThread (backgroundThread_), - numberOfSamplesToBuffer (jmax (1024, numberOfSamplesToBuffer_)), - numberOfChannels (numberOfChannels_), - buffer (numberOfChannels_, 0), - bufferValidStart (0), - bufferValidEnd (0), - nextPlayPos (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 sampleRate_) -{ - const int bufferSizeNeeded = jmax (samplesPerBlockExpected * 2, numberOfSamplesToBuffer); - - if (sampleRate_ != sampleRate - || bufferSizeNeeded != buffer.getNumSamples() - || ! isPrepared) - { - backgroundThread.removeTimeSliceClient (this); - - isPrepared = true; - sampleRate = sampleRate_; - - source->prepareToPlay (samplesPerBlockExpected, sampleRate_); - - buffer.setSize (numberOfChannels, bufferSizeNeeded); - buffer.clear(); - - bufferValidStart = 0; - bufferValidEnd = 0; - - backgroundThread.addTimeSliceClient (this); - - while (bufferValidEnd - bufferValidStart < jmin (((int) sampleRate_) / 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; - - if (source->isLooping() && nextPlayPos > 0) - nextPlayPos %= source->getTotalLength(); - } -} - -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) - { - 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; - } - else - { - return false; - } -} - -void BufferingAudioSource::readBufferSection (const int64 start, const int length, const int bufferOffset) -{ - if (source->getNextReadPosition() != start) - source->setNextReadPosition (start); - - AudioSourceChannelInfo info; - info.buffer = &buffer; - info.startSample = bufferOffset; - info.numSamples = length; - - source->getNextAudioBlock (info); -} - -int BufferingAudioSource::useTimeSlice() -{ - return readNextBufferChunk() ? 1 : 100; -} diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_basics/sources/juce_BufferingAudioSource.h b/src/juce/JuceLibraryCode/modules/juce_audio_basics/sources/juce_BufferingAudioSource.h deleted file mode 100644 index 834cb0dd..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_basics/sources/juce_BufferingAudioSource.h +++ /dev/null @@ -1,115 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_BUFFERINGAUDIOSOURCE_JUCEHEADER__ -#define __JUCE_BUFFERINGAUDIOSOURCE_JUCEHEADER__ - -#include "juce_PositionableAudioSource.h" - - -//============================================================================== -/** - 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); - - /** Implementation of the AudioSource method. */ - void releaseResources(); - - /** Implementation of the AudioSource method. */ - void getNextAudioBlock (const AudioSourceChannelInfo& bufferToFill); - - //============================================================================== - /** Implements the PositionableAudioSource method. */ - void setNextReadPosition (int64 newPosition); - - /** Implements the PositionableAudioSource method. */ - int64 getNextReadPosition() const; - - /** Implements the PositionableAudioSource method. */ - int64 getTotalLength() const { return source->getTotalLength(); } - - /** Implements the PositionableAudioSource method. */ - bool isLooping() const { 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; - - friend class SharedBufferingAudioSourceThread; - bool readNextBufferChunk(); - void readBufferSection (int64 start, int length, int bufferOffset); - int useTimeSlice(); - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (BufferingAudioSource); -}; - - -#endif // __JUCE_BUFFERINGAUDIOSOURCE_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.cpp b/src/juce/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.cpp deleted file mode 100644 index 0019a8aa..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.cpp +++ /dev/null @@ -1,190 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -ChannelRemappingAudioSource::ChannelRemappingAudioSource (AudioSource* const source_, - const bool deleteSourceWhenDeleted) - : source (source_, deleteSourceWhenDeleted), - requiredNumberOfChannels (2), - buffer (2, 16) -{ - 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(); - - int i; - for (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 (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; - int i; - - const ScopedLock sl (lock); - - for (i = 0; i < remappedInputs.size(); ++i) - ins << remappedInputs.getUnchecked(i) << ' '; - - for (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); - - int i; - for (i = 0; i < ins.size(); ++i) - remappedInputs.add (ins[i].getIntValue()); - - for (i = 0; i < outs.size(); ++i) - remappedOutputs.add (outs[i].getIntValue()); - } -} diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.h b/src/juce/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.h deleted file mode 100644 index e94dcd73..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.h +++ /dev/null @@ -1,149 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_CHANNELREMAPPINGAUDIOSOURCE_JUCEHEADER__ -#define __JUCE_CHANNELREMAPPINGAUDIOSOURCE_JUCEHEADER__ - -#include "juce_AudioSource.h" - - -//============================================================================== -/** - 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& e); - - //============================================================================== - void prepareToPlay (int samplesPerBlockExpected, double sampleRate); - void releaseResources(); - void getNextAudioBlock (const AudioSourceChannelInfo& bufferToFill); - - -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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.cpp b/src/juce/JuceLibraryCode/modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.cpp deleted file mode 100644 index a2bad776..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.cpp +++ /dev/null @@ -1,72 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce 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::setFilterParameters (const IIRFilter& newSettings) -{ - for (int i = iirFilters.size(); --i >= 0;) - iirFilters.getUnchecked(i)->copyCoefficientsFrom (newSettings); -} - -//============================================================================== -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->getSampleData (i, bufferToFill.startSample), - bufferToFill.numSamples); -} diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.h b/src/juce/JuceLibraryCode/modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.h deleted file mode 100644 index 0e040941..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.h +++ /dev/null @@ -1,71 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_IIRFILTERAUDIOSOURCE_JUCEHEADER__ -#define __JUCE_IIRFILTERAUDIOSOURCE_JUCEHEADER__ - -#include "juce_AudioSource.h" -#include "../effects/juce_IIRFilter.h" - - -//============================================================================== -/** - 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 setFilterParameters (const IIRFilter& newSettings); - - //============================================================================== - void prepareToPlay (int samplesPerBlockExpected, double sampleRate); - void releaseResources(); - void getNextAudioBlock (const AudioSourceChannelInfo& bufferToFill); - -private: - //============================================================================== - OptionalScopedPointer input; - OwnedArray iirFilters; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (IIRFilterAudioSource); -}; - - -#endif // __JUCE_IIRFILTERAUDIOSOURCE_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_basics/sources/juce_MixerAudioSource.cpp b/src/juce/JuceLibraryCode/modules/juce_audio_basics/sources/juce_MixerAudioSource.cpp deleted file mode 100644 index 8858554b..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_basics/sources/juce_MixerAudioSource.cpp +++ /dev/null @@ -1,161 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -MixerAudioSource::MixerAudioSource() - : tempBuffer (2, 0), - 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 (index, 1); - 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; - info2.buffer = &tempBuffer; - info2.numSamples = info.numSamples; - info2.startSample = 0; - - 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/src/juce/JuceLibraryCode/modules/juce_audio_basics/sources/juce_MixerAudioSource.h b/src/juce/JuceLibraryCode/modules/juce_audio_basics/sources/juce_MixerAudioSource.h deleted file mode 100644 index cafdf012..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_basics/sources/juce_MixerAudioSource.h +++ /dev/null @@ -1,104 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_MIXERAUDIOSOURCE_JUCEHEADER__ -#define __JUCE_MIXERAUDIOSOURCE_JUCEHEADER__ - -#include "juce_AudioSource.h" - - -//============================================================================== -/** - 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); - - /** Implementation of the AudioSource method. - This will call releaseResources() on all its input sources. - */ - void releaseResources(); - - /** Implementation of the AudioSource method. */ - void getNextAudioBlock (const AudioSourceChannelInfo& bufferToFill); - - -private: - //============================================================================== - Array inputs; - BigInteger inputsToDelete; - CriticalSection lock; - AudioSampleBuffer tempBuffer; - double currentSampleRate; - int bufferSizeExpected; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MixerAudioSource); -}; - - -#endif // __JUCE_MIXERAUDIOSOURCE_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_basics/sources/juce_PositionableAudioSource.h b/src/juce/JuceLibraryCode/modules/juce_audio_basics/sources/juce_PositionableAudioSource.h deleted file mode 100644 index 2ffe737a..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_basics/sources/juce_PositionableAudioSource.h +++ /dev/null @@ -1,81 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_POSITIONABLEAUDIOSOURCE_JUCEHEADER__ -#define __JUCE_POSITIONABLEAUDIOSOURCE_JUCEHEADER__ - -#include "juce_AudioSource.h" - - -//============================================================================== -/** - 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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ResamplingAudioSource.cpp b/src/juce/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ResamplingAudioSource.cpp deleted file mode 100644 index 65b5d442..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ResamplingAudioSource.cpp +++ /dev/null @@ -1,258 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -ResamplingAudioSource::ResamplingAudioSource (AudioSource* const inputSource, - const bool deleteInputWhenDeleted, - const int numChannels_) - : input (inputSource, deleteInputWhenDeleted), - ratio (1.0), - lastRatio (1.0), - buffer (numChannels_, 0), - sampsInBuffer (0), - numChannels (numChannels_) -{ - jassert (input != nullptr); -} - -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); - buffer.clear(); - sampsInBuffer = 0; - bufferPos = 0; - subSampleOffset = 0.0; - - filterStates.calloc ((size_t) numChannels); - srcBuffers.calloc ((size_t) numChannels); - destBuffers.calloc ((size_t) numChannels); - createLowPass (ratio); - 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) + 2; - - 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; - readInfo.buffer = &buffer; - readInfo.numSamples = numToDo; - readInfo.startSample = endOfBufferPos; - - input->getNextAudioBlock (readInfo); - - if (localRatio > 1.0001) - { - // for down-sampling, pre-apply the filter.. - - for (int i = channelsToProcess; --i >= 0;) - applyFilter (buffer.getSampleData (i, endOfBufferPos), numToDo, filterStates[i]); - } - - sampsInBuffer += numToDo; - endOfBufferPos += numToDo; - } - - for (int channel = 0; channel < channelsToProcess; ++channel) - { - destBuffers[channel] = info.buffer->getSampleData (channel, info.startSample); - srcBuffers[channel] = buffer.getSampleData (channel, 0); - } - - int nextPos = (bufferPos + 1) % bufferSize; - for (int m = info.numSamples; --m >= 0;) - { - const float alpha = (float) subSampleOffset; - const float invAlpha = 1.0f - alpha; - - for (int channel = 0; channel < channelsToProcess; ++channel) - *destBuffers[channel]++ = srcBuffers[channel][bufferPos] * invAlpha + srcBuffers[channel][nextPos] * alpha; - - subSampleOffset += localRatio; - - jassert (sampsInBuffer > 0); - - 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->getSampleData (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->getSampleData (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() -{ - 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/src/juce/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ResamplingAudioSource.h b/src/juce/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ResamplingAudioSource.h deleted file mode 100644 index 5ecea84e..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ResamplingAudioSource.h +++ /dev/null @@ -1,106 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_RESAMPLINGAUDIOSOURCE_JUCEHEADER__ -#define __JUCE_RESAMPLINGAUDIOSOURCE_JUCEHEADER__ - -#include "juce_AudioSource.h" - - -//============================================================================== -/** - 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; } - - //============================================================================== - void prepareToPlay (int samplesPerBlockExpected, double sampleRate); - void releaseResources(); - void getNextAudioBlock (const AudioSourceChannelInfo& bufferToFill); - -private: - //============================================================================== - OptionalScopedPointer input; - double ratio, lastRatio; - AudioSampleBuffer buffer; - int bufferPos, sampsInBuffer; - double subSampleOffset; - double coefficients[6]; - SpinLock ratioLock; - const int numChannels; - HeapBlock destBuffers, 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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ReverbAudioSource.cpp b/src/juce/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ReverbAudioSource.cpp deleted file mode 100644 index 55c16bce..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ReverbAudioSource.cpp +++ /dev/null @@ -1,81 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce 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->getSampleData (0, bufferToFill.startSample); - - if (bufferToFill.buffer->getNumChannels() > 1) - { - reverb.processStereo (firstChannel, - bufferToFill.buffer->getSampleData (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/src/juce/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ReverbAudioSource.h b/src/juce/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ReverbAudioSource.h deleted file mode 100644 index b7765ff2..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ReverbAudioSource.h +++ /dev/null @@ -1,80 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_REVERBAUDIOSOURCE_JUCEHEADER__ -#define __JUCE_REVERBAUDIOSOURCE_JUCEHEADER__ - -#include "juce_AudioSource.h" -#include "../effects/juce_Reverb.h" - - -//============================================================================== -/** - 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); - void releaseResources(); - void getNextAudioBlock (const AudioSourceChannelInfo& bufferToFill); - -private: - //============================================================================== - CriticalSection lock; - OptionalScopedPointer input; - Reverb reverb; - volatile bool bypass; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ReverbAudioSource); -}; - - -#endif // __JUCE_REVERBAUDIOSOURCE_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.cpp b/src/juce/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.cpp deleted file mode 100644 index 5629e557..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.cpp +++ /dev/null @@ -1,77 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce 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 sampleRate_) -{ - currentPhase = 0.0; - phasePerSample = 0.0; - sampleRate = sampleRate_; -} - -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->getSampleData (j, info.startSample + i) = sample; - } -} diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.h b/src/juce/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.h deleted file mode 100644 index f70d81d0..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.h +++ /dev/null @@ -1,76 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_TONEGENERATORAUDIOSOURCE_JUCEHEADER__ -#define __JUCE_TONEGENERATORAUDIOSOURCE_JUCEHEADER__ - -#include "juce_AudioSource.h" - - -//============================================================================== -/** - 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); - - /** Implementation of the AudioSource method. */ - void releaseResources(); - - /** Implementation of the AudioSource method. */ - void getNextAudioBlock (const AudioSourceChannelInfo& bufferToFill); - - -private: - //============================================================================== - double frequency, sampleRate; - double currentPhase, phasePerSample; - float amplitude; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ToneGeneratorAudioSource); -}; - - -#endif // __JUCE_TONEGENERATORAUDIOSOURCE_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_basics/synthesisers/juce_Synthesiser.cpp b/src/juce/JuceLibraryCode/modules/juce_audio_basics/synthesisers/juce_Synthesiser.cpp deleted file mode 100644 index ef23024f..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_basics/synthesisers/juce_Synthesiser.cpp +++ /dev/null @@ -1,433 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -SynthesiserSound::SynthesiserSound() -{ -} - -SynthesiserSound::~SynthesiserSound() -{ -} - -//============================================================================== -SynthesiserVoice::SynthesiserVoice() - : currentSampleRate (44100.0), - currentlyPlayingNote (-1), - noteOnTime (0), - keyIsDown (false), - sostenutoPedalDown (false) -{ -} - -SynthesiserVoice::~SynthesiserVoice() -{ -} - -bool SynthesiserVoice::isPlayingChannel (const int midiChannel) const -{ - return currentlyPlayingSound != nullptr - && currentlyPlayingSound->appliesToChannel (midiChannel); -} - -void SynthesiserVoice::setCurrentPlaybackSampleRate (const double newRate) -{ - currentSampleRate = newRate; -} - -void SynthesiserVoice::clearCurrentNote() -{ - currentlyPlayingNote = -1; - currentlyPlayingSound = nullptr; -} - -//============================================================================== -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(); -} - -void Synthesiser::addVoice (SynthesiserVoice* const newVoice) -{ - const ScopedLock sl (lock); - 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(); -} - -void Synthesiser::addSound (const SynthesiserSound::Ptr& newSound) -{ - const ScopedLock sl (lock); - sounds.add (newSound); -} - -void Synthesiser::removeSound (const int index) -{ - const ScopedLock sl (lock); - sounds.remove (index); -} - -void Synthesiser::setNoteStealingEnabled (const bool shouldStealNotes_) -{ - shouldStealNotes = shouldStealNotes_; -} - -//============================================================================== -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) - { - for (int i = voices.size(); --i >= 0;) - voices.getUnchecked (i)->renderNextBlock (outputBuffer, startSample, numThisTime); - } - - if (useEvent) - handleMidiEvent (m); - - startSample += numThisTime; - numSamples -= numThisTime; - } -} - -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(), - 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.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, true); - } - - startVoice (findFreeVoice (sound, 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 (false); - - voice->startNote (midiNoteNumber, velocity, sound, - lastPitchWheelValues [midiChannel - 1]); - - voice->currentlyPlayingNote = midiNoteNumber; - voice->noteOnTime = ++lastNoteOnCounter; - voice->currentlyPlayingSound = sound; - voice->keyIsDown = true; - voice->sostenutoPedalDown = false; - } -} - -void Synthesiser::stopVoice (SynthesiserVoice* voice, const bool allowTailOff) -{ - jassert (voice != nullptr); - - voice->stopNote (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 bool allowTailOff) -{ - const ScopedLock sl (lock); - - for (int i = voices.size(); --i >= 0;) - { - SynthesiserVoice* const voice = voices.getUnchecked (i); - - if (voice->getCurrentlyPlayingNote() == midiNoteNumber) - { - SynthesiserSound* const sound = voice->getCurrentlyPlayingSound(); - - if (sound != nullptr - && sound->appliesToNote (midiNoteNumber) - && sound->appliesToChannel (midiChannel)) - { - voice->keyIsDown = false; - - if (! (sustainPedalsDown [midiChannel] || voice->sostenutoPedalDown)) - stopVoice (voice, 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 (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::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, 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, true); - } - } -} - -void Synthesiser::handleSoftPedal (int midiChannel, bool /*isDown*/) -{ - (void) midiChannel; - jassert (midiChannel > 0 && midiChannel <= 16); -} - -//============================================================================== -SynthesiserVoice* Synthesiser::findFreeVoice (SynthesiserSound* soundToPlay, - const bool stealIfNoneAvailable) const -{ - const ScopedLock sl (lock); - - for (int i = voices.size(); --i >= 0;) - if (voices.getUnchecked (i)->getCurrentlyPlayingNote() < 0 - && voices.getUnchecked (i)->canPlaySound (soundToPlay)) - return voices.getUnchecked (i); - - if (stealIfNoneAvailable) - { - // currently this just steals the one that's been playing the longest, but could be made a bit smarter.. - SynthesiserVoice* oldest = nullptr; - - for (int i = voices.size(); --i >= 0;) - { - SynthesiserVoice* const voice = voices.getUnchecked (i); - - if (voice->canPlaySound (soundToPlay) - && (oldest == nullptr || oldest->noteOnTime > voice->noteOnTime)) - oldest = voice; - } - - jassert (oldest != nullptr); - return oldest; - } - - return nullptr; -} diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_basics/synthesisers/juce_Synthesiser.h b/src/juce/JuceLibraryCode/modules/juce_audio_basics/synthesisers/juce_Synthesiser.h deleted file mode 100644 index b6c2b678..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_basics/synthesisers/juce_Synthesiser.h +++ /dev/null @@ -1,494 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_SYNTHESISER_JUCEHEADER__ -#define __JUCE_SYNTHESISER_JUCEHEADER__ - -#include "../buffers/juce_AudioSampleBuffer.h" -#include "../midi/juce_MidiBuffer.h" - - -//============================================================================== -/** - 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 (const 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 (const int midiChannel) = 0; - - /** - */ - 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 { return currentlyPlayingNote; } - - /** Returns the sound that this voice is currently playing. - - Returns 0 if it's not playing. - */ - SynthesiserSound::Ptr getCurrentlyPlayingSound() const { 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* sound) = 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 (const int midiNoteNumber, - const float velocity, - SynthesiserSound* sound, - const int currentPitchWheelPosition) = 0; - - /** Called to stop a note. - - This will be called during the rendering callback, so must be fast and thread-safe. - - 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 (const bool allowTailOff) = 0; - - /** 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 (const int newValue) = 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 (const int controllerNumber, - const int newValue) = 0; - - //============================================================================== - /** 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; - - /** 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. - */ - bool isPlayingChannel (int midiChannel) const; - - /** 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. - */ - void setCurrentPlaybackSampleRate (double newRate); - - -protected: - //============================================================================== - /** Returns the current target sample rate at which rendering is being done. - - This is available for subclasses so they can pitch things correctly. - */ - double getSampleRate() const { return currentSampleRate; } - - /** 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; - uint32 noteOnTime; - SynthesiserSound::Ptr currentlyPlayingSound; - bool keyIsDown; // the voice may still be playing when the key is not down (i.e. sustain pedal) - bool sostenutoPedalDown; - - 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 { 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. - */ - void 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 { return sounds.size(); } - - /** Returns one of the sounds. */ - SynthesiserSound* getSound (int index) const { return sounds [index]; } - - /** Adds a new sound to the synthesiser. - - The object passed in is reference counted, so will be deleted when it is removed - from the synthesiser, and when no voices are still using it. - */ - void 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 { 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, - 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. - - 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. - - 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); - - virtual void handleSustainPedal (int midiChannel, bool isDown); - virtual void handleSostenutoPedal (int midiChannel, bool isDown); - 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. - */ - 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); - -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]; - - /** Searches through the voices to find one that's not currently playing, and which - can play the given sound. - - Returns 0 if all voices are busy and stealing isn't enabled. - - This can be overridden to implement custom voice-stealing algorithms. - */ - virtual SynthesiserVoice* findFreeVoice (SynthesiserSound* soundToPlay, - const bool stealIfNoneAvailable) 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); - -private: - //============================================================================== - double sampleRate; - uint32 lastNoteOnCounter; - bool shouldStealNotes; - BigInteger sustainPedalsDown; - - void handleMidiEvent (const MidiMessage& m); - void stopVoice (SynthesiserVoice* voice, bool allowTailOff); - - #if JUCE_CATCH_DEPRECATED_CODE_MISUSE - // Note the new parameters for this method. - virtual int findFreeVoice (const bool) const { return 0; } - #endif - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Synthesiser); -}; - - -#endif // __JUCE_SYNTHESISER_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_devices/audio_cd/juce_AudioCDBurner.h b/src/juce/JuceLibraryCode/modules/juce_audio_devices/audio_cd/juce_AudioCDBurner.h deleted file mode 100644 index a887147b..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_devices/audio_cd/juce_AudioCDBurner.h +++ /dev/null @@ -1,170 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_AUDIOCDBURNER_JUCEHEADER__ -#define __JUCE_AUDIOCDBURNER_JUCEHEADER__ - -#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 class ScopedPointer; - ScopedPointer pimpl; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioCDBurner); -}; - - -#endif -#endif // __JUCE_AUDIOCDBURNER_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_devices/audio_cd/juce_AudioCDReader.cpp b/src/juce/JuceLibraryCode/modules/juce_audio_devices/audio_cd/juce_AudioCDReader.cpp deleted file mode 100644 index 58c87fae..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_devices/audio_cd/juce_AudioCDReader.cpp +++ /dev/null @@ -1,58 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce 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/src/juce/JuceLibraryCode/modules/juce_audio_devices/audio_cd/juce_AudioCDReader.h b/src/juce/JuceLibraryCode/modules/juce_audio_devices/audio_cd/juce_AudioCDReader.h deleted file mode 100644 index 92f6fc82..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_devices/audio_cd/juce_AudioCDReader.h +++ /dev/null @@ -1,175 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_AUDIOCDREADER_JUCEHEADER__ -#define __JUCE_AUDIOCDREADER_JUCEHEADER__ - -#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); - - /** 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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.cpp b/src/juce/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.cpp deleted file mode 100644 index c9f54ad4..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.cpp +++ /dev/null @@ -1,944 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce 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; -} - -//============================================================================== -AudioDeviceManager::AudioDeviceManager() - : numInputChansNeeded (0), - numOutputChansNeeded (2), - listNeedsScanning (true), - useInputNames (false), - inputLevelMeasurementEnabledCount (0), - inputLevel (0), - tempBuffer (2, 2), - cpuUsageMs (0), - timeToCpuScale (0) -{ - callbackHandler.owner = this; -} - -AudioDeviceManager::~AudioDeviceManager() -{ - currentAudioDevice = nullptr; - defaultMidiOutput = nullptr; -} - - -//============================================================================== -void AudioDeviceManager::createDeviceTypesIfNeeded() -{ - if (availableDeviceTypes.size() == 0) - { - createAudioDeviceTypes (availableDeviceTypes); - - while (lastDeviceTypeConfigs.size() < availableDeviceTypes.size()) - lastDeviceTypeConfigs.add (new AudioDeviceSetup()); - - if (availableDeviceTypes.size() > 0) - currentDeviceType = availableDeviceTypes.getUnchecked(0)->getTypeName(); - - for (int i = 0; i < availableDeviceTypes.size(); ++i) - availableDeviceTypes.getUnchecked(i)->addListener (&callbackHandler); - } -} - -const OwnedArray & AudioDeviceManager::getAvailableDeviceTypes() -{ - scanDevicesIfNeeded(); - return availableDeviceTypes; -} - -void AudioDeviceManager::audioDeviceListChanged() -{ - 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()); - 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()); -} - -//============================================================================== -String AudioDeviceManager::initialise (const int numInputChannelsNeeded, - const int numOutputChannelsNeeded, - const XmlElement* const e, - const bool selectDefaultDeviceOnFailure, - const String& preferredDefaultDeviceName, - const AudioDeviceSetup* preferredSetupOptions) -{ - scanDevicesIfNeeded(); - - numInputChansNeeded = numInputChannelsNeeded; - numOutputChansNeeded = numOutputChannelsNeeded; - - if (e != nullptr && e->hasTagName ("DEVICESETUP")) - { - lastExplicitSettings = new XmlElement (*e); - - String error; - AudioDeviceSetup setup; - - if (preferredSetupOptions != nullptr) - setup = *preferredSetupOptions; - - if (e->getStringAttribute ("audioDeviceName").isNotEmpty()) - { - setup.inputDeviceName = setup.outputDeviceName - = e->getStringAttribute ("audioDeviceName"); - } - else - { - setup.inputDeviceName = e->getStringAttribute ("audioInputDeviceName"); - setup.outputDeviceName = e->getStringAttribute ("audioOutputDeviceName"); - } - - currentDeviceType = e->getStringAttribute ("deviceType"); - - if (findType (currentDeviceType) == nullptr) - { - AudioIODeviceType* const type = findType (setup.inputDeviceName, setup.outputDeviceName); - - if (type != nullptr) - currentDeviceType = type->getTypeName(); - else if (availableDeviceTypes.size() > 0) - currentDeviceType = availableDeviceTypes.getUnchecked(0)->getTypeName(); - } - - setup.bufferSize = e->getIntAttribute ("audioDeviceBufferSize"); - setup.sampleRate = e->getDoubleAttribute ("audioDeviceRate"); - - setup.inputChannels .parseString (e->getStringAttribute ("audioDeviceInChans", "11"), 2); - setup.outputChannels.parseString (e->getStringAttribute ("audioDeviceOutChans", "11"), 2); - - setup.useDefaultInputChannels = ! e->hasAttribute ("audioDeviceInChans"); - setup.useDefaultOutputChannels = ! e->hasAttribute ("audioDeviceOutChans"); - - error = setAudioDeviceSetup (setup, true); - - midiInsFromXml.clear(); - forEachXmlChildElementWithTagName (*e, 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 (numInputChannelsNeeded, numOutputChannelsNeeded, 0, - false, preferredDefaultDeviceName); - - setDefaultMidiOutput (e->getStringAttribute ("defaultMidiOutput")); - - return error; - } - else - { - AudioDeviceSetup setup; - - if (preferredSetupOptions != nullptr) - { - setup = *preferredSetupOptions; - } - else if (preferredDefaultDeviceName.isNotEmpty()) - { - for (int j = availableDeviceTypes.size(); --j >= 0;) - { - AudioIODeviceType* const type = availableDeviceTypes.getUnchecked(j); - - StringArray outs (type->getDeviceNames (false)); - - int i; - for (i = 0; i < outs.size(); ++i) - { - if (outs[i].matchesWildcard (preferredDefaultDeviceName, true)) - { - setup.outputDeviceName = outs[i]; - break; - } - } - - StringArray ins (type->getDeviceNames (true)); - - for (i = 0; i < ins.size(); ++i) - { - if (ins[i].matchesWildcard (preferredDefaultDeviceName, true)) - { - setup.inputDeviceName = ins[i]; - break; - } - } - } - } - - insertDefaultDeviceNames (setup); - return setAudioDeviceSetup (setup, false); - } -} - -void AudioDeviceManager::insertDefaultDeviceNames (AudioDeviceSetup& setup) const -{ - AudioIODeviceType* type = getCurrentDeviceTypeObject(); - if (type != nullptr) - { - 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() && type->getDeviceNames (true).contains (inputName, true)) - || (outputName.isNotEmpty() && type->getDeviceNames (false).contains (outputName, true))) - { - return type; - } - } - - return nullptr; -} - -void AudioDeviceManager::getAudioDeviceSetup (AudioDeviceSetup& setup) -{ - setup = currentSetup; -} - -void AudioDeviceManager::deleteCurrentDevice() -{ - currentAudioDevice = nullptr; - currentSetup.inputDeviceName = String::empty; - currentSetup.outputDeviceName = String::empty; -} - -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) - { - 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[i]->getTypeName() == currentDeviceType) - return availableDeviceTypes[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::empty; - - if (! (newSetup == currentSetup)) - sendChangeMessage(); - - stopDevice(); - - const String newInputDeviceName (numInputChansNeeded == 0 ? String::empty : newSetup.inputDeviceName); - const String newOutputDeviceName (numOutputChansNeeded == 0 ? String::empty : newSetup.outputDeviceName); - - String error; - AudioIODeviceType* type = getCurrentDeviceTypeObject(); - - if (type == nullptr || (newInputDeviceName.isEmpty() && newOutputDeviceName.isEmpty())) - { - deleteCurrentDevice(); - - if (treatAsChosenDevice) - updateXml(); - - return String::empty; - } - - if (currentSetup.inputDeviceName != newInputDeviceName - || currentSetup.outputDeviceName != newOutputDeviceName - || currentAudioDevice == nullptr) - { - deleteCurrentDevice(); - scanDevicesIfNeeded(); - - if (newOutputDeviceName.isNotEmpty() - && ! type->getDeviceNames (false).contains (newOutputDeviceName)) - { - return "No such device: " + newOutputDeviceName; - } - - if (newInputDeviceName.isNotEmpty() - && ! type->getDeviceNames (true).contains (newInputDeviceName)) - { - return "No such device: " + newInputDeviceName; - } - - currentAudioDevice = type->createDevice (newOutputDeviceName, newInputDeviceName); - - if (currentAudioDevice == nullptr) - error = "Can't open the audio device!\n\nThis 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); - - if (rate > 0) - for (int i = currentAudioDevice->getNumSampleRates(); --i >= 0;) - if (currentAudioDevice->getSampleRate (i) == rate) - return rate; - - double lowestAbove44 = 0.0; - - for (int i = currentAudioDevice->getNumSampleRates(); --i >= 0;) - { - const double sr = currentAudioDevice->getSampleRate (i); - - if (sr >= 44100.0 && (lowestAbove44 < 1.0 || sr < lowestAbove44)) - lowestAbove44 = sr; - } - - if (lowestAbove44 > 0.0) - return lowestAbove44; - - return currentAudioDevice->getSampleRate (0); -} - -int AudioDeviceManager::chooseBestBufferSize (int bufferSize) const -{ - jassert (currentAudioDevice != nullptr); - - if (bufferSize > 0) - for (int i = currentAudioDevice->getNumBufferSizesAvailable(); --i >= 0;) - if (currentAudioDevice->getBufferSizeSamples(i) == 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) - { - XmlElement* const m = lastExplicitSettings->createNewChildElement ("MIDIINPUT"); - m->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)) - { - XmlElement* const m = lastExplicitSettings->createNewChildElement ("MIDIINPUT"); - m->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.removeValue (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 > 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.getArrayOfChannels(); - - for (int i = callbacks.size(); --i > 0;) - { - callbacks.getUnchecked(i)->audioDeviceIOCallback (inputChannelData, numInputChannels, - tempChans, numOutputChannels, numSamples); - - for (int chan = 0; chan < numOutputChannels; ++chan) - { - const float* const src = tempChans [chan]; - float* const dst = outputChannelData [chan]; - - if (src != nullptr && dst != nullptr) - 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->getSampleData (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(); -} - -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) - { - MidiInput* const midiIn = MidiInput::openDevice (index, &callbackHandler); - - if (midiIn != nullptr) - { - 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); - midiCallbacks.add (callbackToAdd); - midiCallbackDevices.add (name); - } -} - -void AudioDeviceManager::removeMidiInputCallback (const String& name, MidiInputCallback* callbackToRemove) -{ - for (int i = midiCallbacks.size(); --i >= 0;) - { - if (midiCallbackDevices[i] == name && midiCallbacks.getUnchecked(i) == callbackToRemove) - { - const ScopedLock sl (midiCallbackLock); - midiCallbacks.remove (i); - midiCallbackDevices.remove (i); - } - } -} - -void AudioDeviceManager::handleIncomingMidiMessageInt (MidiInput* source, - const MidiMessage& message) -{ - if (! message.isActiveSense()) - { - const bool isDefaultSource = (source == nullptr || source == enabledMidiInputs.getFirst()); - - const ScopedLock sl (midiCallbackLock); - - for (int i = midiCallbackDevices.size(); --i >= 0;) - { - const String name (midiCallbackDevices[i]); - - if ((isDefaultSource && name.isEmpty()) || (name.isNotEmpty() && name == source->getName())) - midiCallbacks.getUnchecked(i)->handleIncomingMidiMessage (source, message); - } - } -} - -//============================================================================== -void AudioDeviceManager::setDefaultMidiOutput (const String& deviceName) -{ - if (defaultMidiOutputName != deviceName) - { - Array oldCallbacks; - - { - const ScopedLock sl (audioCallbackLock); - oldCallbacks = callbacks; - callbacks.clear(); - } - - 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); - callbacks = oldCallbacks; - } - - updateXml(); - sendChangeMessage(); - } -} - -//============================================================================== -void AudioDeviceManager::CallbackHandler::audioDeviceIOCallback (const float** inputChannelData, - int numInputChannels, - float** outputChannelData, - int numOutputChannels, - int numSamples) -{ - owner->audioDeviceIOCallbackInt (inputChannelData, numInputChannels, outputChannelData, numOutputChannels, numSamples); -} - -void AudioDeviceManager::CallbackHandler::audioDeviceAboutToStart (AudioIODevice* device) -{ - owner->audioDeviceAboutToStartInt (device); -} - -void AudioDeviceManager::CallbackHandler::audioDeviceStopped() -{ - owner->audioDeviceStoppedInt(); -} - -void AudioDeviceManager::CallbackHandler::handleIncomingMidiMessage (MidiInput* source, const MidiMessage& message) -{ - owner->handleIncomingMidiMessageInt (source, message); -} - -void AudioDeviceManager::CallbackHandler::audioDeviceListChanged() -{ - owner->audioDeviceListChanged(); -} - -//============================================================================== -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; - - AudioSampleBuffer* const newSound = new AudioSampleBuffer (1, soundLength); - float* samples = newSound->getSampleData (0); - - const double frequency = MidiMessage::getMidiNoteInHertz (80); - const float amplitude = 0.5f; - - const double phasePerSample = double_Pi * 2.0 / (sampleRate / frequency); - - for (int i = 0; i < soundLength; ++i) - samples[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) -{ - const ScopedLock sl (audioCallbackLock); - - if (enableMeasurement) - ++inputLevelMeasurementEnabledCount; - else - --inputLevelMeasurementEnabledCount; - - inputLevel = 0; -} - -double AudioDeviceManager::getCurrentInputLevel() const -{ - jassert (inputLevelMeasurementEnabledCount > 0); // you need to call enableInputLevelMeasurement() before using this! - return inputLevel; -} diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.h b/src/juce/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.h deleted file mode 100644 index a447fe88..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.h +++ /dev/null @@ -1,517 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_AUDIODEVICEMANAGER_JUCEHEADER__ -#define __JUCE_AUDIODEVICEMANAGER_JUCEHEADER__ - -#include "juce_AudioIODeviceType.h" -#include "../midi_io/juce_MidiInput.h" -#include "../midi_io/juce_MidiOutput.h" - - -//============================================================================== -/** - 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 the default rate. - */ - 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 a minimum number of input channels needed - by your app. - @param numOutputChannelsNeeded a minimum number of output channels to open - @param savedState either a previously-saved state that was produced - by createStateXml(), or 0 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::empty, - const AudioDeviceSetup* preferredSetupOptions = 0); - - /** 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& setup); - - /** 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 - */ - 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 events from whatever the - current "default" device is. Or it can be the name of one of the midi input devices - (see MidiInput::getDevices() for the 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 - */ - String getDefaultMidiOutputName() const { 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 0. - - @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); - - //============================================================================== - /** 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; - bool useInputNames; - int inputLevelMeasurementEnabledCount; - double inputLevel; - ScopedPointer testSound; - int testSoundPosition; - AudioSampleBuffer tempBuffer; - - StringArray midiInsFromXml; - OwnedArray enabledMidiInputs; - Array midiCallbacks; - StringArray midiCallbackDevices; - String defaultMidiOutputName; - ScopedPointer defaultMidiOutput; - CriticalSection audioCallbackLock, midiCallbackLock; - - double cpuUsageMs, timeToCpuScale; - - //============================================================================== - class CallbackHandler : public AudioIODeviceCallback, - public MidiInputCallback, - public AudioIODeviceType::Listener - { - public: - void audioDeviceIOCallback (const float**, int, float**, int, int); - void audioDeviceAboutToStart (AudioIODevice*); - void audioDeviceStopped(); - void handleIncomingMidiMessage (MidiInput*, const MidiMessage&); - void audioDeviceListChanged(); - - AudioDeviceManager* owner; - }; - - CallbackHandler callbackHandler; - friend class CallbackHandler; - - void audioDeviceIOCallbackInt (const float** inputChannelData, int totalNumInputChannels, - float** outputChannelData, int totalNumOutputChannels, int numSamples); - void audioDeviceAboutToStartInt (AudioIODevice*); - void audioDeviceStoppedInt(); - 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; - - AudioIODeviceType* findType (const String& inputName, const String& outputName); - AudioIODeviceType* findType (const String& typeName); - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioDeviceManager); -}; - -#endif // __JUCE_AUDIODEVICEMANAGER_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioIODevice.cpp b/src/juce/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioIODevice.cpp deleted file mode 100644 index 93dbf80c..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioIODevice.cpp +++ /dev/null @@ -1,49 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -AudioIODevice::AudioIODevice (const String& deviceName, const String& typeName_) - : name (deviceName), - typeName (typeName_) -{ -} - -AudioIODevice::~AudioIODevice() -{ -} - -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; -} - -//============================================================================== -void AudioIODeviceCallback::audioDeviceError (const String&) {} diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioIODevice.h b/src/juce/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioIODevice.h deleted file mode 100644 index 7e52852a..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioIODevice.h +++ /dev/null @@ -1,333 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_AUDIOIODEVICE_JUCEHEADER__ -#define __JUCE_AUDIOIODEVICE_JUCEHEADER__ - -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 number of sample-rates this device supports. - - To find out which rates are available on this device, use this method to - find out how many there are, and getSampleRate() to get the rates. - - @see getSampleRate - */ - virtual int getNumSampleRates() = 0; - - /** Returns one of the sample-rates this device supports. - - To find out which rates are available on this device, use getNumSampleRates() to - find out how many there are, and getSampleRate() to get the individual rates. - - The sample rate is set by the open() method. - - (Note that for DirectSound some rates might not work, depending on combinations - of i/o channels that are being opened). - - @see getNumSampleRates - */ - virtual double getSampleRate (int index) = 0; - - /** Returns the number of sizes of buffer that are available. - - @see getBufferSizeSamples, getDefaultBufferSize - */ - virtual int getNumBufferSizesAvailable() = 0; - - /** Returns one of the possible buffer-sizes. - - @param index the index of the buffer-size to use, from 0 to getNumBufferSizesAvailable() - 1 - @returns a number of samples - @see getNumBufferSizesAvailable, getDefaultBufferSize - */ - virtual int getBufferSizeSamples (int index) = 0; - - /** Returns the default buffer-size to use. - - @returns a number of samples - @see getNumBufferSizesAvailable, getBufferSizeSamples - */ - 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 getNumSampleRates() and getSampleRate() - @param bufferSizeSamples the size of i/o buffer to use - to find out the available buffer - sizes, see getNumBufferSizesAvailable() and getBufferSizeSamples() - @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(); - - - //============================================================================== -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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.cpp b/src/juce/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.cpp deleted file mode 100644 index a32f080f..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.cpp +++ /dev/null @@ -1,79 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce 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() { 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/src/juce/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.h b/src/juce/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.h deleted file mode 100644 index 8929fa9e..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.h +++ /dev/null @@ -1,186 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_AUDIOIODEVICETYPE_JUCEHEADER__ -#define __JUCE_AUDIOIODEVICETYPE_JUCEHEADER__ - -#include "juce_AudioIODevice.h" -class AudioDeviceManager; - - -//============================================================================== -/** - 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 a 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(); - /** 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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_devices/juce_audio_devices.cpp b/src/juce/JuceLibraryCode/modules/juce_audio_devices/juce_audio_devices.cpp deleted file mode 100644 index d379789c..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_devices/juce_audio_devices.cpp +++ /dev/null @@ -1,238 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#if defined (__JUCE_AUDIO_DEVICES_JUCEHEADER__) && ! 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 - #undef Point - #undef Component - -#elif JUCE_IOS - #import - #import - #import - -//============================================================================== -#elif JUCE_WINDOWS - #if JUCE_WASAPI - #pragma warning (push) - #pragma warning (disable: 4201) - #include - #include - #include - #include - #include - #include - #pragma warning (pop) - #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 www.steinberg.net/Steinberg/Developers.asp). - - 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 - #endif - -#endif - -namespace juce -{ - -// START_AUTOINCLUDE audio_io/*.cpp, midi_io/*.cpp, audio_cd/*.cpp, sources/*.cpp -#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" -// END_AUTOINCLUDE - -} - -//============================================================================== -using namespace juce; - -namespace juce -{ - #include "native/juce_MidiDataConcatenator.h" - -//============================================================================== -#if JUCE_MAC - #include "../juce_core/native/juce_osx_ObjCHelpers.h" - #include "../juce_core/native/juce_mac_ObjCSuffix.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 - -} diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_devices/juce_audio_devices.h b/src/juce/JuceLibraryCode/modules/juce_audio_devices/juce_audio_devices.h deleted file mode 100644 index 2f555307..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_devices/juce_audio_devices.h +++ /dev/null @@ -1,139 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_AUDIO_DEVICES_JUCEHEADER__ -#define __JUCE_AUDIO_DEVICES_JUCEHEADER__ - -#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). -*/ -#ifndef JUCE_WASAPI - #define JUCE_WASAPI 1 -#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 -{ - -// START_AUTOINCLUDE audio_io, midi_io, sources, audio_cd -#ifndef __JUCE_AUDIODEVICEMANAGER_JUCEHEADER__ - #include "audio_io/juce_AudioDeviceManager.h" -#endif -#ifndef __JUCE_AUDIOIODEVICE_JUCEHEADER__ - #include "audio_io/juce_AudioIODevice.h" -#endif -#ifndef __JUCE_AUDIOIODEVICETYPE_JUCEHEADER__ - #include "audio_io/juce_AudioIODeviceType.h" -#endif -#ifndef __JUCE_MIDIINPUT_JUCEHEADER__ - #include "midi_io/juce_MidiInput.h" -#endif -#ifndef __JUCE_MIDIMESSAGECOLLECTOR_JUCEHEADER__ - #include "midi_io/juce_MidiMessageCollector.h" -#endif -#ifndef __JUCE_MIDIOUTPUT_JUCEHEADER__ - #include "midi_io/juce_MidiOutput.h" -#endif -#ifndef __JUCE_AUDIOSOURCEPLAYER_JUCEHEADER__ - #include "sources/juce_AudioSourcePlayer.h" -#endif -#ifndef __JUCE_AUDIOTRANSPORTSOURCE_JUCEHEADER__ - #include "sources/juce_AudioTransportSource.h" -#endif -#ifndef __JUCE_AUDIOCDBURNER_JUCEHEADER__ - #include "audio_cd/juce_AudioCDBurner.h" -#endif -#ifndef __JUCE_AUDIOCDREADER_JUCEHEADER__ - #include "audio_cd/juce_AudioCDReader.h" -#endif -// END_AUTOINCLUDE - -} - -#endif // __JUCE_AUDIO_DEVICES_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_devices/juce_audio_devices.mm b/src/juce/JuceLibraryCode/modules/juce_audio_devices/juce_audio_devices.mm deleted file mode 100644 index ea13a2f6..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_devices/juce_audio_devices.mm +++ /dev/null @@ -1,26 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#include "juce_audio_devices.cpp" diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_devices/juce_module_info b/src/juce/JuceLibraryCode/modules/juce_audio_devices/juce_module_info deleted file mode 100644 index 0fb68465..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_devices/juce_module_info +++ /dev/null @@ -1,26 +0,0 @@ -{ - "id": "juce_audio_devices", - "name": "JUCE audio and midi I/O device classes", - "version": "2.0.21", - "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" -} diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiInput.h b/src/juce/JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiInput.h deleted file mode 100644 index 2a3c44b3..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiInput.h +++ /dev/null @@ -1,183 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_MIDIINPUT_JUCEHEADER__ -#define __JUCE_MIDIINPUT_JUCEHEADER__ - -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, - const int numBytesSoFar, - const 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 0 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. */ - virtual ~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 - */ - virtual void start(); - - /** Stops the device running. - - @see start - */ - virtual void stop(); - -protected: - //============================================================================== - String name; - void* internal; - - explicit MidiInput (const String& name); - -private: - //============================================================================== - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MidiInput); -}; - - -#endif // __JUCE_MIDIINPUT_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.cpp b/src/juce/JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.cpp deleted file mode 100644 index 4bcc897d..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.cpp +++ /dev/null @@ -1,153 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce 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); - - 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/src/juce/JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.h b/src/juce/JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.h deleted file mode 100644 index e0731018..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.h +++ /dev/null @@ -1,105 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_MIDIMESSAGECOLLECTOR_JUCEHEADER__ -#define __JUCE_MIDIMESSAGECOLLECTOR_JUCEHEADER__ - -#include "juce_MidiInput.h" - - -//============================================================================== -/** - 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(). - */ - void removeNextBlockOfMessages (MidiBuffer& destBuffer, int numSamples); - - - //============================================================================== - /** @internal */ - void handleNoteOn (MidiKeyboardState* source, int midiChannel, int midiNoteNumber, float velocity); - /** @internal */ - void handleNoteOff (MidiKeyboardState* source, int midiChannel, int midiNoteNumber); - /** @internal */ - void handleIncomingMidiMessage (MidiInput* source, const MidiMessage& message); - -private: - //============================================================================== - double lastCallbackTime; - CriticalSection midiCallbackLock; - MidiBuffer incomingMessages; - double sampleRate; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MidiMessageCollector); -}; - - -#endif // __JUCE_MIDIMESSAGECOLLECTOR_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiOutput.cpp b/src/juce/JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiOutput.cpp deleted file mode 100644 index 1bebd784..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiOutput.cpp +++ /dev/null @@ -1,163 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce 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/src/juce/JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiOutput.h b/src/juce/JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiOutput.h deleted file mode 100644 index d05883cb..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiOutput.h +++ /dev/null @@ -1,148 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_MIDIOUTPUT_JUCEHEADER__ -#define __JUCE_MIDIOUTPUT_JUCEHEADER__ - - -//============================================================================== -/** - 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 0 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. */ - virtual ~MidiOutput(); - - /** Makes this device output a midi message. - - @see MidiMessage - */ - virtual 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 supplied, 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. - */ - virtual void sendBlockOfMessages (const MidiBuffer& buffer, - double millisecondCounterToStartAt, - double samplesPerSecondForBuffer); - - /** Gets rid of any midi messages that had been added by sendBlockOfMessages(). - */ - virtual 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(). - */ - virtual void startBackgroundThread(); - - /** Stops the background thread, and clears any pending midi events. - - @see startBackgroundThread - */ - virtual void stopBackgroundThread(); - - -protected: - //============================================================================== - void* internal; - CriticalSection lock; - struct PendingMessage; - PendingMessage* firstMessage; - - MidiOutput(); - void run(); - -private: - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MidiOutput); -}; - - -#endif // __JUCE_MIDIOUTPUT_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_devices/native/juce_MidiDataConcatenator.h b/src/juce/JuceLibraryCode/modules/juce_audio_devices/native/juce_MidiDataConcatenator.h deleted file mode 100644 index 0ff8060b..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_devices/native/juce_MidiDataConcatenator.h +++ /dev/null @@ -1,142 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_MIDIDATACONCATENATOR_JUCEHEADER__ -#define __JUCE_MIDIDATACONCATENATOR_JUCEHEADER__ - -//============================================================================== -/** - 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), - pendingBytes (0), pendingDataTime (0) - { - } - - void reset() - { - pendingBytes = 0; - pendingDataTime = 0; - } - - void pushMidiData (const void* data, int numBytes, double time, - MidiInput* input, MidiInputCallback& callback) - { - const uint8* d = static_cast (data); - - while (numBytes > 0) - { - if (pendingBytes > 0 || d[0] == 0xf0) - { - processSysex (d, numBytes, time, input, callback); - } - else - { - int used = 0; - const MidiMessage m (d, numBytes, used, 0, time); - - if (used <= 0) - break; // malformed message.. - - callback.handleIncomingMidiMessage (input, m); - numBytes -= used; - d += used; - } - } - } - -private: - void processSysex (const uint8*& d, int& numBytes, double time, - MidiInput* input, MidiInputCallback& 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 >= 0xfa || *d == 0xf8) - { - callback.handleIncomingMidiMessage (input, MidiMessage (*d, time)); - ++d; - --numBytes; - } - else - { - if (*d == 0xf7) - { - *dest++ = *d++; - pendingBytes++; - --numBytes; - } - - 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; - int pendingBytes; - double pendingDataTime; - - JUCE_DECLARE_NON_COPYABLE (MidiDataConcatenator); -}; - -#endif // __JUCE_MIDIDATACONCATENATOR_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_devices/native/juce_android_Audio.cpp b/src/juce/JuceLibraryCode/modules/juce_audio_devices/native/juce_android_Audio.cpp deleted file mode 100644 index c4c6ab59..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_devices/native/juce_android_Audio.cpp +++ /dev/null @@ -1,444 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce 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), - outputChannelBuffer (1, 1), - inputChannelBuffer (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() - { - StringArray s; - s.add ("Left"); - s.add ("Right"); - return s; - } - - StringArray getInputChannelNames() - { - StringArray s; - - if (numDeviceInputChannelsAvailable == 2) - { - s.add ("Left"); - s.add ("Right"); - } - else if (numDeviceInputChannelsAvailable == 1) - { - s.add ("Audio Input"); - } - - return s; - } - - int getNumSampleRates() { return 1;} - double getSampleRate (int index) { return sampleRate; } - - int getDefaultBufferSize() { return 2048; } - int getNumBufferSizesAvailable() { return 50; } - - int getBufferSizeSamples (int index) - { - int n = 16; - for (int i = 0; i < index; ++i) - n += n < 64 ? 16 - : (n < 512 ? 32 - : (n < 1024 ? 64 - : (n < 2048 ? 128 : 256))); - - return n; - } - - - String open (const BigInteger& inputChannels, - const BigInteger& outputChannels, - double requestedSampleRate, - int bufferSize) - { - close(); - - if (sampleRate != (int) requestedSampleRate) - return "Sample rate not allowed"; - - lastError = String::empty; - 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() - { - if (isRunning) - { - stopThread (2000); - isRunning = false; - closeDevices(); - } - } - - int getOutputLatencyInSamples() { return (minBufferSizeOut * 3) / 4; } - int getInputLatencyInSamples() { return (minBufferSizeIn * 3) / 4; } - bool isOpen() { return isRunning; } - int getCurrentBufferSizeSamples() { return actualBufferSize; } - int getCurrentBitDepth() { return 16; } - double getCurrentSampleRate() { return sampleRate; } - BigInteger getActiveOutputChannels() const { return activeOutputChans; } - BigInteger getActiveInputChannels() const { return activeInputChans; } - String getLastError() { return lastError; } - bool isPlaying() { return isRunning && callback != 0; } - - void start (AudioIODeviceCallback* newCallback) - { - if (isRunning && callback != newCallback) - { - if (newCallback != nullptr) - newCallback->audioDeviceAboutToStart (this); - - const ScopedLock sl (callbackLock); - callback = newCallback; - } - } - - void stop() - { - if (isRunning) - { - AudioIODeviceCallback* lastCallback; - - { - const ScopedLock sl (callbackLock); - lastCallback = callback; - callback = nullptr; - } - - if (lastCallback != nullptr) - lastCallback->audioDeviceStopped(); - } - } - - void run() - { - 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.getSampleData (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 ((const float**) inputChannelBuffer.getArrayOfChannels(), numClientInputChannels, - outputChannelBuffer.getArrayOfChannels(), 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.getSampleData (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/src/juce/JuceLibraryCode/modules/juce_audio_devices/native/juce_android_Midi.cpp b/src/juce/JuceLibraryCode/modules/juce_audio_devices/native/juce_android_Midi.cpp deleted file mode 100644 index b8a79bb6..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_devices/native/juce_android_Midi.cpp +++ /dev/null @@ -1,85 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -StringArray MidiOutput::getDevices() -{ - StringArray devices; - - return devices; -} - -int MidiOutput::getDefaultDeviceIndex() -{ - return 0; -} - -MidiOutput* MidiOutput::openDevice (int index) -{ - return nullptr; -} - -MidiOutput::~MidiOutput() -{ -} - -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/src/juce/JuceLibraryCode/modules/juce_audio_devices/native/juce_android_OpenSL.cpp b/src/juce/JuceLibraryCode/modules/juce_audio_devices/native/juce_android_OpenSL.cpp deleted file mode 100644 index 5525bb13..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_devices/native/juce_android_OpenSL.cpp +++ /dev/null @@ -1,633 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -const char* const openSLTypeName = "Android OpenSL"; - -bool isOpenSLAvailable() -{ - DynamicLibrary library; - return library.open ("libOpenSLES.so"); -} - -const unsigned short openSLRates[] = { 8000, 16000, 32000, 44100, 48000 }; -const unsigned short openSLBufferSizes[] = { 256, 512, 768, 1024, 1280, 1600 }; // must all be multiples of the block size - -//============================================================================== -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() - { - StringArray s; - s.add ("Left"); - s.add ("Right"); - return s; - } - - StringArray getInputChannelNames() - { - StringArray s; - s.add ("Audio Input"); - return s; - } - - int getNumSampleRates() { return numElementsInArray (openSLRates); } - - double getSampleRate (int index) - { - jassert (index >= 0 && index < getNumSampleRates()); - return (int) openSLRates [index]; - } - - int getDefaultBufferSize() { return 1024; } - int getNumBufferSizesAvailable() { return numElementsInArray (openSLBufferSizes); } - - int getBufferSizeSamples (int index) - { - jassert (index >= 0 && index < getNumBufferSizesAvailable()); - return (int) openSLBufferSizes [index]; - } - - String open (const BigInteger& inputChannels, - const BigInteger& outputChannels, - double requestedSampleRate, - int bufferSize) - { - close(); - - lastError = String::empty; - 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); - - recorder = engine.createRecorder (numInputChannels, sampleRate); - player = engine.createPlayer (numOutputChannels, sampleRate); - - startThread (8); - - deviceOpen = true; - return lastError; - } - - void close() - { - stop(); - stopThread (6000); - deviceOpen = false; - recorder = nullptr; - player = nullptr; - } - - int getOutputLatencyInSamples() { return outputLatency; } - int getInputLatencyInSamples() { return inputLatency; } - bool isOpen() { return deviceOpen; } - int getCurrentBufferSizeSamples() { return actualBufferSize; } - int getCurrentBitDepth() { return 16; } - double getCurrentSampleRate() { return sampleRate; } - BigInteger getActiveOutputChannels() const { return activeOutputChans; } - BigInteger getActiveInputChannels() const { return activeInputChans; } - String getLastError() { return lastError; } - bool isPlaying() { return callback != nullptr; } - - void start (AudioIODeviceCallback* newCallback) - { - stop(); - - if (deviceOpen && callback != newCallback) - { - if (newCallback != nullptr) - newCallback->audioDeviceAboutToStart (this); - - setCallback (newCallback); - } - } - - void stop() - { - AudioIODeviceCallback* const oldCallback = setCallback (nullptr); - - if (oldCallback != nullptr) - oldCallback->audioDeviceStopped(); - } - - void run() - { - if (recorder != nullptr) recorder->start(); - if (player != nullptr) player->start(); - - while (! threadShouldExit()) - { - if (player != nullptr && ! threadShouldExit()) - player->writeBuffer (outputBuffer, *this); - - if (recorder != nullptr) - recorder->readNextBlock (inputBuffer, *this); - - invokeCallback(); - } - } - - void invokeCallback() - { - const ScopedLock sl (callbackLock); - - if (callback != nullptr) - { - callback->audioDeviceIOCallback (numInputChannels > 0 ? (const float**) inputBuffer.getArrayOfChannels() : nullptr, - numInputChannels, - numOutputChannels > 0 ? outputBuffer.getArrayOfChannels() : nullptr, - numOutputChannels, - actualBufferSize); - } - else - { - outputBuffer.clear(); - } - } - -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; - } - - //================================================================================================== - 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*); - CreateEngineFunc createEngine = (CreateEngineFunc) library.getFunction ("slCreateEngine"); - - if (createEngine != nullptr) - { - 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"); - - 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; - - 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, - numChannels, - 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.getSampleData (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), - bufferList (numChannels) - { - jassert (numChannels == 1); // STEREO doesn't always work!! - - SLDataFormat_PCM pcmFormat = - { - SL_DATAFORMAT_PCM, - numChannels, - 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 ((*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.getSampleData (i, offset)); - SrcSampleType srcData (srcBuffer + i, bufferList.numChannels); - dstData.convertSamples (srcData, bufferList.numSamples); - } - - enqueueBuffer (srcBuffer); - - numSamples -= bufferList.numSamples; - offset += bufferList.numSamples; - } - } - - private: - SLObjectItf recorderObject; - SLRecordItf recorderRecord; - SLAndroidSimpleBufferQueueItf recorderBufferQueue; - - 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/src/juce/JuceLibraryCode/modules/juce_audio_devices/native/juce_ios_Audio.cpp b/src/juce/JuceLibraryCode/modules/juce_audio_devices/native/juce_ios_Audio.cpp deleted file mode 100644 index b86a4819..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_devices/native/juce_ios_Audio.cpp +++ /dev/null @@ -1,541 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -class IPhoneAudioIODevice : public AudioIODevice -{ -public: - IPhoneAudioIODevice (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(); - } - - ~IPhoneAudioIODevice() - { - getSessionHolder().activeDevices.removeValue (this); - close(); - } - - StringArray getOutputChannelNames() - { - StringArray s; - s.add ("Left"); - s.add ("Right"); - return s; - } - - StringArray getInputChannelNames() - { - StringArray s; - if (audioInputIsAvailable) - { - s.add ("Left"); - s.add ("Right"); - } - return s; - } - - int getNumSampleRates() { return 1; } - double getSampleRate (int index) { return sampleRate; } - - int getNumBufferSizesAvailable() { return 6; } - int getBufferSizeSamples (int index) { return 1 << (jlimit (0, 5, index) + 6); } - int getDefaultBufferSize() { return 1024; } - - String open (const BigInteger& inputChannels, - const BigInteger& outputChannels, - double sampleRate, - int bufferSize) - { - close(); - - lastError = String::empty; - preferredBufferSize = (bufferSize <= 0) ? getDefaultBufferSize() : bufferSize; - - // xxx set up channel mapping - - activeOutputChans = outputChannels; - activeOutputChans.setRange (2, activeOutputChans.getHighestBit(), false); - numOutputChannels = activeOutputChans.countNumberOfSetBits(); - monoOutputChannelNumber = activeOutputChans.findNextSetBit (0); - - activeInputChans = inputChannels; - activeInputChans.setRange (2, activeInputChans.getHighestBit(), false); - numInputChannels = activeInputChans.countNumberOfSetBits(); - monoInputChannelNumber = activeInputChans.findNextSetBit (0); - - AudioSessionSetActive (true); - - UInt32 audioCategory = audioInputIsAvailable ? kAudioSessionCategory_PlayAndRecord - : kAudioSessionCategory_MediaPlayback; - - AudioSessionSetProperty (kAudioSessionProperty_AudioCategory, sizeof (audioCategory), &audioCategory); - AudioSessionAddPropertyListener (kAudioSessionProperty_AudioRouteChange, routingChangedStatic, this); - - fixAudioRouteIfSetToReceiver(); - updateDeviceInfo(); - - Float32 bufferDuration = preferredBufferSize / sampleRate; - AudioSessionSetProperty (kAudioSessionProperty_PreferredHardwareIOBufferDuration, sizeof (bufferDuration), &bufferDuration); - actualBufferSize = preferredBufferSize; - - prepareFloatBuffers(); - - isRunning = true; - routingChanged (nullptr); // creates and starts the AU - - lastError = audioUnit != 0 ? "" : "Couldn't open the device"; - return lastError; - } - - void close() - { - if (isRunning) - { - isRunning = false; - AudioSessionRemovePropertyListenerWithUserData (kAudioSessionProperty_AudioRouteChange, routingChangedStatic, this); - AudioSessionSetActive (false); - - if (audioUnit != 0) - { - AudioComponentInstanceDispose (audioUnit); - audioUnit = 0; - } - } - } - - bool isOpen() { return isRunning; } - - int getCurrentBufferSizeSamples() { return actualBufferSize; } - double getCurrentSampleRate() { return sampleRate; } - int getCurrentBitDepth() { return 16; } - - BigInteger getActiveOutputChannels() const { return activeOutputChans; } - BigInteger getActiveInputChannels() const { return activeInputChans; } - - int getOutputLatencyInSamples() { return 0; } //xxx - int getInputLatencyInSamples() { return 0; } //xxx - - void start (AudioIODeviceCallback* callback_) - { - if (isRunning && callback != callback_) - { - if (callback_ != nullptr) - callback_->audioDeviceAboutToStart (this); - - const ScopedLock sl (callbackLock); - callback = callback_; - } - } - - void stop() - { - if (isRunning) - { - AudioIODeviceCallback* lastCallback; - - { - const ScopedLock sl (callbackLock); - lastCallback = callback; - callback = nullptr; - } - - if (lastCallback != nullptr) - lastCallback->audioDeviceStopped(); - } - } - - bool isPlaying() { return isRunning && callback != nullptr; } - String getLastError() { return lastError; } - -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() - { - floatData.setSize (numInputChannels + numOutputChannels, actualBufferSize); - zeromem (inputChannels, sizeof (inputChannels)); - zeromem (outputChannels, sizeof (outputChannels)); - - for (int i = 0; i < numInputChannels; ++i) - inputChannels[i] = floatData.getSampleData (i); - - for (int i = 0; i < numOutputChannels; ++i) - outputChannels[i] = floatData.getSampleData (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 (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() - { - UInt32 size = sizeof (sampleRate); - AudioSessionGetProperty (kAudioSessionProperty_CurrentHardwareSampleRate, &size, &sampleRate); - - size = sizeof (audioInputIsAvailable); - AudioSessionGetProperty (kAudioSessionProperty_AudioInputAvailable, &size, &audioInputIsAvailable); - } - - 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) - fixAudioRouteIfSetToReceiver(); - } - - updateDeviceInfo(); - createAudioUnit(); - - AudioSessionSetActive (true); - - if (audioUnit != 0) - { - UInt32 formatSize = sizeof (format); - AudioUnitGetProperty (audioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, 1, &format, &formatSize); - - Float32 bufferDuration = preferredBufferSize / sampleRate; - UInt32 bufferDurationSize = sizeof (bufferDuration); - AudioSessionGetProperty (kAudioSessionProperty_CurrentHardwareIOBufferDuration, &bufferDurationSize, &bufferDurationSize); - actualBufferSize = (int) (sampleRate * bufferDuration + 0.5); - - 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); - - if (juce_iPhoneShowModalAlert ("Audio Interrupted", - "This could have been interrupted by another application or by unplugging a headset", - @"Resume", - @"Cancel")) - { - isRunning = true; - routingChanged (nullptr); - } - }*/ - - if (interruptionType == kAudioSessionEndInterruption) - { - isRunning = true; - AudioSessionSetActive (true); - AudioOutputUnitStart (audioUnit); - } - } - - //================================================================================================== - 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 = numChannels; - format.mFramesPerPacket = 1; - format.mBytesPerFrame = format.mBytesPerPacket = 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; - UInt32 propertySize = sizeof (audioRoute); - if (AudioSessionGetProperty (kAudioSessionProperty_AudioRoute, &propertySize, &audioRoute) == noErr) - { - NSString* route = (NSString*) audioRoute; - - //DBG ("audio route: " + nsStringToJuce (route)); - - if ([route hasPrefix: @"Receiver"]) - { - UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker; - AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute, sizeof (audioRouteOverride), &audioRouteOverride); - } - - CFRelease (audioRoute); - } - } - - JUCE_DECLARE_NON_COPYABLE (IPhoneAudioIODevice); -}; - - -//============================================================================== -class IPhoneAudioIODeviceType : public AudioIODeviceType -{ -public: - //============================================================================== - IPhoneAudioIODeviceType() - : AudioIODeviceType ("iPhone Audio") - { - } - - void scanForDevices() {} - - StringArray getDeviceNames (bool wantInputNames) const - { - return StringArray ("iPhone Audio"); - } - - 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) - { - if (outputDeviceName.isNotEmpty() || inputDeviceName.isNotEmpty()) - return new IPhoneAudioIODevice (outputDeviceName.isNotEmpty() ? outputDeviceName - : inputDeviceName); - - return nullptr; - } - -private: - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (IPhoneAudioIODeviceType); -}; - -//============================================================================== -AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_iOSAudio() -{ - return new IPhoneAudioIODeviceType(); -} diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_devices/native/juce_linux_ALSA.cpp b/src/juce/JuceLibraryCode/modules/juce_audio_devices/native/juce_linux_ALSA.cpp deleted file mode 100644 index 51ad00e3..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_devices/native/juce_linux_ALSA.cpp +++ /dev/null @@ -1,1012 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -namespace -{ - 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 (ratesToTry[i]); - } - } - } - - 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); - } - } - - void getDeviceProperties (const String& deviceID, - unsigned int& minChansOut, - unsigned int& maxChansOut, - unsigned int& minChansIn, - unsigned int& maxChansIn, - Array & rates) - { - if (deviceID.isEmpty()) - return; - - snd_ctl_t* handle; - - if (snd_ctl_open (&handle, deviceID.upToLastOccurrenceOf (",", false, false).toUTF8(), SND_CTL_NONBLOCK) >= 0) - { - snd_pcm_info_t* info; - snd_pcm_info_alloca (&info); - - snd_pcm_info_set_stream (info, SND_PCM_STREAM_PLAYBACK); - snd_pcm_info_set_device (info, deviceID.fromLastOccurrenceOf (",", false, false).getIntValue()); - snd_pcm_info_set_subdevice (info, 0); - - if (snd_ctl_pcm_info (handle, info) >= 0) - { - snd_pcm_t* pcmHandle; - if (snd_pcm_open (&pcmHandle, deviceID.toUTF8(), SND_PCM_STREAM_PLAYBACK, SND_PCM_ASYNC | SND_PCM_NONBLOCK) >= 0) - { - getDeviceNumChannels (pcmHandle, &minChansOut, &maxChansOut); - getDeviceSampleRates (pcmHandle, rates); - - snd_pcm_close (pcmHandle); - } - } - - snd_pcm_info_set_stream (info, SND_PCM_STREAM_CAPTURE); - - if (snd_ctl_pcm_info (handle, info) >= 0) - { - snd_pcm_t* pcmHandle; - if (snd_pcm_open (&pcmHandle, deviceID.toUTF8(), SND_PCM_STREAM_CAPTURE, SND_PCM_ASYNC | SND_PCM_NONBLOCK) >= 0) - { - getDeviceNumChannels (pcmHandle, &minChansIn, &maxChansIn); - - if (rates.size() == 0) - getDeviceSampleRates (pcmHandle, rates); - - snd_pcm_close (pcmHandle); - } - } - - snd_ctl_close (handle); - } - } -} - -//============================================================================== -class ALSADevice -{ -public: - ALSADevice (const String& deviceID, bool forInput) - : handle (0), - bitDepth (16), - numChannelsRunning (0), - latency (0), - isInput (forInput), - isInterleaved (true) - { - failed (snd_pcm_open (&handle, deviceID.toUTF8(), - forInput ? SND_PCM_STREAM_CAPTURE : SND_PCM_STREAM_PLAYBACK, - SND_PCM_ASYNC)); - } - - ~ALSADevice() - { - if (handle != 0) - snd_pcm_close (handle); - } - - bool setParameters (unsigned int sampleRate, int numChannels, int bufferSize) - { - if (handle == 0) - return false; - - snd_pcm_hw_params_t* hwParams; - snd_pcm_hw_params_alloca (&hwParams); - - if (failed (snd_pcm_hw_params_any (handle, hwParams))) - return false; - - if (snd_pcm_hw_params_set_access (handle, hwParams, SND_PCM_ACCESS_RW_NONINTERLEAVED) >= 0) - isInterleaved = false; - else if (snd_pcm_hw_params_set_access (handle, hwParams, SND_PCM_ACCESS_RW_INTERLEAVED) >= 0) - isInterleaved = true; - else - { - jassertfalse; - return false; - } - - enum { isFloatBit = 1 << 16, isLittleEndianBit = 1 << 17 }; - - 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_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) - { - bitDepth = formatsToTry [i + 1] & 255; - const bool isFloat = (formatsToTry [i + 1] & isFloatBit) != 0; - const bool isLittleEndian = (formatsToTry [i + 1] & isLittleEndianBit) != 0; - converter = createConverter (isInput, bitDepth, isFloat, isLittleEndian, numChannels); - break; - } - } - - if (bitDepth == 0) - { - error = "device doesn't support a compatible PCM format"; - DBG ("ALSA error: " + error + "\n"); - return false; - } - - int dir = 0; - unsigned int periods = 4; - snd_pcm_uframes_t samplesPerPeriod = bufferSize; - - if (failed (snd_pcm_hw_params_set_rate_near (handle, hwParams, &sampleRate, 0)) - || failed (snd_pcm_hw_params_set_channels (handle, hwParams, numChannels)) - || failed (snd_pcm_hw_params_set_periods_near (handle, hwParams, &periods, &dir)) - || failed (snd_pcm_hw_params_set_period_size_near (handle, hwParams, &samplesPerPeriod, &dir)) - || failed (snd_pcm_hw_params (handle, hwParams))) - { - return false; - } - - snd_pcm_uframes_t frames = 0; - - if (failed (snd_pcm_hw_params_get_period_size (hwParams, &frames, &dir)) - || 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..) - - snd_pcm_sw_params_t* swParams; - snd_pcm_sw_params_alloca (&swParams); - snd_pcm_uframes_t boundary; - - if (failed (snd_pcm_sw_params_current (handle, swParams)) - || failed (snd_pcm_sw_params_get_boundary (swParams, &boundary)) - || failed (snd_pcm_sw_params_set_silence_threshold (handle, swParams, 0)) - || failed (snd_pcm_sw_params_set_silence_size (handle, swParams, boundary)) - || failed (snd_pcm_sw_params_set_start_threshold (handle, swParams, samplesPerPeriod)) - || failed (snd_pcm_sw_params_set_stop_threshold (handle, swParams, boundary)) - || failed (snd_pcm_sw_params (handle, swParams))) - { - return false; - } - - #if 0 - // 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 data = outputChannelBuffer.getArrayOfChannels(); - 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 (failed (numDone)) - { - if (numDone == -EPIPE) - { - if (failed (snd_pcm_prepare (handle))) - return false; - } - else if (numDone != -ESTRPIPE) - return false; - } - - return true; - } - - bool readFromInputDevice (AudioSampleBuffer& inputChannelBuffer, const int numSamples) - { - jassert (numChannelsRunning <= inputChannelBuffer.getNumChannels()); - float** const data = inputChannelBuffer.getArrayOfChannels(); - - 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 (failed (num)) - { - if (num == -EPIPE) - { - if (failed (snd_pcm_prepare (handle))) - return false; - } - else if (num != -ESTRPIPE) - return false; - } - - 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 (failed (num) && num != -EPIPE && num != -ESTRPIPE) - return false; - - 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: - 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); - else - return new AudioData::ConverterInstance , DestType> (numInterleavedChannels, 1); - } - else - { - typedef AudioData::Pointer SourceType; - - if (isLittleEndian) - return new AudioData::ConverterInstance > (1, numInterleavedChannels); - else - return new AudioData::ConverterInstance > (1, numInterleavedChannels); - } - } - }; - - static AudioData::Converter* createConverter (const bool forInput, const int bitDepth, const bool isFloat, const bool isLittleEndian, const int numInterleavedChannels) - { - switch (bitDepth) - { - case 16: return ConverterHelper ::createConverter (forInput, isLittleEndian, numInterleavedChannels); - case 24: return ConverterHelper ::createConverter (forInput, isLittleEndian, numInterleavedChannels); - case 32: return isFloat ? ConverterHelper ::createConverter (forInput, isLittleEndian, numInterleavedChannels) - : ConverterHelper ::createConverter (forInput, isLittleEndian, numInterleavedChannels); - default: jassertfalse; break; // unsupported format! - } - - return nullptr; - } - - //============================================================================== - bool failed (const int errorNum) - { - if (errorNum >= 0) - return false; - - error = snd_strerror (errorNum); - DBG ("ALSA error: " + error + "\n"); - return true; - } - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ALSADevice); -}; - -//============================================================================== -class ALSAThread : public Thread -{ -public: - ALSAThread (const String& inputId_, - const String& outputId_) - : Thread ("Juce ALSA"), - sampleRate (0), - bufferSize (0), - outputLatency (0), - inputLatency (0), - callback (0), - inputId (inputId_), - outputId (outputId_), - numCallbacks (0), - inputChannelBuffer (1, 1), - outputChannelBuffer (1, 1) - { - initialiseRatesAndChannels(); - } - - ~ALSAThread() - { - close(); - } - - void open (BigInteger inputChannels, - BigInteger outputChannels, - const double sampleRate_, - const int bufferSize_) - { - close(); - - error = String::empty; - sampleRate = sampleRate_; - bufferSize = bufferSize_; - - 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.getSampleData (i)); - currentInputChans.setBit (i); - } - } - } - - 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.getSampleData (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; - } - - currentOutputChans.setRange (0, minChansOut, true); - - 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; - } - - currentInputChans.setRange (0, minChansIn, true); - - 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 && failed (snd_pcm_prepare (inputDevice->handle))) - return; - - if (outputDevice != nullptr && 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() - { - 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() - { - while (! threadShouldExit()) - { - if (inputDevice != nullptr) - { - if (! inputDevice->readFromInputDevice (inputChannelBuffer, bufferSize)) - { - DBG ("ALSA: read failure"); - break; - } - } - - if (threadShouldExit()) - break; - - { - const ScopedLock sl (callbackLock); - ++numCallbacks; - - if (callback != nullptr) - { - callback->audioDeviceIOCallback ((const float**) 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) - { - failed (snd_pcm_wait (outputDevice->handle, 2000)); - - if (threadShouldExit()) - break; - - failed (snd_pcm_avail_update (outputDevice->handle)); - - if (! outputDevice->writeToOutputDevice (outputChannelBuffer, bufferSize)) - { - DBG ("ALSA: write failure"); - break; - } - } - } - } - - 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; - - CriticalSection callbackLock; - - AudioSampleBuffer inputChannelBuffer, outputChannelBuffer; - Array inputChannelDataForCallback, outputChannelDataForCallback; - - unsigned int minChansOut, maxChansOut; - unsigned int minChansIn, maxChansIn; - - bool failed (const int errorNum) - { - if (errorNum >= 0) - return false; - - error = snd_strerror (errorNum); - DBG ("ALSA error: " + error + "\n"); - 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); - getDeviceProperties (outputId, minChansOut, maxChansOut, dummy, dummy, sampleRates); - - unsigned int i; - for (i = 0; i < maxChansOut; ++i) - channelNamesOut.add ("channel " + String ((int) i + 1)); - - for (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& inputId_, - const String& outputId_) - : AudioIODevice (deviceName, "ALSA"), - inputId (inputId_), - outputId (outputId_), - isOpen_ (false), - isStarted (false), - internal (inputId_, outputId_) - { - } - - ~ALSAAudioIODevice() - { - close(); - } - - StringArray getOutputChannelNames() { return internal.channelNamesOut; } - StringArray getInputChannelNames() { return internal.channelNamesIn; } - - int getNumSampleRates() { return internal.sampleRates.size(); } - double getSampleRate (int index) { return internal.sampleRates [index]; } - - int getDefaultBufferSize() { return 512; } - int getNumBufferSizesAvailable() { return 50; } - - int getBufferSizeSamples (int index) - { - int n = 16; - for (int i = 0; i < index; ++i) - n += n < 64 ? 16 - : (n < 512 ? 32 - : (n < 1024 ? 64 - : (n < 2048 ? 128 : 256))); - - return n; - } - - String open (const BigInteger& inputChannels, - const BigInteger& outputChannels, - double sampleRate, - int bufferSizeSamples) - { - close(); - - if (bufferSizeSamples <= 0) - bufferSizeSamples = getDefaultBufferSize(); - - if (sampleRate <= 0) - { - for (int i = 0; i < getNumSampleRates(); ++i) - { - if (getSampleRate (i) >= 44100) - { - sampleRate = getSampleRate (i); - break; - } - } - } - - internal.open (inputChannels, outputChannels, - sampleRate, bufferSizeSamples); - - isOpen_ = internal.error.isEmpty(); - return internal.error; - } - - void close() - { - stop(); - internal.close(); - isOpen_ = false; - } - - bool isOpen() { return isOpen_; } - bool isPlaying() { return isStarted && internal.error.isEmpty(); } - String getLastError() { return internal.error; } - - int getCurrentBufferSizeSamples() { return internal.bufferSize; } - double getCurrentSampleRate() { return internal.sampleRate; } - int getCurrentBitDepth() { return internal.getBitDepth(); } - - BigInteger getActiveOutputChannels() const { return internal.currentOutputChans; } - BigInteger getActiveInputChannels() const { return internal.currentInputChans; } - - int getOutputLatencyInSamples() { return internal.outputLatency; } - int getInputLatencyInSamples() { return internal.inputLatency; } - - void start (AudioIODeviceCallback* callback) - { - if (! isOpen_) - callback = nullptr; - - if (callback != nullptr) - callback->audioDeviceAboutToStart (this); - - internal.setCallback (callback); - - isStarted = (callback != nullptr); - } - - void stop() - { - AudioIODeviceCallback* const oldCallback = internal.callback; - - start (0); - - if (oldCallback != nullptr) - oldCallback->audioDeviceStopped(); - } - - String inputId, outputId; - -private: - bool isOpen_, isStarted; - ALSAThread internal; -}; - - -//============================================================================== -class ALSAAudioIODeviceType : public AudioIODeviceType -{ -public: - //============================================================================== - ALSAAudioIODeviceType() - : AudioIODeviceType ("ALSA"), - hasScanned (false) - { - } - - ~ALSAAudioIODeviceType() - { - } - - //============================================================================== - void scanForDevices() - { - if (hasScanned) - return; - - hasScanned = true; - inputNames.clear(); - inputIds.clear(); - outputNames.clear(); - outputIds.clear(); - -/* void** hints = 0; - if (snd_device_name_hint (-1, "pcm", &hints) >= 0) - { - for (void** hint = hints; *hint != 0; ++hint) - { - const String name (getHint (*hint, "NAME")); - - if (name.isNotEmpty()) - { - const String ioid (getHint (*hint, "IOID")); - - String desc (getHint (*hint, "DESC")); - if (desc.isEmpty()) - desc = name; - - desc = desc.replaceCharacters ("\n\r", " "); - - DBG ("name: " << name << "\ndesc: " << desc << "\nIO: " << ioid); - - if (ioid.isEmpty() || ioid == "Input") - { - inputNames.add (desc); - inputIds.add (name); - } - - if (ioid.isEmpty() || ioid == "Output") - { - outputNames.add (desc); - outputIds.add (name); - } - } - } - - snd_device_name_free_hint (hints); - } -*/ - 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() <= 32) - { - snd_card_next (&cardNum); - - if (cardNum < 0) - break; - - if (snd_ctl_open (&handle, ("hw:" + String (cardNum)).toUTF8(), SND_CTL_NONBLOCK) >= 0) - { - if (snd_ctl_card_info (handle, info) >= 0) - { - String cardId (snd_ctl_card_info_get_id (info)); - - if (cardId.removeCharacters ("0123456789").isEmpty()) - cardId = String (cardNum); - - int device = -1; - - for (;;) - { - if (snd_ctl_pcm_next_device (handle, &device) < 0 || device < 0) - break; - - String id, name; - id << "hw:" << cardId << ',' << device; - - bool isInput, isOutput; - - if (testDevice (id, isInput, isOutput)) - { - name << snd_ctl_card_info_get_name (info); - - if (name.isEmpty()) - name = id; - - if (isInput) - { - inputNames.add (name); - inputIds.add (id); - } - - if (isOutput) - { - outputNames.add (name); - outputIds.add (id); - } - } - } - } - - snd_ctl_close (handle); - } - } - - 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 - return 0; - } - - bool hasSeparateInputsAndOutputs() const { return true; } - - int getIndexOfDevice (AudioIODevice* device, bool asInput) const - { - jassert (hasScanned); // need to call scanForDevices() before doing this - - ALSAAudioIODevice* d = dynamic_cast (device); - if (d == nullptr) - return -1; - - return asInput ? inputIds.indexOf (d->inputId) - : outputIds.indexOf (d->outputId); - } - - 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, - inputIds [inputIndex], - outputIds [outputIndex]); - - return nullptr; - } - - //============================================================================== -private: - StringArray inputNames, outputNames, inputIds, outputIds; - bool hasScanned; - - static bool testDevice (const String& id, bool& isInput, bool& isOutput) - { - unsigned int minChansOut = 0, maxChansOut = 0; - unsigned int minChansIn = 0, maxChansIn = 0; - Array rates; - - getDeviceProperties (id, minChansOut, maxChansOut, minChansIn, maxChansIn, rates); - - DBG ("ALSA device: " + id - + " outs=" + String ((int) minChansOut) + "-" + String ((int) maxChansOut) - + " ins=" + String ((int) minChansIn) + "-" + String ((int) maxChansIn) - + " rates=" + String (rates.size())); - - isInput = maxChansIn > 0; - isOutput = maxChansOut > 0; - - return (isInput || isOutput) && rates.size() > 0; - } - - /*static String getHint (void* hint, const char* type) - { - char* const n = snd_device_name_get_hint (hint, type); - const String s ((const char*) n); - free (n); - return s; - }*/ - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ALSAAudioIODeviceType); -}; - -//============================================================================== -AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_ALSA() -{ - return new ALSAAudioIODeviceType(); -} diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_devices/native/juce_linux_AudioCDReader.cpp b/src/juce/JuceLibraryCode/modules/juce_audio_devices/native/juce_linux_AudioCDReader.cpp deleted file mode 100644 index 8ff14ca1..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_devices/native/juce_linux_AudioCDReader.cpp +++ /dev/null @@ -1,78 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce 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/src/juce/JuceLibraryCode/modules/juce_audio_devices/native/juce_linux_JackAudio.cpp b/src/juce/JuceLibraryCode/modules/juce_audio_devices/native/juce_linux_JackAudio.cpp deleted file mode 100644 index c48be0b7..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_devices/native/juce_linux_JackAudio.cpp +++ /dev/null @@ -1,587 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce 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) \ - typedef return_type (*fn_name##_ptr_t)argument_types; \ - return_type fn_name argument_types { \ - static fn_name##_ptr_t fn = nullptr; \ - if (fn == nullptr) { fn = (fn_name##_ptr_t)juce_loadJackFunction(#fn_name); } \ - if (fn) return (*fn)arguments; \ - else return nullptr; \ - } - -#define JUCE_DECL_VOID_JACK_FUNCTION(fn_name, argument_types, arguments) \ - typedef void (*fn_name##_ptr_t)argument_types; \ - void fn_name argument_types { \ - static fn_name##_ptr_t fn = nullptr; \ - if (fn == nullptr) { fn = (fn_name##_ptr_t)juce_loadJackFunction(#fn_name); } \ - if (fn) (*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 (int, 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; - } - - void dumpJackErrorMessage (const jack_status_t status) - { - if (status & JackServerFailed || status & JackServerError) jack_Log ("Unable to connect to JACK server"); - if (status & JackVersionError) jack_Log ("Client's protocol version does not match"); - if (status & JackInvalidOption) jack_Log ("The operation contained an invalid or unsupported option"); - if (status & JackNameNotUnique) jack_Log ("The desired client name was not unique"); - if (status & JackNoSuchClient) jack_Log ("Requested client does not exist"); - if (status & JackInitFailure) jack_Log ("Unable to initialize client"); - } -} -#else - #define dumpJackErrorMessage(a) {} - #define jack_Log(...) {} -#endif - - -//============================================================================== -#ifndef JUCE_JACK_CLIENT_NAME - #define JUCE_JACK_CLIENT_NAME "JuceJack" -#endif - -//============================================================================== -class JackAudioIODevice : public AudioIODevice -{ -public: - JackAudioIODevice (const String& deviceName, - const String& inputId_, - const String& outputId_) - : AudioIODevice (deviceName, "JACK"), - inputId (inputId_), - outputId (outputId_), - isOpen_ (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 == 0) - { - dumpJackErrorMessage (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 != 0) - { - juce::jack_client_close (client); - client = 0; - } - } - - StringArray getChannelNames (bool forInput) const - { - StringArray names; - const char** const ports = juce::jack_get_ports (client, 0, 0, /* JackPortIsPhysical | */ - forInput ? JackPortIsInput : JackPortIsOutput); - - if (ports != 0) - { - int j = 0; - while (ports[j] != 0) - { - const String portName (ports [j++]); - - if (portName.upToFirstOccurrenceOf (":", false, false) == getName()) - names.add (portName.fromFirstOccurrenceOf (":", false, false)); - } - - free (ports); - } - - return names; - } - - StringArray getOutputChannelNames() { return getChannelNames (false); } - StringArray getInputChannelNames() { return getChannelNames (true); } - int getNumSampleRates() { return client != 0 ? 1 : 0; } - double getSampleRate (int index) { return client != 0 ? juce::jack_get_sample_rate (client) : 0; } - int getNumBufferSizesAvailable() { return client != 0 ? 1 : 0; } - int getBufferSizeSamples (int index) { return getDefaultBufferSize(); } - int getDefaultBufferSize() { return client != 0 ? juce::jack_get_buffer_size (client) : 0; } - - String open (const BigInteger& inputChannels, const BigInteger& outputChannels, - double sampleRate, int bufferSizeSamples) - { - if (client == 0) - { - lastError = "No JACK client running"; - return lastError; - } - - lastError = String::empty; - close(); - - juce::jack_set_process_callback (client, processCallback, this); - juce::jack_on_shutdown (client, shutdownCallback, this); - juce::jack_activate (client); - isOpen_ = true; - - if (! inputChannels.isZero()) - { - const char** const ports = juce::jack_get_ports (client, 0, 0, /* JackPortIsPhysical | */ JackPortIsOutput); - - if (ports != 0) - { - const int numInputChannels = inputChannels.getHighestBit() + 1; - - for (int i = 0; i < numInputChannels; ++i) - { - const String portName (ports[i]); - - if (inputChannels[i] && portName.upToFirstOccurrenceOf (":", false, false) == getName()) - { - int error = juce::jack_connect (client, ports[i], juce::jack_port_name ((jack_port_t*) inputPorts[i])); - if (error != 0) - jack_Log ("Cannot connect input port " + String (i) + " (" + String (ports[i]) + "), error " + String (error)); - } - } - - free (ports); - } - } - - if (! outputChannels.isZero()) - { - const char** const ports = juce::jack_get_ports (client, 0, 0, /* JackPortIsPhysical | */ JackPortIsInput); - - if (ports != 0) - { - const int numOutputChannels = outputChannels.getHighestBit() + 1; - - for (int i = 0; i < numOutputChannels; ++i) - { - const String portName (ports[i]); - - if (outputChannels[i] && portName.upToFirstOccurrenceOf (":", false, false) == getName()) - { - int error = juce::jack_connect (client, juce::jack_port_name ((jack_port_t*) outputPorts[i]), ports[i]); - if (error != 0) - jack_Log ("Cannot connect output port " + String (i) + " (" + String (ports[i]) + "), error " + String (error)); - } - } - - free (ports); - } - } - - return lastError; - } - - void close() - { - stop(); - - if (client != 0) - { - juce::jack_deactivate (client); - juce::jack_set_process_callback (client, processCallback, 0); - juce::jack_on_shutdown (client, shutdownCallback, 0); - } - - isOpen_ = false; - } - - void start (AudioIODeviceCallback* newCallback) - { - if (isOpen_ && 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() - { - start (0); - } - - bool isOpen() { return isOpen_; } - bool isPlaying() { return callback != nullptr; } - int getCurrentBufferSizeSamples() { return getBufferSizeSamples (0); } - double getCurrentSampleRate() { return getSampleRate (0); } - int getCurrentBitDepth() { return 32; } - String getLastError() { return lastError; } - - BigInteger getActiveOutputChannels() const - { - BigInteger outputBits; - - for (int i = 0; i < outputPorts.size(); i++) - if (juce::jack_port_connected ((jack_port_t*) outputPorts [i])) - outputBits.setBit (i); - - return outputBits; - } - - BigInteger getActiveInputChannels() const - { - BigInteger inputBits; - - for (int i = 0; i < inputPorts.size(); i++) - if (juce::jack_port_connected ((jack_port_t*) inputPorts [i])) - inputBits.setBit (i); - - return inputBits; - } - - int getOutputLatencyInSamples() - { - 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() - { - 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 i, numActiveInChans = 0, numActiveOutChans = 0; - - for (i = 0; i < totalNumberOfInputChannels; ++i) - { - jack_default_audio_sample_t* in - = (jack_default_audio_sample_t*) juce::jack_port_get_buffer ((jack_port_t*) inputPorts.getUnchecked(i), numSamples); - - if (in != nullptr) - inChans [numActiveInChans++] = (float*) in; - } - - for (i = 0; i < totalNumberOfOutputChannels; ++i) - { - jack_default_audio_sample_t* out - = (jack_default_audio_sample_t*) juce::jack_port_get_buffer ((jack_port_t*) outputPorts.getUnchecked(i), numSamples); - - if (out != nullptr) - outChans [numActiveOutChans++] = (float*) out; - } - - const ScopedLock sl (callbackLock); - - if (callback != nullptr) - { - callback->audioDeviceIOCallback (const_cast (inChans.getData()), numActiveInChans, - outChans, numActiveOutChans, numSamples); - } - else - { - for (i = 0; i < numActiveOutChans; ++i) - zeromem (outChans[i], sizeof (float) * numSamples); - } - } - - static int processCallback (jack_nframes_t nframes, void* callbackArgument) - { - if (callbackArgument != 0) - ((JackAudioIODevice*) callbackArgument)->process (nframes); - - return 0; - } - - static void threadInitCallback (void* callbackArgument) - { - jack_Log ("JackAudioIODevice::initialise"); - } - - static void shutdownCallback (void* callbackArgument) - { - jack_Log ("JackAudioIODevice::shutdown"); - - JackAudioIODevice* device = (JackAudioIODevice*) callbackArgument; - - if (device != nullptr) - { - device->client = 0; - device->close(); - } - } - - static void errorCallback (const char* msg) - { - jack_Log ("JackAudioIODevice::errorCallback " + String (msg)); - } - - bool isOpen_; - jack_client_t* client; - String lastError; - AudioIODeviceCallback* callback; - CriticalSection callbackLock; - - HeapBlock inChans, outChans; - int totalNumberOfInputChannels; - int totalNumberOfOutputChannels; - Array inputPorts, outputPorts; -}; - - -//============================================================================== -class JackAudioIODeviceType : public AudioIODeviceType -{ -public: - //============================================================================== - JackAudioIODeviceType() - : AudioIODeviceType ("JACK"), - hasScanned (false) - { - } - - //============================================================================== - void scanForDevices() - { - hasScanned = true; - inputNames.clear(); - inputIds.clear(); - outputNames.clear(); - outputIds.clear(); - - if (juce_libjackHandle == nullptr) - { - juce_libjackHandle = dlopen ("libjack.so", RTLD_LAZY); - - if (juce_libjackHandle == nullptr) - return; - } - - // open a dummy client - jack_status_t status; - jack_client_t* client = juce::jack_client_open ("JuceJackDummy", JackNoStartServer, &status); - - if (client == 0) - { - dumpJackErrorMessage (status); - } - else - { - // scan for output devices - const char** ports = juce::jack_get_ports (client, 0, 0, /* JackPortIsPhysical | */ JackPortIsOutput); - - if (ports != 0) - { - int j = 0; - while (ports[j] != 0) - { - String clientName (ports[j]); - clientName = clientName.upToFirstOccurrenceOf (":", false, false); - - if (clientName != String (JUCE_JACK_CLIENT_NAME) - && ! inputNames.contains (clientName)) - { - inputNames.add (clientName); - inputIds.add (ports [j]); - } - - ++j; - } - - free (ports); - } - - // scan for input devices - ports = juce::jack_get_ports (client, 0, 0, /* JackPortIsPhysical | */ JackPortIsInput); - - if (ports != 0) - { - int j = 0; - while (ports[j] != 0) - { - String clientName (ports[j]); - clientName = clientName.upToFirstOccurrenceOf (":", false, false); - - if (clientName != String (JUCE_JACK_CLIENT_NAME) - && ! outputNames.contains (clientName)) - { - outputNames.add (clientName); - outputIds.add (ports [j]); - } - - ++j; - } - - free (ports); - } - - juce::jack_client_close (client); - } - } - - 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 - - JackAudioIODevice* d = dynamic_cast (device); - if (d == 0) - return -1; - - return asInput ? inputIds.indexOf (d->inputId) - : outputIds.indexOf (d->outputId); - } - - 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; - } - - //============================================================================== -private: - StringArray inputNames, outputNames, inputIds, outputIds; - bool hasScanned; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (JackAudioIODeviceType); -}; - -//============================================================================== -AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_JACK() -{ - return new JackAudioIODeviceType(); -} diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_devices/native/juce_linux_Midi.cpp b/src/juce/JuceLibraryCode/modules/juce_audio_devices/native/juce_linux_Midi.cpp deleted file mode 100644 index 8a7c4c55..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_devices/native/juce_linux_Midi.cpp +++ /dev/null @@ -1,460 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce 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 -{ - snd_seq_t* iterateMidiClient (snd_seq_t* seqHandle, - snd_seq_client_info_t* clientInfo, - const bool forInput, - StringArray& deviceNamesFound, - const int deviceIndexToOpen) - { - snd_seq_t* returnedHandle = nullptr; - - snd_seq_port_info_t* portInfo; - 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) - { - if (forInput) - { - snd_seq_set_client_name (seqHandle, JUCE_ALSA_MIDI_INPUT_NAME); - - const int portId = snd_seq_create_simple_port (seqHandle, "Juce Midi In Port", - SND_SEQ_PORT_CAP_WRITE | SND_SEQ_PORT_CAP_SUBS_WRITE, - SND_SEQ_PORT_TYPE_MIDI_GENERIC); - - snd_seq_connect_from (seqHandle, portId, sourceClient, sourcePort); - } - else - { - snd_seq_set_client_name (seqHandle, JUCE_ALSA_MIDI_OUTPUT_NAME); - - const int portId = snd_seq_create_simple_port (seqHandle, "Juce Midi Out Port", - SND_SEQ_PORT_CAP_READ | SND_SEQ_PORT_CAP_SUBS_READ, - SND_SEQ_PORT_TYPE_MIDI_GENERIC); - - snd_seq_connect_to (seqHandle, portId, sourceClient, sourcePort); - } - - returnedHandle = seqHandle; - } - } - } - } - - snd_seq_port_info_free (portInfo); - } - - return returnedHandle; - } - - snd_seq_t* iterateMidiDevices (const bool forInput, - StringArray& deviceNamesFound, - const int deviceIndexToOpen) - { - snd_seq_t* returnedHandle = nullptr; - snd_seq_t* seqHandle = nullptr; - - if (snd_seq_open (&seqHandle, "default", forInput ? SND_SEQ_OPEN_INPUT - : SND_SEQ_OPEN_OUTPUT, 0) == 0) - { - 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 && returnedHandle == 0) - if (snd_seq_query_next_client (seqHandle, clientInfo) == 0) - returnedHandle = iterateMidiClient (seqHandle, clientInfo, - forInput, deviceNamesFound, - deviceIndexToOpen); - - snd_seq_client_info_free (clientInfo); - } - - snd_seq_system_info_free (systemInfo); - } - - if (returnedHandle == 0) - snd_seq_close (seqHandle); - } - - deviceNamesFound.appendNumbersToDuplicates (true, true); - - return returnedHandle; - } - - snd_seq_t* createMidiDevice (const bool forInput, const String& deviceNameToOpen) - { - snd_seq_t* seqHandle = nullptr; - - if (snd_seq_open (&seqHandle, "default", forInput ? SND_SEQ_OPEN_INPUT - : SND_SEQ_OPEN_OUTPUT, 0) == 0) - { - snd_seq_set_client_name (seqHandle, - (deviceNameToOpen + (forInput ? " Input" : " Output")).toUTF8()); - - const int portId - = snd_seq_create_simple_port (seqHandle, - forInput ? "in" - : "out", - forInput ? (SND_SEQ_PORT_CAP_WRITE | SND_SEQ_PORT_CAP_SUBS_WRITE) - : (SND_SEQ_PORT_CAP_READ | SND_SEQ_PORT_CAP_SUBS_READ), - forInput ? SND_SEQ_PORT_TYPE_APPLICATION - : SND_SEQ_PORT_TYPE_MIDI_GENERIC); - - if (portId < 0) - { - snd_seq_close (seqHandle); - seqHandle = nullptr; - } - } - - return seqHandle; - } -} - - -//============================================================================== -class MidiOutputDevice -{ -public: - MidiOutputDevice (MidiOutput* const midiOutput_, - snd_seq_t* const seqHandle_) - : - midiOutput (midiOutput_), - seqHandle (seqHandle_), - maxEventSize (16 * 1024) - { - jassert (seqHandle != 0 && midiOutput != 0); - snd_midi_event_new (maxEventSize, &midiParser); - } - - ~MidiOutputDevice() - { - snd_midi_event_free (midiParser); - snd_seq_close (seqHandle); - } - - void 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); - - snd_midi_event_encode (midiParser, - message.getRawData(), - message.getRawDataSize(), - &event); - - snd_midi_event_reset_encode (midiParser); - - snd_seq_ev_set_source (&event, 0); - snd_seq_ev_set_subs (&event); - snd_seq_ev_set_direct (&event); - - snd_seq_event_output (seqHandle, &event); - snd_seq_drain_output (seqHandle); - } - -private: - MidiOutput* const midiOutput; - snd_seq_t* const seqHandle; - snd_midi_event_t* midiParser; - int maxEventSize; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MidiOutputDevice); -}; - -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; - snd_seq_t* const handle = iterateMidiDevices (false, devices, deviceIndex); - - if (handle != 0) - { - newDevice = new MidiOutput(); - newDevice->internal = new MidiOutputDevice (newDevice, handle); - } - - return newDevice; -} - -MidiOutput* MidiOutput::createNewDevice (const String& deviceName) -{ - MidiOutput* newDevice = nullptr; - - snd_seq_t* const handle = createMidiDevice (false, deviceName); - - if (handle != 0) - { - newDevice = new MidiOutput(); - newDevice->internal = new MidiOutputDevice (newDevice, handle); - } - - return newDevice; -} - -MidiOutput::~MidiOutput() -{ - delete static_cast (internal); -} - -void MidiOutput::sendMessageNow (const MidiMessage& message) -{ - static_cast (internal)->sendMessageNow (message); -} - - -//============================================================================== -class MidiInputThread : public Thread -{ -public: - MidiInputThread (MidiInput* const midiInput_, - snd_seq_t* const seqHandle_, - MidiInputCallback* const callback_) - : Thread ("Juce MIDI Input"), - midiInput (midiInput_), - seqHandle (seqHandle_), - callback (callback_) - { - jassert (seqHandle != 0 && callback != 0 && midiInput != 0); - } - - ~MidiInputThread() - { - snd_seq_close (seqHandle); - } - - void run() - { - const int maxEventSize = 16 * 1024; - snd_midi_event_t* midiParser; - - if (snd_midi_event_new (maxEventSize, &midiParser) >= 0) - { - HeapBlock buffer (maxEventSize); - - const int numPfds = snd_seq_poll_descriptors_count (seqHandle, POLLIN); - struct pollfd* const pfd = (struct pollfd*) alloca (numPfds * sizeof (struct pollfd)); - - snd_seq_poll_descriptors (seqHandle, pfd, numPfds, POLLIN); - - while (! threadShouldExit()) - { - if (poll (pfd, numPfds, 500) > 0) - { - snd_seq_event_t* inputEvent = nullptr; - - snd_seq_nonblock (seqHandle, 1); - - do - { - 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); - - - callback->handleIncomingMidiMessage (midiInput, message); - } - - snd_seq_free_event (inputEvent); - } - } - while (snd_seq_event_input_pending (seqHandle, 0) > 0); - - snd_seq_free_event (inputEvent); - } - } - - snd_midi_event_free (midiParser); - } - }; - -private: - MidiInput* const midiInput; - snd_seq_t* const seqHandle; - MidiInputCallback* const callback; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MidiInputThread); -}; - -//============================================================================== -MidiInput::MidiInput (const String& name_) - : name (name_), - internal (0) -{ -} - -MidiInput::~MidiInput() -{ - stop(); - delete static_cast (internal); -} - -void MidiInput::start() -{ - static_cast (internal)->startThread(); -} - -void MidiInput::stop() -{ - static_cast (internal)->stopThread (3000); -} - -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; - snd_seq_t* const handle = iterateMidiDevices (true, devices, deviceIndex); - - if (handle != 0) - { - newDevice = new MidiInput (devices [deviceIndex]); - newDevice->internal = new MidiInputThread (newDevice, handle, callback); - } - - return newDevice; -} - -MidiInput* MidiInput::createNewDevice (const String& deviceName, MidiInputCallback* callback) -{ - MidiInput* newDevice = nullptr; - - snd_seq_t* const handle = createMidiDevice (true, deviceName); - - if (handle != 0) - { - newDevice = new MidiInput (deviceName); - newDevice->internal = new MidiInputThread (newDevice, handle, 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& name_) : name (name_), internal (0) {} -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/src/juce/JuceLibraryCode/modules/juce_audio_devices/native/juce_mac_AudioCDBurner.mm b/src/juce/JuceLibraryCode/modules/juce_audio_devices/native/juce_mac_AudioCDBurner.mm deleted file mode 100644 index b4519fb3..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_devices/native/juce_mac_AudioCDBurner.mm +++ /dev/null @@ -1,561 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -const int kilobytesPerSecond1x = 176; - -} // (juce namespace) - -#define OpenDiskDevice MakeObjCClassName(OpenDiskDevice) - -@interface OpenDiskDevice : NSObject -{ -@public - DRDevice* device; - NSMutableArray* tracks; - bool underrunProtection; -} - -- (OpenDiskDevice*) initWithDRDevice: (DRDevice*) device; -- (void) dealloc; -- (void) addSourceTrack: (juce::AudioSource*) source numSamples: (int) numSamples_; -- (void) burn: (juce::AudioCDBurner::BurnProgressListener*) listener errorString: (juce::String*) error - ejectAfterwards: (bool) shouldEject isFake: (bool) peformFakeBurnForTesting speed: (int) burnSpeed; -@end - -//============================================================================== -#define AudioTrackProducer MakeObjCClassName(AudioTrackProducer) - -@interface AudioTrackProducer : NSObject -{ - juce::AudioSource* source; - int readPosition, lengthInFrames; -} - -- (AudioTrackProducer*) init: (int) lengthInFrames; -- (AudioTrackProducer*) initWithAudioSource: (juce::AudioSource*) source numSamples: (int) lengthInSamples; -- (void) dealloc; -- (void) setupTrackProperties: (DRTrack*) track; - -- (void) cleanupTrackAfterBurn: (DRTrack*) track; -- (BOOL) cleanupTrackAfterVerification:(DRTrack*)track; -- (uint64_t) estimateLengthOfTrack:(DRTrack*)track; -- (BOOL) prepareTrack:(DRTrack*)track forBurn:(DRBurn*)burn - toMedia:(NSDictionary*)mediaInfo; -- (BOOL) prepareTrackForVerification:(DRTrack*)track; -- (uint32_t) produceDataForTrack:(DRTrack*)track intoBuffer:(char*)buffer - length:(uint32_t)bufferLength atAddress:(uint64_t)address - blockSize:(uint32_t)blockSize ioFlags:(uint32_t*)flags; -- (uint32_t) producePreGapForTrack:(DRTrack*)track - intoBuffer:(char*)buffer length:(uint32_t)bufferLength - atAddress:(uint64_t)address blockSize:(uint32_t)blockSize - ioFlags:(uint32_t*)flags; -- (BOOL) verifyDataForTrack:(DRTrack*)track inBuffer:(const char*)buffer - length:(uint32_t)bufferLength atAddress:(uint64_t)address - blockSize:(uint32_t)blockSize ioFlags:(uint32_t*)flags; -- (uint32_t) producePreGapForTrack:(DRTrack*)track - intoBuffer:(char*)buffer length:(uint32_t)bufferLength - atAddress:(uint64_t)address blockSize:(uint32_t)blockSize - ioFlags:(uint32_t*)flags; -@end - -//============================================================================== -@implementation OpenDiskDevice - -- (OpenDiskDevice*) initWithDRDevice: (DRDevice*) device_ -{ - [super init]; - - device = device_; - tracks = [[NSMutableArray alloc] init]; - underrunProtection = true; - return self; -} - -- (void) dealloc -{ - [tracks release]; - [super dealloc]; -} - -- (void) addSourceTrack: (juce::AudioSource*) source_ numSamples: (int) numSamples_ -{ - AudioTrackProducer* p = [[AudioTrackProducer alloc] initWithAudioSource: source_ numSamples: numSamples_]; - DRTrack* t = [[DRTrack alloc] initWithProducer: p]; - [p setupTrackProperties: t]; - - [tracks addObject: t]; - - [t release]; - [p release]; -} - -- (void) burn: (juce::AudioCDBurner::BurnProgressListener*) listener errorString: (juce::String*) error - ejectAfterwards: (bool) shouldEject isFake: (bool) peformFakeBurnForTesting speed: (int) burnSpeed -{ - DRBurn* burn = [DRBurn burnForDevice: device]; - - if (! [device acquireExclusiveAccess]) - { - *error = "Couldn't open or write to the CD device"; - return; - } - - [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 * juce::kilobytesPerSecond1x] forKey: DRBurnRequestedSpeedKey]; - - if (! underrunProtection) - [d setObject: [NSNumber numberWithBool: false] forKey: DRBurnUnderrunProtectionKey]; - - [burn setProperties: d]; - - [burn writeLayout: tracks]; - - for (;;) - { - juce::Thread::sleep (300); - float progress = [[[burn status] objectForKey: DRStatusPercentCompleteKey] floatValue]; - - if (listener != nullptr && listener->audioCDBurnProgress (progress)) - { - [burn abort]; - *error = "User cancelled the write operation"; - break; - } - - if ([[[burn status] objectForKey: DRStatusStateKey] isEqualTo: DRStatusStateFailed]) - { - *error = "Write operation failed"; - break; - } - else if ([[[burn status] objectForKey: DRStatusStateKey] isEqualTo: DRStatusStateDone]) - { - break; - } - - NSString* err = (NSString*) [[[burn status] objectForKey: DRErrorStatusKey] - objectForKey: DRErrorStatusErrorStringKey]; - - if ([err length] > 0) - { - *error = juce::CharPointer_UTF8 ([err UTF8String]); - break; - } - } - - [device releaseMediaReservation]; - [device releaseExclusiveAccess]; -} -@end - -//============================================================================== -@implementation AudioTrackProducer - -- (AudioTrackProducer*) init: (int) lengthInFrames_ -{ - lengthInFrames = lengthInFrames_; - readPosition = 0; - return self; -} - -- (void) setupTrackProperties: (DRTrack*) track -{ - NSMutableDictionary* p = [[track properties] mutableCopy]; - [p setObject:[DRMSF msfWithFrames: lengthInFrames] 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]; -} - -- (AudioTrackProducer*) initWithAudioSource: (juce::AudioSource*) source_ numSamples: (int) lengthInSamples -{ - AudioTrackProducer* s = [self init: (lengthInSamples + 587) / 588]; - - if (s != nil) - s->source = source_; - - return s; -} - -- (void) dealloc -{ - if (source != nullptr) - { - source->releaseResources(); - delete source; - } - - [super dealloc]; -} - -- (void) cleanupTrackAfterBurn: (DRTrack*) track -{ - (void) track; -} - -- (BOOL) cleanupTrackAfterVerification: (DRTrack*) track -{ - (void) track; - return true; -} - -- (uint64_t) estimateLengthOfTrack: (DRTrack*) track -{ - (void) track; - return lengthInFrames; -} - -- (BOOL) prepareTrack: (DRTrack*) track forBurn: (DRBurn*) burn - toMedia: (NSDictionary*) mediaInfo -{ - (void) track; (void) burn; (void) mediaInfo; - - if (source != nullptr) - source->prepareToPlay (44100 / 75, 44100); - - readPosition = 0; - return true; -} - -- (BOOL) prepareTrackForVerification: (DRTrack*) track -{ - (void) track; - if (source != nullptr) - source->prepareToPlay (44100 / 75, 44100); - - return true; -} - -- (uint32_t) produceDataForTrack: (DRTrack*) track intoBuffer: (char*) buffer - length: (uint32_t) bufferLength atAddress: (uint64_t) address - blockSize: (uint32_t) blockSize ioFlags: (uint32_t*) flags -{ - (void) track; (void) address; (void) blockSize; (void) flags; - - if (source != nullptr) - { - const int numSamples = juce::jmin ((int) bufferLength / 4, (lengthInFrames * (44100 / 75)) - readPosition); - - if (numSamples > 0) - { - juce::AudioSampleBuffer tempBuffer (2, numSamples); - - juce::AudioSourceChannelInfo info; - info.buffer = &tempBuffer; - info.startSample = 0; - info.numSamples = numSamples; - - source->getNextAudioBlock (info); - - typedef juce::AudioData::Pointer CDSampleFormat; - - typedef juce::AudioData::Pointer SourceSampleFormat; - CDSampleFormat left (buffer, 2); - left.convertSamples (SourceSampleFormat (tempBuffer.getSampleData (0)), numSamples); - CDSampleFormat right (buffer + 2, 2); - right.convertSamples (SourceSampleFormat (tempBuffer.getSampleData (1)), numSamples); - - readPosition += numSamples; - } - - return numSamples * 4; - } - - return 0; -} - -- (uint32_t) producePreGapForTrack: (DRTrack*) track - intoBuffer: (char*) buffer length: (uint32_t) bufferLength - atAddress: (uint64_t) address blockSize: (uint32_t) blockSize - ioFlags: (uint32_t*) flags -{ - (void) track; (void) address; (void) blockSize; (void) flags; - zeromem (buffer, bufferLength); - return bufferLength; -} - -- (BOOL) verifyDataForTrack: (DRTrack*) track inBuffer: (const char*) buffer - length: (uint32_t) bufferLength atAddress: (uint64_t) address - blockSize: (uint32_t) blockSize ioFlags: (uint32_t*) flags -{ - (void) track; (void) buffer; (void) bufferLength; (void) address; (void) blockSize; (void) flags; - return true; -} - -@end - - -namespace juce -{ - -//============================================================================== -class AudioCDBurner::Pimpl : public Timer -{ -public: - Pimpl (AudioCDBurner& owner_, const int deviceIndex) - : device (0), owner (owner_) - { - DRDevice* dev = [[DRDevice devices] objectAtIndex: deviceIndex]; - if (dev != nil) - { - device = [[OpenDiskDevice alloc] initWithDRDevice: dev]; - lastState = getDiskState(); - startTimer (1000); - } - } - - ~Pimpl() - { - stopTimer(); - [device release]; - } - - void timerCallback() - { - 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; - else - return readOnlyDiskPresent; - } - } - - return unknown; - } - - bool openTray() { return [device->device isValid] && [device->device ejectMedia]; } - - Array getAvailableWriteSpeeds() const - { - Array results; - - if ([device->device isValid]) - { - NSArray* speeds = [[[device->device status] objectForKey: DRDeviceMediaInfoKey] objectForKey: DRDeviceBurnSpeedsKey]; - for (unsigned int i = 0; i < [speeds count]; ++i) - { - const int kbPerSec = [[speeds objectAtIndex: i] intValue]; - results.add (kbPerSec / 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]; - } - - OpenDiskDevice* 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 = 0; - - return b.release(); -} - -namespace -{ - NSArray* findDiskBurnerDevices() - { - NSMutableArray* results = [NSMutableArray array]; - NSArray* devs = [DRDevice devices]; - - for (int i = 0; i < [devs count]; ++i) - { - NSDictionary* dic = [[devs objectAtIndex: i] info]; - NSString* name = [dic valueForKey: DRDeviceProductNameKey]; - if (name != nil) - [results addObject: name]; - } - - return results; - } -} - -StringArray AudioCDBurner::findAvailableDevices() -{ - NSArray* names = findDiskBurnerDevices(); - StringArray s; - - for (unsigned int i = 0; i < [names count]; ++i) - s.add (CharPointer_UTF8 ([[names objectAtIndex: i] UTF8String])); - - 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 numSamples: numSamps]; - return true; - } - - return false; -} - -String AudioCDBurner::burn (juce::AudioCDBurner::BurnProgressListener* listener, - bool ejectDiscAfterwards, - bool performFakeBurnForTesting, - int writeSpeed) -{ - String error ("Couldn't open or write to the CD device"); - - if ([pimpl->device->device isValid]) - { - error = String::empty; - - [pimpl->device burn: listener - errorString: &error - ejectAfterwards: ejectDiscAfterwards - isFake: performFakeBurnForTesting - speed: writeSpeed]; - } - - return error; -} diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_devices/native/juce_mac_AudioCDReader.mm b/src/juce/JuceLibraryCode/modules/juce_audio_devices/native/juce_mac_AudioCDReader.mm deleted file mode 100644 index 0e0a8cef..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_devices/native/juce_mac_AudioCDReader.mm +++ /dev/null @@ -1,262 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce 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; - - FileInputStream* const in = tracks [track].createInputStream(); - - if (in != nullptr) - { - 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/src/juce/JuceLibraryCode/modules/juce_audio_devices/native/juce_mac_CoreAudio.cpp b/src/juce/JuceLibraryCode/modules/juce_audio_devices/native/juce_mac_CoreAudio.cpp deleted file mode 100644 index c1a7e66c..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_devices/native/juce_mac_CoreAudio.cpp +++ /dev/null @@ -1,1270 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#if JUCE_COREAUDIO_LOGGING_ENABLED - #define JUCE_COREAUDIOLOG(a) Logger::writeToLog (a) -#else - #define JUCE_COREAUDIOLOG(a) -#endif - -//============================================================================== -class CoreAudioInternal : public Timer -{ -public: - //============================================================================== - CoreAudioInternal (AudioDeviceID id) - : inputLatency (0), - outputLatency (0), - callback (nullptr), - #if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 - audioProcID (0), - #endif - isSlaveDevice (false), - deviceID (id), - started (false), - sampleRate (0), - bufferSize (512), - numInputChans (0), - numOutputChans (0), - callbacksAllowed (true), - numInputChannelInfos (0), - numOutputChannelInfos (0) - { - 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 i, count = 0; - for (i = 0; i < numInputChans; ++i) - tempInputBuffers[i] = audioBuffer + count++ * tempBufSize; - - for (i = 0; i < numOutputChans; ++i) - tempOutputBuffers[i] = audioBuffer + count++ * tempBufSize; - } - - // returns the number of actual available channels - void fillInChannelInfo (const bool input) - { - int chanNum = 0; - UInt32 size; - - AudioObjectPropertyAddress pa; - pa.mSelector = kAudioDevicePropertyStreamConfiguration; - pa.mScope = input ? kAudioDevicePropertyScopeInput : kAudioDevicePropertyScopeOutput; - pa.mElement = kAudioObjectPropertyElementMaster; - - if (OK (AudioObjectGetPropertyDataSize (deviceID, &pa, 0, 0, &size))) - { - HeapBlock bufList; - bufList.calloc (size, 1); - - if (OK (AudioObjectGetPropertyData (deviceID, &pa, 0, 0, &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; - - { - char channelName [256] = { 0 }; - UInt32 nameSize = sizeof (channelName); - UInt32 channelNum = (UInt32) chanNum + 1; - pa.mSelector = kAudioDevicePropertyChannelName; - - if (AudioObjectGetPropertyData (deviceID, &pa, sizeof (channelNum), &channelNum, &nameSize, channelName) == noErr) - name = String::fromUTF8 (channelName, (int) nameSize); - } - - if (input) - { - if (activeInputChans[chanNum]) - { - inputChannelInfo [numInputChannelInfos].streamNum = i; - inputChannelInfo [numInputChannelInfos].dataOffsetSamples = (int) j; - inputChannelInfo [numInputChannelInfos].dataStrideSamples = (int) b.mNumberChannels; - ++numInputChannelInfos; - } - - if (name.isEmpty()) - name << "Input " << (chanNum + 1); - - inChanNames.add (name); - } - else - { - if (activeOutputChans[chanNum]) - { - outputChannelInfo [numOutputChannelInfos].streamNum = i; - outputChannelInfo [numOutputChannelInfos].dataOffsetSamples = (int) j; - outputChannelInfo [numOutputChannelInfos].dataStrideSamples = (int) b.mNumberChannels; - ++numOutputChannelInfos; - } - - if (name.isEmpty()) - name << "Output " << (chanNum + 1); - - outChanNames.add (name); - } - - ++chanNum; - } - } - } - } - } - - void updateDetailsFromDevice() - { - stopTimer(); - - if (deviceID == 0) - return; - - const ScopedLock sl (callbackLock); - - AudioObjectPropertyAddress pa; - pa.mScope = kAudioObjectPropertyScopeWildcard; - pa.mElement = kAudioObjectPropertyElementMaster; - - UInt32 isAlive; - UInt32 size = sizeof (isAlive); - pa.mSelector = kAudioDevicePropertyDeviceIsAlive; - if (OK (AudioObjectGetPropertyData (deviceID, &pa, 0, 0, &size, &isAlive)) - && isAlive == 0) - return; - - Float64 sr; - size = sizeof (sr); - pa.mSelector = kAudioDevicePropertyNominalSampleRate; - if (OK (AudioObjectGetPropertyData (deviceID, &pa, 0, 0, &size, &sr))) - sampleRate = sr; - - UInt32 framesPerBuf; - size = sizeof (framesPerBuf); - pa.mSelector = kAudioDevicePropertyBufferFrameSize; - if (OK (AudioObjectGetPropertyData (deviceID, &pa, 0, 0, &size, &framesPerBuf))) - { - bufferSize = (int) framesPerBuf; - allocateTempBuffers(); - } - - bufferSizes.clear(); - - pa.mSelector = kAudioDevicePropertyBufferFrameSizeRange; - - if (OK (AudioObjectGetPropertyDataSize (deviceID, &pa, 0, 0, &size))) - { - HeapBlock ranges; - ranges.calloc (size, 1); - - if (OK (AudioObjectGetPropertyData (deviceID, &pa, 0, 0, &size, ranges))) - { - bufferSizes.add ((int) ranges[0].mMinimum); - - 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) - { - bufferSizes.addIfNotAlreadyThere (i); - break; - } - } - } - - if (bufferSize > 0) - bufferSizes.addIfNotAlreadyThere (bufferSize); - } - } - - if (bufferSizes.size() == 0 && bufferSize > 0) - bufferSizes.add (bufferSize); - - sampleRates.clear(); - const double possibleRates[] = { 44100.0, 48000.0, 88200.0, 96000.0, 176400.0, 192000.0 }; - String rates; - - pa.mSelector = kAudioDevicePropertyAvailableNominalSampleRates; - - if (OK (AudioObjectGetPropertyDataSize (deviceID, &pa, 0, 0, &size))) - { - HeapBlock ranges; - ranges.calloc (size, 1); - - if (OK (AudioObjectGetPropertyData (deviceID, &pa, 0, 0, &size, ranges))) - { - for (int i = 0; i < numElementsInArray (possibleRates); ++i) - { - bool ok = false; - - for (int j = size / (int) sizeof (AudioValueRange); --j >= 0;) - if (possibleRates[i] >= ranges[j].mMinimum - 2 && possibleRates[i] <= ranges[j].mMaximum + 2) - ok = true; - - if (ok) - { - sampleRates.add (possibleRates[i]); - rates << possibleRates[i] << ' '; - } - } - } - } - - if (sampleRates.size() == 0 && sampleRate > 0) - { - sampleRates.add (sampleRate); - rates << sampleRate; - } - - JUCE_COREAUDIOLOG ("sr: " + rates); - - inputLatency = 0; - outputLatency = 0; - UInt32 lat; - size = sizeof (lat); - pa.mSelector = kAudioDevicePropertyLatency; - pa.mScope = kAudioDevicePropertyScopeInput; - if (AudioObjectGetPropertyData (deviceID, &pa, 0, 0, &size, &lat) == noErr) - inputLatency = (int) lat; - - pa.mScope = kAudioDevicePropertyScopeOutput; - size = sizeof (lat); - - if (AudioObjectGetPropertyData (deviceID, &pa, 0, 0, &size, &lat) == noErr) - outputLatency = (int) lat; - - JUCE_COREAUDIOLOG ("lat: " + String (inputLatency) + " " + String (outputLatency)); - - inChanNames.clear(); - outChanNames.clear(); - - inputChannelInfo.calloc ((size_t) numInputChans + 2); - numInputChannelInfos = 0; - - outputChannelInfo.calloc ((size_t) numOutputChans + 2); - numOutputChannelInfos = 0; - - fillInChannelInfo (true); - fillInChannelInfo (false); - } - - //============================================================================== - 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, 0, &transSize, &avt))) - { - DBG (buffer); - 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, 0, &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; - JUCE_COREAUDIOLOG ("CoreAudio reopen"); - 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 = kAudioObjectPropertyScopeWildcard; - 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"; - else if (inputDevice != 0) - error = inputDevice->reopen (inputChannels, - outputChannels, - newSampleRate, - bufferSizeSamples); - } - } - - callbacksAllowed = true; - return error; - } - - bool start (AudioIODeviceCallback* cb) - { - 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 - } - } - } - } - - if (started) - { - const ScopedLock sl (callbackLock); - callback = cb; - } - - return started && (inputDevice == nullptr || inputDevice->start (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, 0, &size, &running)); - - if (running == 0) - break; - } - - const ScopedLock sl (callbackLock); - } - - if (inputDevice != nullptr) - inputDevice->stop (leaveInterruptRunning); - } - - double getSampleRate() const { return sampleRate; } - int getBufferSize() const { return bufferSize; } - - void audioCallback (const AudioBufferList* inInputData, - AudioBufferList* outOutputData) - { - int i; - const ScopedLock sl (callbackLock); - - if (callback != nullptr) - { - if (inputDevice == 0) - { - for (i = numInputChans; --i >= 0;) - { - const CallbackDetailsForChannel& info = inputChannelInfo[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; - } - } - } - } - - if (! isSlaveDevice) - { - if (inputDevice == 0) - { - callback->audioDeviceIOCallback (const_cast (tempInputBuffers.getData()), - numInputChans, - tempOutputBuffers, - numOutputChans, - bufferSize); - } - else - { - jassert (inputDevice->bufferSize == bufferSize); - - // Sometimes the two linked devices seem to get their callbacks in - // parallel, so we need to lock both devices to stop the input data being - // changed while inside our callback.. - const ScopedLock sl2 (inputDevice->callbackLock); - - callback->audioDeviceIOCallback (const_cast (inputDevice->tempInputBuffers.getData()), - inputDevice->numInputChans, - tempOutputBuffers, - numOutputChans, - bufferSize); - } - - for (i = numOutputChans; --i >= 0;) - { - const CallbackDetailsForChannel& info = outputChannelInfo[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 (i = jmin (numOutputChans, numOutputChannelInfos); --i >= 0;) - { - const CallbackDetailsForChannel& info = outputChannelInfo[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 = 0.0f; - dest += stride; - } - } - } - } - } - - // called by callbacks - void deviceDetailsChanged() - { - if (callbacksAllowed) - startTimer (100); - } - - void timerCallback() - { - stopTimer(); - JUCE_COREAUDIOLOG ("CoreAudio device changed callback"); - - const double oldSampleRate = sampleRate; - const int oldBufferSize = bufferSize; - updateDetailsFromDevice(); - - if (oldBufferSize != bufferSize || oldSampleRate != sampleRate) - { - callbacksAllowed = false; - stop (false); - updateDetailsFromDevice(); - callbacksAllowed = true; - } - } - - CoreAudioInternal* getRelatedDevice() const - { - UInt32 size = 0; - ScopedPointer result; - - AudioObjectPropertyAddress pa; - pa.mSelector = kAudioDevicePropertyRelatedDevices; - pa.mScope = kAudioObjectPropertyScopeWildcard; - pa.mElement = kAudioObjectPropertyElementMaster; - - if (deviceID != 0 - && AudioObjectGetPropertyDataSize (deviceID, &pa, 0, 0, &size) == noErr - && size > 0) - { - HeapBlock devs; - devs.calloc (size, 1); - - if (OK (AudioObjectGetPropertyData (deviceID, &pa, 0, 0, &size, devs))) - { - for (unsigned int i = 0; i < size / sizeof (AudioDeviceID); ++i) - { - if (devs[i] != deviceID && devs[i] != 0) - { - result = new CoreAudioInternal (devs[i]); - - const bool thisIsInput = inChanNames.size() > 0 && outChanNames.size() == 0; - const bool otherIsInput = result->inChanNames.size() > 0 && result->outChanNames.size() == 0; - - if (thisIsInput != otherIsInput - || (inChanNames.size() + outChanNames.size() == 0) - || (result->inChanNames.size() + result->outChanNames.size()) == 0) - break; - - result = 0; - } - } - } - } - - return result.release(); - } - - //============================================================================== - int inputLatency, outputLatency; - 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 - - ScopedPointer inputDevice; - bool isSlaveDevice; - -private: - CriticalSection callbackLock; - AudioDeviceID deviceID; - bool started; - double sampleRate; - int bufferSize; - HeapBlock audioBuffer; - int numInputChans, numOutputChans; - bool callbacksAllowed; - - struct CallbackDetailsForChannel - { - int streamNum; - int dataOffsetSamples; - int dataStrideSamples; - }; - - int numInputChannelInfos, numOutputChannelInfos; - HeapBlock 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, 0, &size) == noErr) - { - types.calloc (size, 1); - - if (AudioObjectGetPropertyData (deviceID, &pa, 0, 0, &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 (inputDeviceId); - } - else - { - device = new CoreAudioInternal (outputDeviceId); - - if (inputDeviceId != 0) - { - CoreAudioInternal* secondDevice = new CoreAudioInternal (inputDeviceId); - - device->inputDevice = secondDevice; - secondDevice->isSlaveDevice = true; - } - } - - 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() - { - return internal->outChanNames; - } - - StringArray getInputChannelNames() - { - if (internal->inputDevice != 0) - return internal->inputDevice->inChanNames; - else - return internal->inChanNames; - } - - bool isOpen() { return isOpen_; } - - int getNumSampleRates() { return internal->sampleRates.size(); } - double getSampleRate (int index) { return internal->sampleRates [index]; } - double getCurrentSampleRate() { return internal->getSampleRate(); } - - int getCurrentBitDepth() { return 32; } // no way to find out, so just assume it's high.. - - int getNumBufferSizesAvailable() { return internal->bufferSizes.size(); } - int getBufferSizeSamples (int index) { return internal->bufferSizes [index]; } - int getCurrentBufferSizeSamples() { return internal->getBufferSize(); } - - int getDefaultBufferSize() - { - int best = 0; - - for (int i = 0; best < 512 && i < getNumBufferSizesAvailable(); ++i) - best = getBufferSizeSamples(i); - - if (best == 0) - best = 512; - - return best; - } - - String open (const BigInteger& inputChannels, - const BigInteger& outputChannels, - double sampleRate, - int bufferSizeSamples) - { - isOpen_ = true; - - if (bufferSizeSamples <= 0) - bufferSizeSamples = getDefaultBufferSize(); - - lastError = internal->reopen (inputChannels, outputChannels, sampleRate, bufferSizeSamples); - isOpen_ = lastError.isEmpty(); - return lastError; - } - - void close() - { - isOpen_ = false; - internal->stop (false); - } - - BigInteger getActiveOutputChannels() const - { - return internal->activeOutputChans; - } - - BigInteger getActiveInputChannels() const - { - BigInteger chans (internal->activeInputChans); - - if (internal->inputDevice != nullptr) - chans |= internal->inputDevice->activeInputChans; - - return chans; - } - - int getOutputLatencyInSamples() - { - // 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 + internal->getBufferSize() * 2; - } - - int getInputLatencyInSamples() - { - return internal->inputLatency + internal->getBufferSize() * 2; - } - - void start (AudioIODeviceCallback* callback) - { - if (! isStarted) - { - if (callback != nullptr) - callback->audioDeviceAboutToStart (this); - - isStarted = true; - internal->start (callback); - } - } - - void stop() - { - if (isStarted) - { - AudioIODeviceCallback* const lastCallback = internal->callback; - - isStarted = false; - internal->stop (true); - - if (lastCallback != nullptr) - lastCallback->audioDeviceStopped(); - } - } - - bool isPlaying() - { - if (internal->callback == nullptr) - isStarted = false; - - return isStarted; - } - - String getLastError() - { - 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) - { - CoreAudioInternal* const intern = static_cast (inClientData); - - switch (pa->mSelector) - { - case kAudioHardwarePropertyDevices: - intern->deviceDetailsChanged(); - break; - - case kAudioHardwarePropertyDefaultOutputDevice: - case kAudioHardwarePropertyDefaultInputDevice: - case kAudioHardwarePropertyDefaultSystemOutputDevice: - break; - } - - return noErr; - } - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (CoreAudioIODevice); -}; - -//============================================================================== -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, 0, &size) == noErr) - { - HeapBlock devs; - devs.calloc (size, 1); - - if (AudioObjectGetPropertyData (kAudioObjectSystemObject, &pa, 0, 0, &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, 0, &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, 0, &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 - - CoreAudioIODevice* const d = dynamic_cast (device); - if (d == nullptr) - return -1; - - return asInput ? d->inputIndex - : d->outputIndex; - } - - 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); - - String deviceName (outputDeviceName); - if (deviceName.isEmpty()) - deviceName = inputDeviceName; - - if (index >= 0) - return new CoreAudioIODevice (deviceName, - inputIds [inputIndex], - inputIndex, - outputIds [outputIndex], - outputIndex); - - return nullptr; - } - - //============================================================================== -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, 0, &size) == noErr) - { - HeapBlock bufList; - bufList.calloc (size, 1); - - if (AudioObjectGetPropertyData (deviceID, &pa, 0, 0, &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 CoreAudioIODeviceType(); -} - -#undef JUCE_COREAUDIOLOG diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_devices/native/juce_mac_CoreMidi.cpp b/src/juce/JuceLibraryCode/modules/juce_audio_devices/native/juce_mac_CoreMidi.cpp deleted file mode 100644 index 7fdca634..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_devices/native/juce_mac_CoreMidi.cpp +++ /dev/null @@ -1,541 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -namespace CoreMidiHelpers -{ - static bool logError (const OSStatus err, const int lineNum) - { - if (err == noErr) - return true; - - Logger::writeToLog ("CoreMidi error: " + String (lineNum) + " - " + String::toHexString ((int) err)); - jassertfalse; - return false; - } - - #undef CHECK_ERROR - #define CHECK_ERROR(a) CoreMidiHelpers::logError (a, __LINE__) - - //============================================================================== - static String getEndpointName (MIDIEndpointRef endpoint, bool isExternal) - { - String result; - CFStringRef str = 0; - - MIDIObjectGetStringProperty (endpoint, kMIDIPropertyName, &str); - - if (str != 0) - { - result = String::fromCFString (str); - CFRelease (str); - str = 0; - } - - MIDIEntityRef entity = 0; - MIDIEndpointGetEntity (endpoint, &entity); - - if (entity == 0) - return result; // probably virtual - - if (result.isEmpty()) - { - // endpoint name has zero length - try the entity - MIDIObjectGetStringProperty (entity, kMIDIPropertyName, &str); - - if (str != 0) - { - result += String::fromCFString (str); - CFRelease (str); - str = 0; - } - } - - // now consider the device's name - MIDIDeviceRef device = 0; - MIDIEntityGetDevice (entity, &device); - if (device == 0) - return result; - - MIDIObjectGetStringProperty (device, kMIDIPropertyName, &str); - - if (str != 0) - { - const String s (String::fromCFString (str)); - CFRelease (str); - - // 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 = s; - } - else if (! result.startsWithIgnoreCase (s)) - { - // prepend the device name to the entity name - result = (s + " " + result).trimEnd(); - } - } - - return result; - } - - static String getConnectedEndpointName (MIDIEndpointRef endpoint) - { - String result; - - // Does the endpoint have connections? - CFDataRef connections = 0; - int numConnections = 0; - - MIDIObjectGetDataProperty (endpoint, kMIDIPropertyConnectionUniqueID, &connections); - - if (connections != 0) - { - 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) - CFStringRef str = 0; - MIDIObjectGetStringProperty (connObject, kMIDIPropertyName, &str); - - if (str != 0) - { - s = String::fromCFString (str); - CFRelease (str); - } - } - - if (s.isNotEmpty()) - { - if (result.isNotEmpty()) - result += ", "; - - result += s; - } - } - } - } - - CFRelease (connections); - } - - if (result.isNotEmpty()) - return result; - - // Here, either the endpoint had no connections, or we failed to obtain names for any of them. - return getEndpointName (endpoint, false); - } - - static MIDIClientRef getGlobalMidiClient() - { - static MIDIClientRef globalMidiClient = 0; - - if (globalMidiClient == 0) - { - String name ("JUCE"); - - if (JUCEApplicationBase::getInstance() != nullptr) - name = JUCEApplicationBase::getInstance()->getApplicationName(); - - CFStringRef appName = name.toCFString(); - CHECK_ERROR (MIDIClientCreate (appName, 0, 0, &globalMidiClient)); - CFRelease (appName); - } - - return globalMidiClient; - } - - //============================================================================== - class MidiPortAndEndpoint - { - public: - MidiPortAndEndpoint (MIDIPortRef port_, MIDIEndpointRef endPoint_) - : port (port_), endPoint (endPoint_) - { - } - - ~MidiPortAndEndpoint() - { - if (port != 0) - MIDIPortDispose (port); - - if (port == 0 && endPoint != 0) // if port == 0, 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& callback_) - : input (nullptr), active (false), callback (callback_), concatenator (2048) - { - } - - ~MidiPortAndCallback() - { - active = false; - - { - const ScopedLock sl (callbackLock); - activeCallbacks.removeValue (this); - } - - if (portAndEndpoint != nullptr && 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() -{ - StringArray s; - - const ItemCount num = MIDIGetNumberOfDestinations(); - for (ItemCount i = 0; i < num; ++i) - { - MIDIEndpointRef dest = MIDIGetDestination (i); - String name; - - if (dest != 0) - name = CoreMidiHelpers::getConnectedEndpointName (dest); - - if (name.isEmpty()) - name = ""; - - s.add (name); - } - - return s; -} - -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() -{ - delete static_cast (internal); -} - -void MidiOutput::sendMessageNow (const MidiMessage& message) -{ - CoreMidiHelpers::MidiPortAndEndpoint* const mpe = static_cast (internal); - - #if JUCE_IOS - const MIDITimeStamp timeStamp = mach_absolute_time(); - #else - const MIDITimeStamp timeStamp = AudioGetCurrentHostTime(); - #endif - - if (message.isSysEx()) - { - const int maxPacketSize = 256; - int pos = 0, bytesLeft = message.getRawDataSize(); - const int numPackets = (bytesLeft + maxPacketSize - 1) / maxPacketSize; - HeapBlock packets; - packets.malloc ((size_t) (32 * numPackets + message.getRawDataSize()), 1); - packets->numPackets = (UInt32) numPackets; - - MIDIPacket* p = packets->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); - } - - mpe->send (packets); - } - else - { - MIDIPacketList packets; - packets.numPackets = 1; - packets.packet[0].timeStamp = timeStamp; - packets.packet[0].length = (UInt16) message.getRawDataSize(); - *(int*) (packets.packet[0].data) = *(const int*) message.getRawData(); - - mpe->send (&packets); - } -} - -//============================================================================== -StringArray MidiInput::getDevices() -{ - StringArray s; - - const ItemCount num = MIDIGetNumberOfSources(); - for (ItemCount i = 0; i < num; ++i) - { - MIDIEndpointRef source = MIDIGetSource (i); - String name; - - if (source != 0) - name = CoreMidiHelpers::getConnectedEndpointName (source); - - if (name.isEmpty()) - name = ""; - - s.add (name); - } - - return s; -} - -int MidiInput::getDefaultDeviceIndex() -{ - return 0; -} - -MidiInput* MidiInput::openDevice (int index, MidiInputCallback* callback) -{ - jassert (callback != 0); - - using namespace CoreMidiHelpers; - MidiInput* newInput = nullptr; - - if (isPositiveAndBelow (index, (int) MIDIGetNumberOfSources())) - { - MIDIEndpointRef endPoint = MIDIGetSource ((ItemCount) index); - - if (endPoint != 0) - { - CFStringRef name; - - if (CHECK_ERROR (MIDIObjectGetStringProperty (endPoint, kMIDIPropertyName, &name))) - { - MIDIClientRef client = getGlobalMidiClient(); - - if (client != 0) - { - MIDIPortRef port; - ScopedPointer mpc (new MidiPortAndCallback (*callback)); - - if (CHECK_ERROR (MIDIInputPortCreate (client, name, midiInputProc, mpc, &port))) - { - if (CHECK_ERROR (MIDIPortConnectSource (port, endPoint, 0))) - { - 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; - MIDIClientRef client = getGlobalMidiClient(); - - if (client != 0) - { - 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& name_) - : name (name_) -{ -} - -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/src/juce/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_ASIO.cpp b/src/juce/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_ASIO.cpp deleted file mode 100644 index 8bf17909..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_ASIO.cpp +++ /dev/null @@ -1,1631 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#undef WINDOWS -#undef log - -// #define ASIO_DEBUGGING 1 - -#if ASIO_DEBUGGING - #define log(a) { Logger::writeToLog (a); DBG (a) } -#else - #define log(a) {} -#endif - -/* 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 ASIO_DEBUGGING - static void log (const String& context, long error) - { - const char* err = "unknown error"; - - if (error == ASE_NotPresent) err = "Not Present"; - else if (error == ASE_HWMalfunction) err = "Hardware Malfunction"; - else if (error == ASE_InvalidParameter) err = "Invalid Parameter"; - else if (error == ASE_InvalidMode) err = "Invalid Mode"; - else if (error == ASE_SPNotAdvancing) err = "Sample position not advancing"; - else if (error == ASE_NoClock) err = "No Clock"; - else if (error == ASE_NoMemory) err = "Out of memory"; - - log ("!!error: " + context + " - " + err); - } - - #define logError(a, b) ASIODebugging::log ((a), (b)) - #else - #define logError(a, b) {} - #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) roundDoubleToInt (jlimit (-maxVal, maxVal, maxVal * *src++))); - dest += dstStrideBytes; - } - } - else - { - while (--numSamples >= 0) - { - *(uint16*) dest = ByteOrder::swapIfLittleEndian ((uint16) (short) roundDoubleToInt (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) roundDoubleToInt (jlimit (-maxVal, maxVal, maxVal * *src++)), dest); - dest += dstStrideBytes; - } - } - else - { - while (--numSamples >= 0) - { - ByteOrder::bigEndian24BitToChars ((uint32) roundDoubleToInt (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) roundDoubleToInt (jlimit (-maxVal, maxVal, maxVal * *src++))); - dest += dstStrideBytes; - } - } - else - { - while (--numSamples >= 0) - { - *(uint32*) dest = ByteOrder::swapIfLittleEndian ((uint32) roundDoubleToInt (jlimit (-maxVal, maxVal, maxVal * *src++))); - dest += dstStrideBytes; - } - } - } -}; - -//============================================================================== -class ASIOAudioIODevice; -static ASIOAudioIODevice* volatile currentASIODev[3] = { 0 }; - -extern HWND juce_messageWindowHandle; - -//============================================================================== -class ASIOAudioIODevice : public AudioIODevice, - private Timer -{ -public: - ASIOAudioIODevice (const String& name_, const CLSID classId_, const int slotNumber, - const String& optionalDllForDirectLoading_) - : AudioIODevice (name_, "ASIO"), - asioObject (nullptr), - classId (classId_), - optionalDllForDirectLoading (optionalDllForDirectLoading_), - currentBitDepth (16), - currentSampleRate (0), - deviceIsOpen (false), - isStarted (false), - buffersCreated (false), - postOutput (true), - insideControlPanelModalLoop (false), - shouldUsePreferredSize (false) - { - name = name_; - - 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(); - log ("ASIO - exiting"); - removeCurrentDriver(); - } - - void updateSampleRates() - { - // find a list of sample rates.. - const double possibleSampleRates[] = { 44100.0, 48000.0, 88200.0, 96000.0, 176400.0, 192000.0 }; - sampleRates.clear(); - - if (asioObject != nullptr) - { - for (int index = 0; index < numElementsInArray (possibleSampleRates); ++index) - { - const long err = asioObject->canSampleRate (possibleSampleRates[index]); - - if (err == 0) - { - sampleRates.add ((int) possibleSampleRates[index]); - log ("rate: " + String ((int) possibleSampleRates[index])); - } - else if (err != ASE_NoClock) - { - logError ("CanSampleRate", err); - } - } - - if (sampleRates.size() == 0) - { - double cr = 0; - const long err = asioObject->getSampleRate (&cr); - log ("No sample rates supported - current rate: " + String ((int) cr)); - - if (err == 0) - sampleRates.add ((int) cr); - } - } - } - - StringArray getOutputChannelNames() { return outputChannelNames; } - StringArray getInputChannelNames() { return inputChannelNames; } - - int getNumSampleRates() { return sampleRates.size(); } - double getSampleRate (int index) { return sampleRates [index]; } - - int getNumBufferSizesAvailable() { return bufferSizes.size(); } - int getBufferSizeSamples (int index) { return bufferSizes [index]; } - int getDefaultBufferSize() { return preferredSize; } - - String open (const BigInteger& inputChannels, - const BigInteger& outputChannels, - double sr, - int bufferSizeSamples) - { - close(); - currentCallback = nullptr; - - if (bufferSizeSamples <= 0) - shouldUsePreferredSize = true; - - if (asioObject == nullptr || ! isASIOOpen) - { - log ("Warning: device not open"); - const String err (openDevice()); - - if (asioObject == nullptr || ! isASIOOpen) - return err; - } - - isStarted = false; - bufferIndex = -1; - long err = 0; - long newPreferredSize = 0; - minSize = 0; - maxSize = 0; - granularity = 0; - - if (asioObject->getBufferSize (&minSize, &maxSize, &newPreferredSize, &granularity) == 0) - { - if (preferredSize != 0 && newPreferredSize != 0 && newPreferredSize != preferredSize) - shouldUsePreferredSize = true; - - preferredSize = newPreferredSize; - } - - // unfortunate workaround for certain manufacturers whose drivers crash horribly if you make - // dynamic changes to the buffer size... - shouldUsePreferredSize = shouldUsePreferredSize - || getName().containsIgnoreCase ("Digidesign"); - - if (shouldUsePreferredSize) - { - log ("Using preferred size for buffer.."); - - if ((err = asioObject->getBufferSize (&minSize, &maxSize, &preferredSize, &granularity)) == 0) - { - bufferSizeSamples = preferredSize; - } - else - { - bufferSizeSamples = 1024; - logError ("GetBufferSize1", err); - } - - shouldUsePreferredSize = false; - } - - int sampleRate = roundDoubleToInt (sr); - currentSampleRate = sampleRate; - currentBlockSizeSamples = bufferSizeSamples; - currentChansOut.clear(); - currentChansIn.clear(); - zeromem (inBuffers, sizeof (inBuffers)); - zeromem (outBuffers, sizeof (outBuffers)); - - updateSampleRates(); - - if (sampleRate == 0 || (sampleRates.size() > 0 && ! sampleRates.contains (sampleRate))) - sampleRate = sampleRates[0]; - - jassert (sampleRate != 0); - if (sampleRate == 0) - sampleRate = 44100; - - ASIOClockSource clocks[32] = { 0 }; - long numSources = numElementsInArray (clocks); - asioObject->getClockSources (clocks, &numSources); - bool isSourceSet = false; - - // careful not to remove this loop because it does more than just logging! - int i; - for (i = 0; i < numSources; ++i) - { - String s ("clock: "); - s += clocks[i].name; - - if (clocks[i].isCurrentSource) - { - isSourceSet = true; - s << " (cur)"; - } - - log (s); - } - - if (numSources > 1 && ! isSourceSet) - { - log ("setting clock source"); - asioObject->setClockSource (clocks[0].index); - Thread::sleep (20); - } - else - { - if (numSources == 0) - { - log ("ASIO - no clock sources!"); - } - } - - double cr = 0; - err = asioObject->getSampleRate (&cr); - if (err == 0) - { - currentSampleRate = cr; - } - else - { - logError ("GetSampleRate", err); - currentSampleRate = 0; - } - - error = String::empty; - needToReset = false; - isReSync = false; - err = 0; - buffersCreated = false; - - if (currentSampleRate != sampleRate) - { - log ("ASIO samplerate: " + String (currentSampleRate) + " to " + String (sampleRate)); - err = asioObject->setSampleRate (sampleRate); - - if (err == ASE_NoClock && numSources > 0) - { - log ("trying to set a clock source.."); - Thread::sleep (10); - err = asioObject->setClockSource (clocks[0].index); - if (err != 0) - { - logError ("SetClock", err); - } - - Thread::sleep (10); - err = asioObject->setSampleRate (sampleRate); - } - } - - if (err == 0) - { - currentSampleRate = sampleRate; - - if (needToReset) - { - if (isReSync) - { - log ("Resync request"); - } - - log ("! Resetting ASIO after sample rate change"); - removeCurrentDriver(); - - loadDriver(); - const String error (initDriver()); - - if (error.isNotEmpty()) - { - log ("ASIOInit: " + error); - } - - needToReset = false; - isReSync = false; - } - - numActiveInputChans = 0; - numActiveOutputChans = 0; - - ASIOBufferInfo* info = bufferInfos; - int i; - for (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 (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; - } - } - - const int totalBuffers = numActiveInputChans + numActiveOutputChans; - - setCallbackFunctions(); - - log ("disposing buffers"); - err = asioObject->disposeBuffers(); - - log ("creating buffers: " + String (totalBuffers) + ", " + String (currentBlockSizeSamples)); - err = asioObject->createBuffers (bufferInfos, - totalBuffers, - currentBlockSizeSamples, - &callbacks); - - if (err != 0) - { - currentBlockSizeSamples = preferredSize; - logError ("create buffers 2", err); - - asioObject->disposeBuffers(); - err = asioObject->createBuffers (bufferInfos, - totalBuffers, - currentBlockSizeSamples, - &callbacks); - } - - if (err == 0) - { - buffersCreated = true; - - tempBuffer.calloc (totalBuffers * currentBlockSizeSamples + 32); - - int n = 0; - Array types; - currentBitDepth = 16; - - for (i = 0; i < jmin ((int) totalNumInputChans, (int) maxASIOChannels); ++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 (i = 0; i < jmin ((int) totalNumOutputChans, (int) maxASIOChannels); ++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 (i = types.size(); --i >= 0;) - { - log ("channel format: " + String (types[i])); - } - - jassert (n <= totalBuffers); - - for (i = 0; i < numActiveOutputChans; ++i) - { - outputFormat[i].clear (bufferInfos [numActiveInputChans + i].buffers[0], currentBlockSizeSamples); - outputFormat[i].clear (bufferInfos [numActiveInputChans + i].buffers[1], currentBlockSizeSamples); - } - - inputLatency = outputLatency = 0; - - if (asioObject->getLatencies (&inputLatency, &outputLatency) != 0) - { - log ("ASIO - no latencies"); - } - else - { - log ("ASIO latencies: " + String ((int) outputLatency) + ", " + String ((int) inputLatency)); - } - - deviceIsOpen = true; - - log ("starting ASIO"); - calledback = false; - err = asioObject->start(); - - if (err != 0) - { - deviceIsOpen = false; - log ("ASIO - 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"; - log ("ASIO didn't callback - stopping.."); - asioObject->stop(); - } - } - } - else - { - error = "Can't create i/o buffers"; - } - } - else - { - error = "Can't set sample rate: "; - error << sampleRate; - } - - if (error.isNotEmpty()) - { - logError (error, err); - disposeBuffers(); - - Thread::sleep (20); - isStarted = false; - deviceIsOpen = false; - - const String errorCopy (error); - close(); // (this resets the error string) - error = errorCopy; - } - - needToReset = false; - isReSync = false; - - return error; - } - - void close() - { - error = String::empty; - stopTimer(); - stop(); - - if (isASIOOpen && deviceIsOpen) - { - const ScopedLock sl (callbackLock); - - deviceIsOpen = false; - isStarted = false; - needToReset = false; - isReSync = false; - - log ("ASIO - stopping"); - - if (asioObject != nullptr) - { - Thread::sleep (20); - asioObject->stop(); - Thread::sleep (10); - disposeBuffers(); - } - - Thread::sleep (10); - } - } - - bool isOpen() { return deviceIsOpen || insideControlPanelModalLoop; } - bool isPlaying() { return isASIOOpen && (currentCallback != nullptr); } - - int getCurrentBufferSizeSamples() { return currentBlockSizeSamples; } - double getCurrentSampleRate() { return currentSampleRate; } - int getCurrentBitDepth() { return currentBitDepth; } - - BigInteger getActiveOutputChannels() const { return currentChansOut; } - BigInteger getActiveInputChannels() const { return currentChansIn; } - - int getOutputLatencyInSamples() { return outputLatency + currentBlockSizeSamples / 4; } - int getInputLatencyInSamples() { return inputLatency + currentBlockSizeSamples / 4; } - - void start (AudioIODeviceCallback* callback) - { - if (callback != nullptr) - { - callback->audioDeviceAboutToStart (this); - - const ScopedLock sl (callbackLock); - currentCallback = callback; - } - } - - void stop() - { - 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() - { - log ("ASIO - 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; - - log ("spent: " + String (spent)); - - if (spent > 300) - { - shouldUsePreferredSize = true; - done = true; - } - } - } - JUCE_CATCH_ALL - - insideControlPanelModalLoop = false; - return done; - } - - void resetRequest() noexcept - { - needToReset = true; - } - - void resyncRequest() noexcept - { - needToReset = true; - isReSync = true; - } - - void timerCallback() - { - if (! insideControlPanelModalLoop) - { - stopTimer(); - - // used to cause a reset - log ("! ASIO restart request!"); - - if (deviceIsOpen) - { - AudioIODeviceCallback* const oldCallback = currentCallback; - - close(); - open (BigInteger (currentChansIn), BigInteger (currentChansOut), - currentSampleRate, currentBlockSizeSamples); - - if (oldCallback != nullptr) - start (oldCallback); - } - } - else - { - startTimer (100); - } - } - -private: - //============================================================================== - IASIO* volatile asioObject; - ASIOCallbacks callbacks; - - CLSID classId; - const String optionalDllForDirectLoading; - String error; - - long totalNumInputChans, totalNumOutputChans; - StringArray inputChannelNames, outputChannelNames; - - Array sampleRates, bufferSizes; - long inputLatency, outputLatency; - long minSize, maxSize, preferredSize, granularity; - - int volatile currentBlockSizeSamples; - int volatile currentBitDepth; - double volatile currentSampleRate; - BigInteger currentChansOut, currentChansIn; - AudioIODeviceCallback* volatile currentCallback; - CriticalSection callbackLock; - - enum { maxASIOChannels = 160 }; - - ASIOBufferInfo bufferInfos [maxASIOChannels]; - float* inBuffers [maxASIOChannels]; - float* outBuffers [maxASIOChannels]; - - ASIOSampleFormat inputFormat [maxASIOChannels]; - ASIOSampleFormat outputFormat [maxASIOChannels]; - - WaitableEvent event1; - HeapBlock tempBuffer; - int volatile bufferIndex, numActiveInputChans, numActiveOutputChans; - - bool deviceIsOpen, isStarted, buffersCreated; - bool volatile isASIOOpen; - bool volatile calledback; - bool volatile littleEndian, postOutput, needToReset, isReSync; - bool volatile insideControlPanelModalLoop; - bool volatile shouldUsePreferredSize; - - //============================================================================== - void removeCurrentDriver() - { - if (asioObject != nullptr) - { - asioObject->Release(); - asioObject = nullptr; - } - } - - bool loadDriver() - { - removeCurrentDriver(); - - JUCE_TRY - { - if (CoCreateInstance (classId, 0, CLSCTX_INPROC_SERVER, - classId, (void**) &asioObject) == S_OK) - { - return true; - } - - // If a class isn't registered but we have a path for it, we can fallback to - // doing a direct load of the COM object (only available via the juce_createASIOAudioIODeviceForGUID function). - if (optionalDllForDirectLoading.isNotEmpty()) - { - HMODULE h = LoadLibrary (optionalDllForDirectLoading.toWideCharPointer()); - - if (h != 0) - { - typedef HRESULT (CALLBACK* DllGetClassObjectFunc) (REFCLSID clsid, REFIID iid, LPVOID* ppv); - DllGetClassObjectFunc dllGetClassObject = (DllGetClassObjectFunc) GetProcAddress (h, "DllGetClassObject"); - - if (dllGetClassObject != 0) - { - IClassFactory* classFactory = nullptr; - HRESULT hr = dllGetClassObject (classId, IID_IClassFactory, (void**) &classFactory); - - if (classFactory != nullptr) - { - hr = classFactory->CreateInstance (0, classId, (void**) &asioObject); - classFactory->Release(); - } - - return asioObject != nullptr; - } - } - } - } - JUCE_CATCH_ALL - - asioObject = nullptr; - return false; - } - - String initDriver() - { - if (asioObject != nullptr) - { - char buffer [256] = { 0 }; - - if (! asioObject->init (juce_messageWindowHandle)) - { - asioObject->getErrorMessage (buffer); - return String (buffer, sizeof (buffer) - 1); - } - - // just in case any daft drivers expect this to be called.. - asioObject->getDriverName (buffer); - - return String::empty; - } - - return "No Driver"; - } - - String openDevice() - { - // open the device and get its info.. - log ("opening ASIO device: " + getName()); - - needToReset = false; - isReSync = false; - outputChannelNames.clear(); - inputChannelNames.clear(); - bufferSizes.clear(); - sampleRates.clear(); - isASIOOpen = false; - deviceIsOpen = false; - totalNumInputChans = 0; - totalNumOutputChans = 0; - numActiveInputChans = 0; - numActiveOutputChans = 0; - currentCallback = nullptr; - - error = String::empty; - - 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) - { - log (String ((int) totalNumInputChans) + " in, " + String ((int) totalNumOutputChans) + " out"); - - if ((err = asioObject->getBufferSize (&minSize, &maxSize, &preferredSize, &granularity)) == 0) - { - // find a list of buffer sizes.. - log (String ((int) minSize) + " " + String ((int) maxSize) + " " + String ((int) preferredSize) + " " + String ((int) granularity)); - - if (granularity >= 0) - { - granularity = jmax (1, (int) granularity); - - for (int i = jmax ((int) minSize, (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); - } - } - - if (! bufferSizes.contains (preferredSize)) - bufferSizes.insert (0, preferredSize); - - double currentRate = 0; - asioObject->getSampleRate (¤tRate); - - if (currentRate <= 0.0 || currentRate > 192001.0) - { - log ("setting sample rate"); - err = asioObject->setSampleRate (44100.0); - if (err != 0) - { - logError ("setting sample rate", err); - } - - asioObject->getSampleRate (¤tRate); - } - - currentSampleRate = currentRate; - - postOutput = (asioObject->outputReady() == 0); - if (postOutput) - { - log ("ASIO outputReady = ok"); - } - - updateSampleRates(); - - // ..because cubase does it at this point - inputLatency = outputLatency = 0; - if (asioObject->getLatencies (&inputLatency, &outputLatency) != 0) - { - log ("ASIO - no latencies"); - } - - log ("latencies: " + String ((int) inputLatency) + ", " + String ((int) outputLatency)); - - // create some dummy buffers now.. because cubase does.. - numActiveInputChans = 0; - numActiveOutputChans = 0; - - ASIOBufferInfo* info = bufferInfos; - int i, numChans = 0; - for (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 (i = 0; i < jmin (2, (int) totalNumOutputChans); ++i) - { - info->isInput = 0; - info->channelNum = i; - info->buffers[0] = info->buffers[1] = nullptr; - ++info; - ++numChans; - } - - setCallbackFunctions(); - - log ("creating buffers (dummy): " + String (numChans) + ", " + String ((int) preferredSize)); - - if (preferredSize > 0) - { - err = asioObject->createBuffers (bufferInfos, numChans, preferredSize, &callbacks); - if (err != 0) - { - logError ("dummy buffers", err); - } - } - - long newInps = 0, newOuts = 0; - asioObject->getChannels (&newInps, &newOuts); - - if (totalNumInputChans != newInps || totalNumOutputChans != newOuts) - { - totalNumInputChans = newInps; - totalNumOutputChans = newOuts; - - log (String ((int) totalNumInputChans) + " in; " + String ((int) totalNumOutputChans) + " out"); - } - - updateSampleRates(); - - for (i = 0; i < totalNumInputChans; ++i) - { - ASIOChannelInfo channelInfo = { 0 }; - channelInfo.channel = i; - channelInfo.isInput = 1; - asioObject->getChannelInfo (&channelInfo); - - inputChannelNames.add (String (CharPointer_UTF8 (channelInfo.name))); - } - - for (i = 0; i < totalNumOutputChans; ++i) - { - ASIOChannelInfo channelInfo = { 0 }; - channelInfo.channel = i; - channelInfo.isInput = 0; - asioObject->getChannelInfo (&channelInfo); - - outputChannelNames.add (String (CharPointer_UTF8 (channelInfo.name))); - 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); - } - } - - outputChannelNames.trim(); - inputChannelNames.trim(); - outputChannelNames.appendNumbersToDuplicates (false, true); - inputChannelNames.appendNumbersToDuplicates (false, true); - - // start and stop because cubase does it.. - asioObject->getLatencies (&inputLatency, &outputLatency); - - if ((err = asioObject->start()) != 0) - { - // ignore an error here, as it might start later after setting other stuff up - logError ("ASIO start", err); - } - - Thread::sleep (100); - asioObject->stop(); - } - else - { - error = "Can't detect buffer sizes"; - } - } - else - { - error = "Can't detect asio channels"; - } - } - } - else - { - error = "No such device"; - } - - if (error.isNotEmpty()) - { - logError (error, err); - disposeBuffers(); - removeCurrentDriver(); - isASIOOpen = false; - } - else - { - isASIOOpen = true; - log ("ASIO device open"); - } - - deviceIsOpen = false; - needToReset = false; - isReSync = false; - - 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 (needToReset) - { - needToReset = false; - - if (isReSync) - { - log ("! ASIO resync"); - isReSync = false; - } - else - { - startTimer (20); - } - } - - if (bi >= 0) - { - const int samps = currentBlockSizeSamples; - - if (currentCallback != nullptr) - { - int i; - for (i = 0; i < numActiveInputChans; ++i) - { - jassert (inBuffers[i]!= nullptr); - inputFormat[i].convertToFloat (infos[i].buffers[bi], inBuffers[i], samps); - } - - currentCallback->audioDeviceIOCallback ((const float**) inBuffers, numActiveInputChans, - outBuffers, numActiveOutputChans, samps); - - for (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(); - } - - //============================================================================== - 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 ASIOAudioIODevice::asioMessagesCallback (selector, value, deviceIndex); - } - - static void setCallbacks (ASIOCallbacks& callbacks) - { - callbacks.bufferSwitch = &bufferSwitchCallback; - callbacks.asioMessage = &asioMessagesCallback; - callbacks.bufferSwitchTimeInfo = &bufferSwitchTimeInfoCallback; - } - }; - - void setCallbackFunctions() - { - callbacks.sampleRateDidChange = &sampleRateChangedCallback; - - if (currentASIODev[0] == this) ASIOCallbackFunctions<0>::setCallbacks (callbacks); - else if (currentASIODev[1] == this) ASIOCallbackFunctions<1>::setCallbacks (callbacks); - else if (currentASIODev[2] == this) ASIOCallbackFunctions<2>::setCallbacks (callbacks); - else jassertfalse; - } - - //============================================================================== - static long asioMessagesCallback (long selector, long value, const int deviceIndex) - { - switch (selector) - { - case kAsioSelectorSupported: - if (value == kAsioResetRequest - || value == kAsioEngineVersion - || value == kAsioResyncRequest - || value == kAsioLatenciesChanged - || value == kAsioSupportsInputMonitor) - return 1; - break; - - case kAsioBufferSizeChange: - break; - - case kAsioResetRequest: - if (currentASIODev[deviceIndex] != nullptr) - currentASIODev[deviceIndex]->resetRequest(); - - return 1; - - case kAsioResyncRequest: - if (currentASIODev[deviceIndex] != nullptr) - currentASIODev[deviceIndex]->resyncRequest(); - - return 1; - - case kAsioLatenciesChanged: - return 1; - - case kAsioEngineVersion: - return 2; - - case kAsioSupportsTimeInfo: - case kAsioSupportsTimeCode: - return 0; - } - - return 0; - } - - static void JUCE_ASIOCALLBACK sampleRateChangedCallback (ASIOSampleRate) - { - } - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ASIOAudioIODevice); -}; - -//============================================================================== -class ASIOAudioIODeviceType : public AudioIODeviceType -{ -public: - ASIOAudioIODeviceType() - : AudioIODeviceType ("ASIO"), - hasScanned (false) - { - CoInitialize (0); - } - - //============================================================================== - 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 int index = deviceNames.indexOf (outputDeviceName.isNotEmpty() ? outputDeviceName - : inputDeviceName); - - if (index >= 0) - { - const int freeSlot = findFreeSlot(); - - if (freeSlot >= 0) - return new ASIOAudioIODevice (outputDeviceName, *(classIds [index]), freeSlot, String::empty); - } - - return nullptr; - } - - //============================================================================== -private: - StringArray deviceNames; - OwnedArray 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; - - log ("found " + deviceName); - deviceNames.add (deviceName); - classIds.add (new CLSID (classId)); - } - } - - RegCloseKey (subKey); - } - } - } - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ASIOAudioIODeviceType); -}; - -AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_ASIO() -{ - return new ASIOAudioIODeviceType(); -} - -AudioIODevice* juce_createASIOAudioIODeviceForGUID (const String& name, - void* guid, - const String& optionalDllForDirectLoading) -{ - const int freeSlot = ASIOAudioIODeviceType::findFreeSlot(); - - if (freeSlot < 0) - return nullptr; - - return new ASIOAudioIODevice (name, *(CLSID*) guid, freeSlot, optionalDllForDirectLoading); -} - -#undef logError -#undef log diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_AudioCDBurner.cpp b/src/juce/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_AudioCDBurner.cpp deleted file mode 100644 index 6f19c87f..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_AudioCDBurner.cpp +++ /dev/null @@ -1,415 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce 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; - else - 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() - { - 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; - info.buffer = &sourceBuffer; - info.numSamples = samplesPerBlock; - info.startSample = 0; - sourceBuffer.clear(); - - source->getNextAudioBlock (info); - } - - buffer.clear (bytesPerBlock); - - typedef AudioData::Pointer CDSampleFormat; - - typedef AudioData::Pointer SourceSampleFormat; - - CDSampleFormat left (buffer, 2); - left.convertSamples (SourceSampleFormat (sourceBuffer.getSampleData (0)), samplesPerBlock); - CDSampleFormat right (buffer + 2, 2); - right.convertSamples (SourceSampleFormat (sourceBuffer.getSampleData (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/src/juce/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_AudioCDReader.cpp b/src/juce/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_AudioCDReader.cpp deleted file mode 100644 index c32444d2..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_AudioCDReader.cpp +++ /dev/null @@ -1,1310 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce 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 = 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.removeValue (trackStart); - } - - return indexes; -} - -void AudioCDReader::ejectDisk() -{ - using namespace CDReaderHelpers; - static_cast (handle)->deviceHandle.openDrawer (true); -} diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_DirectSound.cpp b/src/juce/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_DirectSound.cpp deleted file mode 100644 index 87d7b983..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_DirectSound.cpp +++ /dev/null @@ -1,1369 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce 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; - }; -} - -//============================================================================== -namespace juce -{ - -namespace -{ - String getDSErrorMessage (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; - } - - //============================================================================== - #define DS_DEBUGGING 1 - - #ifdef DS_DEBUGGING - #define CATCH JUCE_CATCH_EXCEPTION - #undef log - #define log(a) Logger::writeToLog(a); - #undef logError - #define logError(a) logDSError(a, __LINE__); - - static void logDSError (HRESULT hr, int lineNum) - { - if (hr != S_OK) - { - String error ("DS error at line "); - error << lineNum << " - " << getDSErrorMessage (hr); - log (error); - } - } - #else - #define CATCH JUCE_CATCH_ALL - #define log(a) - #define logError(a) - #endif - - //============================================================================== - #define DSOUND_FUNCTION(functionName, params) \ - typedef HRESULT (WINAPI *type##functionName) params; \ - static type##functionName ds##functionName = 0; - - #define DSOUND_FUNCTION_LOAD(functionName) \ - ds##functionName = (type##functionName) GetProcAddress (h, #functionName); \ - jassert (ds##functionName != 0); - - 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 == 0) - { - HMODULE h = LoadLibraryA ("dsound.dll"); - - DSOUND_FUNCTION_LOAD (DirectSoundCreate) - DSOUND_FUNCTION_LOAD (DirectSoundCaptureCreate) - DSOUND_FUNCTION_LOAD (DirectSoundEnumerateW) - DSOUND_FUNCTION_LOAD (DirectSoundCaptureEnumerateW) - } - } -} - -//============================================================================== -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() - { - HRESULT hr; - - if (pOutputBuffer != nullptr) - { - log ("closing dsound out: " + name); - hr = pOutputBuffer->Stop(); - logError (hr); - - pOutputBuffer->Release(); - pOutputBuffer = nullptr; - } - - if (pDirectSound != nullptr) - { - pDirectSound->Release(); - pDirectSound = nullptr; - } - } - - String open() - { - log ("opening dsound out device: " + name + " rate=" + String (sampleRate) - + " bits=" + String (bitDepth) + " buf=" + String (bufferSizeSamples)); - - pDirectSound = nullptr; - pOutputBuffer = nullptr; - writeOffset = 0; - - String error; - HRESULT hr = E_NOINTERFACE; - - if (dsDirectSoundCreate != 0) - hr = dsDirectSoundCreate (&guid, &pDirectSound, 0); - - if (hr == S_OK) - { - bytesPerBuffer = (bufferSizeSamples * (bitDepth >> 2)) & ~15; - totalBytesPerBuffer = (3 * bytesPerBuffer) & ~15; - const int numChannels = 2; - - hr = pDirectSound->SetCooperativeLevel (GetDesktopWindow(), 2 /* DSSCL_PRIORITY */); - logError (hr); - - if (hr == S_OK) - { - IDirectSoundBuffer* pPrimaryBuffer; - - DSBUFFERDESC primaryDesc = { 0 }; - primaryDesc.dwSize = sizeof (DSBUFFERDESC); - primaryDesc.dwFlags = 1 /* DSBCAPS_PRIMARYBUFFER */; - primaryDesc.dwBufferBytes = 0; - primaryDesc.lpwfxFormat = 0; - - log ("opening dsound out step 2"); - hr = pDirectSound->CreateSoundBuffer (&primaryDesc, &pPrimaryBuffer, 0); - logError (hr); - - if (hr == S_OK) - { - 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); - logError (hr); - - if (hr == S_OK) - { - 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); - logError (hr); - - if (hr == S_OK) - { - log ("opening dsound out step 3"); - - DWORD dwDataLen; - unsigned char* pDSBuffData; - - hr = pOutputBuffer->Lock (0, (DWORD) totalBytesPerBuffer, - (LPVOID*) &pDSBuffData, &dwDataLen, 0, 0, 0); - logError (hr); - - if (hr == S_OK) - { - zeromem (pDSBuffData, dwDataLen); - - hr = pOutputBuffer->Unlock (pDSBuffData, dwDataLen, 0, 0); - - if (hr == S_OK) - { - hr = pOutputBuffer->SetCurrentPosition (0); - - if (hr == S_OK) - { - hr = pOutputBuffer->Play (0, 0, 1 /* DSBPLAY_LOOPING */); - - if (hr == S_OK) - return String::empty; - } - } - } - } - } - } - } - } - - error = getDSErrorMessage (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 (hr == S_OK) - break; - - logError (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) - { - void* lpbuf1 = nullptr; - void* lpbuf2 = nullptr; - DWORD dwSize1 = 0; - DWORD dwSize2 = 0; - - HRESULT hr = pOutputBuffer->Lock ((DWORD) writeOffset, (DWORD) bytesPerBuffer, - &lpbuf1, &dwSize1, - &lpbuf2, &dwSize2, 0); - - if (hr == MAKE_HRESULT (1, 0x878, 150)) // DSERR_BUFFERLOST - { - pOutputBuffer->Restore(); - - hr = pOutputBuffer->Lock ((DWORD) writeOffset, (DWORD) bytesPerBuffer, - &lpbuf1, &dwSize1, - &lpbuf2, &dwSize2, 0); - } - - if (hr == S_OK) - { - if (bitDepth == 16) - { - int* dest = static_cast (lpbuf1); - const float* left = leftBuffer; - const float* right = rightBuffer; - int samples1 = (int) (dwSize1 >> 2); - int samples2 = (int) (dwSize2 >> 2); - - if (left == 0) - { - while (--samples1 >= 0) - *dest++ = (convertInputValue (*right++) << 16); - - dest = static_cast (lpbuf2); - - while (--samples2 >= 0) - *dest++ = (convertInputValue (*right++) << 16); - } - else if (right == 0) - { - while (--samples1 >= 0) - *dest++ = (0xffff & convertInputValue (*left++)); - - dest = static_cast (lpbuf2); - - while (--samples2 >= 0) - *dest++ = (0xffff & convertInputValue (*left++)); - } - else - { - while (--samples1 >= 0) - { - const int l = convertInputValue (*left++); - const int r = convertInputValue (*right++); - *dest++ = (r << 16) | (0xffff & l); - } - - dest = static_cast (lpbuf2); - - while (--samples2 >= 0) - { - const int l = convertInputValue (*left++); - const int r = convertInputValue (*right++); - *dest++ = (r << 16) | (0xffff & l); - } - } - } - else - { - jassertfalse; - } - - writeOffset = (writeOffset + dwSize1 + dwSize2) % totalBytesPerBuffer; - - pOutputBuffer->Unlock (lpbuf1, dwSize1, lpbuf2, dwSize2); - } - else - { - jassertfalse; - logError (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 convertInputValue (const float v) noexcept - { - return jlimit (-32768, 32767, roundToInt (32767.0f * v)); - } - - 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() - { - HRESULT hr; - - if (pInputBuffer != nullptr) - { - log ("closing dsound in: " + name); - hr = pInputBuffer->Stop(); - logError (hr); - - pInputBuffer->Release(); - pInputBuffer = nullptr; - } - - if (pDirectSoundCapture != nullptr) - { - pDirectSoundCapture->Release(); - pDirectSoundCapture = nullptr; - } - - if (pDirectSound != nullptr) - { - pDirectSound->Release(); - pDirectSound = nullptr; - } - } - - String open() - { - log ("opening dsound in device: " + name - + " rate=" + String (sampleRate) + " bits=" + String (bitDepth) + " buf=" + String (bufferSizeSamples)); - - pDirectSound = nullptr; - pDirectSoundCapture = nullptr; - pInputBuffer = nullptr; - readOffset = 0; - totalBytesPerBuffer = 0; - - String error; - HRESULT hr = E_NOINTERFACE; - - if (dsDirectSoundCaptureCreate != 0) - hr = dsDirectSoundCaptureCreate (&guid, &pDirectSoundCapture, 0); - - logError (hr); - - if (hr == S_OK) - { - const int numChannels = 2; - bytesPerBuffer = (bufferSizeSamples * (bitDepth >> 2)) & ~15; - totalBytesPerBuffer = (3 * 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; - - log ("opening dsound in step 2"); - hr = pDirectSoundCapture->CreateCaptureBuffer (&captureDesc, &pInputBuffer, 0); - - logError (hr); - - if (hr == S_OK) - { - hr = pInputBuffer->Start (1 /* DSCBSTART_LOOPING */); - logError (hr); - - if (hr == S_OK) - return String::empty; - } - } - - error = getDSErrorMessage (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); - logError (hr); - - if (hr != S_OK) - return true; - - int bytesFilled = (int) (readPos - readOffset); - if (bytesFilled < 0) - bytesFilled += totalBytesPerBuffer; - - if (bytesFilled >= bytesPerBuffer) - { - LPBYTE lpbuf1 = nullptr; - LPBYTE lpbuf2 = nullptr; - DWORD dwsize1 = 0; - DWORD dwsize2 = 0; - - HRESULT hr = pInputBuffer->Lock ((DWORD) readOffset, (DWORD) bytesPerBuffer, - (void**) &lpbuf1, &dwsize1, - (void**) &lpbuf2, &dwsize2, 0); - - if (hr == S_OK) - { - 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); - - const short* src = (const short*)lpbuf1; - - if (destL == 0) - { - while (--samples1 >= 0) - { - ++src; - *destR++ = *src++ * g; - } - - src = (const short*)lpbuf2; - - while (--samples2 >= 0) - { - ++src; - *destR++ = *src++ * g; - } - } - else if (destR == 0) - { - while (--samples1 >= 0) - { - *destL++ = *src++ * g; - ++src; - } - - src = (const short*)lpbuf2; - - while (--samples2 >= 0) - { - *destL++ = *src++ * g; - ++src; - } - } - else - { - while (--samples1 >= 0) - { - *destL++ = *src++ * g; - *destR++ = *src++ * g; - } - - src = (const short*)lpbuf2; - - while (--samples2 >= 0) - { - *destL++ = *src++ * g; - *destR++ = *src++ * g; - } - } - } - else - { - jassertfalse; - } - - readOffset = (readOffset + dwsize1 + dwsize2) % totalBytesPerBuffer; - - pInputBuffer->Unlock (lpbuf1, dwsize1, lpbuf2, dwsize2); - } - else - { - logError (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), - totalSamplesOut (0), - sampleRate (0.0), - inputBuffers (1, 1), - outputBuffers (1, 1), - 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) - { - lastError = openDevice (inputChannels, outputChannels, sampleRate, bufferSizeSamples); - isOpen_ = lastError.isEmpty(); - - return lastError; - } - - void close() - { - stop(); - - if (isOpen_) - { - closeDevice(); - isOpen_ = false; - } - } - - bool isOpen() { return isOpen_ && isThreadRunning(); } - int getCurrentBufferSizeSamples() { return bufferSizeSamples; } - double getCurrentSampleRate() { return sampleRate; } - BigInteger getActiveOutputChannels() const { return enabledOutputs; } - BigInteger getActiveInputChannels() const { return enabledInputs; } - int getOutputLatencyInSamples() { return (int) (getCurrentBufferSizeSamples() * 1.5); } - int getInputLatencyInSamples() { return getOutputLatencyInSamples(); } - StringArray getOutputChannelNames() { return outChannels; } - StringArray getInputChannelNames() { return inChannels; } - - int getNumSampleRates() { return 4; } - int getDefaultBufferSize() { return 2560; } - int getNumBufferSizesAvailable() { return 50; } - - double getSampleRate (int index) - { - const double samps[] = { 44100.0, 48000.0, 88200.0, 96000.0 }; - return samps [jlimit (0, 3, index)]; - } - - int getBufferSizeSamples (int index) - { - int n = 64; - for (int i = 0; i < index; ++i) - n += (n < 512) ? 32 - : ((n < 1024) ? 64 - : ((n < 2048) ? 128 : 256)); - - return n; - } - - int getCurrentBitDepth() - { - int i, bits = 256; - - for (i = inChans.size(); --i >= 0;) - bits = jmin (bits, inChans[i]->bitDepth); - - for (i = outChans.size(); --i >= 0;) - bits = jmin (bits, outChans[i]->bitDepth); - - if (bits > 32) - bits = 16; - - return bits; - } - - void start (AudioIODeviceCallback* call) - { - 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() - { - if (isStarted) - { - AudioIODeviceCallback* const callbackLocal = callback; - - { - const ScopedLock sl (startStopLock); - isStarted = false; - } - - if (callbackLocal != nullptr) - callbackLocal->audioDeviceStopped(); - } - } - - bool isPlaying() { return isStarted && isOpen_ && isThreadRunning(); } - String getLastError() { return lastError; } - - //============================================================================== - StringArray inChannels, outChannels; - int outputDeviceIndex, inputDeviceIndex; - -private: - bool isOpen_; - bool isStarted; - String lastError; - - OwnedArray inChans; - OwnedArray outChans; - WaitableEvent startEvent; - - int bufferSizeSamples; - int volatile totalSamplesOut; - int64 volatile lastBlockTime; - 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); - - int i; - for (i = 0; i < outChans.size(); ++i) - outChans.getUnchecked(i)->synchronisePosition(); - - for (i = 0; i < inChans.size(); ++i) - inChans.getUnchecked(i)->synchronisePosition(); - } - } - -public: - void run() - { - 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(); - - int i; - for (i = inChans.size(); --i >= 0;) - { - inChans.getUnchecked(i)->doneFlag = false; - ++numToDo; - } - - for (i = outChans.size(); --i >= 0;) - { - outChans.getUnchecked(i)->doneFlag = false; - ++numToDo; - } - - if (numToDo > 0) - { - const int maxCount = 3; - int count = maxCount; - - for (;;) - { - for (i = inChans.size(); --i >= 0;) - { - DSoundInternalInChannel* const in = inChans.getUnchecked(i); - - if ((! in->doneFlag) && in->service()) - { - in->doneFlag = true; - --numToDo; - } - } - - for (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) - { - JUCE_TRY - { - callback->audioDeviceIOCallback (const_cast (inputBuffers.getArrayOfChannels()), - inputBuffers.getNumChannels(), - outputBuffers.getArrayOfChannels(), - outputBuffers.getNumChannels(), - bufferSizeSamples); - } - JUCE_CATCH_EXCEPTION - - totalSamplesOut += bufferSizeSamples; - } - else - { - outputBuffers.clear(); - totalSamplesOut = 0; - 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(); - totalSamplesOut = 0; - - 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 i, numIns = 0; - - for (i = 0; i <= enabledInputs.getHighestBit(); i += 2) - { - float* left = nullptr; - if (enabledInputs[i]) - left = inputBuffers.getSampleData (numIns++); - - float* right = nullptr; - if (enabledInputs[i + 1]) - right = inputBuffers.getSampleData (numIns++); - - 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 (i = 0; i <= enabledOutputs.getHighestBit(); i += 2) - { - float* left = nullptr; - if (enabledOutputs[i]) - left = outputBuffers.getSampleData (numOuts++); - - float* right = nullptr; - if (enabledOutputs[i + 1]) - right = outputBuffers.getSampleData (numOuts++); - - 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 (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 (i = 0; i < inChans.size(); ++i) - { - error = inChans[i]->open(); - - if (error.isNotEmpty()) - { - error = "Error opening " + dlh.inputDeviceNames[i] + ": \"" + error + "\""; - break; - } - } - } - - if (error.isEmpty()) - { - totalSamplesOut = 0; - - for (i = 0; i < outChans.size(); ++i) - outChans.getUnchecked(i)->synchronisePosition(); - - for (i = 0; i < inChans.size(); ++i) - inChans.getUnchecked(i)->synchronisePosition(); - - startThread (9); - sleep (10); - - notify(); - } - else - { - log (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 - - DSoundAudioIODevice* const d = dynamic_cast (device); - if (d == 0) - return -1; - - return asInput ? d->inputDeviceIndex - : d->outputDeviceIndex; - } - - 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() - { - 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(); -} - -#undef log -#undef logError diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_Midi.cpp b/src/juce/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_Midi.cpp deleted file mode 100644 index 771cdb77..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_Midi.cpp +++ /dev/null @@ -1,495 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce 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) - { - int count = 5; - while (--count >= 0) - { - if (midiInClose (deviceHandle) == MMSYSERR_NOERROR) - break; - - Sleep (20); - } - } - } - - //============================================================================== - void handleMessage (const uint32 message, const uint32 timeStamp) - { - if ((message & 0xff) >= 0x80 && isStarted) - { - concatenator.pushMidiData (&message, 3, 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() - { - jassert (deviceHandle != 0); - if (deviceHandle != 0 && ! isStarted) - { - activeMidiCollectors.addIfNotAlreadyThere (this); - - for (int i = 0; i < (int) numHeaders; ++i) - headers[i].write (deviceHandle); - - startTime = Time::getMillisecondCounter(); - 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.removeValue (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 ((uint32) 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; - uint32 startTime; - - class MidiHeader - { - public: - MidiHeader() - { - zerostruct (hdr); - hdr.lpData = data; - hdr.dwBufferLength = (DWORD) numElementsInArray (data); - } - - void write (HMIDIIN deviceHandle) - { - hdr.dwBytesRecorded = 0; - MMRESULT res = midiInPrepareHeader (deviceHandle, &hdr, sizeof (hdr)); - res = midiInAddBuffer (deviceHandle, &hdr, sizeof (hdr)); - } - - void writeIfFinished (HMIDIIN deviceHandle) - { - if ((hdr.dwFlags & WHDR_DONE) != 0) - { - MMRESULT res = midiInUnprepareHeader (deviceHandle, &hdr, sizeof (hdr)); - (void) res; - write (deviceHandle); - } - } - - 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); - } - } - - 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) - { - timeStamp += startTime; - - const uint32 now = Time::getMillisecondCounter(); - if (timeStamp > now) - { - if (timeStamp > now + 2) - --startTime; - - timeStamp = now; - } - - return timeStamp * 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; - } - } - } - - int i; - for (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 (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.removeValue (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.dwBufferLength = (DWORD) message.getRawDataSize(); - h.dwBytesRecorded = (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 - { - midiOutShortMsg (handle->handle, - *(unsigned int*) message.getRawData()); - } -} diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_WASAPI.cpp b/src/juce/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_WASAPI.cpp deleted file mode 100644 index 951f3044..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_WASAPI.cpp +++ /dev/null @@ -1,1170 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef WASAPI_ENABLE_LOGGING - #define WASAPI_ENABLE_LOGGING 0 -#endif - -//============================================================================== -namespace WasapiClasses -{ - -void logFailure (HRESULT hr) -{ - (void) hr; - - #if WASAPI_ENABLE_LOGGING - if (FAILED (hr)) - { - String e; - e << Time::getCurrentTime().toString (true, true, true, true) - << " -- WASAPI error: "; - - switch (hr) - { - case E_POINTER: e << "E_POINTER"; break; - case E_INVALIDARG: e << "E_INVALIDARG"; break; - case AUDCLNT_E_NOT_INITIALIZED: e << "AUDCLNT_E_NOT_INITIALIZED"; break; - case AUDCLNT_E_ALREADY_INITIALIZED: e << "AUDCLNT_E_ALREADY_INITIALIZED"; break; - case AUDCLNT_E_WRONG_ENDPOINT_TYPE: e << "AUDCLNT_E_WRONG_ENDPOINT_TYPE"; break; - case AUDCLNT_E_DEVICE_INVALIDATED: e << "AUDCLNT_E_DEVICE_INVALIDATED"; break; - case AUDCLNT_E_NOT_STOPPED: e << "AUDCLNT_E_NOT_STOPPED"; break; - case AUDCLNT_E_BUFFER_TOO_LARGE: e << "AUDCLNT_E_BUFFER_TOO_LARGE"; break; - case AUDCLNT_E_OUT_OF_ORDER: e << "AUDCLNT_E_OUT_OF_ORDER"; break; - case AUDCLNT_E_UNSUPPORTED_FORMAT: e << "AUDCLNT_E_UNSUPPORTED_FORMAT"; break; - case AUDCLNT_E_INVALID_SIZE: e << "AUDCLNT_E_INVALID_SIZE"; break; - case AUDCLNT_E_DEVICE_IN_USE: e << "AUDCLNT_E_DEVICE_IN_USE"; break; - case AUDCLNT_E_BUFFER_OPERATION_PENDING: e << "AUDCLNT_E_BUFFER_OPERATION_PENDING"; break; - case AUDCLNT_E_THREAD_NOT_REGISTERED: e << "AUDCLNT_E_THREAD_NOT_REGISTERED"; break; - case AUDCLNT_E_EXCLUSIVE_MODE_NOT_ALLOWED: e << "AUDCLNT_E_EXCLUSIVE_MODE_NOT_ALLOWED"; break; - case AUDCLNT_E_ENDPOINT_CREATE_FAILED: e << "AUDCLNT_E_ENDPOINT_CREATE_FAILED"; break; - case AUDCLNT_E_SERVICE_NOT_RUNNING: e << "AUDCLNT_E_SERVICE_NOT_RUNNING"; break; - case AUDCLNT_E_EVENTHANDLE_NOT_EXPECTED: e << "AUDCLNT_E_EVENTHANDLE_NOT_EXPECTED"; break; - case AUDCLNT_E_EXCLUSIVE_MODE_ONLY: e << "AUDCLNT_E_EXCLUSIVE_MODE_ONLY"; break; - case AUDCLNT_E_BUFDURATION_PERIOD_NOT_EQUAL: e << "AUDCLNT_E_BUFDURATION_PERIOD_NOT_EQUAL"; break; - case AUDCLNT_E_EVENTHANDLE_NOT_SET: e << "AUDCLNT_E_EVENTHANDLE_NOT_SET"; break; - case AUDCLNT_E_INCORRECT_BUFFER_SIZE: e << "AUDCLNT_E_INCORRECT_BUFFER_SIZE"; break; - case AUDCLNT_E_BUFFER_SIZE_ERROR: e << "AUDCLNT_E_BUFFER_SIZE_ERROR"; break; - case AUDCLNT_S_BUFFER_EMPTY: e << "AUDCLNT_S_BUFFER_EMPTY"; break; - case AUDCLNT_S_THREAD_ALREADY_REGISTERED: e << "AUDCLNT_S_THREAD_ALREADY_REGISTERED"; break; - default: e << String::toHexString ((int) hr); break; - } - - DBG (e); - jassertfalse; - } - #endif -} - -#undef check - -bool check (HRESULT hr) -{ - logFailure (hr); - return SUCCEEDED (hr); -} - -//============================================================================== -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 roundDoubleToInt (sampleRate * ((double) t) * 0.0000001); -} - -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 & device_, const bool useExclusiveMode_) - : device (device_), - sampleRate (0), - defaultSampleRate (0), - numChannels (0), - actualNumChannels (0), - minBufferSize (0), - defaultBufferSize (0), - latencySamples (0), - useExclusiveMode (useExclusiveMode_), - sampleRateHasChanged (false) - { - clientEvent = CreateEvent (0, false, false, _T("JuceWASAPI")); - - 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); - - rates.addUsingDefaultSort (defaultSampleRate); - - static const double ratesToTest[] = { 44100.0, 48000.0, 88200.0, 96000.0 }; - - for (int i = 0; i < numElementsInArray (ratesToTest); ++i) - { - if (ratesToTest[i] == defaultSampleRate) - continue; - - format.Format.nSamplesPerSec = (DWORD) roundDoubleToInt (ratesToTest[i]); - - if (SUCCEEDED (tempClient->IsFormatSupported (useExclusiveMode ? AUDCLNT_SHAREMODE_EXCLUSIVE : AUDCLNT_SHAREMODE_SHARED, - (WAVEFORMATEX*) &format, 0))) - if (! rates.contains (ratesToTest[i])) - rates.addUsingDefaultSort (ratesToTest[i]); - } - } - - ~WASAPIDeviceBase() - { - device = nullptr; - CloseHandle (clientEvent); - } - - bool isOk() const noexcept { return defaultBufferSize > 0 && defaultSampleRate > 0; } - - bool openClient (const double newSampleRate, const BigInteger& newChannels) - { - 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 - && (tryInitialisingWithFormat (true, 4) || tryInitialisingWithFormat (false, 4) - || tryInitialisingWithFormat (false, 3) || tryInitialisingWithFormat (false, 2))) - { - 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; - const bool useExclusiveMode; - Array rates; - HANDLE clientEvent; - BigInteger channels; - Array channelMaps; - UINT32 actualBufferSize; - int bytesPerSample; - bool sampleRateHasChanged; - - virtual void updateFormat (bool isFloat) = 0; - -private: - //============================================================================== - class SessionEventCallback : public ComBaseClassHelper - { - public: - SessionEventCallback (WASAPIDeviceBase& owner_) : owner (owner_) {} - - 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; - } - - //============================================================================== - const ComSmartPtr createClient() - { - ComSmartPtr client; - - if (device != nullptr) - { - HRESULT hr = device->Activate (__uuidof (IAudioClient), CLSCTX_INPROC_SERVER, 0, (void**) client.resetAndGetPointerAddress()); - logFailure (hr); - } - - return client; - } - - bool tryInitialisingWithFormat (const bool useFloat, const int bytesPerSampleToTry) - { - WAVEFORMATEXTENSIBLE format = { 0 }; - - if (numChannels <= 2 && bytesPerSampleToTry <= 2) - { - format.Format.wFormatTag = WAVE_FORMAT_PCM; - } - else - { - format.Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE; - format.Format.cbSize = sizeof (WAVEFORMATEXTENSIBLE) - sizeof (WAVEFORMATEX); - } - - format.Format.nSamplesPerSec = (DWORD) roundDoubleToInt (sampleRate); - format.Format.nChannels = (WORD) numChannels; - format.Format.wBitsPerSample = (WORD) (8 * bytesPerSampleToTry); - format.Format.nAvgBytesPerSec = (DWORD) (format.Format.nSamplesPerSec * numChannels * bytesPerSampleToTry); - format.Format.nBlockAlign = (WORD) (numChannels * bytesPerSampleToTry); - format.SubFormat = useFloat ? KSDATAFORMAT_SUBTYPE_IEEE_FLOAT : KSDATAFORMAT_SUBTYPE_PCM; - format.Samples.wValidBitsPerSample = format.Format.wBitsPerSample; - - switch (numChannels) - { - case 1: format.dwChannelMask = SPEAKER_FRONT_CENTER; break; - case 2: format.dwChannelMask = SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT; break; - case 4: format.dwChannelMask = SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT; break; - case 6: format.dwChannelMask = SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_FRONT_CENTER | SPEAKER_LOW_FREQUENCY | SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT; break; - case 8: format.dwChannelMask = SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_FRONT_CENTER | SPEAKER_LOW_FREQUENCY | SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT | SPEAKER_FRONT_LEFT_OF_CENTER | SPEAKER_FRONT_RIGHT_OF_CENTER; break; - default: break; - } - - WAVEFORMATEXTENSIBLE* nearestFormat = nullptr; - - HRESULT hr = client->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, (WAVEFORMATEX*) nearestFormat); - hr = S_OK; - } - - CoTaskMemFree (nearestFormat); - - REFERENCE_TIME defaultPeriod = 0, minPeriod = 0; - if (useExclusiveMode) - check (client->GetDevicePeriod (&defaultPeriod, &minPeriod)); - - GUID session; - if (hr == S_OK - && check (client->Initialize (useExclusiveMode ? AUDCLNT_SHAREMODE_EXCLUSIVE : AUDCLNT_SHAREMODE_SHARED, - AUDCLNT_STREAMFLAGS_EVENTCALLBACK, - defaultPeriod, defaultPeriod, (WAVEFORMATEX*) &format, &session))) - { - actualNumChannels = format.Format.nChannels; - const bool isFloat = format.Format.wFormatTag == WAVE_FORMAT_EXTENSIBLE && format.SubFormat == KSDATAFORMAT_SUBTYPE_IEEE_FLOAT; - bytesPerSample = format.Format.wBitsPerSample / 8; - - updateFormat (isFloat); - return true; - } - - return false; - } - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (WASAPIDeviceBase); -}; - -//============================================================================== -class WASAPIInputDevice : public WASAPIDeviceBase -{ -public: - WASAPIInputDevice (const ComSmartPtr & device_, const bool useExclusiveMode_) - : WASAPIDeviceBase (device_, useExclusiveMode_), - reservoir (1, 1) - { - } - - ~WASAPIInputDevice() - { - close(); - } - - bool open (const double newSampleRate, const BigInteger& newChannels) - { - reservoirSize = 0; - reservoirCapacity = 16384; - reservoir.setSize (actualNumChannels * reservoirCapacity * sizeof (float)); - return openClient (newSampleRate, newChannels) - && (numChannels == 0 || check (client->GetService (__uuidof (IAudioCaptureClient), - (void**) captureClient.resetAndGetPointerAddress()))); - } - - void close() - { - closeClient(); - captureClient = nullptr; - reservoir.setSize (0); - } - - template - void updateFormatWithType (SourceType*) - { - typedef AudioData::Pointer NativeType; - converter = new AudioData::ConverterInstance , NativeType> (actualNumChannels, 1); - } - - void updateFormat (bool isFloat) - { - if (isFloat) updateFormatWithType ((AudioData::Float32*) 0); - else if (bytesPerSample == 4) updateFormatWithType ((AudioData::Int32*) 0); - else if (bytesPerSample == 3) updateFormatWithType ((AudioData::Int24*) 0); - else updateFormatWithType ((AudioData::Int16*) 0); - } - - void copyBuffers (float** destBuffers, int numDestBuffers, int bufferSize, Thread& thread) - { - if (numChannels <= 0) - return; - - int offset = 0; - - while (bufferSize > 0) - { - if (reservoirSize > 0) // There's stuff in the reservoir, so use that... - { - const int samplesToDo = jmin (bufferSize, (int) reservoirSize); - - for (int i = 0; i < numDestBuffers; ++i) - converter->convertSamples (destBuffers[i] + offset, 0, reservoir.getData(), channelMaps.getUnchecked(i), samplesToDo); - - bufferSize -= samplesToDo; - offset += samplesToDo; - reservoirSize = 0; - } - else - { - UINT32 packetLength = 0; - if (! check (captureClient->GetNextPacketSize (&packetLength))) - break; - - if (packetLength == 0) - { - if (thread.threadShouldExit() - || WaitForSingleObject (clientEvent, 1000) == WAIT_TIMEOUT) - break; - - continue; - } - - uint8* inputData; - UINT32 numSamplesAvailable; - DWORD flags; - - if (check (captureClient->GetBuffer (&inputData, &numSamplesAvailable, &flags, 0, 0))) - { - const int samplesToDo = jmin (bufferSize, (int) numSamplesAvailable); - - for (int i = 0; i < numDestBuffers; ++i) - converter->convertSamples (destBuffers[i] + offset, 0, inputData, channelMaps.getUnchecked(i), samplesToDo); - - bufferSize -= samplesToDo; - offset += samplesToDo; - - if (samplesToDo < (int) numSamplesAvailable) - { - reservoirSize = jmin ((int) (numSamplesAvailable - samplesToDo), reservoirCapacity); - memcpy ((uint8*) reservoir.getData(), inputData + bytesPerSample * actualNumChannels * samplesToDo, - (size_t) (bytesPerSample * actualNumChannels * reservoirSize)); - } - - captureClient->ReleaseBuffer (numSamplesAvailable); - } - } - } - } - - ComSmartPtr captureClient; - MemoryBlock reservoir; - int reservoirSize, reservoirCapacity; - ScopedPointer converter; - -private: - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (WASAPIInputDevice); -}; - -//============================================================================== -class WASAPIOutputDevice : public WASAPIDeviceBase -{ -public: - WASAPIOutputDevice (const ComSmartPtr & device_, const bool useExclusiveMode_) - : WASAPIDeviceBase (device_, useExclusiveMode_) - { - } - - ~WASAPIOutputDevice() - { - close(); - } - - bool open (const double newSampleRate, const BigInteger& newChannels) - { - return openClient (newSampleRate, newChannels) - && (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) - { - if (isFloat) updateFormatWithType ((AudioData::Float32*) 0); - else if (bytesPerSample == 4) updateFormatWithType ((AudioData::Int32*) 0); - else if (bytesPerSample == 3) updateFormatWithType ((AudioData::Int24*) 0); - else updateFormatWithType ((AudioData::Int16*) 0); - } - - void copyBuffers (const float** const srcBuffers, const int numSrcBuffers, int bufferSize, Thread& thread) - { - if (numChannels <= 0) - return; - - int offset = 0; - - while (bufferSize > 0) - { - UINT32 padding = 0; - if (! check (client->GetCurrentPadding (&padding))) - return; - - int samplesToDo = useExclusiveMode ? bufferSize - : jmin ((int) (actualBufferSize - padding), bufferSize); - - if (samplesToDo <= 0) - { - if (thread.threadShouldExit() - || WaitForSingleObject (clientEvent, 1000) == WAIT_TIMEOUT) - break; - - continue; - } - - 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); - - offset += samplesToDo; - bufferSize -= samplesToDo; - } - } - } - - ComSmartPtr renderClient; - ScopedPointer converter; - -private: - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (WASAPIOutputDevice); -}; - -//============================================================================== -class WASAPIAudioIODevice : public AudioIODevice, - public Thread -{ -public: - WASAPIAudioIODevice (const String& deviceName, - const String& outputDeviceId_, - const String& inputDeviceId_, - const bool useExclusiveMode_) - : AudioIODevice (deviceName, "Windows Audio"), - Thread ("Juce WASAPI"), - outputDeviceId (outputDeviceId_), - inputDeviceId (inputDeviceId_), - useExclusiveMode (useExclusiveMode_), - 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() - { - StringArray outChannels; - - if (outputDevice != nullptr) - for (int i = 1; i <= outputDevice->actualNumChannels; ++i) - outChannels.add ("Output channel " + String (i)); - - return outChannels; - } - - StringArray getInputChannelNames() - { - StringArray inChannels; - - if (inputDevice != nullptr) - for (int i = 1; i <= inputDevice->actualNumChannels; ++i) - inChannels.add ("Input channel " + String (i)); - - return inChannels; - } - - int getNumSampleRates() { return sampleRates.size(); } - double getSampleRate (int index) { return sampleRates [index]; } - int getNumBufferSizesAvailable() { return bufferSizes.size(); } - int getBufferSizeSamples (int index) { return bufferSizes [index]; } - int getDefaultBufferSize() { return defaultBufferSize; } - - int getCurrentBufferSizeSamples() { return currentBufferSizeSamples; } - double getCurrentSampleRate() { return currentSampleRate; } - int getCurrentBitDepth() { return 32; } - int getOutputLatencyInSamples() { return latencyOut; } - int getInputLatencyInSamples() { return latencyIn; } - BigInteger getActiveOutputChannels() const { return outputDevice != nullptr ? outputDevice->channels : BigInteger(); } - BigInteger getActiveInputChannels() const { return inputDevice != nullptr ? inputDevice->channels : BigInteger(); } - String getLastError() { return lastError; } - - - String open (const BigInteger& inputChannels, const BigInteger& outputChannels, - double sampleRate, int bufferSizeSamples) - { - close(); - lastError = String::empty; - - if (sampleRates.size() == 0 && inputDevice != nullptr && outputDevice != nullptr) - { - lastError = "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; - - if (inputDevice != nullptr && ! inputDevice->open (currentSampleRate, inputChannels)) - { - lastError = "Couldn't open the input device!"; - return lastError; - } - - if (outputDevice != nullptr && ! outputDevice->open (currentSampleRate, outputChannels)) - { - close(); - lastError = "Couldn't open the output device!"; - return lastError; - } - - 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 + inputDevice->actualBufferSize + inputDevice->minBufferSize); - - if (! check (inputDevice->client->Start())) - { - close(); - lastError = "Couldn't start the input device!"; - return lastError; - } - } - - if (outputDevice != nullptr && outputDevice->client != nullptr) - { - latencyOut = (int) (outputDevice->latencySamples + outputDevice->actualBufferSize + outputDevice->minBufferSize); - - if (! check (outputDevice->client->Start())) - { - close(); - lastError = "Couldn't start the output device!"; - return lastError; - } - } - - isOpen_ = true; - return lastError; - } - - void close() - { - 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() { return isOpen_ && isThreadRunning(); } - bool isPlaying() { return isStarted && isOpen_ && isThreadRunning(); } - - void start (AudioIODeviceCallback* call) - { - 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() - { - if (isStarted) - { - AudioIODeviceCallback* const callbackLocal = callback; - - { - const ScopedLock sl (startStopLock); - isStarted = false; - } - - if (callbackLocal != nullptr) - callbackLocal->audioDeviceStopped(); - } - } - - void setMMThreadPriority() - { - DynamicLibrary dll ("avrt.dll"); - JUCE_DLL_FUNCTION (AvSetMmThreadCharacteristicsW, avSetMmThreadCharacteristics, HANDLE, dll, (LPCWSTR, LPDWORD)) - JUCE_DLL_FUNCTION (AvSetMmThreadPriority, avSetMmThreadPriority, HANDLE, dll, (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() - { - setMMThreadPriority(); - - const int bufferSize = currentBufferSizeSamples; - const int numInputBuffers = getActiveInputChannels().countNumberOfSetBits(); - const int numOutputBuffers = getActiveOutputChannels().countNumberOfSetBits(); - bool sampleRateChanged = false; - - AudioSampleBuffer ins (jmax (1, numInputBuffers), bufferSize + 32); - AudioSampleBuffer outs (jmax (1, numOutputBuffers), bufferSize + 32); - float** const inputBuffers = ins.getArrayOfChannels(); - float** const outputBuffers = outs.getArrayOfChannels(); - ins.clear(); - - while (! threadShouldExit()) - { - if (inputDevice != nullptr) - { - inputDevice->copyBuffers (inputBuffers, numInputBuffers, bufferSize, *this); - - if (threadShouldExit()) - break; - - if (inputDevice->sampleRateHasChanged) - sampleRateChanged = true; - } - - JUCE_TRY - { - const ScopedLock sl (startStopLock); - - if (isStarted) - callback->audioDeviceIOCallback (const_cast (inputBuffers), numInputBuffers, - outputBuffers, numOutputBuffers, bufferSize); - else - outs.clear(); - } - JUCE_CATCH_EXCEPTION - - if (outputDevice != nullptr) - { - outputDevice->copyBuffers (const_cast (outputBuffers), numOutputBuffers, bufferSize, *this); - - if (outputDevice->sampleRateHasChanged) - sampleRateChanged = true; - } - - if (sampleRateChanged) - { - // xxx one of the devices has had its sample rate changed externally.. not 100% sure how - // to handle this.. - } - } - } - - //============================================================================== - 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; - - AudioIODeviceCallback* callback; - CriticalSection startStopLock; - - //============================================================================== - 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())); - } - - //============================================================================== - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (WASAPIAudioIODevice); -}; - - -//============================================================================== -class WASAPIAudioIODeviceType : public AudioIODeviceType, - private DeviceChangeDetector -{ -public: - WASAPIAudioIODeviceType() - : AudioIODeviceType ("Windows Audio"), - DeviceChangeDetector (L"Windows Audio"), - hasScanned (false) - { - } - - //============================================================================== - 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 - WASAPIAudioIODevice* const d = dynamic_cast (device); - return d == nullptr ? -1 : (asInput ? inputDeviceIds.indexOf (d->inputDeviceId) - : outputDeviceIds.indexOf (d->outputDeviceId)); - } - - bool hasSeparateInputsAndOutputs() const { return true; } - - AudioIODevice* createDevice (const String& outputDeviceName, - const String& inputDeviceName) - { - jassert (hasScanned); // need to call scanForDevices() before doing this - - const bool useExclusiveMode = false; - 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, - outputDeviceIds [outputIndex], - inputDeviceIds [inputIndex], - useExclusiveMode); - - if (! device->initialise()) - device = nullptr; - } - - return device.release(); - } - - //============================================================================== - StringArray outputDeviceNames, outputDeviceIds; - StringArray inputDeviceNames, inputDeviceIds; - -private: - bool hasScanned; - - //============================================================================== - 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) - { - ComSmartPtr enumerator; - if (! check (enumerator.CoCreateInstance (__uuidof (MMDeviceEnumerator)))) - return; - - 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; - PropVariantInit (&value); - 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() - { - 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); -}; - -} - -//============================================================================== -AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_WASAPI() -{ - if (SystemStats::getOperatingSystemType() >= SystemStats::WinVista) - return new WasapiClasses::WASAPIAudioIODeviceType(); - - return nullptr; -} diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_devices/sources/juce_AudioSourcePlayer.cpp b/src/juce/JuceLibraryCode/modules/juce_audio_devices/sources/juce_AudioSourcePlayer.cpp deleted file mode 100644 index 36e349fb..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_devices/sources/juce_AudioSourcePlayer.cpp +++ /dev/null @@ -1,182 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -AudioSourcePlayer::AudioSourcePlayer() - : source (nullptr), - sampleRate (0), - bufferSize (0), - tempBuffer (2, 8), - 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) - { - AudioSourceChannelInfo info; - int i, numActiveChans = 0, numInputs = 0, numOutputs = 0; - - // messy stuff needed to compact the channels down into an array - // of non-zero pointers.. - for (i = 0; i < totalNumInputChannels; ++i) - { - if (inputChannelData[i] != nullptr) - { - inputChans [numInputs++] = inputChannelData[i]; - if (numInputs >= numElementsInArray (inputChans)) - break; - } - } - - for (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 (i = 0; i < numOutputs; ++i) - { - channels[numActiveChans] = outputChans[i]; - memcpy (channels[numActiveChans], inputChans[i], sizeof (float) * (size_t) numSamples); - ++numActiveChans; - } - - for (i = numOutputs; i < numInputs; ++i) - { - channels[numActiveChans] = tempBuffer.getSampleData (i - numOutputs, 0); - memcpy (channels[numActiveChans], inputChans[i], sizeof (float) * (size_t) numSamples); - ++numActiveChans; - } - } - else - { - for (i = 0; i < numInputs; ++i) - { - channels[numActiveChans] = outputChans[i]; - memcpy (channels[numActiveChans], inputChans[i], sizeof (float) * (size_t) numSamples); - ++numActiveChans; - } - - for (i = numInputs; i < numOutputs; ++i) - { - channels[numActiveChans] = outputChans[i]; - zeromem (channels[numActiveChans], sizeof (float) * (size_t) numSamples); - ++numActiveChans; - } - } - - AudioSampleBuffer buffer (channels, numActiveChans, numSamples); - - info.buffer = &buffer; - info.startSample = 0; - info.numSamples = numSamples; - - source->getNextAudioBlock (info); - - for (i = info.buffer->getNumChannels(); --i >= 0;) - info.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) -{ - sampleRate = device->getCurrentSampleRate(); - bufferSize = device->getCurrentBufferSizeSamples(); - 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/src/juce/JuceLibraryCode/modules/juce_audio_devices/sources/juce_AudioSourcePlayer.h b/src/juce/JuceLibraryCode/modules/juce_audio_devices/sources/juce_AudioSourcePlayer.h deleted file mode 100644 index 7a89527a..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_devices/sources/juce_AudioSourcePlayer.h +++ /dev/null @@ -1,114 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_AUDIOSOURCEPLAYER_JUCEHEADER__ -#define __JUCE_AUDIOSOURCEPLAYER_JUCEHEADER__ - - -//============================================================================== -/** - 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 0 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); - - /** Implementation of the AudioIODeviceCallback method. */ - void audioDeviceAboutToStart (AudioIODevice* device); - - /** Implementation of the AudioIODeviceCallback method. */ - void audioDeviceStopped(); - -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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_devices/sources/juce_AudioTransportSource.cpp b/src/juce/JuceLibraryCode/modules/juce_audio_devices/sources/juce_AudioTransportSource.cpp deleted file mode 100644 index a2c854f6..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_devices/sources/juce_AudioTransportSource.cpp +++ /dev/null @@ -1,302 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce 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 readAheadBufferSize_, - 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 = readAheadBufferSize_; - 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 (readAheadBufferSize_ > 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, readAheadBufferSize_, 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; - - 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; - else - return 0.0; -} - -double AudioTransportSource::getLengthInSeconds() const -{ - return getTotalLength() / sampleRate; -} - -void AudioTransportSource::setNextReadPosition (int64 newPosition) -{ - if (positionableSource != nullptr) - { - if (sampleRate > 0 && sourceSampleRate > 0) - newPosition = (int64) (newPosition * sourceSampleRate / sampleRate); - - positionableSource->setNextReadPosition (newPosition); - } -} - -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 sampleRate_) -{ - const ScopedLock sl (callbackLock); - - sampleRate = sampleRate_; - blockSize = samplesPerBlockExpected; - - if (masterSource != nullptr) - masterSource->prepareToPlay (samplesPerBlockExpected, sampleRate); - - if (resamplerSource != nullptr && sourceSampleRate > 0) - resamplerSource->setResamplingRatio (sourceSampleRate / sampleRate); - - 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); - - inputStreamEOF = false; - - 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/src/juce/JuceLibraryCode/modules/juce_audio_devices/sources/juce_AudioTransportSource.h b/src/juce/JuceLibraryCode/modules/juce_audio_devices/sources/juce_AudioTransportSource.h deleted file mode 100644 index 5fcf5139..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_devices/sources/juce_AudioTransportSource.h +++ /dev/null @@ -1,187 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_AUDIOTRANSPORTSOURCE_JUCEHEADER__ -#define __JUCE_AUDIOTRANSPORTSOURCE_JUCEHEADER__ - - -//============================================================================== -/** - 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); - - /** Implementation of the AudioSource method. */ - void releaseResources(); - - /** Implementation of the AudioSource method. */ - void getNextAudioBlock (const AudioSourceChannelInfo& bufferToFill); - - //============================================================================== - /** Implements the PositionableAudioSource method. */ - void setNextReadPosition (int64 newPosition); - - /** Implements the PositionableAudioSource method. */ - int64 getNextReadPosition() const; - - /** Implements the PositionableAudioSource method. */ - int64 getTotalLength() const; - - /** Implements the PositionableAudioSource method. */ - bool isLooping() const; - -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 isPrepared, inputStreamEOF; - - void releaseMasterResources(); - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioTransportSource); -}; - - -#endif // __JUCE_AUDIOTRANSPORTSOURCE_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/Flac Licence.txt b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/Flac Licence.txt deleted file mode 100644 index 39992bdf..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/all.h b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/all.h deleted file mode 100644 index 98026b2e..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/all.h +++ /dev/null @@ -1,402 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 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. - */ - -#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" - - -#ifdef _MSC_VER -/* OPT: an MSVC built-in would be better */ -static _inline FLAC__uint32 local_swap32_(FLAC__uint32 x) -{ - x = ((x<<8)&0xFF00FF00) | ((x>>8)&0x00FF00FF); - return (x>>16) | (x<<16); -} -#endif - -#if defined(_MSC_VER) && defined(_X86_) -/* OPT: an MSVC built-in would be better */ -static void local_swap32_block_(FLAC__uint32 *start, FLAC__uint32 len) -{ - __asm { - mov edx, start - mov ecx, len - test ecx, ecx -loop1: - jz done1 - mov eax, [edx] - bswap eax - mov [edx], eax - add edx, 4 - dec ecx - jmp short loop1 -done1: - } -} -#endif - - -/** \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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/alloc.h b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/alloc.h deleted file mode 100644 index 270fde01..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/alloc.h +++ /dev/null @@ -1,212 +0,0 @@ -/* alloc - Convenience routines for safely allocating memory - * Copyright (C) 2007 Josh Coalson - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#ifndef FLAC__SHARE__ALLOC_H -#define FLAC__SHARE__ALLOC_H - -#if 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 !defined _MSC_VER && !defined __MINGW32__ && !defined __EMX__ -#include /* for SIZE_MAX in case limits.h didn't get it */ -#endif -#include /* for size_t, malloc(), etc */ - -#ifndef SIZE_MAX -# ifndef SIZE_T_MAX -# ifdef _MSC_VER -# define SIZE_T_MAX UINT_MAX -# else -# error -# endif -# endif -# define SIZE_MAX SIZE_T_MAX -#endif - -#ifndef FLaC__INLINE -#define FLaC__INLINE -#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 FLaC__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 FLaC__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 FLaC__INLINE void *safe_malloc_add_2op_(size_t size1, size_t size2) -{ - size2 += size1; - if(size2 < size1) - return 0; - return safe_malloc_(size2); -} - -static FLaC__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 FLaC__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); -} - -static FLaC__INLINE void *safe_malloc_mul_2op_(size_t size1, size_t size2) -#if 0 -needs support for cases where sizeof(size_t) != 4 -{ - /* could be faster #ifdef'ing off SIZEOF_SIZE_T */ - if(sizeof(size_t) == 4) { - if ((double)size1 * (double)size2 < 4294967296.0) - return malloc(size1*size2); - } - return 0; -} -#else -/* better? */ -{ - 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); -} -#endif - -static FLaC__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 FLaC__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 FLaC__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; - return safe_malloc_mul_2op_(size1, size2); -} - -static FLaC__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 FLaC__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 FLaC__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 FLaC__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 FLaC__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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/assert.h b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/assert.h deleted file mode 100644 index 5c2d5048..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/assert.h +++ /dev/null @@ -1,45 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2001,2002,2003,2004,2005,2006,2007 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. - */ - -#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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/callback.h b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/callback.h deleted file mode 100644 index c9513050..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/callback.h +++ /dev/null @@ -1,184 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2004,2005,2006,2007 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. - */ - -#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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/export.h b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/export.h deleted file mode 100644 index 5a5654c0..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/export.h +++ /dev/null @@ -1,91 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 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. - */ - -#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) || !defined(_MSC_VER) -#define FLAC_API - -#else - -#ifdef FLAC_API_EXPORTS -#define FLAC_API _declspec(dllexport) -#else -#define FLAC_API _declspec(dllimport) - -#endif -#endif - -/** These #defines will mirror the libtool-based library version number, see - * http://www.gnu.org/software/libtool/manual.html#Libtool-versioning - */ -#define FLAC_API_VERSION_CURRENT 10 -#define FLAC_API_VERSION_REVISION 0 /**< see above */ -#define FLAC_API_VERSION_AGE 2 /**< 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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/format.h b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/format.h deleted file mode 100644 index 75c06c1b..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/format.h +++ /dev/null @@ -1,1010 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 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. - */ - -#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__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 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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/bitmath.c b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/bitmath.c deleted file mode 100644 index ccc65243..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/bitmath.c +++ /dev/null @@ -1,149 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2001,2002,2003,2004,2005,2006,2007 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. - */ - -#if HAVE_CONFIG_H -# include -#endif - -#include "include/private/bitmath.h" -#include "../assert.h" - -/* 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 - */ -unsigned FLAC__bitmath_ilog2(FLAC__uint32 v) -{ - unsigned l = 0; - FLAC__ASSERT(v > 0); - while(v >>= 1) - l++; - return l; -} - -unsigned FLAC__bitmath_ilog2_wide(FLAC__uint64 v) -{ - unsigned l = 0; - FLAC__ASSERT(v > 0); - while(v >>= 1) - l++; - return l; -} - -/* 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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/bitreader.c b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/bitreader.c deleted file mode 100644 index 1a182875..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/bitreader.c +++ /dev/null @@ -1,1350 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 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. - */ - -#if HAVE_CONFIG_H -# include -#endif - -#include /* for malloc() */ -#include /* for memcpy(), memset() */ -#ifdef _MSC_VER -#include /* for ntohl() */ -#elif defined FLAC__SYS_DARWIN -#include /* for ntohl() */ -#elif defined __MINGW32__ -#include /* for ntohl() */ -#else -#include /* for ntohl() */ -#endif -#include "include/private/bitmath.h" -#include "include/private/bitreader.h" -#include "include/private/crc.h" -#include "../assert.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 COUNT_ZERO_MSBS below to match */ -/* WATCHOUT: there are a few places where the code will not work unless brword is >= 32 bits wide */ -/* also, some sections currently only have fast versions for 4 or 8 bytes per word */ -typedef FLAC__uint32 brword; -#define FLAC__BYTES_PER_WORD 4 -#define FLAC__BITS_PER_WORD 32 -#define FLAC__WORD_ALL_ONES ((FLAC__uint32)0xffffffff) -/* SWAP_BE_WORD_TO_HOST swaps bytes in a brword (which is always big-endian) if necessary to match host byte order */ -#if WORDS_BIGENDIAN -#define SWAP_BE_WORD_TO_HOST(x) (x) -#else -#if defined (_MSC_VER) && defined (_X86_) -#define SWAP_BE_WORD_TO_HOST(x) local_swap32_(x) -#else -#define SWAP_BE_WORD_TO_HOST(x) ntohl(x) -#endif -#endif -/* counts the # of zero MSBs in a word */ -#define COUNT_ZERO_MSBS(word) ( \ - (word) <= 0xffff ? \ - ( (word) <= 0xff? byte_to_unary_table[word] + 24 : byte_to_unary_table[(word) >> 8] + 16 ) : \ - ( (word) <= 0xffffff? byte_to_unary_table[word >> 16] + 8 : byte_to_unary_table[(word) >> 24] ) \ -) -/* this alternate might be slightly faster on some systems/compilers: */ -#define COUNT_ZERO_MSBS2(word) ( (word) <= 0xff ? byte_to_unary_table[word] + 24 : ((word) <= 0xffff ? byte_to_unary_table[(word) >> 8] + 16 : ((word) <= 0xffffff ? byte_to_unary_table[(word) >> 16] + 8 : byte_to_unary_table[(word) >> 24])) ) - - -/* - * 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 */ - -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 -}; - -#ifdef min -#undef min -#endif -#define min(x,y) ((x)<(y)?(x):(y)) -#ifdef max -#undef max -#endif -#define max(x,y) ((x)>(y)?(x):(y)) - -/* adjust for compilers that can't understand using LLU suffix for uint64_t literals */ -#ifdef _MSC_VER -#define FLAC__U64L(x) x -#else -#define FLAC__U64L(x) x##LLU -#endif - -#ifndef FLaC__INLINE -#define FLaC__INLINE -#endif - -/* WATCHOUT: assembly routines rely on the order in which these fields are declared */ -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 */ - brword *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; - FLAC__CPUInfo cpu_info; -}; - -static FLaC__INLINE void crc16_update_word_(FLAC__BitReader *br, brword word) -{ - register 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; -} - -/* would be static except it needs to be called by asm routines */ -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 brword 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; -# if defined(_MSC_VER) && defined (_X86_) && (FLAC__BYTES_PER_WORD == 4) - if(br->cpu_info.type == FLAC__CPUINFO_TYPE_IA32 && br->cpu_info.data.ia32.bswap) { - start = br->words; - local_swap32_block_(br->buffer + start, end - start); - } - else -# endif - 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__CPUInfo cpu, 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 = (brword*)malloc(sizeof(brword) * br->capacity); - if(br->buffer == 0) - return false; - br->read_callback = rcb; - br->client_data = cd; - br->cpu_info = cpu; - - 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 brword 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 (FLAC__uint16) br->read_crc16; -} - -FLaC__INLINE FLAC__bool FLAC__bitreader_is_consumed_byte_aligned(const FLAC__BitReader *br) -{ - return ((br->consumed_bits & 7) == 0); -} - -FLaC__INLINE unsigned FLAC__bitreader_bits_left_for_byte_alignment(const FLAC__BitReader *br) -{ - return 8 - (br->consumed_bits & 7); -} - -FLaC__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__INLINE 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 brword 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 brword 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; -} - -FLaC__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 = 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 brword 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__INLINE 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... */ - brword b = br->buffer[br->consumed_words] << br->consumed_bits; - if(b) { - i = COUNT_ZERO_MSBS(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) { - const unsigned end = br->bytes * 8; - brword b = (br->buffer[br->consumed_words] & (FLAC__WORD_ALL_ONES << (FLAC__BITS_PER_WORD-end))) << br->consumed_bits; - if(b) { - i = COUNT_ZERO_MSBS(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, (unsigned int*) &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 */ -/* a lot of the logic is copied, then adapted, from FLAC__bitreader_read_unary_unsigned() and FLAC__bitreader_read_raw_uint32() */ -FLAC__bool FLAC__bitreader_read_rice_signed_block(FLAC__BitReader *br, int vals[], unsigned nvals, unsigned parameter) -/* OPT: possibly faster version for use with MSVC */ -#ifdef _MSC_VER -{ - unsigned i; - unsigned uval = 0; - unsigned bits; /* the # of binary LSBs left to read to finish a rice codeword */ - - /* try and get br->consumed_words and br->consumed_bits into register; - * must remember to flush them back to *br before calling other - * bitwriter functions that use them, and before returning */ - register unsigned cwords; - register unsigned cbits; - - 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 that 2 words, so we don't have to loop to read it */ - - if(nvals == 0) - return true; - - cbits = br->consumed_bits; - cwords = br->consumed_words; - - while(1) { - - /* read unary part */ - while(1) { - while(cwords < br->words) { /* if we've not consumed up to a partial tail word... */ - brword b = br->buffer[cwords] << cbits; - if(b) { -#if 0 /* slower, probably due to bad register allocation... */ && defined FLAC__CPU_IA32 && !defined FLAC__NO_ASM && FLAC__BITS_PER_WORD == 32 - __asm { - bsr eax, b - not eax - and eax, 31 - mov i, eax - } -#else - i = COUNT_ZERO_MSBS(b); -#endif - uval += i; - bits = parameter; - i++; - cbits += i; - if(cbits == FLAC__BITS_PER_WORD) { - crc16_update_word_(br, br->buffer[cwords]); - cwords++; - cbits = 0; - } - goto break1; - } - else { - uval += FLAC__BITS_PER_WORD - cbits; - crc16_update_word_(br, br->buffer[cwords]); - cwords++; - cbits = 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) { - const unsigned end = br->bytes * 8; - brword b = (br->buffer[cwords] & (FLAC__WORD_ALL_ONES << (FLAC__BITS_PER_WORD-end))) << cbits; - if(b) { - i = COUNT_ZERO_MSBS(b); - uval += i; - bits = parameter; - i++; - cbits += i; - FLAC__ASSERT(cbits < FLAC__BITS_PER_WORD); - goto break1; - } - else { - uval += end - cbits; - cbits += end; - FLAC__ASSERT(cbits < FLAC__BITS_PER_WORD); - /* didn't find stop bit yet, have to keep going... */ - } - } - /* flush registers and read; bitreader_read_from_client_() does - * not touch br->consumed_bits at all but we still need to set - * it in case it fails and we have to return false. - */ - br->consumed_bits = cbits; - br->consumed_words = cwords; - if(!bitreader_read_from_client_(br)) - return false; - cwords = br->consumed_words; - } -break1: - /* read binary part */ - FLAC__ASSERT(cwords <= br->words); - - if(bits) { - while((br->words-cwords)*FLAC__BITS_PER_WORD + br->bytes*8 - cbits < bits) { - /* flush registers and read; bitreader_read_from_client_() does - * not touch br->consumed_bits at all but we still need to set - * it in case it fails and we have to return false. - */ - br->consumed_bits = cbits; - br->consumed_words = cwords; - if(!bitreader_read_from_client_(br)) - return false; - cwords = br->consumed_words; - } - if(cwords < br->words) { /* if we've not consumed up to a partial tail word... */ - if(cbits) { - /* 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 - cbits; - const brword word = br->buffer[cwords]; - if(bits < n) { - uval <<= bits; - uval |= (word & (FLAC__WORD_ALL_ONES >> cbits)) >> (n-bits); - cbits += bits; - goto break2; - } - uval <<= n; - uval |= word & (FLAC__WORD_ALL_ONES >> cbits); - bits -= n; - crc16_update_word_(br, word); - cwords++; - cbits = 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 */ - uval <<= bits; - uval |= (br->buffer[cwords] >> (FLAC__BITS_PER_WORD-bits)); - cbits = bits; - } - goto break2; - } - else { - FLAC__ASSERT(bits < FLAC__BITS_PER_WORD); - uval <<= bits; - uval |= br->buffer[cwords] >> (FLAC__BITS_PER_WORD-bits); - cbits = bits; - goto break2; - } - } - 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. - */ - uval <<= bits; - if(cbits) { - /* this also works when consumed_bits==0, it's just a little slower than necessary for that case */ - FLAC__ASSERT(cbits + bits <= br->bytes*8); - uval |= (br->buffer[cwords] & (FLAC__WORD_ALL_ONES >> cbits)) >> (FLAC__BITS_PER_WORD-cbits-bits); - cbits += bits; - goto break2; - } - else { - uval |= br->buffer[cwords] >> (FLAC__BITS_PER_WORD-bits); - cbits += bits; - goto break2; - } - } - } -break2: - /* compose the value */ - *vals = (int)(uval >> 1 ^ -(int)(uval & 1)); - - /* are we done? */ - --nvals; - if(nvals == 0) { - br->consumed_bits = cbits; - br->consumed_words = cwords; - return true; - } - - uval = 0; - ++vals; - - } -} -#else -{ - unsigned i; - unsigned uval = 0; - - /* try and get br->consumed_words and br->consumed_bits into register; - * must remember to flush them back to *br before calling other - * bitwriter functions that use them, and before returning */ - register unsigned cwords; - register unsigned cbits; - unsigned ucbits; /* keep track of the number of unconsumed bits in the buffer */ - - 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 */ - - if(nvals == 0) - return true; - - cbits = br->consumed_bits; - cwords = br->consumed_words; - ucbits = (br->words-cwords)*FLAC__BITS_PER_WORD + br->bytes*8 - cbits; - - while(1) { - - /* read unary part */ - while(1) { - while(cwords < br->words) { /* if we've not consumed up to a partial tail word... */ - brword b = br->buffer[cwords] << cbits; - if(b) { -#if 0 /* is not discernably faster... */ && defined FLAC__CPU_IA32 && !defined FLAC__NO_ASM && FLAC__BITS_PER_WORD == 32 && defined __GNUC__ - asm volatile ( - "bsrl %1, %0;" - "notl %0;" - "andl $31, %0;" - : "=r"(i) - : "r"(b) - ); -#else - i = COUNT_ZERO_MSBS(b); -#endif - uval += i; - cbits += i; - cbits++; /* skip over stop bit */ - if(cbits >= FLAC__BITS_PER_WORD) { /* faster way of testing if(cbits == FLAC__BITS_PER_WORD) */ - crc16_update_word_(br, br->buffer[cwords]); - cwords++; - cbits = 0; - } - goto break1; - } - else { - uval += FLAC__BITS_PER_WORD - cbits; - crc16_update_word_(br, br->buffer[cwords]); - cwords++; - cbits = 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) { - const unsigned end = br->bytes * 8; - brword b = (br->buffer[cwords] & ~(FLAC__WORD_ALL_ONES >> end)) << cbits; - if(b) { - i = COUNT_ZERO_MSBS(b); - uval += i; - cbits += i; - cbits++; /* skip over stop bit */ - FLAC__ASSERT(cbits < FLAC__BITS_PER_WORD); - goto break1; - } - else { - uval += end - cbits; - cbits += end; - FLAC__ASSERT(cbits < FLAC__BITS_PER_WORD); - /* didn't find stop bit yet, have to keep going... */ - } - } - /* flush registers and read; bitreader_read_from_client_() does - * not touch br->consumed_bits at all but we still need to set - * it in case it fails and we have to return false. - */ - br->consumed_bits = cbits; - br->consumed_words = cwords; - if(!bitreader_read_from_client_(br)) - return false; - cwords = br->consumed_words; - ucbits = (br->words-cwords)*FLAC__BITS_PER_WORD + br->bytes*8 - cbits + uval; - /* + uval to offset our count by the # of unary bits already - * consumed before the read, because we will add these back - * in all at once at break1 - */ - } -break1: - ucbits -= uval; - ucbits--; /* account for stop bit */ - - /* read binary part */ - FLAC__ASSERT(cwords <= br->words); - - if(parameter) { - while(ucbits < parameter) { - /* flush registers and read; bitreader_read_from_client_() does - * not touch br->consumed_bits at all but we still need to set - * it in case it fails and we have to return false. - */ - br->consumed_bits = cbits; - br->consumed_words = cwords; - if(!bitreader_read_from_client_(br)) - return false; - cwords = br->consumed_words; - ucbits = (br->words-cwords)*FLAC__BITS_PER_WORD + br->bytes*8 - cbits; - } - if(cwords < br->words) { /* if we've not consumed up to a partial tail word... */ - if(cbits) { - /* this also works when consumed_bits==0, it's just slower than necessary for that case */ - const unsigned n = FLAC__BITS_PER_WORD - cbits; - const brword word = br->buffer[cwords]; - if(parameter < n) { - uval <<= parameter; - uval |= (word & (FLAC__WORD_ALL_ONES >> cbits)) >> (n-parameter); - cbits += parameter; - } - else { - uval <<= n; - uval |= word & (FLAC__WORD_ALL_ONES >> cbits); - crc16_update_word_(br, word); - cwords++; - cbits = parameter - n; - if(cbits) { /* parameter > n, i.e. if there are still bits left to read, there have to be less than 32 so they will all be in the next word */ - uval <<= cbits; - uval |= (br->buffer[cwords] >> (FLAC__BITS_PER_WORD-cbits)); - } - } - } - else { - cbits = parameter; - uval <<= parameter; - uval |= br->buffer[cwords] >> (FLAC__BITS_PER_WORD-cbits); - } - } - else { - /* in this case we're starting our read at a partial tail word; - * the reader has guaranteed that we have at least 'parameter' - * bits available to read, which makes this case simpler. - */ - uval <<= parameter; - if(cbits) { - /* this also works when consumed_bits==0, it's just a little slower than necessary for that case */ - FLAC__ASSERT(cbits + parameter <= br->bytes*8); - uval |= (br->buffer[cwords] & (FLAC__WORD_ALL_ONES >> cbits)) >> (FLAC__BITS_PER_WORD-cbits-parameter); - cbits += parameter; - } - else { - cbits = parameter; - uval |= br->buffer[cwords] >> (FLAC__BITS_PER_WORD-cbits); - } - } - } - - ucbits -= parameter; - - /* compose the value */ - *vals = (int)(uval >> 1 ^ -(int)(uval & 1)); - - /* are we done? */ - --nvals; - if(nvals == 0) { - br->consumed_bits = cbits; - br->consumed_words = cwords; - return true; - } - - uval = 0; - ++vals; - - } -} -#endif - -#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; -} diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/bitwriter.c b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/bitwriter.c deleted file mode 100644 index 759a8363..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/bitwriter.c +++ /dev/null @@ -1,880 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 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. - */ - -#if HAVE_CONFIG_H -# include -#endif - -#include /* for malloc() */ -#include /* for memcpy(), memset() */ -#ifdef _MSC_VER -#include /* for ntohl() */ -#elif defined FLAC__SYS_DARWIN -#include /* for ntohl() */ -#elif defined __MINGW32__ -#include /* for ntohl() */ -#else -#include /* for ntohl() */ -#endif -#if 0 /* UNUSED */ -#include "include/private/bitmath.h" -#endif -#include "include/private/bitwriter.h" -#include "include/private/crc.h" -#include "../assert.h" -#include "../alloc.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 bwword is >= 32 bits wide */ -typedef FLAC__uint32 bwword; -#define FLAC__BYTES_PER_WORD 4 -#define FLAC__BITS_PER_WORD 32 -#define FLAC__WORD_ALL_ONES ((FLAC__uint32)0xffffffff) -/* SWAP_BE_WORD_TO_HOST swaps bytes in a bwword (which is always big-endian) if necessary to match host byte order */ -#if WORDS_BIGENDIAN -#define SWAP_BE_WORD_TO_HOST(x) (x) -#else -#ifdef _MSC_VER -#define SWAP_BE_WORD_TO_HOST(x) local_swap32_(x) -#else -#define SWAP_BE_WORD_TO_HOST(x) ntohl(x) -#endif -#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(bwword); /* size in words */ -/* When growing, increment 4K at a time */ -static const unsigned FLAC__BITWRITER_DEFAULT_INCREMENT = 4096u / sizeof(bwword); /* 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) - -#ifdef min -#undef min -#endif -#define min(x,y) ((x)<(y)?(x):(y)) - -/* adjust for compilers that can't understand using LLU suffix for uint64_t literals */ -#ifdef _MSC_VER -#define FLAC__U64L(x) x -#else -#define FLAC__U64L(x) x##LLU -#endif - -#ifndef FLaC__INLINE -#define FLaC__INLINE -#endif - -struct FLAC__BitWriter { - bwword *buffer; - bwword 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. */ -static FLAC__bool bitwriter_grow_(FLAC__BitWriter *bw, unsigned bits_to_add) -{ - unsigned new_capacity; - bwword *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 = (bwword*)safe_realloc_mul_2op_(bw->buffer, sizeof(bwword), /*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 = (bwword*)malloc(sizeof(bwword) * 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; -} - -FLaC__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 = 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; -} - -FLaC__INLINE FLAC__bool FLAC__bitwriter_write_raw_uint32(FLAC__BitWriter *bw, FLAC__uint32 val, unsigned bits) -{ - register 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; -} - -FLaC__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); -} - -FLaC__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); -} - -FLaC__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; -} - -FLaC__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(bwword)-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 0 /* OPT: can remove this special case if it doesn't make up for the extra compare (doesn't make a statistically significant difference with msvc or gcc/x86) */ - if(bw->bits && bw->bits + msbits + lsbits <= FLAC__BITS_PER_WORD) { /* i.e. if the whole thing fits in the current bwword */ - /* ^^^ if bw->bits is 0 then we may have filled the buffer and have no free bwword to work in */ - bw->bits = bw->bits + msbits + lsbits; - uval |= mask1; /* set stop bit */ - uval &= mask2; /* mask off unused top bits */ - /* NOT: bw->accum <<= msbits + lsbits because msbits+lsbits could be 32, then the shift would be a NOP */ - bw->accum <<= msbits; - bw->accum <<= lsbits; - bw->accum |= uval; - if(bw->bits == FLAC__BITS_PER_WORD) { - bw->buffer[bw->words++] = SWAP_BE_WORD_TO_HOST(bw->accum); - bw->bits = 0; - /* burying the capacity check down here means we have to grow the buffer a little if there are more vals to do */ - if(bw->capacity <= bw->words && nvals > 1 && !bitwriter_grow_(bw, 1)) { - FLAC__ASSERT(bw->capacity == bw->words); - return false; - } - } - } - else { -#elif 1 /*@@@@@@ OPT: try this version with MSVC6 to see if better, not much difference for gcc-4 */ - if(bw->bits && bw->bits + msbits + lsbits < FLAC__BITS_PER_WORD) { /* i.e. if the whole thing fits in the current bwword */ - /* ^^^ if bw->bits is 0 then we may have filled the buffer and have no free bwword 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 { -#endif - /* 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 bwword*/ && !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; - } -#if 1 - } -#endif - 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; -} diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/cpu.c b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/cpu.c deleted file mode 100644 index c052e25c..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/cpu.c +++ /dev/null @@ -1,418 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2001,2002,2003,2004,2005,2006,2007 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. - */ - -#if HAVE_CONFIG_H -# include -#endif - -#include "include/private/cpu.h" -#include -#include - -#if defined FLAC__CPU_IA32 -# include -#elif defined FLAC__CPU_PPC -# if !defined FLAC__NO_ASM -# if defined FLAC__SYS_DARWIN -# include -# include -# include -# include -# include -# ifndef CPU_SUBTYPE_POWERPC_970 -# define CPU_SUBTYPE_POWERPC_970 ((cpu_subtype_t) 100) -# endif -# else /* FLAC__SYS_DARWIN */ - -# include -# include - -static sigjmp_buf jmpbuf; -static volatile sig_atomic_t canjump = 0; - -static void sigill_handler (int sig) -{ - if (!canjump) { - signal (sig, SIG_DFL); - raise (sig); - } - canjump = 0; - siglongjmp (jmpbuf, 1); -} -# endif /* FLAC__SYS_DARWIN */ -# endif /* FLAC__NO_ASM */ -#endif /* FLAC__CPU_PPC */ - -#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 - -/* 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; -/* 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; -/* these are flags in EDX of CPUID AX=80000001 */ -static const unsigned FLAC__CPUINFO_IA32_CPUID_EXTENDED_AMD_3DNOW = 0x80000000; -static const unsigned FLAC__CPUINFO_IA32_CPUID_EXTENDED_AMD_EXT3DNOW = 0x40000000; -static const unsigned FLAC__CPUINFO_IA32_CPUID_EXTENDED_AMD_EXTMMX = 0x00400000; - - -/* - * 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__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" - */ -# undef USE_OBSOLETE_SIGCONTEXT_FLAVOR /* #define this to use the older signal handler method */ -# ifdef USE_OBSOLETE_SIGCONTEXT_FLAVOR - static void sigill_handler_sse_os(int signal, struct sigcontext sc) - { - (void)signal; - sc.eip += 3 + 3 + 6; - } -# else -# 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; - } -# endif -# elif defined(_MSC_VER) -# include -# undef USE_TRY_CATCH_FLAVOR /* #define this to use the try/catch method for catching illegal opcode exception */ -# ifdef USE_TRY_CATCH_FLAVOR -# else - LONG CALLBACK sigill_handler_sse_os(EXCEPTION_POINTERS *ep) - { - if(ep->ExceptionRecord->ExceptionCode == EXCEPTION_ILLEGAL_INSTRUCTION) { - ep->ContextRecord->Eip += 3 + 3 + 6; - return EXCEPTION_CONTINUE_EXECUTION; - } - return EXCEPTION_CONTINUE_SEARCH; - } -# endif -# endif -#endif - - -void FLAC__cpu_info(FLAC__CPUInfo *info) -{ -/* - * IA32-specific - */ -#ifdef FLAC__CPU_IA32 - info->type = FLAC__CPUINFO_TYPE_IA32; -#if !defined FLAC__NO_ASM && defined FLAC__HAS_NASM - info->use_asm = true; /* we assume a minimum of 80386 with FLAC__CPU_IA32 */ - info->data.ia32.cpuid = FLAC__cpu_have_cpuid_asm_ia32()? true : false; - info->data.ia32.bswap = info->data.ia32.cpuid; /* CPUID => BSWAP since it came after */ - info->data.ia32.cmov = false; - info->data.ia32.mmx = false; - info->data.ia32.fxsr = false; - info->data.ia32.sse = false; - info->data.ia32.sse2 = false; - info->data.ia32.sse3 = false; - info->data.ia32.ssse3 = false; - info->data.ia32._3dnow = false; - info->data.ia32.ext3dnow = false; - info->data.ia32.extmmx = false; - if(info->data.ia32.cpuid) { - /* http://www.sandpile.org/ia32/cpuid.htm */ - FLAC__uint32 flags_edx, flags_ecx; - FLAC__cpu_info_asm_ia32(&flags_edx, &flags_ecx); - info->data.ia32.cmov = (flags_edx & FLAC__CPUINFO_IA32_CPUID_CMOV )? true : false; - info->data.ia32.mmx = (flags_edx & FLAC__CPUINFO_IA32_CPUID_MMX )? true : false; - info->data.ia32.fxsr = (flags_edx & FLAC__CPUINFO_IA32_CPUID_FXSR )? true : false; - info->data.ia32.sse = (flags_edx & FLAC__CPUINFO_IA32_CPUID_SSE )? true : false; - info->data.ia32.sse2 = (flags_edx & FLAC__CPUINFO_IA32_CPUID_SSE2 )? true : false; - info->data.ia32.sse3 = (flags_ecx & FLAC__CPUINFO_IA32_CPUID_SSE3 )? true : false; - info->data.ia32.ssse3 = (flags_ecx & FLAC__CPUINFO_IA32_CPUID_SSSE3)? true : false; - -#ifdef FLAC__USE_3DNOW - flags_edx = FLAC__cpu_info_extended_amd_asm_ia32(); - info->data.ia32._3dnow = (flags_edx & FLAC__CPUINFO_IA32_CPUID_EXTENDED_AMD_3DNOW )? true : false; - info->data.ia32.ext3dnow = (flags_edx & FLAC__CPUINFO_IA32_CPUID_EXTENDED_AMD_EXT3DNOW)? true : false; - info->data.ia32.extmmx = (flags_edx & FLAC__CPUINFO_IA32_CPUID_EXTENDED_AMD_EXTMMX )? true : false; -#else - info->data.ia32._3dnow = info->data.ia32.ext3dnow = info->data.ia32.extmmx = false; -#endif - -#ifdef DEBUG - fprintf(stderr, "CPU info (IA-32):\n"); - fprintf(stderr, " CPUID ...... %c\n", info->data.ia32.cpuid ? 'Y' : 'n'); - fprintf(stderr, " BSWAP ...... %c\n", info->data.ia32.bswap ? 'Y' : 'n'); - fprintf(stderr, " CMOV ....... %c\n", info->data.ia32.cmov ? 'Y' : 'n'); - fprintf(stderr, " MMX ........ %c\n", info->data.ia32.mmx ? 'Y' : 'n'); - fprintf(stderr, " FXSR ....... %c\n", info->data.ia32.fxsr ? 'Y' : 'n'); - fprintf(stderr, " SSE ........ %c\n", info->data.ia32.sse ? 'Y' : 'n'); - fprintf(stderr, " SSE2 ....... %c\n", info->data.ia32.sse2 ? 'Y' : 'n'); - fprintf(stderr, " SSE3 ....... %c\n", info->data.ia32.sse3 ? 'Y' : 'n'); - fprintf(stderr, " SSSE3 ...... %c\n", info->data.ia32.ssse3 ? 'Y' : 'n'); - fprintf(stderr, " 3DNow! ..... %c\n", info->data.ia32._3dnow ? 'Y' : 'n'); - fprintf(stderr, " 3DNow!-ext . %c\n", info->data.ia32.ext3dnow? 'Y' : 'n'); - fprintf(stderr, " 3DNow!-MMX . %c\n", info->data.ia32.extmmx ? 'Y' : 'n'); -#endif - - /* - * now have to check for OS support of SSE/SSE2 - */ - if(info->data.ia32.fxsr || info->data.ia32.sse || info->data.ia32.sse2) { -#if defined FLAC__NO_SSE_OS - /* assume user knows better than us; turn it off */ - info->data.ia32.fxsr = info->data.ia32.sse = info->data.ia32.sse2 = info->data.ia32.sse3 = info->data.ia32.ssse3 = false; -#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) - info->data.ia32.fxsr = info->data.ia32.sse = info->data.ia32.sse2 = info->data.ia32.sse3 = info->data.ia32.ssse3 = false; -#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) - info->data.ia32.fxsr = info->data.ia32.sse = info->data.ia32.sse2 = info->data.ia32.sse3 = info->data.ia32.ssse3 = false; - else { /* double-check SSE2 */ - mib[1] = CPU_SSE2; - len = sizeof(val); - if(sysctl(mib, 2, &val, &len, NULL, 0) < 0 || !val) - info->data.ia32.sse2 = info->data.ia32.sse3 = info->data.ia32.ssse3 = false; - } -# else - info->data.ia32.fxsr = info->data.ia32.sse = info->data.ia32.sse2 = info->data.ia32.sse3 = info->data.ia32.ssse3 = false; -# endif -#elif defined(__linux__) - int sse = 0; - struct sigaction sigill_save; -#ifdef USE_OBSOLETE_SIGCONTEXT_FLAVOR - if(0 == sigaction(SIGILL, NULL, &sigill_save) && signal(SIGILL, (void (*)(int))sigill_handler_sse_os) != SIG_ERR) -#else - 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)) -#endif - { - /* http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html */ - /* see sigill_handler_sse_os() for an explanation of the following: */ - asm volatile ( - "xorl %0,%0\n\t" /* for some reason, still need to do this to clear 'sse' var */ - "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) - : "r"(sse) - ); - - sigaction(SIGILL, &sigill_save, NULL); - } - - if(!sse) - info->data.ia32.fxsr = info->data.ia32.sse = info->data.ia32.sse2 = info->data.ia32.sse3 = info->data.ia32.ssse3 = false; -#elif defined(_MSC_VER) -# ifdef USE_TRY_CATCH_FLAVOR - _try { - __asm { -# if _MSC_VER <= 1200 - /* VC6 assembler doesn't know SSE, have to emit bytecode instead */ - _emit 0x0F - _emit 0x57 - _emit 0xC0 -# else - xorps xmm0,xmm0 -# endif - } - } - _except(EXCEPTION_EXECUTE_HANDLER) { - if (_exception_code() == STATUS_ILLEGAL_INSTRUCTION) - info->data.ia32.fxsr = info->data.ia32.sse = info->data.ia32.sse2 = info->data.ia32.sse3 = info->data.ia32.ssse3 = false; - } -# else - int sse = 0; - LPTOP_LEVEL_EXCEPTION_FILTER save = SetUnhandledExceptionFilter(sigill_handler_sse_os); - /* see GCC version above for explanation */ - /* http://msdn2.microsoft.com/en-us/library/4ks26t93.aspx */ - /* http://www.codeproject.com/cpp/gccasm.asp */ - /* http://www.hick.org/~mmiller/msvc_inline_asm.html */ - __asm { -# if _MSC_VER <= 1200 - /* VC6 assembler doesn't know SSE, have to emit bytecode instead */ - _emit 0x0F - _emit 0x57 - _emit 0xC0 -# else - xorps xmm0,xmm0 -# endif - inc sse - nop - nop - nop - nop - nop - nop - nop - nop - nop - } - SetUnhandledExceptionFilter(save); - if(!sse) - info->data.ia32.fxsr = info->data.ia32.sse = info->data.ia32.sse2 = info->data.ia32.sse3 = info->data.ia32.ssse3 = false; -# endif -#else - /* no way to test, disable to be safe */ - info->data.ia32.fxsr = info->data.ia32.sse = info->data.ia32.sse2 = info->data.ia32.sse3 = info->data.ia32.ssse3 = false; -#endif -#ifdef DEBUG - fprintf(stderr, " SSE OS sup . %c\n", info->data.ia32.sse ? 'Y' : 'n'); -#endif - - } - } -#else - info->use_asm = false; -#endif - -/* - * PPC-specific - */ -#elif defined FLAC__CPU_PPC - info->type = FLAC__CPUINFO_TYPE_PPC; -# if !defined FLAC__NO_ASM - info->use_asm = true; -# ifdef FLAC__USE_ALTIVEC -# if defined FLAC__SYS_DARWIN - { - int val = 0, mib[2] = { CTL_HW, HW_VECTORUNIT }; - size_t len = sizeof(val); - info->data.ppc.altivec = !(sysctl(mib, 2, &val, &len, NULL, 0) || !val); - } - { - host_basic_info_data_t hostInfo; - mach_msg_type_number_t infoCount; - - infoCount = HOST_BASIC_INFO_COUNT; - host_info(mach_host_self(), HOST_BASIC_INFO, (host_info_t)&hostInfo, &infoCount); - - info->data.ppc.ppc64 = (hostInfo.cpu_type == CPU_TYPE_POWERPC) && (hostInfo.cpu_subtype == CPU_SUBTYPE_POWERPC_970); - } -# else /* FLAC__USE_ALTIVEC && !FLAC__SYS_DARWIN */ - { - /* no Darwin, do it the brute-force way */ - /* @@@@@@ this is not thread-safe; replace with SSE OS method above or remove */ - info->data.ppc.altivec = 0; - info->data.ppc.ppc64 = 0; - - signal (SIGILL, sigill_handler); - canjump = 0; - if (!sigsetjmp (jmpbuf, 1)) { - canjump = 1; - - asm volatile ( - "mtspr 256, %0\n\t" - "vand %%v0, %%v0, %%v0" - : - : "r" (-1) - ); - - info->data.ppc.altivec = 1; - } - canjump = 0; - if (!sigsetjmp (jmpbuf, 1)) { - int x = 0; - canjump = 1; - - /* PPC64 hardware implements the cntlzd instruction */ - asm volatile ("cntlzd %0, %1" : "=r" (x) : "r" (x) ); - - info->data.ppc.ppc64 = 1; - } - signal (SIGILL, SIG_DFL); /*@@@@@@ should save and restore old signal */ - } -# endif -# else /* !FLAC__USE_ALTIVEC */ - info->data.ppc.altivec = 0; - info->data.ppc.ppc64 = 0; -# endif -# else - info->use_asm = false; -# endif - -/* - * unknown CPI - */ -#else - info->type = FLAC__CPUINFO_TYPE_UNKNOWN; - info->use_asm = false; -#endif -} diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/crc.c b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/crc.c deleted file mode 100644 index 1325f174..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/crc.c +++ /dev/null @@ -1,142 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 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. - */ - -#if 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 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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/fixed.c b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/fixed.c deleted file mode 100644 index 9234f63d..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/fixed.c +++ /dev/null @@ -1,435 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 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. - */ - -#if HAVE_CONFIG_H -# include -#endif - -#include -#include -#include "include/private/bitmath.h" -#include "include/private/fixed.h" -#include "../assert.h" - -#ifndef M_LN2 -/* math.h in VC++ doesn't seem to have this (how Microsoft is that?) */ -#define M_LN2 0.69314718055994530942 -#endif - -#ifdef min -#undef min -#endif -#define min(x,y) ((x) < (y)? (x) : (y)) - -#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 < min(min(min(total_error_1, total_error_2), total_error_3), total_error_4)) - order = 0; - else if(total_error_1 < min(min(total_error_2, total_error_3), total_error_4)) - order = 1; - else if(total_error_2 < 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 < min(min(min(total_error_1, total_error_2), total_error_3), total_error_4)) - order = 0; - else if(total_error_1 < min(min(total_error_2, total_error_3), total_error_4)) - order = 1; - else if(total_error_2 < 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 -#if defined _MSC_VER || defined __MINGW32__ - /* with MSVC you have to spoon feed it the casting */ - residual_bits_per_sample[0] = (FLAC__float)((total_error_0 > 0) ? log(M_LN2 * (FLAC__double)(FLAC__int64)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)(FLAC__int64)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)(FLAC__int64)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)(FLAC__int64)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)(FLAC__int64)total_error_4 / (FLAC__double)data_len) / M_LN2 : 0.0); -#else - 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); -#endif -#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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/float.c b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/float.c deleted file mode 100644 index bcb3ef5b..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/float.c +++ /dev/null @@ -1,308 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2004,2005,2006,2007 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. - */ - -#if HAVE_CONFIG_H -# include -#endif - -#include "../assert.h" - -#include "include/private/float.h" - -#ifdef FLAC__INTEGER_ONLY_LIBRARY - -/* adjust for compilers that can't understand using LLU suffix for uint64_t literals */ -#ifdef _MSC_VER -#define FLAC__U64L(x) x -#else -#define FLAC__U64L(x) x##LLU -#endif - -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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/format.c b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/format.c deleted file mode 100644 index 8a0749cf..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/format.c +++ /dev/null @@ -1,598 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 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. - */ - -#if HAVE_CONFIG_H -# include -#endif - -#include -#include /* for qsort() */ -#include /* for memset() */ -#include "../assert.h" -#include "../format.h" -#include "include/private/format.h" - -#ifndef FLaC__INLINE -#define FLaC__INLINE -#endif - -#ifdef min -#undef min -#endif -#define min(a,b) ((a)<(b)?(a):(b)) - -/* adjust for compilers that can't understand using LLU suffix for uint64_t literals */ -#ifdef _MSC_VER -#define FLAC__U64L(x) x -#else -#define FLAC__U64L(x) x##LLU -#endif - -/* VERSION should come from configure */ -FLAC_API const char *FLAC__VERSION_STRING = VERSION - - - - -; - -#if defined _MSC_VER || defined __BORLANDC__ || defined __MINW32__ -/* yet one more hack because of MSVC6: */ -FLAC_API const char *FLAC__VENDOR_STRING = "reference libFLAC 1.2.1 20070917"; -#else -FLAC_API const char *FLAC__VENDOR_STRING = "reference libFLAC " VERSION " 20070917"; -#endif - -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_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 JUCE_CDECL 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 (JUCE_CDECL *)(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 FLaC__INLINE 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 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*)realloc(object->parameters, sizeof(unsigned)*(1 << max_partition_order)))) - return false; - if(0 == (object->raw_bits = (unsigned*)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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/all.h b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/all.h deleted file mode 100644 index 389cdb29..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/all.h +++ /dev/null @@ -1,49 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 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. - */ - -#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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitmath.h b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitmath.h deleted file mode 100644 index 12771020..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitmath.h +++ /dev/null @@ -1,42 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2001,2002,2003,2004,2005,2006,2007 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. - */ - -#ifndef FLAC__PRIVATE__BITMATH_H -#define FLAC__PRIVATE__BITMATH_H - -#include "../../../ordinals.h" - -unsigned FLAC__bitmath_ilog2(FLAC__uint32 v); -unsigned FLAC__bitmath_ilog2_wide(FLAC__uint64 v); -unsigned FLAC__bitmath_silog2(int v); -unsigned FLAC__bitmath_silog2_wide(FLAC__int64 v); - -#endif diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitreader.h b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitreader.h deleted file mode 100644 index 63445321..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitreader.h +++ /dev/null @@ -1,99 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 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. - */ - -#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__CPUInfo cpu, 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); -#ifndef FLAC__NO_ASM -# ifdef FLAC__CPU_IA32 -# ifdef FLAC__HAS_NASM -FLAC__bool FLAC__bitreader_read_rice_signed_block_asm_ia32_bswap(FLAC__BitReader *br, int vals[], unsigned nvals, unsigned parameter); -# endif -# endif -#endif -#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); - -FLAC__bool bitreader_read_from_client_(FLAC__BitReader *br); -#endif diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitwriter.h b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitwriter.h deleted file mode 100644 index 461b8e23..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitwriter.h +++ /dev/null @@ -1,103 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 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. - */ - -#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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/cpu.h b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/cpu.h deleted file mode 100644 index 0b8a66ad..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/cpu.h +++ /dev/null @@ -1,88 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2001,2002,2003,2004,2005,2006,2007 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. - */ - -#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_PPC, - FLAC__CPUINFO_TYPE_UNKNOWN -} FLAC__CPUInfo_Type; - -typedef struct { - FLAC__bool cpuid; - FLAC__bool bswap; - FLAC__bool cmov; - FLAC__bool mmx; - FLAC__bool fxsr; - FLAC__bool sse; - FLAC__bool sse2; - FLAC__bool sse3; - FLAC__bool ssse3; - FLAC__bool _3dnow; - FLAC__bool ext3dnow; - FLAC__bool extmmx; -} FLAC__CPUInfo_IA32; - -typedef struct { - FLAC__bool altivec; - FLAC__bool ppc64; -} FLAC__CPUInfo_PPC; - -typedef struct { - FLAC__bool use_asm; - FLAC__CPUInfo_Type type; - union { - FLAC__CPUInfo_IA32 ia32; - FLAC__CPUInfo_PPC ppc; - } data; -} FLAC__CPUInfo; - -void FLAC__cpu_info(FLAC__CPUInfo *info); - -#ifndef FLAC__NO_ASM -#ifdef FLAC__CPU_IA32 -#ifdef 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); -FLAC__uint32 FLAC__cpu_info_extended_amd_asm_ia32(void); -#endif -#endif -#endif - -#endif diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/crc.h b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/crc.h deleted file mode 100644 index c9b82d4f..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/crc.h +++ /dev/null @@ -1,61 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 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. - */ - -#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 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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/fixed.h b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/fixed.h deleted file mode 100644 index 220273e9..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/fixed.h +++ /dev/null @@ -1,97 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 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. - */ - -#ifndef FLAC__PRIVATE__FIXED_H -#define FLAC__PRIVATE__FIXED_H - -#ifdef HAVE_CONFIG_H -#include -#endif - -#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]); -# ifndef FLAC__NO_ASM -# ifdef FLAC__CPU_IA32 -# ifdef 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 -# endif -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(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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/float.h b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/float.h deleted file mode 100644 index 13e6d579..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/float.h +++ /dev/null @@ -1,97 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2004,2005,2006,2007 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. - */ - -#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 "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_3dnow(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[]); -# 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[]); -# endif /* FLAC__HAS_NASM */ -# elif defined FLAC__CPU_PPC -void FLAC__lpc_restore_signal_asm_ppc_altivec_16(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_ppc_altivec_16_order8(const FLAC__int32 residual[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 data[]); -# endif/* FLAC__CPU_IA32 || FLAC__CPU_PPC */ -#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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/md5.h b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/md5.h deleted file mode 100644 index 2cf5c5da..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/md5.h +++ /dev/null @@ -1,44 +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 struct { - FLAC__uint32 in[16]; - FLAC__uint32 buf[4]; - FLAC__uint32 bytes[2]; - FLAC__byte *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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/memory.h b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/memory.h deleted file mode 100644 index aa3e256b..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/memory.h +++ /dev/null @@ -1,56 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2001,2002,2003,2004,2005,2006,2007 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. - */ - -#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(unsigned elements, FLAC__int32 **unaligned_pointer, FLAC__int32 **aligned_pointer); -FLAC__bool FLAC__memory_alloc_aligned_uint32_array(unsigned elements, FLAC__uint32 **unaligned_pointer, FLAC__uint32 **aligned_pointer); -FLAC__bool FLAC__memory_alloc_aligned_uint64_array(unsigned elements, FLAC__uint64 **unaligned_pointer, FLAC__uint64 **aligned_pointer); -FLAC__bool FLAC__memory_alloc_aligned_unsigned_array(unsigned elements, unsigned **unaligned_pointer, unsigned **aligned_pointer); -#ifndef FLAC__INTEGER_ONLY_LIBRARY -FLAC__bool FLAC__memory_alloc_aligned_real_array(unsigned elements, FLAC__real **unaligned_pointer, FLAC__real **aligned_pointer); -#endif - -#endif diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/metadata.h b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/metadata.h deleted file mode 100644 index 87f78db7..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/metadata.h +++ /dev/null @@ -1,45 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2002,2003,2004,2005,2006,2007 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. - */ - -#ifndef FLAC__PRIVATE__METADATA_H -#define FLAC__PRIVATE__METADATA_H - -#include "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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/stream_encoder_framing.h b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/stream_encoder_framing.h deleted file mode 100644 index a37dbf45..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/stream_encoder_framing.h +++ /dev/null @@ -1,45 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 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. - */ - -#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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/window.h b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/window.h deleted file mode 100644 index 9313451a..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/window.h +++ /dev/null @@ -1,71 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2006,2007 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. - */ - -#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_welch(FLAC__real *window, const FLAC__int32 L); - -#endif /* !defined FLAC__INTEGER_ONLY_LIBRARY */ - -#endif diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/all.h b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/all.h deleted file mode 100644 index 83efdfc5..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/all.h +++ /dev/null @@ -1,38 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2001,2002,2003,2004,2005,2006,2007 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. - */ - -#ifndef FLAC__PROTECTED__ALL_H -#define FLAC__PROTECTED__ALL_H - -#include "stream_decoder.h" -#include "stream_encoder.h" - -#endif diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/stream_decoder.h b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/stream_decoder.h deleted file mode 100644 index 81c36920..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/stream_decoder.h +++ /dev/null @@ -1,58 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 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. - */ - -#ifndef FLAC__PROTECTED__STREAM_DECODER_H -#define FLAC__PROTECTED__STREAM_DECODER_H - -#include "../../../stream_decoder.h" -#if FLAC__HAS_OGG -#include "include/private/ogg_decoder_aspect.h" -#endif - -typedef struct FLAC__StreamDecoderProtected { - FLAC__StreamDecoderState state; - 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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/stream_encoder.h b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/stream_encoder.h deleted file mode 100644 index 64dd457a..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/stream_encoder.h +++ /dev/null @@ -1,110 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2001,2002,2003,2004,2005,2006,2007 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. - */ - -#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_WELCH -} FLAC__ApodizationFunction; - -typedef struct { - FLAC__ApodizationFunction type; - union { - struct { - FLAC__real stddev; - } gauss; - struct { - FLAC__real p; - } 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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/lpc_flac.c b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/lpc_flac.c deleted file mode 100644 index 48273c0f..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/lpc_flac.c +++ /dev/null @@ -1,1377 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 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. - */ - -#if HAVE_CONFIG_H -# include -#endif - -#include -#include "../assert.h" -#include "../format.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 - -#ifndef FLAC__INTEGER_ONLY_LIBRARY - -#ifndef M_LN2 -/* math.h in VC++ doesn't seem to have this (how Microsoft is that?) */ -#define M_LN2 0.69314718055994530942 -#endif - -/* OPT: #undef'ing this may improve the speed on some architectures */ -#define FLAC__LPC_UNROLLED_FILTER_LOOPS - - -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, ref[FLAC__MAX_LPC_ORDER], 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]; - ref[i] = (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 #1601812 http://sourceforge.net/tracker/index.php?func=detail&aid=1601812&group_id=13478&atid=113478 */ - 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); -#if 1 /* unfortunately lround() is C99 */ - if(error >= 0.0) - q = (FLAC__int32)(error + 0.5); - else - q = (FLAC__int32)(error - 0.5); -#else - q = lround(error); -#endif -#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); -#if 1 /* unfortunately lround() is C99 */ - if(error >= 0.0) - q = (FLAC__int32)(error + 0.5); - else - q = (FLAC__int32)(error - 0.5); -#else - q = lround(error); -#endif -#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; -} - -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[]) -#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); -#if defined _MSC_VER - if(sumo > 2147483647I64 || sumo < -2147483648I64) - fprintf(stderr,"FLAC__lpc_compute_residual_from_qlp_coefficients: OVERFLOW, i=%u, j=%u, c=%d, d=%d, sumo=%I64d\n",i,j,qlp_coeff[j],*history,sumo); -#else - if(sumo > 2147483647ll || sumo < -2147483648ll) - fprintf(stderr,"FLAC__lpc_compute_residual_from_qlp_coefficients: OVERFLOW, i=%u, j=%u, c=%d, d=%d, sumo=%lld\n",i,j,qlp_coeff[j],*history,(long long)sumo); -#endif - } - *(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 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 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) { -#if defined _MSC_VER - fprintf(stderr,"FLAC__lpc_compute_residual_from_qlp_coefficients_wide: OVERFLOW, i=%u, sum=%I64d\n", i, sum >> lp_quantization); -#else - fprintf(stderr,"FLAC__lpc_compute_residual_from_qlp_coefficients_wide: OVERFLOW, i=%u, sum=%lld\n", i, (long long)(sum >> lp_quantization)); -#endif - break; - } - if(FLAC__bitmath_silog2_wide((FLAC__int64)(*data) - (sum >> lp_quantization)) > 32) { -#if defined _MSC_VER - fprintf(stderr,"FLAC__lpc_compute_residual_from_qlp_coefficients_wide: OVERFLOW, i=%u, data=%d, sum=%I64d, residual=%I64d\n", i, *data, sum >> lp_quantization, (FLAC__int64)(*data) - (sum >> lp_quantization)); -#else - fprintf(stderr,"FLAC__lpc_compute_residual_from_qlp_coefficients_wide: OVERFLOW, i=%u, data=%d, sum=%lld, residual=%lld\n", i, *data, (long long)(sum >> lp_quantization), (long long)((FLAC__int64)(*data) - (sum >> lp_quantization))); -#endif - 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 residual[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 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 defined _MSC_VER - if(sumo > 2147483647I64 || sumo < -2147483648I64) - fprintf(stderr,"FLAC__lpc_restore_signal: OVERFLOW, i=%u, j=%u, c=%d, d=%d, sumo=%I64d\n",i,j,qlp_coeff[j],*history,sumo); -#else - if(sumo > 2147483647ll || sumo < -2147483648ll) - fprintf(stderr,"FLAC__lpc_restore_signal: OVERFLOW, i=%u, j=%u, c=%d, d=%d, sumo=%lld\n",i,j,qlp_coeff[j],*history,(long long)sumo); -#endif - } - *(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 residual[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 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) { -#ifdef _MSC_VER - fprintf(stderr,"FLAC__lpc_restore_signal_wide: OVERFLOW, i=%u, sum=%I64d\n", i, sum >> lp_quantization); -#else - fprintf(stderr,"FLAC__lpc_restore_signal_wide: OVERFLOW, i=%u, sum=%lld\n", i, (long long)(sum >> lp_quantization)); -#endif - break; - } - if(FLAC__bitmath_silog2_wide((FLAC__int64)(*r) + (sum >> lp_quantization)) > 32) { -#ifdef _MSC_VER - fprintf(stderr,"FLAC__lpc_restore_signal_wide: OVERFLOW, i=%u, residual=%d, sum=%I64d, data=%I64d\n", i, *r, sum >> lp_quantization, (FLAC__int64)(*r) + (sum >> lp_quantization)); -#else - fprintf(stderr,"FLAC__lpc_restore_signal_wide: OVERFLOW, i=%u, residual=%d, sum=%lld, data=%lld\n", i, *r, (long long)(sum >> lp_quantization), (long long)((FLAC__int64)(*r) + (sum >> lp_quantization))); -#endif - 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 - -#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, index, 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(index = 0, order = 1; index < max_order; index++, order++) { - bits = FLAC__lpc_compute_expected_bits_per_residual_sample_with_error_scale(lpc_error[index], error_scale) * (FLAC__double)(total_samples - order) + (FLAC__double)(order * overhead_bits_per_order); - if(bits < best_bits) { - best_index = index; - best_bits = bits; - } - } - - return best_index+1; /* +1 since index of lpc_error[] is order-1 */ -} - -#endif /* !defined FLAC__INTEGER_ONLY_LIBRARY */ diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/md5.c b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/md5.c deleted file mode 100644 index 5cd8e15f..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/md5.c +++ /dev/null @@ -1,425 +0,0 @@ - -#if HAVE_CONFIG_H -# include -#endif - -#include /* for malloc() */ -#include /* for memcpy() */ - -#include "include/private/md5.h" -#include "../alloc.h" - -#ifndef FLaC__INLINE -#define FLaC__INLINE -#endif - -/* - * 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]) -{ - register 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) -{ - register 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) -{ - register 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 = 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); - //memset(ctx, 0, sizeof(ctx)); /* In case it's sensitive */ - if(0 != ctx->internal_buf) { - free(ctx->internal_buf); - ctx->internal_buf = 0; - ctx->capacity = 0; - } -} - -/* - * Convert the incoming audio signal to a byte stream - */ -static void format_input_(FLAC__byte *buf, const FLAC__int32 * const signal[], unsigned channels, unsigned samples, unsigned bytes_per_sample) -{ - unsigned channel, sample; - register FLAC__int32 a_word; - register FLAC__byte *buf_ = buf; - -#if WORDS_BIGENDIAN -#else - if(channels == 2 && bytes_per_sample == 2) { - FLAC__int16 *buf1_ = ((FLAC__int16*)buf_) + 1; - memcpy(buf_, signal[0], sizeof(FLAC__int32) * samples); - for(sample = 0; sample < samples; sample++, buf1_+=2) - *buf1_ = (FLAC__int16)signal[1][sample]; - } - else if(channels == 1 && bytes_per_sample == 2) { - FLAC__int16 *buf1_ = (FLAC__int16*)buf_; - for(sample = 0; sample < samples; sample++) - *buf1_++ = (FLAC__int16)signal[0][sample]; - } - else -#endif - if(bytes_per_sample == 2) { - if(channels == 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 = signal[1][sample]; - *buf_++ = (FLAC__byte)a_word; a_word >>= 8; - *buf_++ = (FLAC__byte)a_word; - } - } - else if(channels == 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; - } - } - else { - 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; - } - } - } - } - else if(bytes_per_sample == 3) { - if(channels == 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; - } - } - else if(channels == 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; - } - } - else { - 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; - } - } - } - } - else if(bytes_per_sample == 1) { - if(channels == 2) { - for(sample = 0; sample < samples; sample++) { - a_word = signal[0][sample]; - *buf_++ = (FLAC__byte)a_word; - a_word = signal[1][sample]; - *buf_++ = (FLAC__byte)a_word; - } - } - else if(channels == 1) { - for(sample = 0; sample < samples; sample++) { - a_word = signal[0][sample]; - *buf_++ = (FLAC__byte)a_word; - } - } - else { - for(sample = 0; sample < samples; sample++) { - for(channel = 0; channel < channels; channel++) { - a_word = signal[channel][sample]; - *buf_++ = (FLAC__byte)a_word; - } - } - } - } - else { /* bytes_per_sample == 4, maybe optimize more later */ - 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; a_word >>= 8; - *buf_++ = (FLAC__byte)a_word; - } - } - } -} - -/* - * 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, bytes_needed); - if(0 == tmp) { - free(ctx->internal_buf); - if(0 == (ctx->internal_buf = (FLAC__byte*)safe_malloc_(bytes_needed))) - return false; - } - ctx->internal_buf = tmp; - ctx->capacity = bytes_needed; - } - - format_input_(ctx->internal_buf, signal, channels, samples, bytes_per_sample); - - FLAC__MD5Update(ctx, ctx->internal_buf, bytes_needed); - - return true; -} diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/memory.c b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/memory.c deleted file mode 100644 index cf6adbd7..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/memory.c +++ /dev/null @@ -1,206 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2001,2002,2003,2004,2005,2006,2007 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. - */ - -#if HAVE_CONFIG_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, /*+*/31); -#ifdef SIZEOF_VOIDP -#if SIZEOF_VOIDP == 4 - /* could do *aligned_address = x + ((unsigned) (32 - (((unsigned)x) & 31))) & 31; */ - *aligned_address = (void*)(((unsigned)x + 31) & -32); -#elif SIZEOF_VOIDP == 8 - *aligned_address = (void*)(((FLAC__uint64)x + 31) & (FLAC__uint64)(-((FLAC__int64)32))); -#else -# error Unsupported sizeof(void*) -#endif -#else - /* there's got to be a better way to do this right for all archs */ - if(sizeof(void*) == sizeof(unsigned)) - *aligned_address = (void*)(((unsigned)x + 31) & -32); - else if(sizeof(void*) == sizeof(FLAC__uint64)) - *aligned_address = (void*)(((FLAC__uint64)x + 31) & (FLAC__uint64)(-((FLAC__int64)32))); - else - return 0; -#endif -#else - x = safe_malloc_(bytes); - *aligned_address = x; -#endif - return x; -} - -FLAC__bool FLAC__memory_alloc_aligned_int32_array(unsigned 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); - - pu = (FLAC__int32*)FLAC__memory_alloc_aligned(sizeof(*pu) * (size_t)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(unsigned 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); - - 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(unsigned 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); - - 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(unsigned 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); - - pu = (unsigned*)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(unsigned 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); - - 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 diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/stream_decoder.c b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/stream_decoder.c deleted file mode 100644 index 77f66f3a..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/stream_decoder.c +++ /dev/null @@ -1,3386 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 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. - */ - -#if HAVE_CONFIG_H -# include -#endif - -#if defined _MSC_VER || defined __MINGW32__ -#include /* for _setmode() */ -#include /* for _O_BINARY */ -#endif -#if defined __CYGWIN__ || defined __EMX__ -#include /* for setmode(), O_BINARY */ -#include /* for _O_BINARY */ -#endif -#include -#include /* for malloc() */ -#include /* for memset/memcpy() */ -#include /* for stat() */ -#include /* for off_t */ -#if defined _MSC_VER || defined __BORLANDC__ || defined __MINGW32__ -#if _MSC_VER <= 1700 || defined __BORLANDC__ /* @@@ [2G limit] */ -#define fseeko fseek -#define ftello ftell -#endif -#endif -#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" - -#ifdef max -#undef max -#endif -#define max(a,b) ((a)>(b)?(a):(b)) - -/* adjust for compilers that can't understand using LLU suffix for uint64_t literals */ -#ifdef _MSC_VER -#define FLAC__U64L(x) x -#else -#define FLAC__U64L(x) x##LLU -#endif - - -/* 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 FLAC__byte ID3V2_TAG_[3] = { 'I', 'D', '3' }; - -/*********************************************************************** - * - * Private class method prototypes - * - ***********************************************************************/ - -static void set_defaults_dec(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); -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_dec (const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data); -static FLAC__StreamDecoderSeekStatus file_seek_callback_dec (const FLAC__StreamDecoder *decoder, FLAC__uint64 absolute_byte_offset, void *client_data); -static FLAC__StreamDecoderTellStatus file_tell_callback_dec (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[]); - /* for use when the signal is <= 16 bits-per-sample, or <= 15 bits-per-sample on a side channel (which requires 1 extra bit), AND order <= 8: */ - void (*local_lpc_restore_signal_16bit_order8)(const FLAC__int32 residual[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 data[]); - FLAC__bool (*local_bitreader_read_rice_signed_block)(FLAC__BitReader *br, int* vals, unsigned nvals, unsigned parameter); - 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_dec(decoder); - - decoder->protected_->state = FLAC__STREAM_DECODER_UNINITIALIZED; - - return decoder; -} - -FLAC_API void FLAC__stream_decoder_delete(FLAC__StreamDecoder *decoder) -{ - unsigned i; - - FLAC__ASSERT(0 != decoder); - 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_dec( - 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_->state = FLAC__STREAM_DECODER_OGG_ERROR; -#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; - decoder->private_->local_lpc_restore_signal_16bit_order8 = FLAC__lpc_restore_signal; - decoder->private_->local_bitreader_read_rice_signed_block = FLAC__bitreader_read_rice_signed_block; - /* 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 -#if 1 /*@@@@@@ OPT: not clearly faster, needs more testing */ - if(decoder->private_->cpuinfo.data.ia32.bswap) - decoder->private_->local_bitreader_read_rice_signed_block = FLAC__bitreader_read_rice_signed_block_asm_ia32_bswap; -#endif - if(decoder->private_->cpuinfo.data.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; - decoder->private_->local_lpc_restore_signal_16bit_order8 = 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; - decoder->private_->local_lpc_restore_signal_16bit_order8 = FLAC__lpc_restore_signal_asm_ia32; - } -#endif -#elif defined FLAC__CPU_PPC - FLAC__ASSERT(decoder->private_->cpuinfo.type == FLAC__CPUINFO_TYPE_PPC); - if(decoder->private_->cpuinfo.data.ppc.altivec) { - decoder->private_->local_lpc_restore_signal_16bit = FLAC__lpc_restore_signal_asm_ppc_altivec_16; - decoder->private_->local_lpc_restore_signal_16bit_order8 = FLAC__lpc_restore_signal_asm_ppc_altivec_16_order8; - } -#endif - } -#endif - - /* from here on, errors are fatal */ - - if(!FLAC__bitreader_init(decoder->private_->input, decoder->private_->cpuinfo, 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_dec( - 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_dec( - decoder, - read_callback, - seek_callback, - tell_callback, - length_callback, - eof_callback, - write_callback, - metadata_callback, - error_callback, - client_data, - /*is_ogg=*/true - ); -} - -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 (FLAC__StreamDecoderInitStatus) (decoder->protected_->state = (FLAC__StreamDecoderState) FLAC__STREAM_DECODER_INIT_STATUS_ALREADY_INITIALIZED); - - if(0 == write_callback || 0 == error_callback) - return (FLAC__StreamDecoderInitStatus) (decoder->protected_->state = (FLAC__StreamDecoderState) 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_dec( - decoder, - file_read_callback_dec, - decoder->private_->file == stdin? 0: file_seek_callback_dec, - decoder->private_->file == stdin? 0: file_tell_callback_dec, - 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 (FLAC__StreamDecoderInitStatus) (decoder->protected_->state = (FLAC__StreamDecoderState) FLAC__STREAM_DECODER_INIT_STATUS_ALREADY_INITIALIZED); - - if(0 == write_callback || 0 == error_callback) - return (FLAC__StreamDecoderInitStatus) (decoder->protected_->state = (FLAC__StreamDecoderState) FLAC__STREAM_DECODER_INIT_STATUS_INVALID_CALLBACKS); - - file = filename? 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); -} - -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__seekable_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_dec(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_dec(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 -} - -/* - * 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; -} - -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; - - /* WATCHOUT: - * minimum of quadword alignment for PPC vector optimizations is REQUIRED: - */ - 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(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 >> 2 == 0x3e) { /* MAGIC NUMBER for the last 6 sync bits */ - 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; - - 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 { - 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)) - return 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; - return false; - } - if(!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, block.data.application.data, real_length)) - return 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)) - return false; - break; - case FLAC__METADATA_TYPE_CUESHEET: - if(!read_metadata_cuesheet_(decoder, &block.data.cue_sheet)) - return false; - break; - case FLAC__METADATA_TYPE_PICTURE: - if(!read_metadata_picture_(decoder, &block.data.picture)) - return 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; - return false; - } - if(!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, block.data.unknown.data, real_length)) - return false; /* read_callback_ sets the state for us */ - } - else - block.data.unknown.data = 0; - break; - } - if(!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(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) -{ - FLAC__uint32 i; - - FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)); - - /* read vendor string */ - 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(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_(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(!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(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; - } - - 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 *index = &track->indices[j]; - if(!FLAC__bitreader_read_raw_uint64(decoder->private_->input, &index->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 */ - index->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 >> 2 == 0x3e) { /* MAGIC NUMBER for the last 6 sync bits */ - 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) { - if(order <= 8) - decoder->private_->local_lpc_restore_signal_16bit_order8(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_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; - return true; - } - } - 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; - return true; - } - } - - if(!FLAC__format_entropy_coding_method_partitioned_rice_contents_ensure_size(partitioned_rice_contents, max(6, 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(!decoder->private_->local_bitreader_read_rice_signed_block(decoder->private_->input, (int*) 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, (FLAC__int32*) &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); - } - } - - return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE; - } - - /* - * 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 -#if defined _MSC_VER || defined __MINGW32__ - /* with VC++ you have to spoon feed it the casting */ - pos = (FLAC__int64)lower_bound + (FLAC__int64)((FLAC__double)(FLAC__int64)(target_sample - lower_bound_sample) / (FLAC__double)(FLAC__int64)(upper_bound_sample - lower_bound_sample) * (FLAC__double)(FLAC__int64)(upper_bound - lower_bound)) - approx_bytes_per_frame; -#else - 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; -#endif -#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 -#if defined _MSC_VER || defined __MINGW32__ - /* with MSVC you have to spoon feed it the casting */ - pos = (FLAC__uint64)((FLAC__double)(FLAC__int64)(target_sample - left_sample) / (FLAC__double)(FLAC__int64)(right_sample - left_sample) * (FLAC__double)(FLAC__int64)(right_pos - left_pos)); -#else - pos = (FLAC__uint64)((FLAC__double)(target_sample - left_sample) / (FLAC__double)(right_sample - left_sample) * (FLAC__double)(right_pos - left_pos)); -#endif -#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 - -FLAC__StreamDecoderReadStatus file_read_callback_dec(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_dec(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, (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_dec(const FLAC__StreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, void *client_data) -{ - 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 stat filestats; - (void)client_data; - - if(decoder->private_->file == stdin) - return FLAC__STREAM_DECODER_LENGTH_STATUS_UNSUPPORTED; - else if(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; -} diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/stream_encoder.c b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/stream_encoder.c deleted file mode 100644 index e592d1eb..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/stream_encoder.c +++ /dev/null @@ -1,4364 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 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. - */ - -#if HAVE_CONFIG_H -# include -#endif - -#if defined _MSC_VER || defined __MINGW32__ -#include /* for _setmode() */ -#include /* for _O_BINARY */ -#endif -#if defined __CYGWIN__ || defined __EMX__ -#include /* for setmode(), O_BINARY */ -#include /* for _O_BINARY */ -#endif -#include -#include -#include /* for malloc() */ -#include /* for memcpy() */ -#include /* for off_t */ -#if defined _MSC_VER || defined __BORLANDC__ || defined __MINGW32__ -#if _MSC_VER <= 1700 || defined __BORLANDC__ /* @@@ [2G limit] */ -#define fseeko fseek -#define ftello ftell -#endif -#endif -#include "../assert.h" -#include "../alloc.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_framing.h" -#include "include/private/window.h" - -#ifndef FLaC__INLINE -#define FLaC__INLINE -#endif - -#ifdef min -#undef min -#endif -#define min(x,y) ((x)<(y)?(x):(y)) - -#ifdef max -#undef max -#endif -#define max(x,y) ((x)>(y)?(x):(y)) - -/* 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; -} compression_levels_[] = { - { false, false, 0, 0, false, false, false, 0, 3, 0 }, - { true , true , 0, 0, false, false, false, 0, 3, 0 }, - { true , false, 0, 0, false, false, false, 0, 3, 0 }, - { false, false, 6, 0, false, false, false, 0, 4, 0 }, - { true , true , 8, 0, false, false, false, 0, 4, 0 }, - { true , false, 8, 0, false, false, false, 0, 5, 0 }, - { true , false, 8, 0, false, false, false, 0, 6, 0 }, - { true , false, 8, 0, false, false, true , 0, 6, 0 }, - { true , false, 12, 0, false, false, true , 0, 6, 0 } -}; - - -/*********************************************************************** - * - * Private class method prototypes - * - ***********************************************************************/ - -static void set_defaults_enc(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_enc(const FLAC__StreamEncoder *encoder, FLAC__byte buffer[], size_t *bytes, void *client_data); -static FLAC__StreamEncoderSeekStatus file_seek_callback_enc(const FLAC__StreamEncoder *encoder, FLAC__uint64 absolute_byte_offset, void *client_data); -static FLAC__StreamEncoderTellStatus file_tell_callback_enc(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; -#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]); -#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]); -#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__treamEncoderReadStatusString[] = { - "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_enc(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; - - FLAC__ASSERT(0 != encoder); - 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_enc( - 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 = 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( - encoder->protected_->blocksize != 192 && - encoder->protected_->blocksize != 576 && - encoder->protected_->blocksize != 1152 && - encoder->protected_->blocksize != 2304 && - encoder->protected_->blocksize != 4608 && - encoder->protected_->blocksize != 256 && - encoder->protected_->blocksize != 512 && - encoder->protected_->blocksize != 1024 && - encoder->protected_->blocksize != 2048 && - encoder->protected_->blocksize != 4096 && - encoder->protected_->blocksize != 8192 && - encoder->protected_->blocksize != 16384 - ) - 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 i; - for(i = 1; i < encoder->protected_->num_metadata_blocks; i++) { - if(0 != encoder->protected_->metadata[i] && encoder->protected_->metadata[i]->type == FLAC__METADATA_TYPE_VORBIS_COMMENT) { - FLAC__StreamMetadata *vc = encoder->protected_->metadata[i]; - for( ; i > 0; i--) - encoder->protected_->metadata[i] = encoder->protected_->metadata[i-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 i; - for(i = 0; i < encoder->protected_->num_metadata_blocks; i++) { - if(0 != encoder->protected_->metadata[i] && encoder->protected_->metadata[i]->type == FLAC__METADATA_TYPE_SEEKTABLE) { - encoder->private_->seek_table = &encoder->protected_->metadata[i]->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(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_fixed_compute_best_predictor = FLAC__fixed_compute_best_predictor; -#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.data.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 - encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_asm_ia32; - } - else if(encoder->private_->cpuinfo.data.ia32._3dnow) - encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_asm_ia32_3dnow; - else - encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_asm_ia32; - if(encoder->private_->cpuinfo.data.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.data.ia32.mmx && encoder->private_->cpuinfo.data.ia32.cmov) - encoder->private_->local_fixed_compute_best_predictor = FLAC__fixed_compute_best_predictor_asm_ia32_mmx_cmov; -# endif /* FLAC__HAS_NASM */ -# endif /* FLAC__CPU_IA32 */ - } -# endif /* !FLAC__NO_ASM */ -#endif /* !FLAC__INTEGER_ONLY_LIBRARY */ - /* finally override based on wide-ness if necessary */ - if(encoder->private_->use_wide_by_block) { - encoder->private_->local_fixed_compute_best_predictor = FLAC__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_(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 - */ - 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_enc( - 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_enc( - encoder, - read_callback, - write_callback, - seek_callback, - tell_callback, - metadata_callback, - client_data, - /*is_ogg=*/true - ); -} - -static FLAC__StreamEncoderInitStatus init_FILE_internal_enc( - 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 */ - - 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_enc( - encoder, - encoder->private_->file == stdout? 0 : is_ogg? file_read_callback_enc : 0, - file_write_callback_, - encoder->private_->file == stdout? 0 : file_seek_callback_enc, - encoder->private_->file == stdout? 0 : file_tell_callback_enc, - /*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_enc(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_enc(encoder, file, progress_callback, client_data, /*is_ogg=*/true); -} - -static FLAC__StreamEncoderInitStatus init_file_internal_enc( - 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? 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_enc(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_enc(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_enc(encoder, filename, progress_callback, client_data, /*is_ogg=*/true); -} - -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_enc(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_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 0 - /* was: */ - ok &= FLAC__stream_encoder_set_apodization (encoder, compression_levels_[value].apodization); - /* but it's too hard to specify the string in a locale-specific way */ -#else - 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==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_(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_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_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_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_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 = 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, 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, 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_enc(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 -} - -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() - * requires 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_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 = min(bytes, encoder->private_->streaminfo.data.stream_info.min_framesize); - encoder->private_->streaminfo.data.stream_info.max_framesize = max(bytes, 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; - - /* 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 = 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[max(6, 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[max(6, 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 = min(max_partition_order, encoder->protected_->max_residual_partition_order); - } - min_partition_order = 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 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 ensure a 32-bit datapath throughout for 16bps(+1bps for side channel) or less */ - if(subframe_bps <= 17) { - max_qlp_coeff_precision = min(32 - subframe_bps - lpc_order, FLAC__MAX_QLP_COEFF_PRECISION); - max_qlp_coeff_precision = 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]; - 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 = 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 = min(min_partition_order, max_partition_order); - - 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, max(6, 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; -} - -#if defined(FLAC__CPU_IA32) && !defined FLAC__NO_ASM && defined FLAC__HAS_NASM -extern void precompute_partition_info_sums_32bit_asm_ia32_( - const FLAC__int32 residual[], - FLAC__uint64 abs_residual_partition_sums[], - unsigned blocksize, - unsigned predictor_order, - unsigned min_partition_order, - unsigned max_partition_order -); -#endif - -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); - -#if defined(FLAC__CPU_IA32) && !defined FLAC__NO_ASM && defined FLAC__HAS_NASM - /* slightly pessimistic but still catches all common cases */ - /* WATCHOUT: "+ bps" is an assumption that the average residual magnitude will not be more than "bps" bits */ - if(FLAC__bitmath_ilog2(default_partition_samples) + bps < 32) { - precompute_partition_info_sums_32bit_asm_ia32_(residual, abs_residual_partition_sums, residual_samples + predictor_order, predictor_order, min_partition_order, max_partition_order); - return; - } -#endif - - /* first do max_partition_order */ - { - unsigned partition, residual_sample, end = (unsigned)(-(int)predictor_order); - /* slightly pessimistic but still catches all common cases */ - /* WATCHOUT: "+ bps" is an assumption that the average residual magnitude will not be more than "bps" bits */ - if(FLAC__bitmath_ilog2(default_partition_samples) + 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] = max(m, raw_bits_per_partition[from_partition]); - from_partition++; - to_partition++; - } - } -} - -#ifdef EXACT_RICE_BITS_CALCULATION -static FLaC__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 FLaC__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, max(6, 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 - */ - for(rice_parameter = 0, k = partition_samples; k < mean; rice_parameter++, k <<= 1) - ; - 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; -} - -FLAC__StreamEncoderReadStatus file_read_callback_enc(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_enc(const FLAC__StreamEncoder *encoder, FLAC__uint64 absolute_byte_offset, void *client_data) -{ - (void)client_data; - - if(fseeko(encoder->private_->file, (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_enc(const FLAC__StreamEncoder *encoder, FLAC__uint64 *absolute_byte_offset, void *client_data) -{ - 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; -} diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/stream_encoder_framing.c b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/stream_encoder_framing.c deleted file mode 100644 index 82d3b352..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/stream_encoder_framing.c +++ /dev/null @@ -1,553 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 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. - */ - -#if HAVE_CONFIG_H -# include -#endif - -#include -#include /* for strlen() */ -#include "include/private/stream_encoder_framing.h" -#include "include/private/crc.h" -#include "../assert.h" - -#ifdef max -#undef max -#endif -#define max(x,y) ((x)>(y)?(x):(y)) - -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 *index = track->indices + j; - - if(!FLAC__bitwriter_write_raw_uint64(bw, index->offset, FLAC__STREAM_METADATA_CUESHEET_INDEX_OFFSET_LEN)) - return false; - if(!FLAC__bitwriter_write_raw_uint32(bw, index->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 - -#ifndef M_PI -/* math.h in VC++ doesn't seem to have this (how Microsoft is that?) */ -#define M_PI 3.14159265358979323846 -#endif - - -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-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+0.5f))); -} - -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; - for (; n <= L; n++) - window[n-1] = ((float)(2 * (L - n)) + 1.0f) / (float)L; - } -} - -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_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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/metadata.h b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/metadata.h deleted file mode 100644 index 19c3b0fe..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/metadata.h +++ /dev/null @@ -1,2181 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2001,2002,2003,2004,2005,2006,2007 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. - */ - -#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) - * \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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/ordinals.h b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/ordinals.h deleted file mode 100644 index b3ea5928..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/ordinals.h +++ /dev/null @@ -1,80 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 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. - */ - -#ifndef FLAC__ORDINALS_H -#define FLAC__ORDINALS_H - -#if !(defined(_MSC_VER) || defined(__BORLANDC__) || defined(__EMX__)) -#include -#endif - -typedef signed char FLAC__int8; -typedef unsigned char FLAC__uint8; - -#if defined(_MSC_VER) || defined(__BORLANDC__) -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; -#elif defined(__EMX__) -typedef short FLAC__int16; -typedef long FLAC__int32; -typedef long long FLAC__int64; -typedef unsigned short FLAC__uint16; -typedef unsigned long FLAC__uint32; -typedef unsigned long long FLAC__uint64; -#else -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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/stream_decoder.h b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/stream_decoder.h deleted file mode 100644 index 5818fdd3..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/stream_decoder.h +++ /dev/null @@ -1,1559 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 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. - */ - -#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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/stream_encoder.h b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/stream_encoder.h deleted file mode 100644 index 7dcf7ed9..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/stream_encoder.h +++ /dev/null @@ -1,1768 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 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. - */ - -#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: - * - * - * - * - * - * - * - * - * - * - * - * - *
level - * do mid-side stereo - * loose mid-side stereo - * apodization - * max lpc order - * qlp coeff precision - * qlp coeff prec search - * escape coding - * exhaustive model search - * min residual partition order - * max residual partition order - * rice 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) 8 0 false false false 0 6 0
7 true false tukey(0.5) 8 0 false false true 0 6 0
8 true false tukey(0.5) 12 0 false false true 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 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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_AiffAudioFormat.cpp b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_AiffAudioFormat.cpp deleted file mode 100644 index 636bc60e..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_AiffAudioFormat.cpp +++ /dev/null @@ -1,719 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -//============================================================================== -static const char* const aiffFormatName = "AIFF file"; -static const char* const aiffExtensions[] = { ".aiff", ".aif", 0 }; - -//============================================================================== -namespace AiffFileHelpers -{ - inline int chunkName (const char* const name) { return (int) ByteOrder::littleEndianInt (name); } - - #if JUCE_MSVC - #pragma pack (push, 1) - #define PACKED - #elif JUCE_GCC - #define PACKED __attribute__((packed)) - #else - #define PACKED - #endif - - //============================================================================== - struct InstChunk - { - struct Loop - { - uint16 type; // these are different in AIFF and WAV - uint16 startIdentifier; - uint16 endIdentifier; - } 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 void create (MemoryBlock& block, const StringPairArray& values) - { - if (values.getAllKeys().contains ("MidiUnityNote", true)) - { - block.setSize ((sizeof (InstChunk) + 3) & ~(size_t) 3, true); - InstChunk* const inst = static_cast (block.getData()); - - inst->baseNote = (int8) values.getValue ("MidiUnityNote", "60").getIntValue(); - inst->detune = (int8) values.getValue ("Detune", "0").getIntValue(); - inst->lowNote = (int8) values.getValue ("LowNote", "0").getIntValue(); - inst->highNote = (int8) values.getValue ("HighNote", "127").getIntValue(); - inst->lowVelocity = (int8) values.getValue ("LowVelocity", "1").getIntValue(); - inst->highVelocity = (int8) values.getValue ("HighVelocity", "127").getIntValue(); - inst->gain = (int16) ByteOrder::swapIfLittleEndian ((uint16) values.getValue ("Gain", "0").getIntValue()); - - inst->sustainLoop.type = ByteOrder::swapIfLittleEndian ((uint16) values.getValue ("Loop0Type", "0").getIntValue()); - inst->sustainLoop.startIdentifier = ByteOrder::swapIfLittleEndian ((uint16) values.getValue ("Loop0StartIdentifier", "0").getIntValue()); - inst->sustainLoop.endIdentifier = ByteOrder::swapIfLittleEndian ((uint16) values.getValue ("Loop0EndIdentifier", "0").getIntValue()); - inst->releaseLoop.type = ByteOrder::swapIfLittleEndian ((uint16) values.getValue ("Loop1Type", "0").getIntValue()); - inst->releaseLoop.startIdentifier = ByteOrder::swapIfLittleEndian ((uint16) values.getValue ("Loop1StartIdentifier", "0").getIntValue()); - inst->releaseLoop.endIdentifier = ByteOrder::swapIfLittleEndian ((uint16) values.getValue ("Loop1EndIdentifier", "0").getIntValue()); - } - } - - } PACKED; - - #if JUCE_MSVC - #pragma pack (pop) - #endif - - #undef PACKED - - //============================================================================== - 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 int labelLength = jmin (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::empty)); - out.write (comment.toUTF8(), jmin (comment.getNumBytesAsUTF8(), 65534)); - out.writeByte (0); - - if ((out.getDataSize() & 1) != 0) - out.writeByte (0); - } - } - } - } -} - -//============================================================================== -class AiffAudioFormatReader : public AudioFormatReader -{ -public: - AiffAudioFormatReader (InputStream* in) - : AudioFormatReader (in, TRANS (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 - { - 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 ((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) - { - const int64 samplesAvailable = lengthInSamples - 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; - } - - 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)); - } - - jassert (! usesFloatingPointData); // (would need to add support for this if it's possible) - - if (littleEndian) - { - switch (bitsPerSample) - { - case 8: ReadHelper::read (destSamples, startOffsetInDestBuffer, numDestChannels, tempBuffer, (int) numChannels, numThisTime); break; - case 16: ReadHelper::read (destSamples, startOffsetInDestBuffer, numDestChannels, tempBuffer, (int) numChannels, numThisTime); break; - case 24: ReadHelper::read (destSamples, startOffsetInDestBuffer, numDestChannels, tempBuffer, (int) numChannels, numThisTime); break; - case 32: ReadHelper::read (destSamples, startOffsetInDestBuffer, numDestChannels, tempBuffer, (int) numChannels, numThisTime); break; - default: jassertfalse; break; - } - } - else - { - switch (bitsPerSample) - { - case 8: ReadHelper::read (destSamples, startOffsetInDestBuffer, numDestChannels, tempBuffer, (int) numChannels, numThisTime); break; - case 16: ReadHelper::read (destSamples, startOffsetInDestBuffer, numDestChannels, tempBuffer, (int) numChannels, numThisTime); break; - case 24: ReadHelper::read (destSamples, startOffsetInDestBuffer, numDestChannels, tempBuffer, (int) numChannels, numThisTime); break; - case 32: ReadHelper::read (destSamples, startOffsetInDestBuffer, numDestChannels, tempBuffer, (int) numChannels, numThisTime); break; - default: jassertfalse; break; - } - } - - startOffsetInDestBuffer += numThisTime; - numSamples -= numThisTime; - } - - return true; - } - - int bytesPerFrame; - int64 dataChunkStart; - bool littleEndian; - -private: - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AiffAudioFormatReader); -}; - -//============================================================================== -class AiffAudioFormatWriter : public AudioFormatWriter -{ -public: - AiffAudioFormatWriter (OutputStream* out, double sampleRate_, - unsigned int numChans, unsigned int bits, - const StringPairArray& metadataValues) - : AudioFormatWriter (out, TRANS (aiffFormatName), sampleRate_, 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) - { - 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(), (int) 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); -}; - -//============================================================================== -AiffAudioFormat::AiffAudioFormat() - : AudioFormat (TRANS (aiffFormatName), StringArray (aiffExtensions)) -{ -} - -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(); - return type == 'AIFF' || type == 'AIFC' - || type == 'aiff' || type == 'aifc'; -} -#endif - -AudioFormatReader* AiffAudioFormat::createReaderFor (InputStream* sourceStream, const bool deleteStreamIfOpeningFails) -{ - ScopedPointer w (new AiffAudioFormatReader (sourceStream)); - - if (w->sampleRate > 0) - return w.release(); - - if (! deleteStreamIfOpeningFails) - w->input = nullptr; - - 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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_AiffAudioFormat.h b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_AiffAudioFormat.h deleted file mode 100644 index cf317e34..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_AiffAudioFormat.h +++ /dev/null @@ -1,66 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce 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(); - - //============================================================================== - Array getPossibleSampleRates(); - Array getPossibleBitDepths(); - bool canDoStereo(); - bool canDoMono(); - - #if JUCE_MAC - bool canHandleFile (const File& fileToTest); - #endif - - //============================================================================== - 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(AiffAudioFormat); -}; diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_CoreAudioFormat.cpp b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_CoreAudioFormat.cpp deleted file mode 100644 index e5e38266..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_CoreAudioFormat.cpp +++ /dev/null @@ -1,261 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#if JUCE_MAC || JUCE_IOS - -//============================================================================== -namespace -{ - const char* const coreAudioFormatName = "CoreAudio supported file"; - - StringArray findFileExtensionsForCoreAudioCodecs() - { - StringArray extensionsArray; - CFMutableArrayRef extensions = CFArrayCreateMutable (0, 0, 0); - UInt32 sizeOfArray = sizeof (CFMutableArrayRef); - - 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; - } -} - -//============================================================================== -class CoreAudioReader : public AudioFormatReader -{ -public: - CoreAudioReader (InputStream* const inp) - : AudioFormatReader (inp, TRANS (coreAudioFormatName)), - ok (false), lastReadPosition (0) - { - usesFloatingPointData = true; - - OSStatus status = AudioFileOpenWithCallbacks (this, - &readCallback, - 0, // write needs to be null to avoid permisisions errors - &getSizeCallback, - 0, // 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; - bitsPerSample = sourceAudioFormat.mBitsPerChannel; - - 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) - { - jassert (destSamples != nullptr); - const int64 samplesAvailable = lengthInSamples - 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; - } - - 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 (TRANS (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* streamToWriteTo, - double sampleRateToUse, - unsigned int numberOfChannels, - int bitsPerSample, - const StringPairArray& metadataValues, - int qualityOptionIndex) -{ - jassertfalse; // not yet implemented! - return nullptr; -} - -#endif diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_CoreAudioFormat.h b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_CoreAudioFormat.h deleted file mode 100644 index dc6b7361..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_CoreAudioFormat.h +++ /dev/null @@ -1,68 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#if JUCE_MAC || JUCE_IOS - -//============================================================================== -/** - 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(); - - //============================================================================== - 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 (CoreAudioFormat); -}; - -#endif diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_FlacAudioFormat.cpp b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_FlacAudioFormat.cpp deleted file mode 100644 index dbf0e50e..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_FlacAudioFormat.cpp +++ /dev/null @@ -1,536 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce 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 - - #define __STDC_LIMIT_MACROS 1 - #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 -} - -#undef max -#undef min - -//============================================================================== -static const char* const flacFormatName = "FLAC file"; -static const char* const flacExtensions[] = { ".flac", 0 }; - - -//============================================================================== -class FlacReader : public AudioFormatReader -{ -public: - //============================================================================== - FlacReader (InputStream* const in) - : AudioFormatReader (in, TRANS (flacFormatName)), - reservoir (2, 0), - 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) - { - 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.getSampleData (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.getSampleData(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 sampleRate_, - uint32 numChannels_, uint32 bitsPerSample_, int qualityOptionIndex) - : AudioFormatWriter (out, TRANS (flacFormatName), - sampleRate_, numChannels_, bitsPerSample_) - { - 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) - { - 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, (size_t) numSamples) != 0; - } - - bool writeData (const void* const data, const int size) const - { - return output->write (data, 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 (TRANS (flacFormatName), StringArray (flacExtensions)) -{ -} - -FlacAudioFormat::~FlacAudioFormat() -{ -} - -Array FlacAudioFormat::getPossibleSampleRates() -{ - const int rates[] = { 22050, 32000, 44100, 48000, 88200, 96000, 176400, 192000, 352800, 384000, 0 }; - return Array (rates); -} - -Array FlacAudioFormat::getPossibleBitDepths() -{ - const int depths[] = { 16, 24, 0 }; - return Array (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() -{ - const char* options[] = { "0 (Fastest)", "1", "2", "3", "4", "5 (Default)","6", "7", "8 (Highest quality)", 0 }; - return StringArray (options); -} - -#endif diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_FlacAudioFormat.h b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_FlacAudioFormat.h deleted file mode 100644 index 6535db1a..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_FlacAudioFormat.h +++ /dev/null @@ -1,66 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce 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(); - Array getPossibleBitDepths(); - bool canDoStereo(); - bool canDoMono(); - bool isCompressed(); - StringArray getQualityOptions(); - - //============================================================================== - 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 (FlacAudioFormat); -}; - - -#endif diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_MP3AudioFormat.cpp b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_MP3AudioFormat.cpp deleted file mode 100644 index 810d2664..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_MP3AudioFormat.cpp +++ /dev/null @@ -1,3148 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce 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 = ByteOrder::bigEndianInt (data); - data += 4; - } - - headersize = ((type + 1) * 72000 * bitrate) / sampleRate; - return true; - } - - uint8 toc[100]; - int sampleRate, flags, frames, bytes, vbrScale, headersize; - -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)) : (((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 } } - }; - - 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 int index) const noexcept - { - switch (d1) - { - case 3: return &group3tab [3 * jmin (index, 3 * 3 * 3)]; - case 5: return &group5tab [3 * jmin (index, 5 * 5 * 5)]; - case 9: return &group9tab [3 * jmin (index, 9 * 9 * 9)]; - 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 * 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] = pow (2.0, -0.25 * (i + 210)); - - for (i = 0; i < 8207; ++i) - nToThe4Over3[i] = 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] = 1.0 / sq; - antiAliasingCa[i] = Ci[i] / sq; - } - - for (i = 0; i < 18; ++i) - { - win[0][i] = win[1][i] = 0.5 * sin (double_Pi / 72.0 * (2 * i + 1)) / cos (double_Pi * (2 * i + 19) / 72.0); - win[0][i + 18] = win[3][i + 18] = 0.5 * sin (double_Pi / 72.0 * (2 * (i + 18) + 1)) / cos (double_Pi * (2 * (i + 18) + 19) / 72.0); - } - - const double piOver72 = double_Pi; - - for (i = 0; i < 6; ++i) - { - win[1][i + 18] = 0.5 / cos (piOver72 * (2 * (i + 18) + 19)); - win[3][i + 12] = 0.5 / cos (piOver72 * (2 * (i + 12) + 19)); - win[1][i + 24] = 0.5 * sin (double_Pi / 24.0 * (2 * i + 13)) / cos (piOver72 * (2 * (i + 24) + 19)); - win[1][i + 30] = win[3][i] = 0; - win[3][i + 6] = 0.5 * sin (double_Pi / 24.0 * (2 * i + 1)) / cos (piOver72 * (2 * (i + 6) + 19)); - } - - for (i = 0; i < 12; ++i) - win[2][i] = 0.5 * sin (double_Pi / 24.0 * (2 * i + 1)) / 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 = tan (i * double_Pi / 12.0); - tan1_1[i] = t / (1.0 + t); - tan2_1[i] = 1.0 / (1.0 + t); - tan1_2[i] = sqrt2 * t / (1.0 + t); - tan2_2[i] = 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] = p1; - pow2_1[j][i] = p2; - pow1_2[j][i] = sqrt2 * p1; - pow2_2[j][i] = 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] = 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] = 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] = i | (j << 3) | (5 << 12); - nLength2[n + 500] = 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] = 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] = 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 = 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 (int lwin = 0; lwin < 3; ++lwin) - { - int 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]; - int index = 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]; - int index = 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 (int 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 (int 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]); - } - - 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; - } - }; - - 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]; - } - } - - 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]; - } - - 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 (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 == -1) - 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); - if (nextFrameOffset < 0) - 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; - else 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 = *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 int lsf = mpeg25 ? 1 : ((header & (1 << 19)) ? 0 : 1); - const int sampleRateIndex = mpeg25 ? (6 + ((header >> 10) & 3)) : (((header >> 10) & 3) + (lsf * 3)); - const int mode = (header >> 6) & 3; - const int numChannels = (mode == 3) ? 1 : 2; - - if (numChannels == frame.numChannels && lsf == frame.lsf - && mpeg25 == frame.mpeg25 && sampleRateIndex == 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 = 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 * 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 = ((-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]; - int i; - - if (frame.numChannels == 2) - { - for (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 (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 (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 (i = 0; i < sblimit; ++i) - { - const int16 step = allocTable->bits; - allocTable += (1 << step); - si.allocation[i][0] = getBitsUint8 (step); - } - - for (i = 0; i < sblimit; ++i) - scfsi[i][0] = si.allocation[i][0] ? getBitsUint8 (2) : 0; - } - - for (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; - int i; - - for (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) ((getBits (k) + d1) * cm); - fraction[ch][1][i] = (float) ((getBits (k) + d1) * cm); - fraction[ch][2][i] = (float) ((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 (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 = getBits (k); - const int v1 = getBits (k); - const int v2 = 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 (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 = 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 (288, (int) getBitsUnchecked (9)); - - const int qss = 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 int 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 = getBitsUnchecked (4); - const int r1c = getBitsUnchecked (3); - const int region0index = jmin (22, r0c + 1); - const int region1index = jmin (22, r0c + 1 + r1c + 1); - - granule.region1Start = bandInfo[sampleRate].longIndex[region0index] >> 1; - granule.region2Start = 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 (288, (int) 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 = getBitsUnchecked (4); - const int r1c = getBitsUnchecked (3); - const int region0index = jmin (22, r0c + 1); - const int region1index = jmin (22, r0c + 1 + r1c + 1); - - granule.region1Start = bandInfo[sampleRate].longIndex[region0index] >> 1; - granule.region2Start = 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++ = getBitsUnchecked (num0); - numBits -= num0; - i = 9; - } - - for (; --i >= 0;) *scf++ = getBitsUnchecked (num0); - for (i = 18; --i >= 0;) *scf++ = getBitsUnchecked (num1); - - *scf++ = 0; - *scf++ = 0; - *scf++ = 0; - } - else - { - const int scfsi = granule.scfsi; - - if (scfsi < 0) - { - for (int i = 11; --i >= 0;) *scf++ = getBitsUnchecked (num0); - for (int j = 10; --j >= 0;) *scf++ = getBitsUnchecked (num1); - numBits = (num0 + num1) * 10 + num0; - } - else - { - numBits = 0; - if ((scfsi & 8) == 0) - { - for (int i = 6; --i >= 0;) *scf++ = getBitsUnchecked (num0); - numBits += num0 * 6; - } - else - scf += 6; - - if ((scfsi & 4) == 0) - { - for (int i = 5; --i >= 0;) *scf++ = getBitsUnchecked (num0); - numBits += num0 * 5; - } - else - scf += 5; - - if ((scfsi & 2) == 0) - { - for (int i = 5; --i >= 0;) *scf++ = getBitsUnchecked (num1); - numBits += num1 * 5; - } - else - scf += 5; - - if ((scfsi & 1) == 0) - { - for (int i = 5; --i >= 0;) *scf++ = 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++ = 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 int shift = 1 + granule.scaleFactorScale; - float* xrpnt = (float*) xr; - int i, part2remain = granule.part2_3Length - part2bits; - - zeromem (xrpnt, sizeof (float) * (&xr[32][0] - xrpnt)); - - const int bv = granule.bigValues; - const int region1 = granule.region1Start; - const int region2 = 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 (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 (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 (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] = max[0] + 1; - granule.maxBand[1] = max[1] + 1; - granule.maxBand[2] = max[2] + 1; - granule.maxBandl = max[3] + 1; - - const int rmax = jmax (max[0], max[1], max[3]) + 1; - granule.maxb = rmax ? constants.shortLimit[sampleRate][rmax] - : 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 i, max = -1, cb = 0, mc = 0; - int* map = constants.map [sampleRate][2]; - float v = 0; - - for (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 (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) * (&xr[32][0] - xrpnt)); - - granule.maxBandl = max + 1; - granule.maxb = 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; - } - - int 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"; -static const char* const mp3Extensions[] = { ".mp3", nullptr }; - -//============================================================================== -class MP3Reader : public AudioFormatReader -{ -public: - MP3Reader (InputStream* const in) - : AudioFormatReader (in, TRANS (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 = stream.frame.numChannels; - lengthInSamples = findLength (streamPos); - } - } - - //============================================================================== - bool readSamples (int** destSamples, int numDestChannels, int startOffsetInDestBuffer, - int64 startSampleInFile, int numSamples) - { - jassert (destSamples != nullptr); - - if (currentPosition != startSampleInFile) - { - if (! stream.seek (startSampleInFile / 1152 - 1)) - { - currentPosition = -1; - createEmptyDecodedData(); - } - else - { - decodedStart = decodedEnd = 0; - const int64 streamPos = stream.currentFrameIndex * 1152; - int toSkip = 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 = 2; --i >= 0;) - if (destSamples[i] != nullptr) - zeromem (destSamples[i] + startOffsetInDestBuffer, sizeof (float) * 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) * numToCopy); - - if (dst[1] != nullptr) - memcpy (dst[1] + startOffsetInDestBuffer, (numChannels < 2 ? decoded0 : decoded1) + decodedStart, sizeof (float) * 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; - } - else if (result <= 0) - { - decodedStart = 0; - decodedEnd = samplesDone; - return result == 0; - } - } - - return false; - } - - void skipID3() - { - const int64 originalPosition = stream.stream.getPosition(); - const uint32 firstWord = 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 int 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) - numFrames = (streamSize - streamStartPos) / (stream.frame.frameSize); - } - - return numFrames * 1152; - } - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MP3Reader); -}; - -} - -//============================================================================== -MP3AudioFormat::MP3AudioFormat() - : AudioFormat (MP3Decoder::mp3FormatName, StringArray (MP3Decoder::mp3Extensions)) -{} - -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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_MP3AudioFormat.h b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_MP3AudioFormat.h deleted file mode 100644 index 3723b48b..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_MP3AudioFormat.h +++ /dev/null @@ -1,65 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#if JUCE_USE_MP3AUDIOFORMAT - -//============================================================================== -/** - 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(); - 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); -}; - -#endif diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.cpp b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.cpp deleted file mode 100644 index 554484e2..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.cpp +++ /dev/null @@ -1,484 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce 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 - - #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 -#else - #include - #include - #include -#endif -} - -#undef max -#undef min - -//============================================================================== -static const char* const oggFormatName = "Ogg-Vorbis file"; -static const char* const oggExtensions[] = { ".ogg", 0 }; - -//============================================================================== -class OggReader : public AudioFormatReader -{ -public: - OggReader (InputStream* const inp) - : AudioFormatReader (inp, TRANS (oggFormatName)), - reservoir (2, 4096), - 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); - 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) reservoir.getNumSamples())); - } - } - - ~OggReader() - { - OggVorbisNamespace::ov_clear (&ovFile); - } - - //============================================================================== - bool readSamples (int** destSamples, int numDestChannels, int startOffsetInDestBuffer, - int64 startSampleInFile, int numSamples) - { - while (numSamples > 0) - { - const int numAvailable = 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.getSampleData (i, (int) (startSampleInFile - reservoirStart)), - sizeof (float) * 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 int 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.getSampleData (i, offset), - dataIn[i], - sizeof (float) * 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) * 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& metadataValues) - : AudioFormatWriter (out, TRANS (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); - - const String encoder (metadataValues [OggVorbisAudioFormat::encoderName]); - if (encoder.isNotEmpty()) - vorbis_comment_add_tag (&vc, "ENCODER", const_cast (encoder.toUTF8().getAddress())); - - 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, og.header_len); - output->write (og.body, 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) - { - 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, og.header_len); - output->write (og.body, 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; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (OggWriter); -}; - - -//============================================================================== -OggVorbisAudioFormat::OggVorbisAudioFormat() - : AudioFormat (TRANS (oggFormatName), StringArray (oggExtensions)) -{ -} - -OggVorbisAudioFormat::~OggVorbisAudioFormat() -{ -} - -Array OggVorbisAudioFormat::getPossibleSampleRates() -{ - const int rates[] = { 22050, 32000, 44100, 48000, 88200, 96000, 176400, 192000, 0 }; - return Array (rates); -} - -Array OggVorbisAudioFormat::getPossibleBitDepths() -{ - const int depths[] = { 32, 0 }; - return Array (depths); -} - -bool OggVorbisAudioFormat::canDoStereo() { return true; } -bool OggVorbisAudioFormat::canDoMono() { return true; } -bool OggVorbisAudioFormat::isCompressed() { return true; } - -const char* const OggVorbisAudioFormat::encoderName = "encoder"; - -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() -{ - 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) -{ - FileInputStream* const in = source.createInputStream(); - - if (in != nullptr) - { - ScopedPointer r (createReaderFor (in, true)); - - if (r != nullptr) - { - const int64 numSamps = r->lengthInSamples; - r = nullptr; - - const int64 fileNumSamps = source.getSize() / 4; - const double ratio = numSamps / (double) fileNumSamps; - - if (ratio > 12.0) - return 0; - else if (ratio > 6.0) - return 1; - else - return 2; - } - } - - return 1; -} - -#endif diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.h b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.h deleted file mode 100644 index 20756873..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.h +++ /dev/null @@ -1,86 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce 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(); - Array getPossibleBitDepths(); - bool canDoStereo(); - bool canDoMono(); - bool isCompressed(); - StringArray getQualityOptions(); - - //============================================================================== - /** 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; - - //============================================================================== - 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 (OggVorbisAudioFormat); -}; - - -#endif diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_QuickTimeAudioFormat.cpp b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_QuickTimeAudioFormat.cpp deleted file mode 100644 index 66584e58..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_QuickTimeAudioFormat.cpp +++ /dev/null @@ -1,388 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce 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"; -static const char* const quickTimeExtensions[] = { ".mov", ".mp3", ".mp4", ".m4a", 0 }; - -//============================================================================== -class QTAudioReader : public AudioFormatReader -{ -public: - QTAudioReader (InputStream* const input_, const int trackNum_) - : AudioFormatReader (input_, TRANS (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); - - OSStatus err = MovieAudioExtractionBegin (movie, 0, &extractor); - - unsigned long output_layout_size; - 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); - - err = MovieAudioExtractionGetProperty (extractor, - kQTPropertyClass_MovieAudioExtraction_Audio, - kQTMovieAudioExtractionAudioPropertyID_AudioChannelLayout, - output_layout_size, qt_audio_channel_layout, 0); - - qt_audio_channel_layout[0].mChannelLayoutTag = kAudioChannelLayoutTag_Stereo; - - err = 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 ok = 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) - { - ok = 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) - { - ok = 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 ok; - } - - 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 (TRANS (quickTimeFormatName), StringArray (quickTimeExtensions)) -{ -} - -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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_QuickTimeAudioFormat.h b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_QuickTimeAudioFormat.h deleted file mode 100644 index bee74676..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_QuickTimeAudioFormat.h +++ /dev/null @@ -1,70 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce 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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_WavAudioFormat.cpp b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_WavAudioFormat.cpp deleted file mode 100644 index 029adfea..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_WavAudioFormat.cpp +++ /dev/null @@ -1,1110 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -//============================================================================== -static const char* const wavFormatName = "WAV file"; -static const char* const wavExtensions[] = { ".wav", ".bwf", 0 }; - -//============================================================================== -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; -} - - -//============================================================================== -namespace WavFileHelpers -{ - inline int chunkName (const char* const name) noexcept { return (int) ByteOrder::littleEndianInt (name); } - - #if JUCE_MSVC - #pragma pack (push, 1) - #define PACKED - #elif JUCE_GCC - #define PACKED __attribute__((packed)) - #else - #define PACKED - #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 - { - values.set (WavAudioFormat::bwavDescription, String::fromUTF8 (description, 256)); - values.set (WavAudioFormat::bwavOriginator, String::fromUTF8 (originator, 32)); - values.set (WavAudioFormat::bwavOriginatorRef, String::fromUTF8 (originatorRef, 32)); - values.set (WavAudioFormat::bwavOriginationDate, String::fromUTF8 (originationDate, 10)); - values.set (WavAudioFormat::bwavOriginationTime, String::fromUTF8 (originationTime, 8)); - - 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)); - } - - static MemoryBlock createFrom (const StringPairArray& values) - { - const size_t sizeNeeded = sizeof (BWAVChunk) + values [WavAudioFormat::bwavCodingHistory].getNumBytesAsUTF8(); - MemoryBlock data ((sizeNeeded + 3) & ~3); - 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(); - } - - } PACKED; - - - //============================================================================== - struct SMPLChunk - { - struct SampleLoop - { - uint32 identifier; - uint32 type; // these are different in AIFF and WAV - uint32 start; - uint32 end; - uint32 fraction; - uint32 playCount; - } PACKED; - - uint32 manufacturer; - uint32 product; - uint32 samplePeriod; - uint32 midiUnityNote; - uint32 midiPitchFraction; - uint32 smpteFormat; - uint32 smpteOffset; - uint32 numSampleLoops; - uint32 samplerData; - SampleLoop loops[1]; - - void copyTo (StringPairArray& values, const int totalSize) const - { - values.set ("Manufacturer", String (ByteOrder::swapIfBigEndian (manufacturer))); - values.set ("Product", String (ByteOrder::swapIfBigEndian (product))); - values.set ("SamplePeriod", String (ByteOrder::swapIfBigEndian (samplePeriod))); - values.set ("MidiUnityNote", String (ByteOrder::swapIfBigEndian (midiUnityNote))); - values.set ("MidiPitchFraction", String (ByteOrder::swapIfBigEndian (midiPitchFraction))); - values.set ("SmpteFormat", String (ByteOrder::swapIfBigEndian (smpteFormat))); - values.set ("SmpteOffset", String (ByteOrder::swapIfBigEndian (smpteOffset))); - values.set ("NumSampleLoops", String (ByteOrder::swapIfBigEndian (numSampleLoops))); - values.set ("SamplerData", String (ByteOrder::swapIfBigEndian (samplerData))); - - for (uint32 i = 0; i < numSampleLoops; ++i) - { - if ((uint8*) (loops + (i + 1)) > ((uint8*) this) + totalSize) - break; - - const String prefix ("Loop" + String(i)); - values.set (prefix + "Identifier", String (ByteOrder::swapIfBigEndian (loops[i].identifier))); - values.set (prefix + "Type", String (ByteOrder::swapIfBigEndian (loops[i].type))); - values.set (prefix + "Start", String (ByteOrder::swapIfBigEndian (loops[i].start))); - values.set (prefix + "End", String (ByteOrder::swapIfBigEndian (loops[i].end))); - values.set (prefix + "Fraction", String (ByteOrder::swapIfBigEndian (loops[i].fraction))); - values.set (prefix + "PlayCount", String (ByteOrder::swapIfBigEndian (loops[i].playCount))); - } - } - - static MemoryBlock createFrom (const StringPairArray& values) - { - MemoryBlock data; - const int numLoops = jmin (64, values.getValue ("NumSampleLoops", "0").getIntValue()); - - if (numLoops > 0) - { - const size_t sizeNeeded = sizeof (SMPLChunk) + (numLoops - 1) * sizeof (SampleLoop); - data.setSize ((sizeNeeded + 3) & ~3, true); - - SMPLChunk* const s = static_cast (data.getData()); - - s->manufacturer = ByteOrder::swapIfBigEndian ((uint32) values.getValue ("Manufacturer", "0").getIntValue()); - s->product = ByteOrder::swapIfBigEndian ((uint32) values.getValue ("Product", "0").getIntValue()); - s->samplePeriod = ByteOrder::swapIfBigEndian ((uint32) values.getValue ("SamplePeriod", "0").getIntValue()); - s->midiUnityNote = ByteOrder::swapIfBigEndian ((uint32) values.getValue ("MidiUnityNote", "60").getIntValue()); - s->midiPitchFraction = ByteOrder::swapIfBigEndian ((uint32) values.getValue ("MidiPitchFraction", "0").getIntValue()); - s->smpteFormat = ByteOrder::swapIfBigEndian ((uint32) values.getValue ("SmpteFormat", "0").getIntValue()); - s->smpteOffset = ByteOrder::swapIfBigEndian ((uint32) values.getValue ("SmpteOffset", "0").getIntValue()); - s->numSampleLoops = ByteOrder::swapIfBigEndian ((uint32) numLoops); - s->samplerData = ByteOrder::swapIfBigEndian ((uint32) values.getValue ("SamplerData", "0").getIntValue()); - - for (int i = 0; i < numLoops; ++i) - { - const String prefix ("Loop" + String(i)); - s->loops[i].identifier = ByteOrder::swapIfBigEndian ((uint32) values.getValue (prefix + "Identifier", "0").getIntValue()); - s->loops[i].type = ByteOrder::swapIfBigEndian ((uint32) values.getValue (prefix + "Type", "0").getIntValue()); - s->loops[i].start = ByteOrder::swapIfBigEndian ((uint32) values.getValue (prefix + "Start", "0").getIntValue()); - s->loops[i].end = ByteOrder::swapIfBigEndian ((uint32) values.getValue (prefix + "End", "0").getIntValue()); - s->loops[i].fraction = ByteOrder::swapIfBigEndian ((uint32) values.getValue (prefix + "Fraction", "0").getIntValue()); - s->loops[i].playCount = ByteOrder::swapIfBigEndian ((uint32) values.getValue (prefix + "PlayCount", "0").getIntValue()); - } - } - - return data; - } - } PACKED; - - //============================================================================== - struct InstChunk - { - int8 baseNote; - int8 detune; - int8 gain; - int8 lowNote; - int8 highNote; - int8 lowVelocity; - int8 highVelocity; - - void copyTo (StringPairArray& values) const - { - values.set ("MidiUnityNote", String (baseNote)); - values.set ("Detune", String (detune)); - values.set ("Gain", String (gain)); - values.set ("LowNote", String (lowNote)); - values.set ("HighNote", String (highNote)); - values.set ("LowVelocity", String (lowVelocity)); - values.set ("HighVelocity", String (highVelocity)); - } - - 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 = (int8) values.getValue ("MidiUnityNote", "60").getIntValue(); - inst->detune = (int8) values.getValue ("Detune", "0").getIntValue(); - inst->gain = (int8) values.getValue ("Gain", "0").getIntValue(); - inst->lowNote = (int8) values.getValue ("LowNote", "0").getIntValue(); - inst->highNote = (int8) values.getValue ("HighNote", "127").getIntValue(); - inst->lowVelocity = (int8) values.getValue ("LowVelocity", "1").getIntValue(); - inst->highVelocity = (int8) values.getValue ("HighVelocity", "127").getIntValue(); - } - - return data; - } - } PACKED; - - //============================================================================== - struct CueChunk - { - struct Cue - { - uint32 identifier; - uint32 order; - uint32 chunkID; - uint32 chunkStart; - uint32 blockStart; - uint32 offset; - } PACKED; - - uint32 numCues; - Cue cues[1]; - - void copyTo (StringPairArray& values, const int totalSize) const - { - values.set ("NumCuePoints", String (ByteOrder::swapIfBigEndian (numCues))); - - for (uint32 i = 0; i < numCues; ++i) - { - if ((uint8*) (cues + (i + 1)) > ((uint8*) this) + totalSize) - break; - - const String prefix ("Cue" + String(i)); - values.set (prefix + "Identifier", String (ByteOrder::swapIfBigEndian (cues[i].identifier))); - values.set (prefix + "Order", String (ByteOrder::swapIfBigEndian (cues[i].order))); - values.set (prefix + "ChunkID", String (ByteOrder::swapIfBigEndian (cues[i].chunkID))); - values.set (prefix + "ChunkStart", String (ByteOrder::swapIfBigEndian (cues[i].chunkStart))); - values.set (prefix + "BlockStart", String (ByteOrder::swapIfBigEndian (cues[i].blockStart))); - values.set (prefix + "Offset", String (ByteOrder::swapIfBigEndian (cues[i].offset))); - } - } - - static void create (MemoryBlock& data, const StringPairArray& values) - { - const int numCues = values.getValue ("NumCuePoints", "0").getIntValue(); - - if (numCues > 0) - { - const size_t sizeNeeded = sizeof (CueChunk) + (numCues - 1) * sizeof (Cue); - data.setSize ((sizeNeeded + 3) & ~3, 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)); - - uint32 identifier = (uint32) values.getValue (prefix + "Identifier", "0").getIntValue(); - - #if JUCE_DEBUG - jassert (! identifiers.contains (identifier)); - identifiers.add (identifier); - #endif - - c->cues[i].identifier = ByteOrder::swapIfBigEndian ((uint32) identifier); - - const int order = values.getValue (prefix + "Order", String (nextOrder)).getIntValue(); - nextOrder = jmax (nextOrder, order) + 1; - - c->cues[i].order = ByteOrder::swapIfBigEndian ((uint32) order); - c->cues[i].chunkID = ByteOrder::swapIfBigEndian ((uint32) values.getValue (prefix + "ChunkID", dataChunkID).getIntValue()); - c->cues[i].chunkStart = ByteOrder::swapIfBigEndian ((uint32) values.getValue (prefix + "ChunkStart", "0").getIntValue()); - c->cues[i].blockStart = ByteOrder::swapIfBigEndian ((uint32) values.getValue (prefix + "BlockStart", "0").getIntValue()); - c->cues[i].offset = ByteOrder::swapIfBigEndian ((uint32) values.getValue (prefix + "Offset", "0").getIntValue()); - } - } - } - - } PACKED; - - //============================================================================== - namespace ListChunk - { - 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 = label.getNumBytesAsUTF8() + 1; - const int chunkLength = 4 + labelLength + (labelLength & 1); - - out.writeInt (chunkType); - out.writeInt (chunkLength); - out.writeInt (values.getValue (prefix + "Identifier", "0").getIntValue()); - out.write (label.toUTF8(), 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 = text.getNumBytesAsUTF8() + 1; // include null terminator - int chunkLength = textLength + 20 + (textLength & 1); - - out.writeInt (chunkName ("ltxt")); - out.writeInt (chunkLength); - out.writeInt (values.getValue (prefix + "Identifier", "0").getIntValue()); - out.writeInt (values.getValue (prefix + "SampleLength", "0").getIntValue()); - out.writeInt (values.getValue (prefix + "Purpose", "0").getIntValue()); - out.writeShort ((short) values.getValue (prefix + "Country", "0").getIntValue()); - out.writeShort ((short) values.getValue (prefix + "Language", "0").getIntValue()); - out.writeShort ((short) values.getValue (prefix + "Dialect", "0").getIntValue()); - out.writeShort ((short) values.getValue (prefix + "CodePage", "0").getIntValue()); - out.write (text.toUTF8(), textLength); - - if ((out.getDataSize() & 1) != 0) - out.writeByte (0); - } - - static void create (MemoryBlock& block, const StringPairArray& values) - { - const int numCueLabels = values.getValue ("NumCueLabels", "0").getIntValue(); - const int numCueNotes = values.getValue ("NumCueNotes", "0").getIntValue(); - const int numCueRegions = values.getValue ("NumCueRegions", "0").getIntValue(); - - if (numCueLabels > 0 || numCueNotes > 0 || numCueRegions > 0) - { - MemoryOutputStream out (block, false); - - int i; - for (i = 0; i < numCueLabels; ++i) - appendLabelOrNoteChunk (values, "CueLabel" + String (i), chunkName ("labl"), out); - - for (i = 0; i < numCueNotes; ++i) - appendLabelOrNoteChunk (values, "CueNote" + String (i), chunkName ("note"), out); - - for (i = 0; i < numCueRegions; ++i) - appendExtraChunk (values, "CueRegion" + String (i), out); - } - } - } - - //============================================================================== - struct ExtensibleWavSubFormat - { - uint32 data1; - uint16 data2; - uint16 data3; - uint8 data4[8]; - } PACKED; - - 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' - } PACKED; - - - #if JUCE_MSVC - #pragma pack (pop) - #endif - - #undef PACKED -} - -//============================================================================== -class WavAudioFormatReader : public AudioFormatReader -{ -public: - WavAudioFormatReader (InputStream* const in) - : AudioFormatReader (in, TRANS (wavFormatName)), - bwavChunkStart (0), - bwavSize (0), - dataLength (0), - isRF64 (false) - { - using namespace WavFileHelpers; - uint64 len = 0; - uint64 end = 0; - bool hasGotType = false; - bool hasGotData = false; - 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 = input->getPosition() + len; - } - else - { - return; - } - - const int64 startOfRIFFChunk = input->getPosition(); - - if (input->readInt() == chunkName ("WAVE")) - { - if (isRF64 && input->readInt() == chunkName ("ds64")) - { - uint32 length = (uint32) input->readInt(); - - if (length < 28) - { - return; - } - else - { - const int64 chunkEnd = input->getPosition() + length + (length & 1); - len = (uint64) input->readInt64(); - end = startOfRIFFChunk + len; - 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 * 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 (10); // skip over bitsPerSample and speakerPosition mask - ExtensibleWavSubFormat subFormat; - subFormat.data1 = (uint32) input->readInt(); - subFormat.data2 = (uint16) input->readShort(); - subFormat.data3 = (uint16) input->readShort(); - input->read (subFormat.data4, sizeof (subFormat.data4)); - - const ExtensibleWavSubFormat pcmFormat - = { 0x00000001, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } }; - - if (memcmp (&subFormat, &pcmFormat, sizeof (subFormat)) != 0) - { - const ExtensibleWavSubFormat ambisonicFormat - = { 0x00000001, 0x0721, 0x11d3, { 0x86, 0x44, 0xC8, 0xC1, 0xCA, 0x00, 0x00, 0x00 } }; - - if (memcmp (&subFormat, &ambisonicFormat, sizeof (subFormat)) != 0) - bytesPerFrame = 0; - } - } - } - else if (format != 1) - { - bytesPerFrame = 0; - } - - hasGotType = true; - } - 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; - - hasGotData = true; - } - 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); - } - 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 ("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 (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) - { - jassert (destSamples != nullptr); - const int64 samplesAvailable = lengthInSamples - startSampleInFile; - - if (samplesAvailable < numSamples) - { - for (int i = numDestChannels; --i >= 0;) - if (destSamples[i] != nullptr) - zeromem (destSamples[i] + startOffsetInDestBuffer, sizeof (int) * numSamples); - - numSamples = (int) samplesAvailable; - } - - 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)); - } - - switch (bitsPerSample) - { - case 8: ReadHelper::read (destSamples, startOffsetInDestBuffer, numDestChannels, tempBuffer, (int) numChannels, numThisTime); break; - case 16: ReadHelper::read (destSamples, startOffsetInDestBuffer, numDestChannels, tempBuffer, (int) numChannels, numThisTime); break; - case 24: ReadHelper::read (destSamples, startOffsetInDestBuffer, numDestChannels, tempBuffer, (int) numChannels, numThisTime); break; - case 32: if (usesFloatingPointData) ReadHelper::read (destSamples, startOffsetInDestBuffer, numDestChannels, tempBuffer, (int) numChannels, numThisTime); - else ReadHelper::read (destSamples, startOffsetInDestBuffer, numDestChannels, tempBuffer, (int) numChannels, numThisTime); break; - default: jassertfalse; break; - } - - startOffsetInDestBuffer += numThisTime; - numSamples -= numThisTime; - } - - return true; - } - - int64 bwavChunkStart, bwavSize; - -private: - ScopedPointer converter; - int bytesPerFrame; - int64 dataChunkStart, dataLength; - bool isRF64; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (WavAudioFormatReader); -}; - -//============================================================================== -class WavAudioFormatWriter : public AudioFormatWriter -{ -public: - WavAudioFormatWriter (OutputStream* const out, const double sampleRate_, - const unsigned int numChannels_, const unsigned int bits, - const StringPairArray& metadataValues) - : AudioFormatWriter (out, TRANS (wavFormatName), sampleRate_, numChannels_, 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); - smplChunk = SMPLChunk::createFrom (metadataValues); - instChunk = InstChunk::createFrom (metadataValues); - CueChunk ::create (cueChunk, metadataValues); - ListChunk::create (listChunk, metadataValues); - } - - headerPosition = out->getPosition(); - writeHeader(); - } - - ~WavAudioFormatWriter() - { - if ((bytesWritten & 1) != 0) // pad to an even length - { - ++bytesWritten; - output->writeByte (0); - } - - writeHeader(); - } - - //============================================================================== - bool write (const int** data, int numSamples) - { - jassert (data != nullptr && *data != nullptr); // the input must contain at least one channel! - - if (writeFailed) - return false; - - const size_t bytes = numChannels * 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(), (int) 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 += numSamples; - - return true; - } - } - -private: - ScopedPointer converter; - MemoryBlock tempBlock, bwavChunk, smplChunk, instChunk, cueChunk, listChunk; - 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 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() - { - using namespace WavFileHelpers; - const bool seekedOk = output->setPosition (headerPosition); - (void) seekedOk; - - // 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 (seekedOk); - - const size_t bytesPerFrame = numChannels * bitsPerSample / 8; - uint64 audioDataSize = bytesPerFrame * lengthInSamples; - - const bool isRF64 = (bytesWritten >= literal64bit (0x100000000)); - const bool isWaveFmtEx = isRF64 || (numChannels > 2); - - int64 riffChunkSize = 4 /* 'RIFF' */ + 8 + 40 /* WAVEFORMATEX */ - + 8 + audioDataSize + (audioDataSize & 1) - + (bwavChunk.getSize() > 0 ? (8 + bwavChunk.getSize()) : 0) - + (smplChunk.getSize() > 0 ? (8 + smplChunk.getSize()) : 0) - + (instChunk.getSize() > 0 ? (8 + instChunk.getSize()) : 0) - + (cueChunk .getSize() > 0 ? (8 + cueChunk .getSize()) : 0) - + (listChunk.getSize() > 0 ? (12 + listChunk.getSize()) : 0) - + (8 + 28); // (ds64 chunk) - - riffChunkSize += (riffChunkSize & 0x1); - - output->writeInt (chunkName (isRF64 ? "RF64" : "RIFF")); - output->writeInt (isRF64 ? -1 : (int) riffChunkSize); - output->writeInt (chunkName ("WAVE")); - - if (! isRF64) - { - output->writeInt (chunkName ("JUNK")); - output->writeInt (28 + (isWaveFmtEx? 0 : 24)); - output->writeRepeatedByte (0, 28 /* ds64 */ + (isWaveFmtEx? 0 : 24)); - } - else - { - // write ds64 chunk - output->writeInt (chunkName ("ds64")); - output->writeInt (28); // chunk size for uncompressed data (no table) - output->writeInt64 (riffChunkSize); - output->writeInt64 (audioDataSize); - output->writeRepeatedByte (0, 12); - } - - output->writeInt (chunkName ("fmt ")); - - if (isWaveFmtEx) - { - output->writeInt (40); // chunk size - output->writeShort ((short) (uint16) 0xfffe); // WAVE_FORMAT_EXTENSIBLE - } - else - { - output->writeInt (16); // chunk size - 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 pcmFormat - = { 0x00000001, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } }; - - const ExtensibleWavSubFormat IEEEFloatFormat - = { 0x00000003, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } }; - - 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)); - } - - if (bwavChunk.getSize() > 0) - { - output->writeInt (chunkName ("bext")); - output->writeInt ((int) bwavChunk.getSize()); - *output << bwavChunk; - } - - if (smplChunk.getSize() > 0) - { - output->writeInt (chunkName ("smpl")); - output->writeInt ((int) smplChunk.getSize()); - *output << smplChunk; - } - - if (instChunk.getSize() > 0) - { - output->writeInt (chunkName ("inst")); - output->writeInt (7); - *output << instChunk; - } - - if (cueChunk.getSize() > 0) - { - output->writeInt (chunkName ("cue ")); - output->writeInt ((int) cueChunk.getSize()); - *output << cueChunk; - } - - if (listChunk.getSize() > 0) - { - output->writeInt (chunkName ("LIST")); - output->writeInt ((int) listChunk.getSize() + 4); - output->writeInt (chunkName ("adtl")); - *output << listChunk; - } - - output->writeInt (chunkName ("data")); - output->writeInt (isRF64 ? -1 : (int) (lengthInSamples * bytesPerFrame)); - - usesFloatingPointData = (bitsPerSample == 32); - } - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (WavAudioFormatWriter); -}; - -//============================================================================== -WavAudioFormat::WavAudioFormat() - : AudioFormat (TRANS (wavFormatName), StringArray (wavExtensions)) -{ -} - -WavAudioFormat::~WavAudioFormat() -{ -} - -Array WavAudioFormat::getPossibleSampleRates() -{ - const int rates[] = { 22050, 32000, 44100, 48000, 88200, 96000, 176400, 192000, 0 }; - return Array (rates); -} - -Array WavAudioFormat::getPossibleBitDepths() -{ - const int depths[] = { 8, 16, 24, 32, 0 }; - return Array (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) - return r.release(); - - if (! deleteStreamIfOpeningFails) - r->input = nullptr; - - 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, (int) numChannels, 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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_WavAudioFormat.h b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_WavAudioFormat.h deleted file mode 100644 index c5d4b37b..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_WavAudioFormat.h +++ /dev/null @@ -1,143 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce 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. - - This is a - - @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); - - //============================================================================== - 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); - - //============================================================================== - /** 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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.cpp b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.cpp deleted file mode 100644 index 0733b8c7..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.cpp +++ /dev/null @@ -1,352 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -namespace WindowsMediaCodec -{ - -class JuceIStream : public ComBaseClassHelper -{ -public: - JuceIStream (InputStream& source_) noexcept - : source (source_) - { - resetReferenceCount(); - } - - 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"), - currentPosition (0), - bufferStart (0), bufferEnd (0) - { - typedef HRESULT (*WMCreateSyncReaderType) (IUnknown*, DWORD, IWMSyncReader**); - WMCreateSyncReaderType wmCreateSyncReader = nullptr; - wmCreateSyncReader = (WMCreateSyncReaderType) wmvCoreLib.getFunction ("WMCreateSyncReader"); - - 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(); - wmSyncReader = nullptr; - } - } - - bool readSamples (int** destSamples, int numDestChannels, int startOffsetInDestBuffer, - int64 startSampleInFile, int numSamples) - { - if (sampleRate <= 0) - return false; - - checkCoInitialiseCalled(); - - if (startSampleInFile != currentPosition) - { - currentPosition = startSampleInFile; - wmSyncReader->SetRange (((QWORD) startSampleInFile * 10000000) / (int) sampleRate, 0); - bufferStart = bufferEnd = 0; - } - - while (numSamples > 0) - { - if (bufferEnd <= bufferStart) - { - INSSBuffer* sampleBuffer = nullptr; - QWORD sampleTime, duration; - DWORD flags, outputNum; - WORD streamNum; - - HRESULT hr = wmSyncReader->GetNextSample (0, &sampleBuffer, &sampleTime, - &duration, &flags, &outputNum, &streamNum); - - if (SUCCEEDED (hr)) - { - BYTE* rawData = nullptr; - DWORD dataLength = 0; - hr = sampleBuffer->GetBufferAndLength (&rawData, &dataLength); - jassert (SUCCEEDED (hr)); - - bufferStart = 0; - bufferEnd = (int) dataLength; - - if (bufferEnd <= 0) - return false; - - buffer.ensureSize (bufferEnd); - memcpy (buffer.getData(), rawData, bufferEnd); - } - else - { - bufferStart = 0; - bufferEnd = 512; - buffer.ensureSize (bufferEnd); - buffer.fillWith (0); - } - } - - const int stride = numChannels * sizeof (int16); - const int16* const rawData = static_cast (addBytesToPointer (buffer.getData(), bufferStart)); - const int numToDo = jmin (numSamples, (bufferEnd - bufferStart) / stride); - - 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; - } - } - - bufferStart += numToDo * stride; - startOffsetInDestBuffer += numToDo; - numSamples -= numToDo; - currentPosition += numToDo; - } - - return true; - } - -private: - DynamicLibrary wmvCoreLib; - ComSmartPtr wmSyncReader; - int64 currentPosition; - MemoryBlock buffer; - int bufferStart, bufferEnd; - - 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; } - -//============================================================================== -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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.h b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.h deleted file mode 100644 index 5e0d7a43..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#if JUCE_WINDOWS - -//============================================================================== -/** - Audio format which uses the Windows Media codecs (Windows only). -*/ -class WindowsMediaAudioFormat : public AudioFormat -{ -public: - //============================================================================== - WindowsMediaAudioFormat(); - ~WindowsMediaAudioFormat(); - - //============================================================================== - Array getPossibleSampleRates(); - Array getPossibleBitDepths(); - bool canDoStereo(); - bool canDoMono(); - - //============================================================================== - AudioFormatReader* createReaderFor (InputStream*, bool deleteStreamIfOpeningFails); - - AudioFormatWriter* createWriterFor (OutputStream*, double sampleRateToUse, - unsigned int numberOfChannels, int bitsPerSample, - const StringPairArray& metadataValues, int qualityOptionIndex); -}; - -#endif diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/Ogg Vorbis Licence.txt b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/Ogg Vorbis Licence.txt deleted file mode 100644 index 254dd527..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/bitwise.c b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/bitwise.c deleted file mode 100644 index 710a5604..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/AUTHORS b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/AUTHORS deleted file mode 100644 index 0da10363..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/CHANGES b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/CHANGES deleted file mode 100644 index e7d5dd30..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/COPYING b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/COPYING deleted file mode 100644 index 28de72a9..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/README b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/README deleted file mode 100644 index 3e969e0c..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/analysis.c b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/analysis.c deleted file mode 100644 index 4391a44e..00000000 --- a/src/juce/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= rint(1.*bi->avg_rate*halfsamples/ratesamples); - bm->min_bitsper= rint(1.*bi->min_rate*halfsamples/ratesamples); - bm->max_bitsper= 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=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=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=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=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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/bitrate.h b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/bitrate.h deleted file mode 100644 index c2dd37d8..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/block.c b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/block.c deleted file mode 100644 index 614302c6..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/block.c +++ /dev/null @@ -1,1036 +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){ - int i; - 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(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(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(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(i=0;ifloors;i++) - b->flr[i]=_floor_P[ci->floor_type[i]]-> - look(v,ci->floor_param[i]); - - for(i=0;iresidues;i++) - b->residue[i]=_residue_P[ci->residue_type[i]]-> - look(v,ci->residue_param[i]); - - return 0; - abort_books: - for(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=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); - int i,j; - - 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(j=0;jchannels;j++){ - float *p=v->pcm[j]; - for(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(j=0;jchannels;j++){ - float *s=v->pcm[j]; - float *d=v->pcm[j]+(n1-n0)/2; - for(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(j=0;jchannels;j++){ - float *s=v->pcm[j]; - float *d=v->pcm[j]+n1-n0; - for(i=n0-1;i>=0;--i) - d[i]=s[i]; - } - v->pcm_returned+=n1-n0; - v->pcm_current+=n1-n0; - } - } - - if(pcm){ - int i; - for(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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/books/coupled/res_books_51.h b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/books/coupled/res_books_51.h deleted file mode 100644 index 488c8a49..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/books/coupled/res_books_stereo.h b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/books/coupled/res_books_stereo.h deleted file mode 100644 index e13b06a4..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/books/floor/floor_books.h b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/books/floor/floor_books.h deleted file mode 100644 index 609b97be..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/books/uncoupled/res_books_uncoupled.h b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/books/uncoupled/res_books_uncoupled.h deleted file mode 100644 index 7d7d7bb8..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/codebook.c b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/codebook.c deleted file mode 100644 index 4876970a..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/codebook.h b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/codebook.h deleted file mode 100644 index 34765277..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/codec_internal.h b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/codec_internal.h deleted file mode 100644 index e4664860..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/envelope.c b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/envelope.c deleted file mode 100644 index 72c4db64..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/envelope.h b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/envelope.h deleted file mode 100644 index 8237b90c..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/floor0.c b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/floor0.c deleted file mode 100644 index fd9cf653..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/floor1.c b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/floor1.c deleted file mode 100644 index 52387c38..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/lookup.c b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/lookup.c deleted file mode 100644 index 953e71a1..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/lookup.h b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/lookup.h deleted file mode 100644 index 0f8fdf4c..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/lookup_data.h b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/lookup_data.h deleted file mode 100644 index b12d79a9..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/lpc.c b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/lpc.c deleted file mode 100644 index a2325e6e..00000000 --- a/src/juce/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 lastdelta=0.f; - 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; - lastdelta=delta; - } - - 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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/masking.h b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/masking.h deleted file mode 100644 index 31c825fa..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/mdct.c b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/mdct.c deleted file mode 100644 index d41dc86f..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/mdct.h b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/mdct.h deleted file mode 100644 index af3e49ec..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/misc.h b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/misc.h deleted file mode 100644 index 044a5436..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/floor_all.h b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/floor_all.h deleted file mode 100644 index e1c80e28..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/psych_11.h b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/psych_11.h deleted file mode 100644 index 0d0d2aee..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/psych_16.h b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/psych_16.h deleted file mode 100644 index 0c6593b4..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/psych_44.h b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/psych_44.h deleted file mode 100644 index d0cbb60c..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/psych_8.h b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/psych_8.h deleted file mode 100644 index 9cb9f317..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/residue_16.h b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/residue_16.h deleted file mode 100644 index 4d7c71a8..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/residue_44.h b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/residue_44.h deleted file mode 100644 index b01ce475..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/residue_44p51.h b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/residue_44p51.h deleted file mode 100644 index 081fe8ef..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/residue_44u.h b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/residue_44u.h deleted file mode 100644 index 5b31322a..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/residue_8.h b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/residue_8.h deleted file mode 100644 index 2943694d..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_11.h b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_11.h deleted file mode 100644 index 6637249b..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_16.h b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_16.h deleted file mode 100644 index 6fec1c26..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_22.h b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_22.h deleted file mode 100644 index c164a9b3..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_32.h b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_32.h deleted file mode 100644 index 301f020f..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_44.h b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_44.h deleted file mode 100644 index 45250e0d..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_44p51.h b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_44p51.h deleted file mode 100644 index a26cee84..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_44u.h b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_44u.h deleted file mode 100644 index 7dfdd550..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_8.h b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_8.h deleted file mode 100644 index 4e71205e..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_X.h b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_X.h deleted file mode 100644 index be5e2c35..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/os.h b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/os.h deleted file mode 100644 index e84035fa..00000000 --- a/src/juce/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; - __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 *fpu){ -} - -static __inline void vorbis_fpu_restore(vorbis_fpu_control fpu){ -} - -#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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/psy.c b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/psy.c deleted file mode 100644 index 0dac94c6..00000000 --- a/src/juce/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 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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/psy.h b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/psy.h deleted file mode 100644 index fd7201ff..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/registry.c b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/registry.c deleted file mode 100644 index c783878d..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/registry.h b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/registry.h deleted file mode 100644 index 3c2497fe..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/res0.c b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/res0.c deleted file mode 100644 index c6640797..00000000 --- a/src/juce/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./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 *vb,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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/scales.h b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/scales.h deleted file mode 100644 index 4adfd784..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/sharedbook.c b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/sharedbook.c deleted file mode 100644 index 2f27b860..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/smallft.c b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/smallft.c deleted file mode 100644 index 03e166a6..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/smallft.h b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/smallft.h deleted file mode 100644 index 420a6abf..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/synthesis.c b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/synthesis.c deleted file mode 100644 index a9fca683..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/vorbisenc.c b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/vorbisenc.c deleted file mode 100644 index 4c5e55dd..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/vorbisfile.c b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/vorbisfile.c deleted file mode 100644 index 5c344dd8..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/vorbisfile.c +++ /dev/null @@ -1,2335 +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); - } - } - } - - /* 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; - } - } -} - -/* 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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/window.c b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/window.c deleted file mode 100644 index 0dfe3f96..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/os_types.h b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/os_types.h deleted file mode 100644 index fa7b49f5..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/vorbisenc.h b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/vorbisenc.h deleted file mode 100644 index c7a23f9a..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/vorbisfile.h b/src/juce/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/vorbisfile.h deleted file mode 100644 index ee6e3f73..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormat.cpp b/src/juce/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormat.cpp deleted file mode 100644 index b5d2b3cd..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormat.cpp +++ /dev/null @@ -1,49 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -AudioFormat::AudioFormat (const String& name, const StringArray& extensions) - : formatName (name), - fileExtensions (extensions) -{ -} - -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(); } diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormat.h b/src/juce/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormat.h deleted file mode 100644 index 7c34b7a0..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormat.h +++ /dev/null @@ -1,172 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_AUDIOFORMAT_JUCEHEADER__ -#define __JUCE_AUDIOFORMAT_JUCEHEADER__ - -#include "juce_AudioFormatReader.h" -#include "juce_AudioFormatWriter.h" - - -//============================================================================== -/** - 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; - - /** 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 a zero-terminated list of file extensions - this is what will - be returned by getFileExtension() - */ - AudioFormat (const String& formatName, - const StringArray& fileExtensions); - -private: - //============================================================================== - String formatName; - StringArray fileExtensions; -}; - - -#endif // __JUCE_AUDIOFORMAT_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatManager.cpp b/src/juce/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatManager.cpp deleted file mode 100644 index a4bda4c4..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatManager.cpp +++ /dev/null @@ -1,193 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce 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); - #elif JUCE_USE_WINDOWS_MEDIA_FORMAT - registerFormat (new WindowsMediaAudioFormat(), false); - #elif JUCE_USE_MP3AUDIOFORMAT - // The software MP3 decoder is only used as a default format if - // there isn't an OS-provided alternative. - registerFormat (new MP3AudioFormat(), 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; - - int i; - for (i = 0; i < getNumKnownFormats(); ++i) - extensions.addArray (getKnownFormat(i)->getFileExtensions()); - - extensions.trim(); - extensions.removeEmptyStrings(); - - for (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)) - { - InputStream* const in = file.createInputStream(); - - if (in != nullptr) - { - AudioFormatReader* const r = af->createReaderFor (in, true); - - if (r != nullptr) - 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) - { - AudioFormatReader* const r = getKnownFormat(i)->createReaderFor (in, false); - - if (r != nullptr) - { - 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/src/juce/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatManager.h b/src/juce/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatManager.h deleted file mode 100644 index 3705600c..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatManager.h +++ /dev/null @@ -1,140 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_AUDIOFORMATMANAGER_JUCEHEADER__ -#define __JUCE_AUDIOFORMATMANAGER_JUCEHEADER__ - -#include "juce_AudioFormat.h" - - -//============================================================================== -/** - 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; - - /** 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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatReader.cpp b/src/juce/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatReader.cpp deleted file mode 100644 index 4389a8d2..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatReader.cpp +++ /dev/null @@ -1,388 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -AudioFormatReader::AudioFormatReader (InputStream* const in, - const String& formatName_) - : sampleRate (0), - bitsPerSample (0), - lengthInSamples (0), - numChannels (0), - usesFloatingPointData (false), - input (in), - formatName (formatName_) -{ -} - -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! - - 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) * (size_t) numSamplesToRead); - } - else - { - for (int i = (int) numChannels; i < numDestChannels; ++i) - if (destSamples[i] != nullptr) - zeromem (destSamples[i], sizeof (int) * (size_t) numSamplesToRead); - } - } - - return 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(); - int* chans[3]; - - if (useReaderLeftChan == useReaderRightChan) - { - chans[0] = reinterpret_cast (buffer->getSampleData (0, startSample)); - chans[1] = (numChannels > 1 && numTargetChannels > 1) ? reinterpret_cast (buffer->getSampleData (1, startSample)) : nullptr; - } - else if (useReaderLeftChan || (numChannels == 1)) - { - chans[0] = reinterpret_cast (buffer->getSampleData (0, startSample)); - chans[1] = nullptr; - } - else if (useReaderRightChan) - { - chans[0] = nullptr; - chans[1] = reinterpret_cast (buffer->getSampleData (0, startSample)); - } - - chans[2] = nullptr; - - read (chans, 2, readerStartSample, numSamples, true); - - if (! usesFloatingPointData) - { - for (int j = 0; j < 2; ++j) - { - float* const d = reinterpret_cast (chans[j]); - - if (d != nullptr) - { - const float multiplier = 1.0f / 0x7fffffff; - - for (int i = 0; i < numSamples; ++i) - d[i] = *reinterpret_cast (d + i) * multiplier; - } - } - } - - if (numTargetChannels > 1 && (chans[0] == nullptr || chans[1] == nullptr)) - { - // if this is a stereo buffer and the source was mono, dupe the first channel.. - memcpy (buffer->getSampleData (1, startSample), - buffer->getSampleData (0, startSample), - sizeof (float) * (size_t) numSamples); - } - } -} - -void AudioFormatReader::readMaxLevels (int64 startSampleInFile, - int64 numSamples, - float& lowestLeft, float& highestLeft, - float& lowestRight, float& highestRight) -{ - if (numSamples <= 0) - { - lowestLeft = 0; - lowestRight = 0; - highestLeft = 0; - highestRight = 0; - return; - } - - const int bufferSize = (int) jmin (numSamples, (int64) 4096); - HeapBlock tempSpace ((size_t) bufferSize * 2 + 64); - - int* tempBuffer[3]; - tempBuffer[0] = tempSpace.getData(); - tempBuffer[1] = tempSpace.getData() + bufferSize; - tempBuffer[2] = 0; - - if (usesFloatingPointData) - { - float lmin = 1.0e6f; - float lmax = -lmin; - float rmin = lmin; - float rmax = lmax; - - while (numSamples > 0) - { - const int numToDo = (int) jmin (numSamples, (int64) bufferSize); - read (tempBuffer, 2, startSampleInFile, numToDo, false); - - numSamples -= numToDo; - startSampleInFile += numToDo; - - float bufMin, bufMax; - findMinAndMax (reinterpret_cast (tempBuffer[0]), numToDo, bufMin, bufMax); - lmin = jmin (lmin, bufMin); - lmax = jmax (lmax, bufMax); - - if (numChannels > 1) - { - findMinAndMax (reinterpret_cast (tempBuffer[1]), numToDo, bufMin, bufMax); - rmin = jmin (rmin, bufMin); - rmax = jmax (rmax, bufMax); - } - } - - if (numChannels <= 1) - { - rmax = lmax; - rmin = lmin; - } - - lowestLeft = lmin; - highestLeft = lmax; - lowestRight = rmin; - highestRight = rmax; - } - else - { - int lmax = std::numeric_limits::min(); - int lmin = std::numeric_limits::max(); - int rmax = std::numeric_limits::min(); - int rmin = std::numeric_limits::max(); - - while (numSamples > 0) - { - const int numToDo = (int) jmin (numSamples, (int64) bufferSize); - if (! read (tempBuffer, 2, startSampleInFile, numToDo, false)) - break; - - numSamples -= numToDo; - startSampleInFile += numToDo; - - for (int j = (int) numChannels; --j >= 0;) - { - int bufMin, bufMax; - findMinAndMax (tempBuffer[j], numToDo, bufMin, bufMax); - - if (j == 0) - { - lmax = jmax (lmax, bufMax); - lmin = jmin (lmin, bufMin); - } - else - { - rmax = jmax (rmax, bufMax); - rmin = jmin (rmin, bufMin); - } - } - } - - if (numChannels <= 1) - { - rmax = lmax; - rmin = lmin; - } - - lowestLeft = lmin / (float) std::numeric_limits::max(); - highestLeft = lmax / (float) std::numeric_limits::max(); - lowestRight = rmin / (float) std::numeric_limits::max(); - highestRight = rmax / (float) std::numeric_limits::max(); - } -} - -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; -} diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatReader.h b/src/juce/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatReader.h deleted file mode 100644 index 9532a8d5..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatReader.h +++ /dev/null @@ -1,265 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_AUDIOFORMATREADER_JUCEHEADER__ -#define __JUCE_AUDIOFORMATREADER_JUCEHEADER__ - -class AudioFormat; - - -//============================================================================== -/** - 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 0). - @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 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; - - static void read (int** destData, int destOffset, int numDestChannels, const void* sourceData, int numSourceChannels, int numSamples) noexcept - { - for (int i = 0; i < numDestChannels; ++i) - { - if (destData[i] != nullptr) - { - DestType dest (destData[i]); - dest += destOffset; - - if (i < numSourceChannels) - dest.convertSamples (SourceType (addBytesToPointer (sourceData, i * SourceType::getBytesPerSample()), numSourceChannels), numSamples); - else - dest.clearSamples (numSamples); - } - } - } - }; - -private: - String formatName; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioFormatReader); -}; - - -#endif // __JUCE_AUDIOFORMATREADER_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatReaderSource.cpp b/src/juce/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatReaderSource.cpp deleted file mode 100644 index 574d66cc..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatReaderSource.cpp +++ /dev/null @@ -1,86 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -AudioFormatReaderSource::AudioFormatReaderSource (AudioFormatReader* const reader_, - const bool deleteReaderWhenThisIsDeleted) - : reader (reader_, 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 int newStart = (int) (start % (int) reader->lengthInSamples); - const int newEnd = (int) ((start + info.numSamples) % (int) reader->lengthInSamples); - - if (newEnd > newStart) - { - reader->read (info.buffer, info.startSample, - 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, - newEnd, 0, true, true); - } - - nextPlayPos = newEnd; - } - else - { - reader->read (info.buffer, info.startSample, - info.numSamples, start, true, true); - nextPlayPos += info.numSamples; - } - } -} diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatReaderSource.h b/src/juce/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatReaderSource.h deleted file mode 100644 index d55b22c1..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatReaderSource.h +++ /dev/null @@ -1,105 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_AUDIOFORMATREADERSOURCE_JUCEHEADER__ -#define __JUCE_AUDIOFORMATREADERSOURCE_JUCEHEADER__ - - -//============================================================================== -/** - 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); - - /** Implementation of the AudioSource method. */ - void releaseResources(); - - /** Implementation of the AudioSource method. */ - void getNextAudioBlock (const AudioSourceChannelInfo& bufferToFill); - - //============================================================================== - /** Implements the PositionableAudioSource method. */ - void setNextReadPosition (int64 newPosition); - - /** Implements the PositionableAudioSource method. */ - int64 getNextReadPosition() const; - - /** Implements the PositionableAudioSource method. */ - int64 getTotalLength() const; - -private: - //============================================================================== - OptionalScopedPointer reader; - - int64 volatile nextPlayPos; - bool volatile looping; - - void readBufferSection (int start, int length, AudioSampleBuffer& buffer, int startSample); - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioFormatReaderSource); -}; - - - - -#endif // __JUCE_AUDIOFORMATREADERSOURCE_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatWriter.cpp b/src/juce/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatWriter.cpp deleted file mode 100644 index 8e7531f2..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatWriter.cpp +++ /dev/null @@ -1,297 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce 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; -} - -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.getSampleData (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) - { - int* b = *bufferChan++; - - if (isFloatingPoint()) - { - // int -> float - const double factor = 1.0 / std::numeric_limits::max(); - - for (int i = 0; i < numToDo; ++i) - reinterpret_cast (b)[i] = (float) (factor * b[i]); - } - else - { - // float -> int - for (int i = 0; i < numToDo; ++i) - { - const double samp = *(const float*) b; - - if (samp <= -1.0) - *b++ = std::numeric_limits::min(); - else if (samp >= 1.0) - *b++ = std::numeric_limits::max(); - else - *b++ = roundToInt (std::numeric_limits::max() * samp); - } - } - } - } - - 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; - info.buffer = &tempBuffer; - info.startSample = 0; - info.numSamples = numToDo; - info.clearActiveBufferRegion(); - - source.getNextAudioBlock (info); - - if (! writeFromAudioSampleBuffer (tempBuffer, 0, numToDo)) - return false; - - numSamplesToRead -= numToDo; - } - - return true; -} - -bool AudioFormatWriter::writeFromAudioSampleBuffer (const AudioSampleBuffer& source, int startSample, int numSamples) -{ - jassert (startSample >= 0 && startSample + numSamples <= source.getNumSamples() && source.getNumChannels() > 0); - - if (numSamples <= 0) - return true; - - HeapBlock tempBuffer; - HeapBlock chans (numChannels + 1); - chans [numChannels] = 0; - - if (isFloatingPoint()) - { - for (int i = (int) numChannels; --i >= 0;) - chans[i] = reinterpret_cast (source.getSampleData (i, startSample)); - } - else - { - tempBuffer.malloc (((size_t) numSamples) * (size_t) numChannels); - - for (unsigned int i = 0; i < numChannels; ++i) - { - typedef AudioData::Pointer DestSampleType; - typedef AudioData::Pointer SourceSampleType; - - chans[i] = tempBuffer + (int) i * numSamples; - DestSampleType destData (chans[i]); - SourceSampleType sourceData (source.getSampleData ((int) i, startSample)); - destData.convertSamples (sourceData, numSamples); - } - } - - return write ((const int**) chans.getData(), numSamples); -} - -//============================================================================== -class AudioFormatWriter::ThreadedWriter::Buffer : public TimeSliceClient, - public AbstractFifo -{ -public: - Buffer (TimeSliceThread& timeSliceThread_, AudioFormatWriter* writer_, int numChannels, int bufferSize_) - : AbstractFifo (bufferSize_), - buffer (numChannels, bufferSize_), - timeSliceThread (timeSliceThread_), - writer (writer_), - receiver (nullptr), - samplesWritten (0), - isRunning (true) - { - timeSliceThread.addTimeSliceClient (this); - } - - ~Buffer() - { - isRunning = false; - timeSliceThread.removeTimeSliceClient (this); - - while (writePendingData() == 0) - {} - } - - bool write (const float** 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; - 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); - } - - finishedWrite (size1 + size2); - timeSliceThread.notify(); - return true; - } - - int useTimeSlice() - { - return writePendingData(); - } - - int writePendingData() - { - const int numToDo = getTotalSize() / 4; - - int start1, size1, start2, size2; - 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; - } - - finishedRead (size1 + size2); - return 0; - } - - void setDataReceiver (IncomingDataReceiver* newReceiver) - { - if (newReceiver != nullptr) - newReceiver->reset (buffer.getNumChannels(), writer->getSampleRate(), 0); - - const ScopedLock sl (thumbnailLock); - receiver = newReceiver; - samplesWritten = 0; - } - -private: - AudioSampleBuffer buffer; - TimeSliceThread& timeSliceThread; - ScopedPointer writer; - CriticalSection thumbnailLock; - IncomingDataReceiver* receiver; - int64 samplesWritten; - 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** data, int numSamples) -{ - return buffer->write (data, numSamples); -} - -void AudioFormatWriter::ThreadedWriter::setDataReceiver (AudioFormatWriter::ThreadedWriter::IncomingDataReceiver* receiver) -{ - buffer->setDataReceiver (receiver); -} diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatWriter.h b/src/juce/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatWriter.h deleted file mode 100644 index 9f1ce1a6..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatWriter.h +++ /dev/null @@ -1,259 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_AUDIOFORMATWRITER_JUCEHEADER__ -#define __JUCE_AUDIOFORMATWRITER_JUCEHEADER__ - -#include "juce_AudioFormatReader.h" - - -//============================================================================== -/** - 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; - - //============================================================================== - /** 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); - - //============================================================================== - /** 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** 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* receiver); - - private: - class Buffer; - friend class ScopedPointer; - 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** 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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioSubsectionReader.cpp b/src/juce/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioSubsectionReader.cpp deleted file mode 100644 index 73323fc9..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioSubsectionReader.cpp +++ /dev/null @@ -1,83 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce 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) -{ - if (startSampleInFile + numSamples > length) - { - for (int i = numDestChannels; --i >= 0;) - if (destSamples[i] != nullptr) - zeromem (destSamples[i], sizeof (int) * (size_t) numSamples); - - numSamples = jmin (numSamples, (int) (length - startSampleInFile)); - - if (numSamples <= 0) - return true; - } - - return source->readSamples (destSamples, numDestChannels, startOffsetInDestBuffer, - startSampleInFile + startSample, numSamples); -} - -void AudioSubsectionReader::readMaxLevels (int64 startSampleInFile, - int64 numSamples, - float& lowestLeft, - float& highestLeft, - float& lowestRight, - float& highestRight) -{ - startSampleInFile = jmax ((int64) 0, startSampleInFile); - numSamples = jmax ((int64) 0, jmin (numSamples, length - startSampleInFile)); - - source->readMaxLevels (startSampleInFile + startSample, numSamples, - lowestLeft, highestLeft, - lowestRight, highestRight); -} diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioSubsectionReader.h b/src/juce/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioSubsectionReader.h deleted file mode 100644 index 803c42ff..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioSubsectionReader.h +++ /dev/null @@ -1,90 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_AUDIOSUBSECTIONREADER_JUCEHEADER__ -#define __JUCE_AUDIOSUBSECTIONREADER_JUCEHEADER__ - -#include "juce_AudioFormatReader.h" - - -//============================================================================== -/** - 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 a 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); - - void readMaxLevels (int64 startSample, - int64 numSamples, - float& lowestLeft, - float& highestLeft, - float& lowestRight, - float& highestRight); - - -private: - //============================================================================== - AudioFormatReader* const source; - int64 startSample, length; - const bool deleteSourceWhenDeleted; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioSubsectionReader); -}; - -#endif // __JUCE_AUDIOSUBSECTIONREADER_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_formats/juce_audio_formats.cpp b/src/juce/JuceLibraryCode/modules/juce_audio_formats/juce_audio_formats.cpp deleted file mode 100644 index ed543703..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_formats/juce_audio_formats.cpp +++ /dev/null @@ -1,120 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#if defined (__JUCE_AUDIO_FORMATS_JUCEHEADER__) && ! 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 "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" - -#if JUCE_WINDOWS && JUCE_USE_WINDOWS_MEDIA_FORMAT - #include "codecs/juce_WindowsMediaAudioFormat.cpp" -#endif - -} diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_formats/juce_audio_formats.h b/src/juce/JuceLibraryCode/modules/juce_audio_formats/juce_audio_formats.h deleted file mode 100644 index e591be2a..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_formats/juce_audio_formats.h +++ /dev/null @@ -1,116 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_AUDIO_FORMATS_JUCEHEADER__ -#define __JUCE_AUDIO_FORMATS_JUCEHEADER__ - -#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_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 -{ - -// START_AUTOINCLUDE format, codecs, sampler -#ifndef __JUCE_AUDIOFORMAT_JUCEHEADER__ - #include "format/juce_AudioFormat.h" -#endif -#ifndef __JUCE_AUDIOFORMATMANAGER_JUCEHEADER__ - #include "format/juce_AudioFormatManager.h" -#endif -#ifndef __JUCE_AUDIOFORMATREADER_JUCEHEADER__ - #include "format/juce_AudioFormatReader.h" -#endif -#ifndef __JUCE_AUDIOFORMATREADERSOURCE_JUCEHEADER__ - #include "format/juce_AudioFormatReaderSource.h" -#endif -#ifndef __JUCE_AUDIOFORMATWRITER_JUCEHEADER__ - #include "format/juce_AudioFormatWriter.h" -#endif -#ifndef __JUCE_AUDIOSUBSECTIONREADER_JUCEHEADER__ - #include "format/juce_AudioSubsectionReader.h" -#endif -#include "codecs/juce_AiffAudioFormat.h" -#include "codecs/juce_CoreAudioFormat.h" -#include "codecs/juce_FlacAudioFormat.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" -#ifndef __JUCE_SAMPLER_JUCEHEADER__ - #include "sampler/juce_Sampler.h" -#endif -// END_AUTOINCLUDE - -} - -#endif // __JUCE_AUDIO_FORMATS_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_formats/juce_audio_formats.mm b/src/juce/JuceLibraryCode/modules/juce_audio_formats/juce_audio_formats.mm deleted file mode 100644 index c625cb22..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_formats/juce_audio_formats.mm +++ /dev/null @@ -1,26 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#include "juce_audio_formats.cpp" diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_formats/juce_module_info b/src/juce/JuceLibraryCode/modules/juce_audio_formats/juce_module_info deleted file mode 100644 index 06165e17..00000000 --- a/src/juce/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": "2.0.21", - "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/src/juce/JuceLibraryCode/modules/juce_audio_formats/sampler/juce_Sampler.cpp b/src/juce/JuceLibraryCode/modules/juce_audio_formats/sampler/juce_Sampler.cpp deleted file mode 100644 index eb4a23b7..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_formats/sampler/juce_Sampler.cpp +++ /dev/null @@ -1,236 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -//============================================================================== -SamplerSound::SamplerSound (const String& name_, - AudioFormatReader& source, - const BigInteger& midiNotes_, - const int midiNoteForNormalPitch, - const double attackTimeSecs, - const double releaseTimeSecs, - const double maxSampleLengthSeconds) - : name (name_), - midiNotes (midiNotes_), - 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 (const int midiNoteNumber) -{ - return midiNotes [midiNoteNumber]; -} - -bool SamplerSound::appliesToChannel (const int /*midiChannel*/) -{ - return true; -} - - -//============================================================================== -SamplerVoice::SamplerVoice() - : pitchRatio (0.0), - sourceSamplePosition (0.0), - lgain (0.0f), - rgain (0.0f), - 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*/) -{ - const SamplerSound* const sound = dynamic_cast (s); - jassert (sound != nullptr); // this object can only play SamplerSounds! - - if (sound != nullptr) - { - const double targetFreq = MidiMessage::getMidiNoteInHertz (midiNoteNumber); - const double naturalFreq = MidiMessage::getMidiNoteInHertz (sound->midiRootNote); - - pitchRatio = (targetFreq * sound->sourceSampleRate) / (naturalFreq * 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 = 0.0f; - } - } -} - -void SamplerVoice::stopNote (const 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) -{ - const SamplerSound* const playingSound = static_cast (getCurrentlyPlayingSound().getObject()); - - if (playingSound != nullptr) - { - const float* const inL = playingSound->data->getSampleData (0, 0); - const float* const inR = playingSound->data->getNumChannels() > 1 - ? playingSound->data->getSampleData (1, 0) : nullptr; - - float* outL = outputBuffer.getSampleData (0, startSample); - float* outR = outputBuffer.getNumChannels() > 1 ? outputBuffer.getSampleData (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 (false); - break; - } - } - - if (outR != nullptr) - { - *outL++ += l; - *outR++ += r; - } - else - { - *outL++ += (l + r) * 0.5f; - } - - sourceSamplePosition += pitchRatio; - - if (sourceSamplePosition > playingSound->length) - { - stopNote (false); - break; - } - } - } -} diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_formats/sampler/juce_Sampler.h b/src/juce/JuceLibraryCode/modules/juce_audio_formats/sampler/juce_Sampler.h deleted file mode 100644 index 2ee10163..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_formats/sampler/juce_Sampler.h +++ /dev/null @@ -1,154 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_SAMPLER_JUCEHEADER__ -#define __JUCE_SAMPLER_JUCEHEADER__ - - -//============================================================================== -/** - 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 { return name; } - - /** Returns the audio sample data. - This could be 0 if there was a problem loading it. - */ - AudioSampleBuffer* getAudioData() const { return data; } - - - //============================================================================== - bool appliesToNote (const int midiNoteNumber); - bool appliesToChannel (const int midiChannel); - - -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* sound); - - void startNote (const int midiNoteNumber, - const float velocity, - SynthesiserSound* sound, - const int currentPitchWheelPosition); - - void stopNote (const bool allowTailOff); - - void pitchWheelMoved (const int newValue); - void controllerMoved (const int controllerNumber, - const int newValue); - - void renderNextBlock (AudioSampleBuffer& outputBuffer, int startSample, int numSamples); - - -private: - //============================================================================== - double pitchRatio; - double sourceSamplePosition; - float lgain, rgain, attackReleaseLevel, attackDelta, releaseDelta; - bool isInAttack, isInRelease; - - JUCE_LEAK_DETECTOR (SamplerVoice); -}; - - -#endif // __JUCE_SAMPLER_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormat.cpp b/src/juce/JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormat.cpp deleted file mode 100644 index 32f992a5..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormat.cpp +++ /dev/null @@ -1,27 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -AudioPluginFormat::AudioPluginFormat() noexcept {} -AudioPluginFormat::~AudioPluginFormat() {} diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormat.h b/src/juce/JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormat.h deleted file mode 100644 index 3cf9e8b2..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormat.h +++ /dev/null @@ -1,115 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_AUDIOPLUGINFORMAT_JUCEHEADER__ -#define __JUCE_AUDIOPLUGINFORMAT_JUCEHEADER__ - -#include "../processors/juce_AudioPluginInstance.h" -class PluginDescription; - - -//============================================================================== -/** - The base class for a type of plugin format, such as VST, AudioUnit, LADSPA, etc. - - Use the static getNumFormats() and getFormat() calls to find the types - of format that are available. -*/ -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) = 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; - - /** 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; - - /** 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 can't be scanned-for - (i.e. it's an internal format that doesn't live in files) - */ - virtual FileSearchPath getDefaultLocationsToSearch() = 0; - - -protected: - //============================================================================== - AudioPluginFormat() noexcept; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioPluginFormat); -}; - - -#endif // __JUCE_AUDIOPLUGINFORMAT_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormatManager.cpp b/src/juce/JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormatManager.cpp deleted file mode 100644 index 568aee22..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormatManager.cpp +++ /dev/null @@ -1,125 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -AudioPluginFormatManager::AudioPluginFormatManager() -{ -} - -AudioPluginFormatManager::~AudioPluginFormatManager() -{ - clearSingletonInstance(); -} - -juce_ImplementSingleton_SingleThreaded (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 && ! (JUCE_MAC && JUCE_64BIT) - jassert (dynamic_cast (formats[i]) == nullptr); - #endif - - #if JUCE_PLUGINHOST_AU && JUCE_MAC - jassert (dynamic_cast (formats[i]) == nullptr); - #endif - - #if JUCE_PLUGINHOST_DX && JUCE_WINDOWS - 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 && ! (JUCE_MAC && JUCE_64BIT) - formats.add (new VSTPluginFormat()); - #endif - - #if JUCE_PLUGINHOST_DX && JUCE_WINDOWS - formats.add (new DirectXPluginFormat()); - #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, - String& errorMessage) const -{ - AudioPluginInstance* result = nullptr; - - for (int i = 0; i < formats.size(); ++i) - { - result = formats.getUnchecked(i)->createInstanceFromDescription (description); - - if (result != nullptr) - break; - } - - if (result == nullptr) - { - if (! doesPluginStillExist (description)) - errorMessage = TRANS ("This plug-in file no longer exists"); - else - errorMessage = TRANS ("This plug-in failed to load correctly"); - } - - return result; -} - -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/src/juce/JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormatManager.h b/src/juce/JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormatManager.h deleted file mode 100644 index 627845a1..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormatManager.h +++ /dev/null @@ -1,102 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_AUDIOPLUGINFORMATMANAGER_JUCEHEADER__ -#define __JUCE_AUDIOPLUGINFORMATMANAGER_JUCEHEADER__ - -#include "juce_AudioPluginFormat.h" - - -//============================================================================== -/** - This maintains a list of known AudioPluginFormats. - - @see AudioPluginFormat -*/ -class JUCE_API AudioPluginFormatManager : public DeletedAtShutdown -{ -public: - //============================================================================== - AudioPluginFormatManager(); - - /** Destructor. */ - ~AudioPluginFormatManager(); - - juce_DeclareSingleton_SingleThreaded (AudioPluginFormatManager, false); - - //============================================================================== - /** 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 0 and leaves a message in the - errorMessage string. - */ - AudioPluginInstance* createPluginInstance (const PluginDescription& description, - 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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.h b/src/juce/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.h deleted file mode 100644 index 985c3053..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_AUDIOUNITPLUGINFORMAT_JUCEHEADER__ -#define __JUCE_AUDIOUNITPLUGINFORMAT_JUCEHEADER__ - -#include "../format/juce_AudioPluginFormat.h" - -#if JUCE_PLUGINHOST_AU && JUCE_MAC - -//============================================================================== -/** - Implements a plugin format manager for AudioUnits. -*/ -class JUCE_API AudioUnitPluginFormat : public AudioPluginFormat -{ -public: - //============================================================================== - AudioUnitPluginFormat(); - ~AudioUnitPluginFormat(); - - //============================================================================== - String getName() const { return "AudioUnit"; } - void findAllTypesForFile (OwnedArray & results, const String& fileOrIdentifier); - AudioPluginInstance* createInstanceFromDescription (const PluginDescription& desc); - bool fileMightContainThisPluginType (const String& fileOrIdentifier); - String getNameOfPluginFromIdentifier (const String& fileOrIdentifier); - StringArray searchPathsForPlugins (const FileSearchPath& directoriesToSearch, bool recursive); - bool doesPluginStillExist (const PluginDescription& desc); - FileSearchPath getDefaultLocationsToSearch(); - -private: - //============================================================================== - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioUnitPluginFormat); -}; - -#endif - -#endif // __JUCE_AUDIOUNITPLUGINFORMAT_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm b/src/juce/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm deleted file mode 100644 index 74e24c75..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm +++ /dev/null @@ -1,1465 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#if JUCE_PLUGINHOST_AU && JUCE_MAC - -} // (juce namespace) - -#include -#include -#include - -#if JUCE_SUPPORT_CARBON - #include - #include -#endif - -namespace juce -{ - -#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 log(a) Logger::writeToLog(a); -#else - #define log(a) -#endif - -namespace AudioUnitFormatHelpers -{ - static int insideCallback = 0; - - String osTypeToString (OSType type) - { - 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 (const String& s1) - { - const String s (s1 + " "); - - 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 createAUPluginIdentifier (const ComponentDescription& desc) - { - jassert (osTypeToString ('abcd') == "abcd"); // agh, must have got the endianness wrong.. - jassert (stringToOSType ("abcd") == (OSType) 'abcd'); // ditto - - 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 getAUDetails (ComponentRecord* comp, String& name, String& manufacturer) - { - Handle componentNameHandle = NewHandle (sizeof (void*)); - Handle componentInfoHandle = NewHandle (sizeof (void*)); - - if (componentNameHandle != 0 && componentInfoHandle != 0) - { - ComponentDescription desc; - - if (GetComponentInfo (comp, &desc, componentNameHandle, componentInfoHandle, 0) == noErr) - { - ConstStr255Param nameString = (ConstStr255Param) (*componentNameHandle); - ConstStr255Param infoString = (ConstStr255Param) (*componentInfoHandle); - - if (nameString != 0 && nameString[0] != 0) - { - const String all ((const char*) nameString + 1, nameString[0]); - DBG ("name: "+ all); - - manufacturer = all.upToFirstOccurrenceOf (":", false, false).trim(); - name = all.fromFirstOccurrenceOf (":", false, false).trim(); - } - - if (infoString != 0 && infoString[0] != 0) - { - DBG ("info: " + String ((const char*) infoString + 1, infoString[0])); - } - - if (name.isEmpty()) - name = ""; - } - - DisposeHandle (componentNameHandle); - DisposeHandle (componentInfoHandle); - } - } - - bool getComponentDescFromIdentifier (const String& fileOrIdentifier, ComponentDescription& desc, - String& name, String& version, String& manufacturer) - { - zerostruct (desc); - - if (fileOrIdentifier.startsWithIgnoreCase (auIdentifierPrefix)) - { - String s (fileOrIdentifier.substring (jmax (fileOrIdentifier.lastIndexOfChar (':'), - fileOrIdentifier.lastIndexOfChar ('/')) + 1)); - - StringArray tokens; - tokens.addTokens (s, ",", String::empty); - tokens.trim(); - tokens.removeEmptyStrings(); - - if (tokens.size() == 3) - { - desc.componentType = stringToOSType (tokens[0]); - desc.componentSubType = stringToOSType (tokens[1]); - desc.componentManufacturer = stringToOSType (tokens[2]); - - ComponentRecord* comp = FindNextComponent (0, &desc); - - if (comp != nullptr) - { - getAUDetails (comp, name, manufacturer); - return true; - } - } - } - - return false; - } - - bool getComponentDescFromFile (const String& fileOrIdentifier, ComponentDescription& desc, - String& name, String& version, String& manufacturer) - { - zerostruct (desc); - - if (getComponentDescFromIdentifier (fileOrIdentifier, desc, name, version, manufacturer)) - return true; - - const File file (fileOrIdentifier); - if (! file.hasFileExtension (".component")) - return false; - - const char* const utf8 = fileOrIdentifier.toUTF8(); - CFURLRef url = CFURLCreateFromFileSystemRepresentation (0, (const UInt8*) utf8, - strlen (utf8), file.isDirectory()); - if (url != 0) - { - 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); - - short resFileId = CFBundleOpenBundleResourceMap (bundleRef); - UseResFile (resFileId); - - for (int i = 1; i <= Count1Resources ('thng'); ++i) - { - Handle h = Get1IndResource ('thng', i); - - if (h != 0) - { - 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]; - 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& fileOrIdentifier) - : fileOrIdentifier (fileOrIdentifier), - wantsMidiMessages (false), wasPlaying (false), prepared (false), - currentBuffer (nullptr), - numInputBusChannels (0), - numOutputBusChannels (0), - numInputBusses (0), - numOutputBusses (0), - audioUnit (0) - { - using namespace AudioUnitFormatHelpers; - - try - { - ++insideCallback; - - log ("Opening AU: " + fileOrIdentifier); - - if (getComponentDescFromFile (fileOrIdentifier, componentDesc, pluginName, version, manufacturer)) - { - ComponentRecord* const comp = FindNextComponent (0, &componentDesc); - - if (comp != nullptr) - { - audioUnit = (AudioUnit) OpenComponent (comp); - - wantsMidiMessages = componentDesc.componentType == kAudioUnitType_MusicDevice - || componentDesc.componentType == kAudioUnitType_MusicEffect; - } - } - - --insideCallback; - } - catch (...) - { - --insideCallback; - } - } - - ~AudioUnitPluginInstance() - { - const ScopedLock sl (lock); - - jassert (AudioUnitFormatHelpers::insideCallback == 0); - - if (audioUnit != 0) - { - AudioUnitUninitialize (audioUnit); - CloseComponent (audioUnit); - audioUnit = 0; - } - } - - void initialise() - { - refreshParameterListFromPlugin(); - updateNumChannels(); - setPluginCallbacks(); - setPlayConfigDetails (numInputBusChannels * numInputBusses, - numOutputBusChannels * numOutputBusses, 0, 0); - setLatencySamples (0); - } - - //============================================================================== - // AudioPluginInstance methods: - - void fillInPluginDescription (PluginDescription& desc) const - { - desc.name = pluginName; - desc.descriptiveName = pluginName; - desc.fileOrIdentifier = AudioUnitFormatHelpers::createAUPluginIdentifier (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() { return audioUnit; } - const String getName() const { return pluginName; } - bool acceptsMidi() const { return wantsMidiMessages; } - bool producesMidi() const { return false; } - - //============================================================================== - // AudioProcessor methods: - - void prepareToPlay (double sampleRate_, int estimatedSamplesPerBlock) - { - if (audioUnit != 0) - { - releaseResources(); - updateNumChannels(); - - Float64 sampleRateIn = 0, sampleRateOut = 0; - UInt32 sampleRateSize = sizeof (sampleRateIn); - const Float64 sr = sampleRate_; - - 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)); - } - - setPlayConfigDetails (numInputBusChannels * numInputBusses, - numOutputBusChannels * numOutputBusses, - sampleRate_, estimatedSamplesPerBlock); - - Float64 latencySecs = 0.0; - UInt32 latencySize = sizeof (latencySecs); - AudioUnitGetProperty (audioUnit, kAudioUnitProperty_Latency, kAudioUnitScope_Global, - 0, &latencySecs, &latencySize); - - setLatencySamples (roundToInt (latencySecs * sampleRate_)); - - for (int i = 0; i < numInputBusses; ++i) AudioUnitReset (audioUnit, kAudioUnitScope_Input, i); - for (int i = 0; i < numOutputBusses; ++i) AudioUnitReset (audioUnit, kAudioUnitScope_Output, i); - - AudioUnitReset (audioUnit, kAudioUnitScope_Global, 0); - - { - AudioStreamBasicDescription stream = { 0 }; - stream.mSampleRate = sampleRate_; - 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; - - prepared = (AudioUnitInitialize (audioUnit) == noErr); - } - } - - void releaseResources() - { - if (prepared) - { - AudioUnitUninitialize (audioUnit); - - for (int i = 0; i < numInputBusses; ++i) AudioUnitReset (audioUnit, kAudioUnitScope_Input, i); - for (int i = 0; i < numOutputBusses; ++i) AudioUnitReset (audioUnit, kAudioUnitScope_Output, i); - - AudioUnitReset (audioUnit, kAudioUnitScope_Global, 0); - - outputBufferList.free(); - currentBuffer = nullptr; - prepared = false; - } - } - - void processBlock (AudioSampleBuffer& buffer, MidiBuffer& midiMessages) - { - const int numSamples = buffer.getNumSamples(); - - if (prepared) - { - timeStamp.mHostTime = AudioGetCurrentHostTime(); - - for (int i = 0; i < numOutputBusses; ++i) - { - 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.getSampleData (i * numOutputBusChannels + j, 0); - } - } - - currentBuffer = &buffer; - - if (wantsMidiMessages) - { - const uint8* midiEventData; - int midiEventSize, midiEventPosition; - MidiBuffer::Iterator i (midiMessages); - - while (i.getNextEvent (midiEventData, midiEventSize, midiEventPosition)) - { - if (midiEventSize <= 3) - MusicDeviceMIDIEvent (audioUnit, - midiEventData[0], midiEventData[1], midiEventData[2], - midiEventPosition); - else - MusicDeviceSysEx (audioUnit, midiEventData, midiEventSize); - } - - midiMessages.clear(); - } - - AudioUnitRenderActionFlags flags = 0; - - for (int i = 0; i < numOutputBusses; ++i) - 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()); - } - } - - //============================================================================== - bool hasEditor() const { return true; } - AudioProcessorEditor* createEditor(); - - //============================================================================== - const String getInputChannelName (int index) const - { - if (isPositiveAndBelow (index, getNumInputChannels())) - return "Input " + String (index + 1); - - return String::empty; - } - - const String getOutputChannelName (int index) const - { - if (isPositiveAndBelow (index, getNumOutputChannels())) - return "Output " + String (index + 1); - - return String::empty; - } - - bool isInputChannelStereoPair (int index) const { return isPositiveAndBelow (index, getNumInputChannels()); } - bool isOutputChannelStereoPair (int index) const { return isPositiveAndBelow (index, getNumOutputChannels()); } - - //============================================================================== - int getNumParameters() { return parameterIds.size(); } - - float getParameter (int index) - { - const ScopedLock sl (lock); - - Float32 value = 0.0f; - - if (audioUnit != 0 && isPositiveAndBelow (index, parameterIds.size())) - AudioUnitGetParameter (audioUnit, - (UInt32) parameterIds.getUnchecked (index), - kAudioUnitScope_Global, 0, - &value); - - return value; - } - - void setParameter (int index, float newValue) - { - const ScopedLock sl (lock); - - if (audioUnit != 0 && isPositiveAndBelow (index, parameterIds.size())) - AudioUnitSetParameter (audioUnit, - (UInt32) parameterIds.getUnchecked (index), - kAudioUnitScope_Global, 0, - newValue, 0); - } - - const String getParameterName (int index) - { - AudioUnitParameterInfo info = { 0 }; - UInt32 sz = sizeof (info); - String name; - - if (AudioUnitGetProperty (audioUnit, - kAudioUnitProperty_ParameterInfo, - kAudioUnitScope_Global, - parameterIds [index], &info, &sz) == noErr) - { - if ((info.flags & kAudioUnitParameterFlag_HasCFNameString) != 0) - name = String::fromCFString (info.cfNameString); - else - name = String (info.name, sizeof (info.name)); - } - - return name; - } - - const String getParameterText (int index) { return String (getParameter (index)); } - - bool isParameterAutomatable (int index) const - { - AudioUnitParameterInfo info; - UInt32 sz = sizeof (info); - - if (AudioUnitGetProperty (audioUnit, kAudioUnitProperty_ParameterInfo, - kAudioUnitScope_Global, parameterIds [index], &info, &sz) == noErr) - { - return (info.flags & kAudioUnitParameterFlag_NonRealTime) == 0; - } - - return true; - } - - //============================================================================== - int getNumPrograms() - { - 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() - { - 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) - { - AUPreset current; - current.presetNumber = newIndex; - current.presetName = CFSTR(""); - - AudioUnitSetProperty (audioUnit, kAudioUnitProperty_PresentPreset, - kAudioUnitScope_Global, 0, ¤t, sizeof (AUPreset)); - } - - const String getProgramName (int index) - { - 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) - { - const AUPreset* p = (const AUPreset*) CFArrayGetValueAtIndex (presets, i); - - if (p != nullptr && p->presetNumber == index) - { - s = String::fromCFString (p->presetName); - break; - } - } - - CFRelease (presets); - } - - return s; - } - - void changeProgramName (int index, const String& newName) - { - jassertfalse; // xxx not implemented! - } - - //============================================================================== - void getStateInformation (MemoryBlock& destData) - { - getCurrentProgramStateInformation (destData); - } - - void getCurrentProgramStateInformation (MemoryBlock& destData) - { - 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) - { - setCurrentProgramStateInformation (data, sizeInBytes); - } - - void setCurrentProgramStateInformation (const void* data, int sizeInBytes) - { - 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) - AudioUnitSetProperty (audioUnit, - kAudioUnitProperty_ClassInfo, - kAudioUnitScope_Global, - 0, &propertyList, sizeof (propertyList)); - } - - void refreshParameterListFromPlugin() - { - parameterIds.clear(); - - if (audioUnit != 0) - { - UInt32 paramListSize = 0; - AudioUnitGetProperty (audioUnit, kAudioUnitProperty_ParameterList, kAudioUnitScope_Global, - 0, 0, ¶mListSize); - - if (paramListSize > 0) - { - parameterIds.insertMultiple (0, 0, paramListSize / sizeof (int)); - - AudioUnitGetProperty (audioUnit, kAudioUnitProperty_ParameterList, kAudioUnitScope_Global, - 0, parameterIds.getRawDataPointer(), ¶mListSize); - } - } - } - -private: - //============================================================================== - friend class AudioUnitPluginWindowCarbon; - friend class AudioUnitPluginWindowCocoa; - friend class AudioUnitPluginFormat; - - ComponentDescription componentDesc; - String pluginName, manufacturer, version; - String fileOrIdentifier; - CriticalSection lock; - bool wantsMidiMessages, wasPlaying, prepared; - - HeapBlock outputBufferList; - AudioTimeStamp timeStamp; - AudioSampleBuffer* currentBuffer; - int numInputBusChannels, numOutputBusChannels, numInputBusses, numOutputBusses; - - AudioUnit audioUnit; - Array parameterIds; - - void setPluginCallbacks() - { - if (audioUnit != 0) - { - { - AURenderCallbackStruct info = { 0 }; - info.inputProcRefCon = this; - info.inputProc = renderGetInputCallback; - - for (int i = 0; i < numInputBusses; ++i) - AudioUnitSetProperty (audioUnit, kAudioUnitProperty_SetRenderCallback, - kAudioUnitScope_Input, i, &info, sizeof (info)); - } - - { - HostCallbackInfo info = { 0 }; - info.hostUserData = this; - info.beatAndTempoProc = getBeatAndTempoCallback; - info.musicalTimeLocationProc = getMusicalTimeLocationCallback; - info.transportStateProc = getTransportStateCallback; - - AudioUnitSetProperty (audioUnit, kAudioUnitProperty_HostCallbacks, kAudioUnitScope_Global, - 0, &info, sizeof (info)); - } - } - } - - - //============================================================================== - OSStatus renderGetInput (AudioUnitRenderActionFlags* ioActionFlags, - const AudioTimeStamp* inTimeStamp, - UInt32 inBusNumber, - UInt32 inNumberFrames, - AudioBufferList* ioData) const - { - if (currentBuffer != nullptr) - { - jassert (inNumberFrames == currentBuffer->getNumSamples()); // if this ever happens, might need to add extra handling - - for (int i = 0; i < ioData->mNumberBuffers; ++i) - { - const int bufferChannel = inBusNumber * numInputBusChannels + i; - - if (bufferChannel < currentBuffer->getNumChannels()) - { - memcpy (ioData->mBuffers[i].mData, - currentBuffer->getSampleData (bufferChannel, 0), - sizeof (float) * inNumberFrames); - } - else - { - zeromem (ioData->mBuffers[i].mData, - sizeof (float) * inNumberFrames); - } - } - } - - return noErr; - } - - OSStatus getBeatAndTempo (Float64* outCurrentBeat, Float64* outCurrentTempo) const - { - AudioPlayHead* const ph = getPlayHead(); - AudioPlayHead::CurrentPositionInfo result; - - if (ph != nullptr && ph->getCurrentPosition (result)) - { - if (outCurrentBeat != nullptr) *outCurrentBeat = result.ppqPosition; - if (outCurrentTempo != nullptr) *outCurrentTempo = result.bpm; - } - else - { - if (outCurrentBeat != nullptr) *outCurrentBeat = 0; - if (outCurrentTempo != nullptr) *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)) - { - if (outTimeSig_Numerator != nullptr) *outTimeSig_Numerator = result.timeSigNumerator; - if (outTimeSig_Denominator != nullptr) *outTimeSig_Denominator = result.timeSigDenominator; - if (outDeltaSampleOffsetToNextBeat != nullptr) *outDeltaSampleOffsetToNextBeat = 0; //xxx - if (outCurrentMeasureDownBeat != nullptr) *outCurrentMeasureDownBeat = result.ppqPositionOfLastBarStart; //xxx wrong - } - else - { - if (outDeltaSampleOffsetToNextBeat != nullptr) *outDeltaSampleOffsetToNextBeat = 0; - if (outTimeSig_Numerator != nullptr) *outTimeSig_Numerator = 4; - if (outTimeSig_Denominator != nullptr) *outTimeSig_Denominator = 4; - if (outCurrentMeasureDownBeat != nullptr) *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)) - { - if (outIsPlaying != nullptr) - *outIsPlaying = result.isPlaying; - - if (outTransportStateChanged != nullptr) - { - *outTransportStateChanged = result.isPlaying != wasPlaying; - wasPlaying = result.isPlaying; - } - - if (outCurrentSampleInTimeLine != nullptr) - *outCurrentSampleInTimeLine = roundToInt (result.timeInSeconds * getSampleRate()); - - if (outIsCycling != nullptr) *outIsCycling = false; - if (outCycleStartBeat != nullptr) *outCycleStartBeat = 0; - if (outCycleEndBeat != nullptr) *outCycleEndBeat = 0; - } - else - { - if (outIsPlaying != nullptr) *outIsPlaying = false; - if (outTransportStateChanged != nullptr) *outTransportStateChanged = false; - if (outCurrentSampleInTimeLine != nullptr) *outCurrentSampleInTimeLine = 0; - if (outIsCycling != nullptr) *outIsCycling = false; - if (outCycleStartBeat != nullptr) *outCycleStartBeat = 0; - if (outCycleEndBeat != nullptr) *outCycleEndBeat = 0; - } - - return noErr; - } - - //============================================================================== - static OSStatus renderGetInputCallback (void* inRefCon, AudioUnitRenderActionFlags* ioActionFlags, - const AudioTimeStamp* inTimeStamp, UInt32 inBusNumber, - UInt32 inNumberFrames, AudioBufferList* ioData) - { - return static_cast (inRefCon) - ->renderGetInput (ioActionFlags, inTimeStamp, inBusNumber, inNumberFrames, ioData); - } - - static OSStatus getBeatAndTempoCallback (void* inHostUserData, Float64* outCurrentBeat, Float64* outCurrentTempo) - { - return static_cast (inHostUserData) - ->getBeatAndTempo (outCurrentBeat, outCurrentTempo); - } - - static OSStatus getMusicalTimeLocationCallback (void* inHostUserData, UInt32* outDeltaSampleOffsetToNextBeat, - Float32* outTimeSig_Numerator, UInt32* outTimeSig_Denominator, - Float64* outCurrentMeasureDownBeat) - { - return static_cast (inHostUserData) - ->getMusicalTimeLocation (outDeltaSampleOffsetToNextBeat, outTimeSig_Numerator, - outTimeSig_Denominator, outCurrentMeasureDownBeat); - } - - static OSStatus getTransportStateCallback (void* inHostUserData, Boolean* outIsPlaying, Boolean* outTransportStateChanged, - Float64* outCurrentSampleInTimeLine, Boolean* outIsCycling, - Float64* outCycleStartBeat, Float64* outCycleEndBeat) - { - return static_cast (inHostUserData) - ->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 < 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; - } - } - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioUnitPluginInstance); -}; - -//============================================================================== -class AudioUnitPluginWindowCocoa : public AudioProcessorEditor, - public Timer -{ -public: - AudioUnitPluginWindowCocoa (AudioUnitPluginInstance& plugin_, const bool createGenericViewIfNeeded) - : AudioProcessorEditor (&plugin_), - plugin (plugin_) - { - addAndMakeVisible (&wrapper); - - setOpaque (true); - setVisible (true); - setSize (100, 100); - - createView (createGenericViewIfNeeded); - } - - ~AudioUnitPluginWindowCocoa() - { - const bool wasValid = isValid(); - - wrapper.setVisible (false); - removeChildComponent (&wrapper); - wrapper.setView (nil); - - if (wasValid) - plugin.editorBeingDeleted (this); - } - - bool isValid() const { return wrapper.getView() != nil; } - - void paint (Graphics& g) - { - g.fillAll (Colours::white); - } - - void resized() - { - wrapper.setSize (getWidth(), getHeight()); - } - - void timerCallback() - { - wrapper.resizeToFitView(); - startTimer (jmin (713, getTimerInterval() + 51)); - } - - void childBoundsChanged (Component* child) - { - setSize (wrapper.getWidth(), wrapper.getHeight()); - startTimer (70); - } - -private: - AudioUnitPluginInstance& plugin; - NSViewComponent wrapper; - - bool createView (const bool createGenericViewIfNeeded) - { - NSView* pluginView = nil; - UInt32 dataSize = 0; - Boolean isWritable = false; - - AudioUnitInitialize (plugin.audioUnit); - - 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 == 0)) - { - { - // This forces CoreAudio.component to be loaded, otherwise the AUGenericView will assert - ComponentDescription 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) - { - timerCallback(); - startTimer (70); - } - - return pluginView != nil; - } -}; - -#if JUCE_SUPPORT_CARBON - -//============================================================================== -class AudioUnitPluginWindowCarbon : public AudioProcessorEditor -{ -public: - AudioUnitPluginWindowCarbon (AudioUnitPluginInstance& plugin_) - : AudioProcessorEditor (&plugin_), - plugin (plugin_), - componentRecord (nullptr), - viewComponent (0) - { - 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) - { - ComponentDescription views [propertySize / sizeof (ComponentDescription)]; - - if (AudioUnitGetProperty (plugin.audioUnit, kAudioUnitProperty_GetUIComponentList, - kAudioUnitScope_Global, 0, &views[0], &propertySize) == noErr) - { - componentRecord = FindNextComponent (0, &views[0]); - } - } - } - - ~AudioUnitPluginWindowCarbon() - { - innerWrapper = nullptr; - - if (isValid()) - plugin.editorBeingDeleted (this); - } - - bool isValid() const noexcept { return componentRecord != nullptr; } - - //============================================================================== - void paint (Graphics& g) - { - g.fillAll (Colours::black); - } - - void resized() - { - if (innerWrapper != nullptr) - innerWrapper->setSize (getWidth(), getHeight()); - } - - //============================================================================== - bool keyStateChanged (bool) { return false; } - bool keyPressed (const KeyPress&) { return false; } - - //============================================================================== - AudioUnit getAudioUnit() const { return plugin.audioUnit; } - - AudioUnitCarbonView getViewComponent() - { - if (viewComponent == 0 && componentRecord != nullptr) - viewComponent = (AudioUnitCarbonView) OpenComponent (componentRecord); - - return viewComponent; - } - - void closeViewComponent() - { - if (viewComponent != 0) - { - log ("Closing AU GUI: " + plugin.getName()); - - CloseComponent (viewComponent); - viewComponent = 0; - } - } - -private: - //============================================================================== - AudioUnitPluginInstance& plugin; - ComponentRecord* componentRecord; - AudioUnitCarbonView viewComponent; - - //============================================================================== - class InnerWrapperComponent : public CarbonViewWrapperComponent - { - public: - InnerWrapperComponent (AudioUnitPluginWindowCarbon& owner_) - : owner (owner_) - { - } - - ~InnerWrapperComponent() - { - deleteWindow(); - } - - HIViewRef attachView (WindowRef windowRef, HIViewRef rootView) - { - log ("Opening AU GUI: " + owner.plugin.getName()); - - AudioUnitCarbonView viewComponent = owner.getViewComponent(); - - if (viewComponent == 0) - return 0; - - Float32Point pos = { 0, 0 }; - Float32Point size = { 250, 200 }; - - HIViewRef pluginView = 0; - - AudioUnitCarbonViewCreate (viewComponent, - owner.getAudioUnit(), - windowRef, - rootView, - &pos, - &size, - (ControlRef*) &pluginView); - - return pluginView; - } - - void removeView (HIViewRef) - { - 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)); - AudioUnitPluginInstance* const auInstance = dynamic_cast ((AudioPluginInstance*) createdInstance); - - if (auInstance != nullptr) - { - auInstance->fillInPluginDescription (desc); - results.add (new PluginDescription (desc)); - } - } - catch (...) - { - // crashed while loading... - } -} - -AudioPluginInstance* AudioUnitPluginFormat::createInstanceFromDescription (const PluginDescription& desc) -{ - if (fileMightContainThisPluginType (desc.fileOrIdentifier)) - { - ScopedPointer result (new AudioUnitPluginInstance (desc.fileOrIdentifier)); - - if (result->audioUnit != 0) - { - result->initialise(); - return result.release(); - } - } - - return nullptr; -} - -StringArray AudioUnitPluginFormat::searchPathsForPlugins (const FileSearchPath& /*directoriesToSearch*/, - const bool /*recursive*/) -{ - StringArray result; - ComponentRecord* comp = nullptr; - - for (;;) - { - ComponentDescription desc = { 0 }; - comp = FindNextComponent (comp, &desc); - - if (comp == 0) - break; - - GetComponentInfo (comp, &desc, 0, 0, 0); - - if (desc.componentType == kAudioUnitType_MusicDevice - || desc.componentType == kAudioUnitType_MusicEffect - || desc.componentType == kAudioUnitType_Effect - || desc.componentType == kAudioUnitType_Generator - || desc.componentType == kAudioUnitType_Panner) - { - const String s (AudioUnitFormatHelpers::createAUPluginIdentifier (desc)); - DBG (s); - result.add (s); - } - } - - return result; -} - -bool AudioUnitPluginFormat::fileMightContainThisPluginType (const String& fileOrIdentifier) -{ - ComponentDescription desc; - - String name, version, manufacturer; - if (AudioUnitFormatHelpers::getComponentDescFromIdentifier (fileOrIdentifier, desc, name, version, manufacturer)) - return FindNextComponent (0, &desc) != 0; - - const File f (fileOrIdentifier); - - return f.hasFileExtension (".component") - && f.isDirectory(); -} - -String AudioUnitPluginFormat::getNameOfPluginFromIdentifier (const String& fileOrIdentifier) -{ - ComponentDescription desc; - String name, version, manufacturer; - AudioUnitFormatHelpers::getComponentDescFromIdentifier (fileOrIdentifier, desc, name, version, manufacturer); - - if (name.isEmpty()) - name = fileOrIdentifier; - - return name; -} - -bool AudioUnitPluginFormat::doesPluginStillExist (const PluginDescription& desc) -{ - if (desc.fileOrIdentifier.startsWithIgnoreCase (AudioUnitFormatHelpers::auIdentifierPrefix)) - return fileMightContainThisPluginType (desc.fileOrIdentifier); - else - return File (desc.fileOrIdentifier).exists(); -} - -FileSearchPath AudioUnitPluginFormat::getDefaultLocationsToSearch() -{ - return FileSearchPath ("/(Default AudioUnit locations)"); -} - -#undef log - -#endif diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_DirectXPluginFormat.h b/src/juce/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_DirectXPluginFormat.h deleted file mode 100644 index 80d9f000..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_DirectXPluginFormat.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_DIRECTXPLUGINFORMAT_JUCEHEADER__ -#define __JUCE_DIRECTXPLUGINFORMAT_JUCEHEADER__ - -#include "../format/juce_AudioPluginFormat.h" - -#if JUCE_PLUGINHOST_DX && JUCE_WINDOWS - - -// Sorry, this file is just a placeholder at the moment!... - - -//============================================================================== -/** - Implements a plugin format manager for DirectX plugins. -*/ -class JUCE_API DirectXPluginFormat : public AudioPluginFormat -{ -public: - //============================================================================== - DirectXPluginFormat(); - ~DirectXPluginFormat(); - - //============================================================================== - String getName() const { return "DirectX"; } - void findAllTypesForFile (OwnedArray & results, const String& fileOrIdentifier); - AudioPluginInstance* createInstanceFromDescription (const PluginDescription& desc); - bool fileMightContainThisPluginType (const String& fileOrIdentifier); - String getNameOfPluginFromIdentifier (const String& fileOrIdentifier) { return fileOrIdentifier; } - FileSearchPath getDefaultLocationsToSearch(); - -private: - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DirectXPluginFormat); -}; - -#endif - -#endif // __JUCE_DIRECTXPLUGINFORMAT_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.h b/src/juce/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.h deleted file mode 100644 index 6bd3a481..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_LADSPAPLUGINFORMAT_JUCEHEADER__ -#define __JUCE_LADSPAPLUGINFORMAT_JUCEHEADER__ - -#include "../format/juce_AudioPluginFormat.h" - -#if JUCE_PLUGINHOST_LADSPA && JUCE_LINUX - - -// Sorry, this file is just a placeholder at the moment!... - - -//============================================================================== -/** - Implements a plugin format manager for DirectX plugins. -*/ -class JUCE_API LADSPAPluginFormat : public AudioPluginFormat -{ -public: - //============================================================================== - LADSPAPluginFormat(); - ~LADSPAPluginFormat(); - - //============================================================================== - String getName() const { return "LADSPA"; } - void findAllTypesForFile (OwnedArray & results, const String& fileOrIdentifier); - AudioPluginInstance* createInstanceFromDescription (const PluginDescription& desc); - bool fileMightContainThisPluginType (const String& fileOrIdentifier); - String getNameOfPluginFromIdentifier (const String& fileOrIdentifier) { return fileOrIdentifier; } - FileSearchPath getDefaultLocationsToSearch(); - -private: - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (LADSPAPluginFormat); -}; - -#endif - -#endif // __JUCE_LADSPAPLUGINFORMAT_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VSTMidiEventList.h b/src/juce/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VSTMidiEventList.h deleted file mode 100644 index 89a6c395..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VSTMidiEventList.h +++ /dev/null @@ -1,190 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifdef __aeffect__ - -#ifndef __JUCE_VSTMIDIEVENTLIST_JUCEHEADER__ -#define __JUCE_VSTMIDIEVENTLIST_JUCEHEADER__ - - -//============================================================================== -/** 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, numBytes); - } - else - { - VstMidiSysexEvent* const se = (VstMidiSysexEvent*) e; - - if (se->type == kVstSysExType) - delete[] se->sysexDump; - - se->sysexDump = new char [numBytes]; - memcpy (se->sysexDump, midiData, 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 int size = 20 + sizeof (VstEvent*) * 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_JUCEHEADER__ -#endif // __JUCE_VSTMIDIEVENTLIST_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp b/src/juce/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp deleted file mode 100644 index 16b6be09..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp +++ /dev/null @@ -1,2924 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#if JUCE_PLUGINHOST_VST - -//============================================================================== -#if ! (JUCE_MAC && JUCE_64BIT) - -#if JUCE_MAC && JUCE_SUPPORT_CARBON - #include "../../juce_gui_extra/native/juce_mac_CarbonViewWrapperComponent.h" -#endif - -#if JUCE_MAC - static bool makeFSRefFromPath (FSRef* destFSRef, const String& path) - { - return FSPathMakeRef (reinterpret_cast (path.toUTF8().getAddress()), destFSRef, 0) == noErr; - } -#endif - -//============================================================================== -#undef PRAGMA_ALIGN_SUPPORTED -#define VST_FORCE_DEPRECATED 0 - -#if JUCE_MSVC - #pragma warning (push) - #pragma warning (disable: 4996) -#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 - -#if JUCE_MSVC - #pragma warning (pop) - #pragma warning (disable: 4355) // ("this" used in initialiser list warning) -#endif - -//============================================================================== -#if JUCE_LINUX - #define Font juce::Font - #define KeyPress juce::KeyPress - #define Drawable juce::Drawable - #define Time juce::Time -#endif - -#include "juce_VSTMidiEventList.h" - -#if ! JUCE_WINDOWS - static void _fpreset() {} - static void _clearfp() {} -#endif - -//============================================================================== -const int fxbVersionNum = 1; - -struct fxProgram -{ - long chunkMagic; // 'CcnK' - long byteSize; // of this chunk, excl. magic + byteSize - long fxMagic; // 'FxCk' - long version; - long fxID; // fx unique id - long fxVersion; - long numParams; - char prgName[28]; - float params[1]; // variable no. of parameters -}; - -struct fxSet -{ - long chunkMagic; // 'CcnK' - long byteSize; // of this chunk, excl. magic + byteSize - long fxMagic; // 'FxBk' - long version; - long fxID; // fx unique id - long fxVersion; - long numPrograms; - char future[128]; - fxProgram programs[1]; // variable no. of programs -}; - -struct fxChunkSet -{ - long chunkMagic; // 'CcnK' - long byteSize; // of this chunk, excl. magic + byteSize - long fxMagic; // 'FxCh', 'FPCh', or 'FBCh' - long version; - long fxID; // fx unique id - long fxVersion; - long numPrograms; - char future[128]; - long chunkSize; - char chunk[8]; // variable -}; - -struct fxProgramSet -{ - long chunkMagic; // 'CcnK' - long byteSize; // of this chunk, excl. magic + byteSize - long fxMagic; // 'FxCh', 'FPCh', or 'FBCh' - long version; - long fxID; // fx unique id - long fxVersion; - long numPrograms; - char name[28]; - long chunkSize; - char chunk[8]; // variable -}; - -namespace -{ - long vst_swap (const long x) noexcept - { - #ifdef JUCE_LITTLE_ENDIAN - return (long) ByteOrder::swap ((uint32) x); - #else - return x; - #endif - } - - float vst_swapFloat (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 - } - - double getVSTHostTimeNanoseconds() - { - #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 - } -} - -//============================================================================== -typedef AEffect* (VSTCALLBACK *MainCall) (audioMasterCallback); - -static VstIntPtr VSTCALLBACK audioMaster (AEffect* effect, VstInt32 opcode, VstInt32 index, VstIntPtr value, void* ptr, float opt); - -static int shellUIDToCreate = 0; -static int insideVSTCallback = 0; - -class IdleCallRecursionPreventer -{ -public: - IdleCallRecursionPreventer() - : isMessageThread (MessageManager::getInstance()->isThisTheMessageThread()) - { - if (isMessageThread) - ++insideVSTCallback; - } - - ~IdleCallRecursionPreventer() - { - if (isMessageThread) - --insideVSTCallback; - } - -private: - const bool isMessageThread; - - JUCE_DECLARE_NON_COPYABLE (IdleCallRecursionPreventer); -}; - -class VSTPluginWindow; - -//============================================================================== -// Change this to disable logging of various VST activities -#ifndef VST_LOGGING - #define VST_LOGGING 1 -#endif - -#if VST_LOGGING - #define log(a) Logger::writeToLog(a); -#else - #define log(a) -#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 - -//============================================================================== -#if JUCE_LINUX - -extern Display* display; -extern XContext windowHandleXContext; - -typedef void (*EventProcPtr) (XEvent* ev); - -static bool xErrorTriggered; - -namespace -{ - int temporaryErrorHandler (Display*, XErrorEvent*) - { - xErrorTriggered = true; - return 0; - } - - int 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) - : 0; - } - - Window getChildWindow (Window windowToCheck) - { - Window rootWindow, parentWindow; - Window* childWindows; - unsigned int numChildren; - - XQueryTree (display, - windowToCheck, - &rootWindow, - &parentWindow, - &childWindows, - &numChildren); - - if (numChildren > 0) - return childWindows [0]; - - return 0; - } - - 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; - } - } - - 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; - } - - 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; - } - - 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; - String pluginName; - - 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; - - 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& file_) - : file (file_), - moduleMain (0) - #if JUCE_MAC - , fragId (0), resHandle (0), bundleRef (0), resFileId (0) - #endif - { - getActiveModules().add (this); - - #if JUCE_WINDOWS || JUCE_LINUX - fullParentDirectoryPathName = file_.getParentDirectory().getFullPathName(); - #elif JUCE_MAC - FSRef ref; - makeFSRefFromPath (&ref, file_.getParentDirectory().getFullPathName()); - FSGetCatalogInfo (&ref, kFSCatInfoNone, 0, 0, &parentDirFSSpec, 0); - #endif - } - - ~ModuleHandle() - { - getActiveModules().removeValue (this); - close(); - } - - //============================================================================== -#if JUCE_WINDOWS || JUCE_LINUX - DynamicLibrary module; - String fullParentDirectoryPathName; - - bool open() - { - #if JUCE_WINDOWS - static bool timePeriodSet = false; - - if (! timePeriodSet) - { - timePeriodSet = true; - timeBeginPeriod (2); - } - #endif - - pluginName = file.getFileNameWithoutExtension(); - - module.open (file.getFullPathName()); - - moduleMain = (MainCall) module.getFunction ("VSTPluginMain"); - - if (moduleMain == nullptr) - moduleMain = (MainCall) module.getFunction ("main"); - - 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); - } - -#else - CFragConnectionID fragId; - Handle resHandle; - CFBundleRef bundleRef; - FSSpec parentDirFSSpec; - short resFileId; - - bool open() - { - bool ok = false; - const String filename (file.getFullPathName()); - - if (file.hasFileExtension (".vst")) - { - const char* const utf8 = filename.toUTF8().getAddress(); - CFURLRef url = CFURLCreateFromFileSystemRepresentation (0, (const UInt8*) utf8, - strlen (utf8), file.isDirectory()); - - if (url != 0) - { - bundleRef = CFBundleCreate (kCFAllocatorDefault, url); - CFRelease (url); - - if (bundleRef != 0) - { - if (CFBundleLoadExecutable (bundleRef)) - { - moduleMain = (MainCall) CFBundleGetFunctionPointerForName (bundleRef, CFSTR("main_macho")); - - if (moduleMain == 0) - moduleMain = (MainCall) CFBundleGetFunctionPointerForName (bundleRef, CFSTR("VSTPluginMain")); - - if (moduleMain != 0) - { - CFTypeRef name = CFBundleGetValueForInfoDictionaryKey (bundleRef, CFSTR("CFBundleName")); - - if (name != 0) - { - 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; - } - } - - if (! ok) - { - CFBundleUnloadExecutable (bundleRef); - CFRelease (bundleRef); - bundleRef = 0; - } - } - } - } -#if JUCE_PPC - else - { - FSRef fn; - - if (FSPathMakeRef ((UInt8*) filename.toUTF8().getAddress(), &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 != 0) - 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); -}; - -//============================================================================== -/** - An instance of a plugin, created by a VSTPluginFormat. - -*/ -class VSTPluginInstance : public AudioPluginInstance, - private Timer, - private AsyncUpdater -{ -public: - //============================================================================== - ~VSTPluginInstance(); - - //============================================================================== - // AudioPluginInstance methods: - - void fillInPluginDescription (PluginDescription& desc) const - { - desc.name = name; - - { - char buffer [512] = { 0 }; - dispatch (effGetEffectName, 0, 0, buffer, 0); - - desc.descriptiveName = String (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 = buffer; - } - - desc.version = getVersion(); - desc.numInputChannels = getNumInputChannels(); - desc.numOutputChannels = getNumOutputChannels(); - desc.isInstrument = (effect != nullptr && (effect->flags & effFlagsIsSynth) != 0); - } - - void* getPlatformSpecificData() { return effect; } - const String getName() const { return name; } - int getUID() const; - bool acceptsMidi() const { return wantsMidiMessages; } - bool producesMidi() const { return dispatch (effCanDo, 0, 0, (void*) "sendVstMidiEvent", 0) > 0; } - - //============================================================================== - // AudioProcessor methods: - - void prepareToPlay (double sampleRate, int estimatedSamplesPerBlock); - void releaseResources(); - void processBlock (AudioSampleBuffer& buffer, - MidiBuffer& midiMessages); - - bool hasEditor() const { return effect != nullptr && (effect->flags & effFlagsHasEditor) != 0; } - AudioProcessorEditor* createEditor(); - - const String getInputChannelName (int index) const; - bool isInputChannelStereoPair (int index) const; - - const String getOutputChannelName (int index) const; - bool isOutputChannelStereoPair (int index) const; - - //============================================================================== - int getNumParameters() { return effect != nullptr ? effect->numParams : 0; } - float getParameter (int index); - void setParameter (int index, float newValue); - const String getParameterName (int index); - const String getParameterText (int index); - bool isParameterAutomatable (int index) const; - - //============================================================================== - int getNumPrograms() { return effect != nullptr ? effect->numPrograms : 0; } - int getCurrentProgram() { return dispatch (effGetProgram, 0, 0, 0, 0); } - void setCurrentProgram (int index); - const String getProgramName (int index); - void changeProgramName (int index, const String& newName); - - //============================================================================== - void getStateInformation (MemoryBlock& destData); - void getCurrentProgramStateInformation (MemoryBlock& destData); - void setStateInformation (const void* data, int sizeInBytes); - void setCurrentProgramStateInformation (const void* data, int sizeInBytes); - - //============================================================================== - void timerCallback(); - void handleAsyncUpdate(); - VstIntPtr handleCallback (VstInt32 opcode, VstInt32 index, VstInt32 value, void *ptr, float opt); - -private: - //============================================================================== - friend class VSTPluginWindow; - friend class VSTPluginFormat; - - AEffect* effect; - String name; - CriticalSection lock; - bool wantsMidiMessages, initialised, isPowerOn; - mutable StringArray programNames; - AudioSampleBuffer tempBuffer; - CriticalSection midiInLock; - MidiBuffer incomingMidi; - VSTMidiEventList midiEventsToSend; - VstTimeInfo vstHostTime; - - ReferenceCountedObjectPtr module; - - //============================================================================== - int dispatch (const int opcode, const int index, const int value, void* const ptr, float opt) const; - bool restoreProgramSettings (const fxProgram* const prog); - const String getCurrentProgramName(); - void setParamsInProgramBlock (fxProgram* const prog); - void updateStoredProgramNames(); - void initialise(); - void handleMidiFromPlugin (const VstEvents* const events); - void createTempParameterStore (MemoryBlock& dest); - void restoreFromTempParameterStore (const MemoryBlock& mb); - const String getParameterLabel (int index) const; - - bool usesChunks() const noexcept { return effect != nullptr && (effect->flags & effFlagsProgramChunks) != 0; } - void getChunkData (MemoryBlock& mb, bool isPreset, int maxSizeMB) const; - void setChunkData (const char* data, int size, bool isPreset); - bool loadFromFXBFile (const void* data, int numBytes); - bool saveToFXBFile (MemoryBlock& dest, bool isFXB, int maxSizeMB); - - int getVersionNumber() const noexcept { return effect != nullptr ? effect->version : 0; } - String getVersion() const; - String getCategory() const; - - void setPower (const bool on); - - VSTPluginInstance (const ReferenceCountedObjectPtr & module); - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (VSTPluginInstance); -}; - -//============================================================================== -VSTPluginInstance::VSTPluginInstance (const ReferenceCountedObjectPtr & module_) - : effect (nullptr), - name (module_->pluginName), - wantsMidiMessages (false), - initialised (false), - isPowerOn (false), - tempBuffer (1, 1), - module (module_) -{ - try - { - const IdleCallRecursionPreventer icrp; - _fpreset(); - - 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 - { - effect = module->moduleMain (&audioMaster); - } - - 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::~VSTPluginInstance() -{ - const ScopedLock sl (lock); - - if (effect != nullptr && effect->magic == kEffectMagic) - { - try - { - #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); - } - catch (...) - {} - } - - module = nullptr; - effect = nullptr; -} - -//============================================================================== -void VSTPluginInstance::initialise() -{ - if (initialised || effect == 0) - return; - - log ("Initialising VST: " + module->pluginName); - initialised = true; - - 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); - - int i; - for (i = effect->numInputs; --i >= 0;) - dispatch (effConnectInput, i, 1, 0, 0); - - for (i = effect->numOutputs; --i >= 0;) - dispatch (effConnectOutput, i, 1, 0, 0); - - updateStoredProgramNames(); - - wantsMidiMessages = dispatch (effCanDo, 0, 0, (void*) "receiveVstMidiEvent", 0) > 0; - - setLatencySamples (effect->initialDelay); -} - - -//============================================================================== -void VSTPluginInstance::prepareToPlay (double sampleRate_, - int samplesPerBlockExpected) -{ - setPlayConfigDetails (effect->numInputs, effect->numOutputs, - sampleRate_, samplesPerBlockExpected); - - setLatencySamples (effect->initialDelay); - - vstHostTime.tempo = 120.0; - vstHostTime.timeSigNumerator = 4; - vstHostTime.timeSigDenominator = 4; - vstHostTime.sampleRate = sampleRate_; - vstHostTime.samplePos = 0; - vstHostTime.flags = kVstNanosValid; /*| kVstTransportPlaying | kVstTempoValid | kVstTimeSigValid*/; - - initialise(); - - 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) sampleRate_); - 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); - } -} - -void VSTPluginInstance::releaseResources() -{ - if (initialised) - { - dispatch (effStopProcess, 0, 0, 0, 0); - setPower (false); - } - - tempBuffer.setSize (1, 1); - incomingMidi.clear(); - - midiEventsToSend.freeEvents(); -} - -void VSTPluginInstance::processBlock (AudioSampleBuffer& buffer, - MidiBuffer& midiMessages) -{ - const int numSamples = buffer.getNumSamples(); - - if (initialised) - { - AudioPlayHead* playHead = getPlayHead(); - - if (playHead != nullptr) - { - AudioPlayHead::CurrentPositionInfo position; - playHead->getCurrentPosition (position); - - 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; - - if (position.isPlaying) - vstHostTime.flags |= kVstTransportPlaying; - else - vstHostTime.flags &= ~kVstTransportPlaying; - } - - 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)); - } - - try - { - effect->dispatcher (effect, effProcessEvents, 0, 0, midiEventsToSend.events, 0); - } - catch (...) - {} - } - - _clearfp(); - - if ((effect->flags & effFlagsCanReplacing) != 0) - { - try - { - effect->processReplacing (effect, buffer.getArrayOfChannels(), buffer.getArrayOfChannels(), numSamples); - } - catch (...) - {} - } - else - { - tempBuffer.setSize (effect->numOutputs, numSamples); - tempBuffer.clear(); - - try - { - effect->process (effect, buffer.getArrayOfChannels(), tempBuffer.getArrayOfChannels(), numSamples); - } - catch (...) - {} - - for (int i = effect->numOutputs; --i >= 0;) - buffer.copyFrom (i, 0, tempBuffer.getSampleData (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(); - } -} - -//============================================================================== -void VSTPluginInstance::handleMidiFromPlugin (const VstEvents* const events) -{ - if (events != nullptr) - { - const ScopedLock sl (midiInLock); - VSTMidiEventList::addEventsToMidiBuffer (events, incomingMidi); - } -} - -//============================================================================== -static Array activeVSTWindows; - -//============================================================================== -class VSTPluginWindow : public AudioProcessorEditor, - #if ! JUCE_MAC - public ComponentMovementWatcher, - #endif - public Timer -{ -public: - //============================================================================== - VSTPluginWindow (VSTPluginInstance& plugin_) - : AudioProcessorEditor (&plugin_), - #if ! JUCE_MAC - ComponentMovementWatcher (this), - #endif - plugin (plugin_), - isOpen (false), - recursiveResize (false), - pluginWantsKeys (false), - pluginRefusesToResize (false), - alreadyInside (false) - { - #if JUCE_WINDOWS - sizeCheckCount = 0; - pluginHWND = 0; - #elif JUCE_LINUX - pluginWindow = None; - pluginProc = None; - #else - addAndMakeVisible (innerWrapper = new InnerWrapperComponent (*this)); - #endif - - activeVSTWindows.add (this); - - setSize (1, 1); - setOpaque (true); - setVisible (true); - } - - ~VSTPluginWindow() - { - #if JUCE_MAC - innerWrapper = nullptr; - #else - closePluginWindow(); - #endif - - activeVSTWindows.removeValue (this); - plugin.editorBeingDeleted (this); - } - - //============================================================================== -#if ! JUCE_MAC - void componentMovedOrResized (bool /*wasMoved*/, bool /*wasResized*/) - { - 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() - { - if (isShowing()) - openPluginWindow(); - else - closePluginWindow(); - - componentMovedOrResized (true, true); - } - - void componentPeerChanged() - { - closePluginWindow(); - openPluginWindow(); - } -#endif - - //============================================================================== - bool keyStateChanged (bool) - { - return pluginWantsKeys; - } - - bool keyPressed (const KeyPress&) - { - return pluginWantsKeys; - } - - //============================================================================== -#if JUCE_MAC - void paint (Graphics& g) - { - g.fillAll (Colours::black); - } -#else - void paint (Graphics& g) - { - if (isOpen) - { - ComponentPeer* const peer = getPeer(); - - if (peer != nullptr) - { - peer->addMaskedRegion (getScreenBounds() - peer->getScreenPosition()); - - #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() - { - #if JUCE_WINDOWS - if (--sizeCheckCount <= 0) - { - sizeCheckCount = 10; - - checkPluginWindowSize(); - } - #endif - - try - { - static bool reentrant = false; - - if (! reentrant) - { - reentrant = true; - plugin.dispatch (effEditIdle, 0, 0, 0, 0); - reentrant = false; - } - } - catch (...) - {} - } - - //============================================================================== - void mouseDown (const MouseEvent& e) - { - #if JUCE_LINUX - if (pluginWindow == 0) - return; - - toFront (true); - - XEvent ev = { 0 }; - ev.xbutton.display = display; - ev.xbutton.type = ButtonPress; - ev.xbutton.window = pluginWindow; - ev.xbutton.root = RootWindow (display, DefaultScreen (display)); - ev.xbutton.time = CurrentTime; - ev.xbutton.x = e.x; - ev.xbutton.y = e.y; - ev.xbutton.x_root = e.getScreenX(); - ev.xbutton.y_root = e.getScreenY(); - - translateJuceToXButtonModifiers (e, ev); - - sendEventToChild (&ev); - - #elif JUCE_WINDOWS - (void) e; - - toFront (true); - #endif - } - - void broughtToFront() - { - activeVSTWindows.removeValue (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 - - //============================================================================== -#if JUCE_MAC - void openPluginWindow (WindowRef 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; - - log ("Opening VST UI: " + plugin.name); - 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) - - originalWndProc = (void*) GetWindowLongPtr (pluginHWND, GWLP_WNDPROC); - - if (! pluginWantsKeys) - SetWindowLongPtr (pluginHWND, GWLP_WNDPROC, (LONG_PTR) vstHookWndProc); - - #pragma warning (pop) - - int w, h; - RECT r; - GetWindowRect (pluginHWND, &r); - w = r.right - r.left; - 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 - - //============================================================================== -#if ! JUCE_MAC - void closePluginWindow() - { - if (isOpen) - { - log ("Closing VST UI: " + plugin.getName()); - isOpen = false; - - dispatch (effEditClose, 0, 0, 0, 0); - - #if JUCE_WINDOWS - #pragma warning (push) - #pragma warning (disable: 4244) - - if (pluginHWND != 0 && IsWindow (pluginHWND)) - SetWindowLongPtr (pluginHWND, GWLP_WNDPROC, (LONG_PTR) originalWndProc); - - #pragma warning (pop) - - stopTimer(); - - if (pluginHWND != 0 && IsWindow (pluginHWND)) - DestroyWindow (pluginHWND); - - pluginHWND = 0; - #elif JUCE_LINUX - stopTimer(); - pluginWindow = 0; - pluginProc = 0; - #endif - } - } -#endif - - //============================================================================== - int 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;) - { - const VSTPluginWindow* const w = activeVSTWindows.getUnchecked (i); - - if (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); - } - - 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, 0L, event); - XFlush (display); - } - } - - void mouseEnter (const MouseEvent& e) - { - if (pluginWindow != 0) - { - XEvent ev = { 0 }; - ev.xcrossing.display = display; - ev.xcrossing.type = EnterNotify; - 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(); - ev.xcrossing.mode = NotifyNormal; // NotifyGrab, NotifyUngrab - ev.xcrossing.detail = NotifyAncestor; // NotifyVirtual, NotifyInferior, NotifyNonlinear,NotifyNonlinearVirtual - - translateJuceToXCrossingModifiers (e, ev); - - sendEventToChild (&ev); - } - } - - void mouseExit (const MouseEvent& e) - { - if (pluginWindow != 0) - { - XEvent ev = { 0 }; - ev.xcrossing.display = display; - ev.xcrossing.type = LeaveNotify; - 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(); - ev.xcrossing.mode = NotifyNormal; // NotifyGrab, NotifyUngrab - ev.xcrossing.detail = NotifyAncestor; // NotifyVirtual, NotifyInferior, NotifyNonlinear,NotifyNonlinearVirtual - ev.xcrossing.focus = hasKeyboardFocus (true); // TODO - yes ? - - translateJuceToXCrossingModifiers (e, ev); - - sendEventToChild (&ev); - } - } - - void mouseMove (const MouseEvent& e) - { - if (pluginWindow != 0) - { - XEvent ev = { 0 }; - ev.xmotion.display = display; - ev.xmotion.type = MotionNotify; - ev.xmotion.window = pluginWindow; - ev.xmotion.root = RootWindow (display, DefaultScreen (display)); - ev.xmotion.time = CurrentTime; - ev.xmotion.is_hint = NotifyNormal; - ev.xmotion.x = e.x; - ev.xmotion.y = e.y; - ev.xmotion.x_root = e.getScreenX(); - ev.xmotion.y_root = e.getScreenY(); - - sendEventToChild (&ev); - } - } - - void mouseDrag (const MouseEvent& e) - { - if (pluginWindow != 0) - { - XEvent ev = { 0 }; - ev.xmotion.display = display; - ev.xmotion.type = MotionNotify; - ev.xmotion.window = pluginWindow; - ev.xmotion.root = RootWindow (display, DefaultScreen (display)); - ev.xmotion.time = CurrentTime; - ev.xmotion.x = e.x ; - ev.xmotion.y = e.y; - ev.xmotion.x_root = e.getScreenX(); - ev.xmotion.y_root = e.getScreenY(); - ev.xmotion.is_hint = NotifyNormal; - - translateJuceToXMotionModifiers (e, ev); - sendEventToChild (&ev); - } - } - - void mouseUp (const MouseEvent& e) - { - if (pluginWindow != 0) - { - XEvent ev = { 0 }; - ev.xbutton.display = display; - ev.xbutton.type = ButtonRelease; - ev.xbutton.window = pluginWindow; - ev.xbutton.root = RootWindow (display, DefaultScreen (display)); - ev.xbutton.time = CurrentTime; - ev.xbutton.x = e.x; - ev.xbutton.y = e.y; - ev.xbutton.x_root = e.getScreenX(); - ev.xbutton.y_root = e.getScreenY(); - - translateJuceToXButtonModifiers (e, ev); - sendEventToChild (&ev); - } - } - - void mouseWheelMove (const MouseEvent& e, - float incrementX, - float incrementY) - { - if (pluginWindow != 0) - { - XEvent ev = { 0 }; - ev.xbutton.display = display; - ev.xbutton.type = ButtonPress; - ev.xbutton.window = pluginWindow; - ev.xbutton.root = RootWindow (display, DefaultScreen (display)); - ev.xbutton.time = CurrentTime; - ev.xbutton.x = e.x; - ev.xbutton.y = e.y; - ev.xbutton.x_root = e.getScreenX(); - ev.xbutton.y_root = e.getScreenY(); - - translateJuceToXMouseWheelModifiers (e, incrementY, ev); - sendEventToChild (&ev); - - // TODO - put a usleep here ? - - ev.xbutton.type = ButtonRelease; - sendEventToChild (&ev); - } - } -#endif - -#if JUCE_MAC - //============================================================================== - #if ! JUCE_SUPPORT_CARBON - #error "To build VSTs, you need to enable the JUCE_SUPPORT_CARBON flag in your config!" - #endif - - class InnerWrapperComponent : public CarbonViewWrapperComponent - { - public: - InnerWrapperComponent (VSTPluginWindow& owner_) - : owner (owner_), - alreadyInside (false) - { - } - - ~InnerWrapperComponent() - { - deleteWindow(); - } - - HIViewRef attachView (WindowRef windowRef, HIViewRef rootView) - { - owner.openPluginWindow (windowRef); - return 0; - } - - void removeView (HIViewRef) - { - 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) - { - ERect* rect = nullptr; - owner.dispatch (effEditGetRect, 0, 0, &rect, 0); - w = rect->right - rect->left; - h = rect->bottom - rect->top; - return true; - } - - void mouseDown (int x, int y) - { - if (! alreadyInside) - { - alreadyInside = true; - getTopLevelComponent()->toFront (true); - owner.dispatch (effEditMouse, x, y, 0, 0); - alreadyInside = false; - } - else - { - PostEvent (::mouseDown, 0); - } - } - - void paint() - { - ComponentPeer* const peer = getPeer(); - - if (peer != nullptr) - { - const Point pos (getScreenPosition() - peer->getScreenPosition()); - ERect r; - r.left = pos.getX(); - r.right = r.left + getWidth(); - r.top = pos.getY(); - r.bottom = r.top + getHeight(); - - owner.dispatch (effEditDraw, 0, 0, &r, 0); - } - } - - private: - VSTPluginWindow& owner; - bool alreadyInside; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (InnerWrapperComponent); - }; - - friend class InnerWrapperComponent; - ScopedPointer innerWrapper; - - void resized() - { - if (innerWrapper != nullptr) - innerWrapper->setSize (getWidth(), getHeight()); - } -#endif - -private: - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (VSTPluginWindow); -}; - -//============================================================================== -AudioProcessorEditor* VSTPluginInstance::createEditor() -{ - if (hasEditor()) - return new VSTPluginWindow (*this); - - return nullptr; -} - - -//============================================================================== -void VSTPluginInstance::handleAsyncUpdate() -{ - // indicates that something about the plugin has changed.. - updateHostDisplay(); -} - -//============================================================================== -bool VSTPluginInstance::restoreProgramSettings (const fxProgram* const prog) -{ - if (vst_swap (prog->chunkMagic) == 'CcnK' && vst_swap (prog->fxMagic) == 'FxCk') - { - changeProgramName (getCurrentProgram(), prog->prgName); - - for (int i = 0; i < vst_swap (prog->numParams); ++i) - setParameter (i, vst_swapFloat (prog->params[i])); - - return true; - } - - return false; -} - -bool VSTPluginInstance::loadFromFXBFile (const void* const data, - const int dataSize) -{ - if (dataSize < 28) - return false; - - const fxSet* const set = (const fxSet*) data; - - if ((vst_swap (set->chunkMagic) != 'CcnK' && vst_swap (set->chunkMagic) != 'KncC') - || vst_swap (set->version) > fxbVersionNum) - return false; - - if (vst_swap (set->fxMagic) == 'FxBk') - { - // bank of programs - if (vst_swap (set->numPrograms) >= 0) - { - const int oldProg = getCurrentProgram(); - const int numParams = vst_swap (((const fxProgram*) (set->programs))->numParams); - const int progLen = sizeof (fxProgram) + (numParams - 1) * sizeof (float); - - for (int i = 0; i < vst_swap (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) >= dataSize) - return false; - - if (vst_swap (set->numPrograms) > 0) - setCurrentProgram (i); - - if (! restoreProgramSettings (prog)) - return false; - } - } - - if (vst_swap (set->numPrograms) > 0) - setCurrentProgram (oldProg); - - const fxProgram* const prog = (const fxProgram*) (((const char*) (set->programs)) + oldProg * progLen); - if (((const char*) prog) - ((const char*) set) >= dataSize) - return false; - - if (! restoreProgramSettings (prog)) - return false; - } - } - else if (vst_swap (set->fxMagic) == 'FxCk') - { - // single program - const fxProgram* const prog = (const fxProgram*) data; - - if (vst_swap (prog->chunkMagic) != 'CcnK') - return false; - - changeProgramName (getCurrentProgram(), prog->prgName); - - for (int i = 0; i < vst_swap (prog->numParams); ++i) - setParameter (i, vst_swapFloat (prog->params[i])); - } - else if (vst_swap (set->fxMagic) == 'FBCh' || vst_swap (set->fxMagic) == 'hCBF') - { - // non-preset chunk - const fxChunkSet* const cset = (const fxChunkSet*) data; - - if (vst_swap (cset->chunkSize) + sizeof (fxChunkSet) - 8 > (unsigned int) dataSize) - return false; - - setChunkData (cset->chunk, vst_swap (cset->chunkSize), false); - } - else if (vst_swap (set->fxMagic) == 'FPCh' || vst_swap (set->fxMagic) == 'hCPF') - { - // preset chunk - const fxProgramSet* const cset = (const fxProgramSet*) data; - - if (vst_swap (cset->chunkSize) + sizeof (fxProgramSet) - 8 > (unsigned int) dataSize) - return false; - - setChunkData (cset->chunk, vst_swap (cset->chunkSize), true); - - changeProgramName (getCurrentProgram(), cset->name); - } - else - { - return false; - } - - return true; -} - -//============================================================================== -void VSTPluginInstance::setParamsInProgramBlock (fxProgram* const prog) -{ - const int numParams = getNumParameters(); - - prog->chunkMagic = vst_swap ('CcnK'); - prog->byteSize = 0; - prog->fxMagic = vst_swap ('FxCk'); - prog->version = vst_swap (fxbVersionNum); - prog->fxID = vst_swap (getUID()); - prog->fxVersion = vst_swap (getVersionNumber()); - prog->numParams = vst_swap (numParams); - - getCurrentProgramName().copyToUTF8 (prog->prgName, sizeof (prog->prgName) - 1); - - for (int i = 0; i < numParams; ++i) - prog->params[i] = vst_swapFloat (getParameter (i)); -} - -bool VSTPluginInstance::saveToFXBFile (MemoryBlock& dest, bool isFXB, int maxSizeMB) -{ - 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 = vst_swap ('CcnK'); - set->byteSize = 0; - set->fxMagic = vst_swap ('FBCh'); - set->version = vst_swap (fxbVersionNum); - set->fxID = vst_swap (getUID()); - set->fxVersion = vst_swap (getVersionNumber()); - set->numPrograms = vst_swap (numPrograms); - set->chunkSize = vst_swap ((long) 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 = vst_swap ('CcnK'); - set->byteSize = 0; - set->fxMagic = vst_swap ('FPCh'); - set->version = vst_swap (fxbVersionNum); - set->fxID = vst_swap (getUID()); - set->fxVersion = vst_swap (getVersionNumber()); - set->numPrograms = vst_swap (numPrograms); - set->chunkSize = vst_swap ((long) 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 = vst_swap ('CcnK'); - set->byteSize = 0; - set->fxMagic = vst_swap ('FxBk'); - set->version = vst_swap (fxbVersionNum); - set->fxID = vst_swap (getUID()); - set->fxVersion = vst_swap (getVersionNumber()); - set->numPrograms = vst_swap (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; -} - -void VSTPluginInstance::getChunkData (MemoryBlock& mb, bool isPreset, int maxSizeMB) const -{ - if (usesChunks()) - { - void* data = nullptr; - const int 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); - } - } -} - -void VSTPluginInstance::setChunkData (const char* data, int size, bool isPreset) -{ - if (size > 0 && usesChunks()) - { - dispatch (effSetChunk, isPreset ? 1 : 0, size, (void*) data, 0.0f); - - if (! isPreset) - updateStoredProgramNames(); - } -} - -//============================================================================== -void VSTPluginInstance::timerCallback() -{ - if (dispatch (effIdle, 0, 0, 0, 0) == 0) - stopTimer(); -} - -int VSTPluginInstance::dispatch (const int opcode, const int index, const int value, void* const ptr, float opt) const -{ - int result = 0; - - if (effect != nullptr) - { - const ScopedLock sl (lock); - const IdleCallRecursionPreventer icrp; - - try - { - #if JUCE_MAC - const int oldResFile = CurResFile(); - - if (module->resFileId != 0) - UseResFile (module->resFileId); - #endif - - result = effect->dispatcher (effect, opcode, index, value, ptr, opt); - - #if JUCE_MAC - const int 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; -} - -//============================================================================== -namespace -{ - static const int defaultVSTSampleRateValue = 44100; - static const int defaultVSTBlockSizeValue = 512; - - // handles non plugin-specific callbacks.. - VstIntPtr handleGeneralCallback (VstInt32 opcode, VstInt32 index, VstInt32 value, void *ptr, float opt) - { - (void) index; - (void) value; - (void) 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 0x2400; - 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 (JUCEApplication::getInstance() != nullptr) - hostName = JUCEApplication::getInstance()->getApplicationName(); - - hostName.copyToUTF8 ((char*) ptr, 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; - } -} - -// handles callbacks for a specific plugin -VstIntPtr VSTPluginInstance::handleCallback (VstInt32 opcode, VstInt32 index, VstInt32 value, void *ptr, float opt) -{ - switch (opcode) - { - case audioMasterAutomate: - sendParamChangeMessageToListeners (index, opt); - break; - - case audioMasterProcessEvents: - handleMidiFromPlugin ((const VstEvents*) ptr); - break; - - case audioMasterGetTime: - #if JUCE_MSVC - #pragma warning (push) - #pragma warning (disable: 4311) - #endif - - return (VstIntPtr) &vstHostTime; - - #if JUCE_MSVC - #pragma warning (pop) - #endif - break; - - 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;) - ComponentPeer::getPeer (i)->performAnyPendingRepaintsNow(); - } - break; - - case audioMasterUpdateDisplay: - triggerAsyncUpdate(); - break; - - case audioMasterTempoAt: - // returns (10000 * bpm) - break; - - case audioMasterNeedIdle: - startTimer (50); - break; - - case audioMasterSizeWindow: - if (getActiveEditor() != nullptr) - getActiveEditor()->setSize (index, value); - - return 1; - - case audioMasterGetSampleRate: - return (VstIntPtr) (getSampleRate() > 0 ? getSampleRate() : defaultVSTSampleRateValue); - - case audioMasterGetBlockSize: - return (VstIntPtr) (getBlockSize() > 0 ? getBlockSize() : defaultVSTBlockSizeValue); - - case audioMasterWantMidi: - wantsMidiMessages = true; - break; - - case audioMasterGetDirectory: - #if JUCE_MAC - return (VstIntPtr) (void*) &module->parentDirFSSpec; - #else - return (VstIntPtr) (pointer_sized_uint) module->fullParentDirectoryPathName.toUTF8().getAddress(); - #endif - - case audioMasterGetAutomationState: - // returns 0: not supported, 1: off, 2:read, 3:write, 4:read/write - break; - - case audioMasterPinConnected: - if (value == 0) // input - { - if (index < getNumInputChannels()) - return 0; - } - else // output - { - if (index < getNumOutputChannels()) - return 0; - } - - return 1; // (not connected) - - case audioMasterIOChanged: - setLatencySamples (effect->initialDelay); - break; - - // 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 audioMasterGetCurrentProcessLevel: - 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; -} - -// entry point for all callbacks from the plugin -static VstIntPtr VSTCALLBACK audioMaster (AEffect* effect, VstInt32 opcode, VstInt32 index, VstIntPtr value, void* ptr, float opt) -{ - try - { - if (effect != nullptr && effect->resvd2 != 0) - { - return ((VSTPluginInstance*)(effect->resvd2)) - ->handleCallback (opcode, index, value, ptr, opt); - } - - return handleGeneralCallback (opcode, index, value, ptr, opt); - } - catch (...) - { - return 0; - } -} - -//============================================================================== -String VSTPluginInstance::getVersion() const -{ - unsigned int v = dispatch (effGetVendorVersion, 0, 0, 0, 0); - - String s; - - if (v == 0 || v == -1) - v = getVersionNumber(); - - if (v != 0) - { - int versionBits[4]; - int n = 0; - - while (v != 0) - { - versionBits [n++] = (v & 0xff); - v >>= 8; - } - - s << 'V'; - - while (n > 0) - { - s << versionBits [--n]; - - if (n > 0) - s << '.'; - } - } - - return s; -} - -int VSTPluginInstance::getUID() const -{ - int uid = effect != nullptr ? effect->uniqueID : 0; - - if (uid == 0) - uid = module->file.hashCode(); - - return uid; -} - -String VSTPluginInstance::getCategory() const -{ - const char* result = nullptr; - - switch (dispatch (effGetPlugCategory, 0, 0, 0, 0)) - { - case kPlugCategEffect: result = "Effect"; break; - case kPlugCategSynth: result = "Synth"; break; - case kPlugCategAnalysis: result = "Analysis"; break; - case kPlugCategMastering: result = "Mastering"; break; - case kPlugCategSpacializer: result = "Spacial"; break; - case kPlugCategRoomFx: result = "Reverb"; break; - case kPlugSurroundFx: result = "Surround"; break; - case kPlugCategRestoration: result = "Restoration"; break; - case kPlugCategGenerator: result = "Tone generation"; break; - default: break; - } - - return result; -} - -//============================================================================== -float VSTPluginInstance::getParameter (int index) -{ - if (effect != nullptr && isPositiveAndBelow (index, (int) effect->numParams)) - { - try - { - const ScopedLock sl (lock); - return effect->getParameter (effect, index); - } - catch (...) - { - } - } - - return 0.0f; -} - -void VSTPluginInstance::setParameter (int index, float newValue) -{ - if (effect != nullptr && isPositiveAndBelow (index, (int) effect->numParams)) - { - try - { - const ScopedLock sl (lock); - - if (effect->getParameter (effect, index) != newValue) - effect->setParameter (effect, index, newValue); - } - catch (...) - { - } - } -} - -const String VSTPluginInstance::getParameterName (int index) -{ - if (effect != nullptr) - { - jassert (index >= 0 && index < effect->numParams); - - char nm [256] = { 0 }; - dispatch (effGetParamName, index, 0, nm, 0); - return String (nm).trim(); - } - - return String::empty; -} - -const String VSTPluginInstance::getParameterLabel (int index) const -{ - if (effect != nullptr) - { - jassert (index >= 0 && index < effect->numParams); - - char nm [256] = { 0 }; - dispatch (effGetParamLabel, index, 0, nm, 0); - return String (nm).trim(); - } - - return String::empty; -} - -const String VSTPluginInstance::getParameterText (int index) -{ - if (effect != nullptr) - { - jassert (index >= 0 && index < effect->numParams); - - char nm [256] = { 0 }; - dispatch (effGetParamDisplay, index, 0, nm, 0); - return String (nm).trim(); - } - - return String::empty; -} - -bool VSTPluginInstance::isParameterAutomatable (int index) const -{ - if (effect != nullptr) - { - jassert (index >= 0 && index < effect->numParams); - return dispatch (effCanBeAutomated, index, 0, 0, 0) != 0; - } - - return false; -} - -void VSTPluginInstance::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 VSTPluginInstance::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]); -} - -//============================================================================== -void VSTPluginInstance::setCurrentProgram (int newIndex) -{ - if (getNumPrograms() > 0 && newIndex != getCurrentProgram()) - dispatch (effSetProgram, 0, jlimit (0, getNumPrograms() - 1, newIndex), 0, 0); -} - -const String VSTPluginInstance::getProgramName (int index) -{ - if (index == getCurrentProgram()) - { - return getCurrentProgramName(); - } - else if (effect != nullptr) - { - char nm [256] = { 0 }; - - if (dispatch (effGetProgramNameIndexed, - jlimit (0, getNumPrograms(), index), - -1, nm, 0) != 0) - { - return String (CharPointer_UTF8 (nm)).trim(); - } - } - - return programNames [index]; -} - -void VSTPluginInstance::changeProgramName (int index, const String& newName) -{ - if (index == getCurrentProgram()) - { - if (getNumPrograms() > 0 && newName != getCurrentProgramName()) - dispatch (effSetProgramName, 0, 0, (void*) newName.substring (0, 24).toUTF8().getAddress(), 0.0f); - } - else - { - jassertfalse; // xxx not implemented! - } -} - -void VSTPluginInstance::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); - } - } -} - -const String VSTPluginInstance::getCurrentProgramName() -{ - String name; - - if (effect != nullptr) - { - { - char nm[256] = { 0 }; - dispatch (effGetProgramName, 0, 0, nm, 0); - name = String (CharPointer_UTF8 (nm)).trim(); - } - - const int index = getCurrentProgram(); - - if (programNames[index].isEmpty()) - { - while (programNames.size() < index) - programNames.add (String::empty); - - programNames.set (index, name); - } - } - - return name; -} - -//============================================================================== -const String VSTPluginInstance::getInputChannelName (int index) const -{ - 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 VSTPluginInstance::isInputChannelStereoPair (int index) const -{ - 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 VSTPluginInstance::getOutputChannelName (int index) const -{ - 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 VSTPluginInstance::isOutputChannelStereoPair (int index) const -{ - 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; -} - -//============================================================================== -void VSTPluginInstance::setPower (const bool on) -{ - dispatch (effMainsChanged, 0, on ? 1 : 0, 0, 0); - isPowerOn = on; -} - -//============================================================================== -const int defaultMaxSizeMB = 64; - -void VSTPluginInstance::getStateInformation (MemoryBlock& destData) -{ - saveToFXBFile (destData, true, defaultMaxSizeMB); -} - -void VSTPluginInstance::getCurrentProgramStateInformation (MemoryBlock& destData) -{ - saveToFXBFile (destData, false, defaultMaxSizeMB); -} - -void VSTPluginInstance::setStateInformation (const void* data, int sizeInBytes) -{ - loadFromFXBFile (data, sizeInBytes); -} - -void VSTPluginInstance::setCurrentProgramStateInformation (const void* data, int sizeInBytes) -{ - loadFromFXBFile (data, sizeInBytes); -} - -//============================================================================== -//============================================================================== -VSTPluginFormat::VSTPluginFormat() -{ -} - -VSTPluginFormat::~VSTPluginFormat() -{ -} - -void VSTPluginFormat::findAllTypesForFile (OwnedArray & results, - const String& fileOrIdentifier) -{ - if (! fileMightContainThisPluginType (fileOrIdentifier)) - return; - - PluginDescription desc; - desc.fileOrIdentifier = fileOrIdentifier; - desc.uid = 0; - - ScopedPointer instance (dynamic_cast (createInstanceFromDescription (desc))); - - if (instance == 0) - return; - - try - { - #if JUCE_MAC - if (instance->module->resFileId != 0) - UseResFile (instance->module->resFileId); - #endif - - instance->fillInPluginDescription (desc); - - VstPlugCategory category = (VstPlugCategory) instance->dispatch (effGetPlugCategory, 0, 0, 0, 0); - - if (category != 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 [64] = { 0 }; - const int uid = instance->dispatch (effShellGetNextPlugin, 0, 0, shellEffectName, 0); - - if (uid == 0) - { - break; - } - else - { - desc.uid = uid; - desc.name = shellEffectName; - desc.descriptiveName = shellEffectName; - - bool alreadyThere = false; - - for (int i = results.size(); --i >= 0;) - { - PluginDescription* const d = results.getUnchecked(i); - - if (d->isDuplicateOf (desc)) - { - alreadyThere = true; - break; - } - } - - if (! alreadyThere) - results.add (new PluginDescription (desc)); - } - } - } - } - catch (...) - { - // crashed while loading... - } -} - -AudioPluginInstance* VSTPluginFormat::createInstanceFromDescription (const PluginDescription& desc) -{ - ScopedPointer result; - - if (fileMightContainThisPluginType (desc.fileOrIdentifier)) - { - File file (desc.fileOrIdentifier); - - const File previousWorkingDirectory (File::getCurrentWorkingDirectory()); - file.getParentDirectory().setAsCurrentWorkingDirectory(); - - const ReferenceCountedObjectPtr module (ModuleHandle::findOrCreateModule (file)); - - if (module != nullptr) - { - shellUIDToCreate = desc.uid; - - result = new VSTPluginInstance (module); - - if (result->effect != nullptr) - { - result->effect->resvd2 = (VstIntPtr) (pointer_sized_int) (VSTPluginInstance*) result; - result->initialise(); - } - else - { - result = nullptr; - } - } - - previousWorkingDirectory.setAsCurrentWorkingDirectory(); - } - - return result.release(); -} - -bool VSTPluginFormat::fileMightContainThisPluginType (const String& fileOrIdentifier) -{ - const File f (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::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_WINDOWS - const String programFiles (File::getSpecialLocation (File::globalApplicationsDirectory).getFullPathName()); - - return FileSearchPath (WindowsRegistry::getValue ("HKLM\\Software\\VST\\VSTPluginsPath", - programFiles + "\\Steinberg\\VstPlugins")); - #elif JUCE_LINUX - return FileSearchPath ("/usr/lib/vst"); - #endif -} - -#endif -#undef log -#endif diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.h b/src/juce/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.h deleted file mode 100644 index 53a3c54e..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.h +++ /dev/null @@ -1,64 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_VSTPLUGINFORMAT_JUCEHEADER__ -#define __JUCE_VSTPLUGINFORMAT_JUCEHEADER__ - -#include "../format/juce_AudioPluginFormat.h" - - -#if JUCE_PLUGINHOST_VST - -//============================================================================== -/** - Implements a plugin format manager for VSTs. -*/ -class JUCE_API VSTPluginFormat : public AudioPluginFormat -{ -public: - //============================================================================== - VSTPluginFormat(); - ~VSTPluginFormat(); - - //============================================================================== - String getName() const { return "VST"; } - void findAllTypesForFile (OwnedArray & results, const String& fileOrIdentifier); - AudioPluginInstance* createInstanceFromDescription (const PluginDescription& desc); - bool fileMightContainThisPluginType (const String& fileOrIdentifier); - String getNameOfPluginFromIdentifier (const String& fileOrIdentifier); - StringArray searchPathsForPlugins (const FileSearchPath& directoriesToSearch, bool recursive); - bool doesPluginStillExist (const PluginDescription& desc); - FileSearchPath getDefaultLocationsToSearch(); - -private: - //============================================================================== - void recursiveFileSearch (StringArray& results, const File& dir, const bool recursive); - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (VSTPluginFormat); -}; - - -#endif -#endif // __JUCE_VSTPLUGINFORMAT_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_processors/juce_audio_processors.cpp b/src/juce/JuceLibraryCode/modules/juce_audio_processors/juce_audio_processors.cpp deleted file mode 100644 index fdf43b7a..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_processors/juce_audio_processors.cpp +++ /dev/null @@ -1,79 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#if defined (__JUCE_AUDIO_PROCESSORS_JUCEHEADER__) && ! 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_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 -#endif - -//============================================================================== -namespace juce -{ - -// START_AUTOINCLUDE format/*.cpp, processors/*.cpp, format_types/*.cpp, -// format_types/*.mm, scanning/*.cpp -#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_VSTPluginFormat.cpp" -#include "format_types/juce_AudioUnitPluginFormat.mm" -#include "scanning/juce_KnownPluginList.cpp" -#include "scanning/juce_PluginDirectoryScanner.cpp" -#include "scanning/juce_PluginListComponent.cpp" -// END_AUTOINCLUDE - -} diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_processors/juce_audio_processors.h b/src/juce/JuceLibraryCode/modules/juce_audio_processors/juce_audio_processors.h deleted file mode 100644 index f21cda16..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_processors/juce_audio_processors.h +++ /dev/null @@ -1,125 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_AUDIO_PROCESSORS_JUCEHEADER__ -#define __JUCE_AUDIO_PROCESSORS_JUCEHEADER__ - -#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, AudioPluginFormat, AudioPluginFormatManager, JUCE_PLUGINHOST_AU -*/ -#ifndef JUCE_PLUGINHOST_VST - #define JUCE_PLUGINHOST_VST 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 -*/ -#ifndef JUCE_PLUGINHOST_AU - #define JUCE_PLUGINHOST_AU 0 -#endif - -#if ! (JUCE_PLUGINHOST_AU || JUCE_PLUGINHOST_VST) -// #error "You need to set either the JUCE_PLUGINHOST_AU anr/or JUCE_PLUGINHOST_VST flags if you're using this module!" -#endif - -#if ! (defined (JUCE_SUPPORT_CARBON) || JUCE_64BIT) - #define JUCE_SUPPORT_CARBON 1 -#endif - -//============================================================================= -//============================================================================= -#include "../juce_core/system/juce_StandardHeader.h" - -namespace juce -{ - -// START_AUTOINCLUDE processors, format, format_types, scanning -#ifndef __JUCE_AUDIOPLAYHEAD_JUCEHEADER__ - #include "processors/juce_AudioPlayHead.h" -#endif -#ifndef __JUCE_AUDIOPLUGININSTANCE_JUCEHEADER__ - #include "processors/juce_AudioPluginInstance.h" -#endif -#ifndef __JUCE_AUDIOPROCESSOR_JUCEHEADER__ - #include "processors/juce_AudioProcessor.h" -#endif -#ifndef __JUCE_AUDIOPROCESSOREDITOR_JUCEHEADER__ - #include "processors/juce_AudioProcessorEditor.h" -#endif -#ifndef __JUCE_AUDIOPROCESSORGRAPH_JUCEHEADER__ - #include "processors/juce_AudioProcessorGraph.h" -#endif -#ifndef __JUCE_AUDIOPROCESSORLISTENER_JUCEHEADER__ - #include "processors/juce_AudioProcessorListener.h" -#endif -#ifndef __JUCE_GENERICAUDIOPROCESSOREDITOR_JUCEHEADER__ - #include "processors/juce_GenericAudioProcessorEditor.h" -#endif -#ifndef __JUCE_PLUGINDESCRIPTION_JUCEHEADER__ - #include "processors/juce_PluginDescription.h" -#endif -#ifndef __JUCE_AUDIOPLUGINFORMAT_JUCEHEADER__ - #include "format/juce_AudioPluginFormat.h" -#endif -#ifndef __JUCE_AUDIOPLUGINFORMATMANAGER_JUCEHEADER__ - #include "format/juce_AudioPluginFormatManager.h" -#endif -#ifndef __JUCE_AUDIOUNITPLUGINFORMAT_JUCEHEADER__ - #include "format_types/juce_AudioUnitPluginFormat.h" -#endif -#ifndef __JUCE_DIRECTXPLUGINFORMAT_JUCEHEADER__ - #include "format_types/juce_DirectXPluginFormat.h" -#endif -#ifndef __JUCE_LADSPAPLUGINFORMAT_JUCEHEADER__ - #include "format_types/juce_LADSPAPluginFormat.h" -#endif -#include "format_types/juce_VSTMidiEventList.h" -#ifndef __JUCE_VSTPLUGINFORMAT_JUCEHEADER__ - #include "format_types/juce_VSTPluginFormat.h" -#endif -#ifndef __JUCE_KNOWNPLUGINLIST_JUCEHEADER__ - #include "scanning/juce_KnownPluginList.h" -#endif -#ifndef __JUCE_PLUGINDIRECTORYSCANNER_JUCEHEADER__ - #include "scanning/juce_PluginDirectoryScanner.h" -#endif -#ifndef __JUCE_PLUGINLISTCOMPONENT_JUCEHEADER__ - #include "scanning/juce_PluginListComponent.h" -#endif -// END_AUTOINCLUDE - -} - -#endif // __JUCE_AUDIO_PROCESSORS_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_processors/juce_audio_processors.mm b/src/juce/JuceLibraryCode/modules/juce_audio_processors/juce_audio_processors.mm deleted file mode 100644 index 7c9c33f8..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_processors/juce_audio_processors.mm +++ /dev/null @@ -1,26 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#include "juce_audio_processors.cpp" diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_processors/juce_module_info b/src/juce/JuceLibraryCode/modules/juce_audio_processors/juce_module_info deleted file mode 100644 index aa10d2a0..00000000 --- a/src/juce/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": "2.0.21", - "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/src/juce/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioPlayHead.h b/src/juce/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioPlayHead.h deleted file mode 100644 index 67d96c3b..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioPlayHead.h +++ /dev/null @@ -1,139 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_AUDIOPLAYHEAD_JUCEHEADER__ -#define __JUCE_AUDIOPLAYHEAD_JUCEHEADER__ - - -//============================================================================== -/** - 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 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. - - This is the number of quarter notes since the edit start. - */ - double ppqPosition; - - /** The position of the start of the last bar, in pulses-per-quarter-note. - - This is the number of quarter notes from the start of the edit to the - start of the current bar. - - 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. - */ - virtual bool getCurrentPosition (CurrentPositionInfo& result) = 0; -}; - - -#endif // __JUCE_AUDIOPLAYHEAD_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioPluginInstance.h b/src/juce/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioPluginInstance.h deleted file mode 100644 index 28a56755..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioPluginInstance.h +++ /dev/null @@ -1,73 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_AUDIOPLUGININSTANCE_JUCEHEADER__ -#define __JUCE_AUDIOPLUGININSTANCE_JUCEHEADER__ - -#include "../processors/juce_AudioProcessor.h" -#include "juce_PluginDescription.h" - - -//============================================================================== -/** - 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. - - @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 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; } - -protected: - //============================================================================== - AudioPluginInstance() {} - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioPluginInstance); -}; - - -#endif // __JUCE_AUDIOPLUGININSTANCE_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessor.cpp b/src/juce/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessor.cpp deleted file mode 100644 index 91a82860..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessor.cpp +++ /dev/null @@ -1,311 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -AudioProcessor::AudioProcessor() - : 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) noexcept -{ - 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.removeValue (listenerToRemove); -} - -void AudioProcessor::setPlayConfigDetails (const int numIns, - const int numOuts, - const double sampleRate_, - const int blockSize_) noexcept -{ - numInputChannels = numIns; - numOutputChannels = numOuts; - sampleRate = sampleRate_; - blockSize = blockSize_; -} - -void AudioProcessor::setNonRealtime (const bool nonRealtime_) noexcept -{ - nonRealtime = nonRealtime_; -} - -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); -} - -void AudioProcessor::sendParamChangeMessageToListeners (const int parameterIndex, const float newValue) -{ - jassert (isPositiveAndBelow (parameterIndex, getNumParameters())); - - for (int i = listeners.size(); --i >= 0;) - { - AudioProcessorListener* l; - - { - const ScopedLock sl (listenerLock); - l = listeners [i]; - } - - if (l != nullptr) - l->audioProcessorParameterChanged (this, parameterIndex, newValue); - } -} - -void AudioProcessor::beginParameterChangeGesture (int parameterIndex) -{ - jassert (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;) - { - AudioProcessorListener* l; - - { - const ScopedLock sl (listenerLock); - l = listeners [i]; - } - - if (l != nullptr) - l->audioProcessorParameterChangeGestureBegin (this, parameterIndex); - } -} - -void AudioProcessor::endParameterChangeGesture (int parameterIndex) -{ - jassert (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;) - { - AudioProcessorListener* l; - - { - const ScopedLock sl (listenerLock); - l = listeners [i]; - } - - if (l != nullptr) - l->audioProcessorParameterChangeGestureEnd (this, parameterIndex); - } -} - -void AudioProcessor::updateHostDisplay() -{ - for (int i = listeners.size(); --i >= 0;) - { - AudioProcessorListener* l; - - { - const ScopedLock sl (listenerLock); - l = listeners [i]; - } - - if (l != nullptr) - l->audioProcessorChanged (this); - } -} - -bool AudioProcessor::isParameterAutomatable (int /*parameterIndex*/) const -{ - return true; -} - -bool AudioProcessor::isMetaParameter (int /*parameterIndex*/) const -{ - return false; -} - -void AudioProcessor::suspendProcessing (const bool shouldBeSuspended) -{ - const ScopedLock sl (callbackLock); - suspended = shouldBeSuspended; -} - -void AudioProcessor::reset() -{ -} - -//============================================================================== -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(); - - // You must make your hasEditor() method return a consistent result! - jassert (hasEditor() == (ed != nullptr)); - - 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; - } - - 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) -{ - const String xmlString (xml.createDocument (String::empty, true, false)); - const int stringLength = xmlString.getNumBytesAsUTF8(); - - destData.setSize ((size_t) stringLength + 10); - - char* const d = static_cast (destData.getData()); - *(uint32*) d = ByteOrder::swapIfBigEndian ((const uint32) magicXmlNumber); - *(uint32*) (d + 4) = ByteOrder::swapIfBigEndian ((const uint32) stringLength); - - xmlString.copyToUTF8 (d + 8, stringLength + 1); -} - -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) {} - -//============================================================================== -bool AudioPlayHead::CurrentPositionInfo::operator== (const CurrentPositionInfo& other) const noexcept -{ - return timeInSeconds == other.timeInSeconds - && 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; -} - -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/src/juce/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessor.h b/src/juce/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessor.h deleted file mode 100644 index f5c224c9..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessor.h +++ /dev/null @@ -1,593 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_AUDIOPROCESSOR_JUCEHEADER__ -#define __JUCE_AUDIOPROCESSOR_JUCEHEADER__ - -#include "juce_AudioProcessorEditor.h" -#include "juce_AudioProcessorListener.h" -#include "juce_AudioPlayHead.h" - - -//============================================================================== -/** - 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. - - You can also do your initialisation tasks in the initialiseFilterInfo() - call, which will be made after this object has been created. - */ - 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 your 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; - - //============================================================================== - /** Returns the current AudioPlayHead object that should be used to find - out the state and position of the playhead. - - You can call this from your processBlock() method, and use the AudioPlayHead - object to get the details about the time of the start of the block currently - being processed. - - If the host hasn't supplied a playhead object, this will return 0. - */ - 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 the name of one of the input channels, as returned by the host. - - The host 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 output channels, as returned by the host. - - The host 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 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. - - If you're going to use this, your processBlock() method must call isSuspended() and - check whether it's suspended or not. If it is, then it should skip doing any real - processing, either emitting silence or passing the input through unchanged. - - @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-realime - capacity for offline rendering or bouncing. - - Whatever value is passed-in will be - */ - void setNonRealtime (bool isNonRealtime) noexcept; - - //============================================================================== - /** Creates the filter's UI. - - This can return 0 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 0, 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() = 0; - - /** Returns the name of a particular parameter. */ - virtual const String getParameterName (int parameterIndex) = 0; - - /** 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) = 0; - - /** Returns the value of a parameter as a text string. */ - virtual const String getParameterText (int parameterIndex) = 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 - 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) = 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 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(); - - //============================================================================== - /** 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); - - - //============================================================================== - /** Adds a listener that will be called when an aspect of this processor changes. */ - void addListener (AudioProcessorListener* newListener); - - /** Removes a previously added listener. */ - 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. - */ - void setPlayHead (AudioPlayHead* newPlayHead) noexcept; - - //============================================================================== - /** Not for public use - this is called before deleting an editor component. */ - void editorBeingDeleted (AudioProcessorEditor* editor) noexcept; - - /** Not for public use - this is called to initialise the processor before playing. */ - void setPlayConfigDetails (int numIns, int numOuts, - double sampleRate, - int blockSize) noexcept; - -protected: - //============================================================================== - /** 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 0 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 */ - 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; - - #if JUCE_DEBUG - BigInteger changingParams; - #endif - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioProcessor); -}; - - -#endif // __JUCE_AUDIOPROCESSOR_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorEditor.cpp b/src/juce/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorEditor.cpp deleted file mode 100644 index 7af95903..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorEditor.cpp +++ /dev/null @@ -1,38 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -AudioProcessorEditor::AudioProcessorEditor (AudioProcessor* const owner_) - : owner (owner_) -{ - // the filter must be valid.. - jassert (owner != nullptr); -} - -AudioProcessorEditor::~AudioProcessorEditor() -{ - // if this fails, then the wrapper hasn't called editorBeingDeleted() on the - // filter for some reason.. - jassert (owner->getActiveEditor() != this); -} diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorEditor.h b/src/juce/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorEditor.h deleted file mode 100644 index 5c252321..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorEditor.h +++ /dev/null @@ -1,67 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_AUDIOPROCESSOREDITOR_JUCEHEADER__ -#define __JUCE_AUDIOPROCESSOREDITOR_JUCEHEADER__ - -class AudioProcessor; - - -//============================================================================== -/** - 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* owner); - -public: - /** Destructor. */ - ~AudioProcessorEditor(); - - - //============================================================================== - /** Returns a pointer to the processor that this editor represents. */ - AudioProcessor* getAudioProcessor() const noexcept { return owner; } - - -private: - //============================================================================== - AudioProcessor* const owner; - - JUCE_DECLARE_NON_COPYABLE (AudioProcessorEditor); -}; - - -#endif // __JUCE_AUDIOPROCESSOREDITOR_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp b/src/juce/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp deleted file mode 100644 index 8c6578bc..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp +++ /dev/null @@ -1,1508 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -const int AudioProcessorGraph::midiChannelIndex = 0x1000; - -//============================================================================== -namespace GraphRenderingOps -{ - -//============================================================================== -class AudioGraphRenderingOp -{ -public: - AudioGraphRenderingOp() {} - virtual ~AudioGraphRenderingOp() {} - - virtual void perform (AudioSampleBuffer& sharedBufferChans, - const OwnedArray & sharedMidiBuffers, - const int numSamples) = 0; - - JUCE_LEAK_DETECTOR (AudioGraphRenderingOp); -}; - -//============================================================================== -class ClearChannelOp : public AudioGraphRenderingOp -{ -public: - ClearChannelOp (const int channelNum_) - : channelNum (channelNum_) - {} - - void perform (AudioSampleBuffer& sharedBufferChans, const OwnedArray &, const int numSamples) - { - sharedBufferChans.clear (channelNum, 0, numSamples); - } - -private: - const int channelNum; - - JUCE_DECLARE_NON_COPYABLE (ClearChannelOp); -}; - -//============================================================================== -class CopyChannelOp : public AudioGraphRenderingOp -{ -public: - CopyChannelOp (const int srcChannelNum_, const int dstChannelNum_) - : srcChannelNum (srcChannelNum_), - dstChannelNum (dstChannelNum_) - {} - - void perform (AudioSampleBuffer& sharedBufferChans, const OwnedArray &, const int numSamples) - { - sharedBufferChans.copyFrom (dstChannelNum, 0, sharedBufferChans, srcChannelNum, 0, numSamples); - } - -private: - const int srcChannelNum, dstChannelNum; - - JUCE_DECLARE_NON_COPYABLE (CopyChannelOp); -}; - -//============================================================================== -class AddChannelOp : public AudioGraphRenderingOp -{ -public: - AddChannelOp (const int srcChannelNum_, const int dstChannelNum_) - : srcChannelNum (srcChannelNum_), - dstChannelNum (dstChannelNum_) - {} - - void perform (AudioSampleBuffer& sharedBufferChans, const OwnedArray &, const int numSamples) - { - sharedBufferChans.addFrom (dstChannelNum, 0, sharedBufferChans, srcChannelNum, 0, numSamples); - } - -private: - const int srcChannelNum, dstChannelNum; - - JUCE_DECLARE_NON_COPYABLE (AddChannelOp); -}; - -//============================================================================== -class ClearMidiBufferOp : public AudioGraphRenderingOp -{ -public: - ClearMidiBufferOp (const int bufferNum_) - : bufferNum (bufferNum_) - {} - - void perform (AudioSampleBuffer&, const OwnedArray & sharedMidiBuffers, const int) - { - sharedMidiBuffers.getUnchecked (bufferNum)->clear(); - } - -private: - const int bufferNum; - - JUCE_DECLARE_NON_COPYABLE (ClearMidiBufferOp); -}; - -//============================================================================== -class CopyMidiBufferOp : public AudioGraphRenderingOp -{ -public: - CopyMidiBufferOp (const int srcBufferNum_, const int dstBufferNum_) - : srcBufferNum (srcBufferNum_), - dstBufferNum (dstBufferNum_) - {} - - void perform (AudioSampleBuffer&, const OwnedArray & sharedMidiBuffers, const int) - { - *sharedMidiBuffers.getUnchecked (dstBufferNum) = *sharedMidiBuffers.getUnchecked (srcBufferNum); - } - -private: - const int srcBufferNum, dstBufferNum; - - JUCE_DECLARE_NON_COPYABLE (CopyMidiBufferOp); -}; - -//============================================================================== -class AddMidiBufferOp : public AudioGraphRenderingOp -{ -public: - AddMidiBufferOp (const int srcBufferNum_, const int dstBufferNum_) - : srcBufferNum (srcBufferNum_), - dstBufferNum (dstBufferNum_) - {} - - void perform (AudioSampleBuffer&, const OwnedArray & sharedMidiBuffers, const int numSamples) - { - sharedMidiBuffers.getUnchecked (dstBufferNum) - ->addEvents (*sharedMidiBuffers.getUnchecked (srcBufferNum), 0, numSamples, 0); - } - -private: - const int srcBufferNum, dstBufferNum; - - JUCE_DECLARE_NON_COPYABLE (AddMidiBufferOp); -}; - -//============================================================================== -class DelayChannelOp : public AudioGraphRenderingOp -{ -public: - DelayChannelOp (const int channel_, const int numSamplesDelay_) - : channel (channel_), - bufferSize (numSamplesDelay_ + 1), - readIndex (0), writeIndex (numSamplesDelay_) - { - buffer.calloc ((size_t) bufferSize); - } - - void perform (AudioSampleBuffer& sharedBufferChans, const OwnedArray &, const int numSamples) - { - float* data = sharedBufferChans.getSampleData (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); -}; - - -//============================================================================== -class ProcessBufferOp : public AudioGraphRenderingOp -{ -public: - ProcessBufferOp (const AudioProcessorGraph::Node::Ptr& node_, - const Array & audioChannelsToUse_, - const int totalChans_, - const int midiBufferToUse_) - : node (node_), - processor (node_->getProcessor()), - audioChannelsToUse (audioChannelsToUse_), - totalChans (jmax (1, totalChans_)), - midiBufferToUse (midiBufferToUse_) - { - 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.getSampleData (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; - int totalChans; - 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. -*/ -class RenderingOpSequenceCalculator -{ -public: - //============================================================================== - RenderingOpSequenceCalculator (AudioProcessorGraph& graph_, - const Array& orderedNodes_, - Array& renderingOps) - : graph (graph_), - orderedNodes (orderedNodes_), - 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 ((AudioProcessorGraph::Node*) orderedNodes.getUnchecked(i), - renderingOps, i); - - markAnyUnusedBuffersAsFree (i); - } - - graph.setLatencySamples (totalLatency); - } - - int getNumBuffersNeeded() const { return nodeIds.size(); } - int getNumMidiBuffersNeeded() const { 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* const node, - Array& renderingOps, - const int ourRenderingIndex) - { - const int numIns = node->getProcessor()->getNumInputChannels(); - const int numOuts = node->getProcessor()->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 (node->getProcessor()->acceptsMidi() || node->getProcessor()->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 (node->getProcessor()->producesMidi()) - markBufferAsContaining (midiBufferToUse, node->nodeId, - AudioProcessorGraph::midiChannelIndex); - - setNodeDelay (node->nodeId, maxLatency + node->getProcessor()->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) - { - int i; - for (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 (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; - const Entry* const entry = findEntry (possibleDestinationId, index); - - if (entry != nullptr) - { - 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; - else if (first->sourceNodeId > second->sourceNodeId) return 1; - else if (first->destNodeId < second->destNodeId) return -1; - else if (first->destNodeId > second->destNodeId) return 1; - else if (first->sourceChannelIndex < second->sourceChannelIndex) return -1; - else if (first->sourceChannelIndex > second->sourceChannelIndex) return 1; - else if (first->destChannelIndex < second->destChannelIndex) return -1; - else if (first->destChannelIndex > second->destChannelIndex) return 1; - - return 0; - } -}; - -} - -//============================================================================== -AudioProcessorGraph::Connection::Connection (const uint32 sourceNodeId_, const int sourceChannelIndex_, - const uint32 destNodeId_, const int destChannelIndex_) noexcept - : sourceNodeId (sourceNodeId_), sourceChannelIndex (sourceChannelIndex_), - destNodeId (destNodeId_), destChannelIndex (destChannelIndex_) -{ -} - -//============================================================================== -AudioProcessorGraph::Node::Node (const uint32 nodeId_, AudioProcessor* const processor_) noexcept - : nodeId (nodeId_), - processor (processor_), - 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 -{ - AudioProcessorGraph::AudioGraphIOProcessor* const ioProc - = dynamic_cast (processor.get()); - - if (ioProc != nullptr) - ioProc->setParentGraph (graph); -} - -//============================================================================== -AudioProcessorGraph::AudioProcessorGraph() - : lastNodeId (0), - renderingBuffers (1, 1), - currentAudioOutputBuffer (1, 1) -{ -} - -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) - { - jassertfalse; - 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; - } - - 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 (renderLock); - renderingOps.swapWithArray (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 (renderLock); - - 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.swapWithArray (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::processBlock (AudioSampleBuffer& buffer, MidiBuffer& midiMessages) -{ - const int numSamples = buffer.getNumSamples(); - - const ScopedLock sl (renderLock); - - currentAudioInputBuffer = &buffer; - currentAudioOutputBuffer.setSize (jmax (1, buffer.getNumChannels()), numSamples); - currentAudioOutputBuffer.clear(); - currentMidiInputBuffer = &midiMessages; - currentMidiOutputBuffer.clear(); - - int i; - for (i = 0; i < renderingOps.size(); ++i) - { - GraphRenderingOps::AudioGraphRenderingOp* const op - = (GraphRenderingOps::AudioGraphRenderingOp*) renderingOps.getUnchecked(i); - - op->perform (renderingBuffers, midiBuffers, numSamples); - } - - for (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 /*index*/) const { return true; } -bool AudioProcessorGraph::isOutputChannelStereoPair (int /*index*/) const { return true; } -bool AudioProcessorGraph::acceptsMidi() const { return true; } -bool AudioProcessorGraph::producesMidi() const { return true; } -void AudioProcessorGraph::getStateInformation (juce::MemoryBlock& /*destData*/) {} -void AudioProcessorGraph::setStateInformation (const void* /*data*/, int /*sizeInBytes*/) {} - - -//============================================================================== -AudioProcessorGraph::AudioGraphIOProcessor::AudioGraphIOProcessor (const IODeviceType type_) - : type (type_), - 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::empty; -} - -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::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::empty; -} - -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::empty; -} - -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 { return type == audioInputNode || type == midiInputNode; } -bool AudioProcessorGraph::AudioGraphIOProcessor::isOutput() const { return type == audioOutputNode || type == midiOutputNode; } - -bool AudioProcessorGraph::AudioGraphIOProcessor::hasEditor() const { return false; } -AudioProcessorEditor* AudioProcessorGraph::AudioGraphIOProcessor::createEditor() { return nullptr; } - -int AudioProcessorGraph::AudioGraphIOProcessor::getNumParameters() { return 0; } -const String AudioProcessorGraph::AudioGraphIOProcessor::getParameterName (int) { return String::empty; } - -float AudioProcessorGraph::AudioGraphIOProcessor::getParameter (int) { return 0.0f; } -const String AudioProcessorGraph::AudioGraphIOProcessor::getParameterText (int) { return String::empty; } -void AudioProcessorGraph::AudioGraphIOProcessor::setParameter (int, float) { } - -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::empty; } -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/src/juce/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h b/src/juce/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h deleted file mode 100644 index b224c2fc..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h +++ /dev/null @@ -1,427 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_AUDIOPROCESSORGRAPH_JUCEHEADER__ -#define __JUCE_AUDIOPROCESSORGRAPH_JUCEHEADER__ - -#include "juce_AudioProcessor.h" -#include "../format/juce_AudioPluginFormatManager.h" -#include "../scanning/juce_KnownPluginList.h" - - -//============================================================================== -/** - 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, - public 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 { 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 { 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. - - Returns true if a connection was actually deleted. - */ - 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 { 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 { return graph; } - - /** True if this is an audio or midi input. */ - bool isInput() const; - /** True if this is an audio or midi output. */ - bool isOutput() const; - - //============================================================================== - AudioGraphIOProcessor (const IODeviceType type); - ~AudioGraphIOProcessor(); - - const String getName() const; - void fillInPluginDescription (PluginDescription&) const; - - void prepareToPlay (double sampleRate, int estimatedSamplesPerBlock); - void releaseResources(); - void processBlock (AudioSampleBuffer&, MidiBuffer&); - - const String getInputChannelName (int channelIndex) const; - const String getOutputChannelName (int channelIndex) const; - bool isInputChannelStereoPair (int index) const; - bool isOutputChannelStereoPair (int index) const; - bool acceptsMidi() const; - bool producesMidi() const; - - bool hasEditor() const; - AudioProcessorEditor* createEditor(); - - int getNumParameters(); - const String getParameterName (int); - float getParameter (int); - const String getParameterText (int); - void setParameter (int, float); - - int getNumPrograms(); - int getCurrentProgram(); - void setCurrentProgram (int); - const String getProgramName (int); - void changeProgramName (int, const String&); - - void getStateInformation (juce::MemoryBlock& destData); - void setStateInformation (const void* data, int sizeInBytes); - - /** @internal */ - void setParentGraph (AudioProcessorGraph*); - - private: - const IODeviceType type; - AudioProcessorGraph* graph; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioGraphIOProcessor); - }; - - //============================================================================== - // AudioProcessor methods: - - const String getName() const; - - void prepareToPlay (double sampleRate, int estimatedSamplesPerBlock); - void releaseResources(); - void processBlock (AudioSampleBuffer&, MidiBuffer&); - - const String getInputChannelName (int channelIndex) const; - const String getOutputChannelName (int channelIndex) const; - bool isInputChannelStereoPair (int index) const; - bool isOutputChannelStereoPair (int index) const; - - bool acceptsMidi() const; - bool producesMidi() const; - - bool hasEditor() const { return false; } - AudioProcessorEditor* createEditor() { return nullptr; } - - int getNumParameters() { return 0; } - const String getParameterName (int) { return String::empty; } - float getParameter (int) { return 0; } - const String getParameterText (int) { return String::empty; } - void setParameter (int, float) { } - - int getNumPrograms() { return 0; } - int getCurrentProgram() { return 0; } - void setCurrentProgram (int) { } - const String getProgramName (int) { return String::empty; } - void changeProgramName (int, const String&) { } - - void getStateInformation (juce::MemoryBlock& destData); - void setStateInformation (const void* data, int sizeInBytes); - - /** @internal */ - void handleAsyncUpdate(); - -private: - //============================================================================== - ReferenceCountedArray nodes; - OwnedArray connections; - uint32 lastNodeId; - AudioSampleBuffer renderingBuffers; - OwnedArray midiBuffers; - - CriticalSection renderLock; - Array renderingOps; - - friend class AudioGraphIOProcessor; - AudioSampleBuffer* currentAudioInputBuffer; - AudioSampleBuffer currentAudioOutputBuffer; - MidiBuffer* currentMidiInputBuffer; - MidiBuffer currentMidiOutputBuffer; - - void clearRenderingSequence(); - void buildRenderingSequence(); - - bool isAnInputTo (uint32 possibleInputId, uint32 possibleDestinationId, int recursionCheck) const; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioProcessorGraph); -}; - - -#endif // __JUCE_AUDIOPROCESSORGRAPH_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorListener.h b/src/juce/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorListener.h deleted file mode 100644 index 55a39ff1..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorListener.h +++ /dev/null @@ -1,108 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_AUDIOPROCESSORLISTENER_JUCEHEADER__ -#define __JUCE_AUDIOPROCESSORLISTENER_JUCEHEADER__ - -class AudioProcessor; - -//============================================================================== -/** - 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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.cpp b/src/juce/JuceLibraryCode/modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.cpp deleted file mode 100644 index 2cea5340..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.cpp +++ /dev/null @@ -1,162 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -class ProcessorParameterPropertyComp : public PropertyComponent, - public AudioProcessorListener, - public Timer -{ -public: - ProcessorParameterPropertyComp (const String& name, AudioProcessor& owner_, const int index_) - : PropertyComponent (name), - owner (owner_), - index (index_), - paramHasChanged (false), - slider (owner_, index_) - { - startTimer (100); - addAndMakeVisible (&slider); - owner_.addListener (this); - } - - ~ProcessorParameterPropertyComp() - { - owner.removeListener (this); - } - - void refresh() - { - paramHasChanged = false; - slider.setValue (owner.getParameter (index), false); - } - - void audioProcessorChanged (AudioProcessor*) {} - - void audioProcessorParameterChanged (AudioProcessor*, int parameterIndex, float) - { - if (parameterIndex == index) - paramHasChanged = true; - } - - void timerCallback() - { - if (paramHasChanged) - { - refresh(); - startTimer (1000 / 50); - } - else - { - startTimer (jmin (1000 / 4, getTimerInterval() + 10)); - } - } - -private: - //============================================================================== - class ParamSlider : public Slider - { - public: - ParamSlider (AudioProcessor& owner_, const int index_) - : owner (owner_), - index (index_) - { - setRange (0.0, 1.0, 0.0); - setSliderStyle (Slider::LinearBar); - setTextBoxIsEditable (false); - setScrollWheelEnabled (false); - } - - void valueChanged() - { - const float newVal = (float) getValue(); - - if (owner.getParameter (index) != newVal) - owner.setParameter (index, newVal); - } - - String getTextFromValue (double /*value*/) - { - return owner.getParameterText (index); - } - - 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 owner_) - : AudioProcessorEditor (owner_) -{ - jassert (owner_ != nullptr); - setOpaque (true); - - addAndMakeVisible (&panel); - - Array params; - - const int numParams = owner_->getNumParameters(); - int totalHeight = 0; - - for (int i = 0; i < numParams; ++i) - { - String name (owner_->getParameterName (i)); - if (name.trim().isEmpty()) - name = "Unnamed"; - - ProcessorParameterPropertyComp* const pc = new ProcessorParameterPropertyComp (name, *owner_, 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/src/juce/JuceLibraryCode/modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.h b/src/juce/JuceLibraryCode/modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.h deleted file mode 100644 index 65b96998..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_GENERICAUDIOPROCESSOREDITOR_JUCEHEADER__ -#define __JUCE_GENERICAUDIOPROCESSOREDITOR_JUCEHEADER__ - -#include "juce_AudioProcessorEditor.h" - - -//============================================================================== -/** - 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& g); - void resized(); - -private: - //============================================================================== - PropertyPanel panel; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (GenericAudioProcessorEditor); -}; - - -#endif // __JUCE_GENERICAUDIOPROCESSOREDITOR_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_processors/processors/juce_PluginDescription.cpp b/src/juce/JuceLibraryCode/modules/juce_audio_processors/processors/juce_PluginDescription.cpp deleted file mode 100644 index a21b316b..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_processors/processors/juce_PluginDescription.cpp +++ /dev/null @@ -1,128 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -PluginDescription::PluginDescription() - : uid (0), - isInstrument (false), - numInputChannels (0), - numOutputChannels (0) -{ -} - -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) -{ -} - -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; - - return *this; -} - -bool PluginDescription::isDuplicateOf (const PluginDescription& other) const -{ - return fileOrIdentifier == other.fileOrIdentifier - && uid == other.uid; -} - -String PluginDescription::createIdentifierString() const -{ - return pluginFormatName - + "-" + name - + "-" + String::toHexString (fileOrIdentifier.hashCode()) - + "-" + String::toHexString (uid); -} - -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); - - 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"); - - return true; - } - - return false; -} diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_processors/processors/juce_PluginDescription.h b/src/juce/JuceLibraryCode/modules/juce_audio_processors/processors/juce_PluginDescription.h deleted file mode 100644 index dd2f6578..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_processors/processors/juce_PluginDescription.h +++ /dev/null @@ -1,143 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_PLUGINDESCRIPTION_JUCEHEADER__ -#define __JUCE_PLUGINDESCRIPTION_JUCEHEADER__ - - -//============================================================================== -/** - A small class to represent some facts about a particular type of plugin. - - This class is for storing and managing the details about a plugin 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 plugin. */ - String name; - - /** A more descriptive name for the plugin. - This may be the same as the 'name' field, but some plugins may provide an - alternative name. - */ - String descriptiveName; - - /** The plugin 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 plugin 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 plugin. For a VST, it's the file path. - */ - String fileOrIdentifier; - - /** The last time the plugin file was changed. - This is handy when scanning for new or changed plugins. - */ - Time lastFileModTime; - - /** A unique ID for the plugin. - - 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 plugin identifies itself as a synthesiser. */ - bool isInstrument; - - /** The number of inputs. */ - int numInputChannels; - - /** The number of outputs. */ - int numOutputChannels; - - /** Returns true if the two descriptions refer the the same plugin. - - This isn't quite as simple as them just having the same file (because of - shell plugins). - */ - bool isDuplicateOf (const PluginDescription& other) 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 - plugin's file location, so can be used to store a plugin 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 plugin description. - */ - bool loadFromXml (const XmlElement& xml); - - -private: - //============================================================================== - JUCE_LEAK_DETECTOR (PluginDescription); -}; - - -#endif // __JUCE_PLUGINDESCRIPTION_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_KnownPluginList.cpp b/src/juce/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_KnownPluginList.cpp deleted file mode 100644 index 5f308e0b..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_KnownPluginList.cpp +++ /dev/null @@ -1,436 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce 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)->createIdentifierString() == 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.add (new PluginDescription (type)); - sendChangeMessage(); - return true; -} - -void KnownPluginList::removeType (const int index) -{ - types.remove (index); - sendChangeMessage(); -} - -namespace -{ - Time getPluginFileModTime (const String& fileOrIdentifier) - { - if (fileOrIdentifier.startsWithChar ('/') || fileOrIdentifier[1] == ':') - return File (fileOrIdentifier).getLastModificationTime(); - - return Time(); - } - - bool timesAreDifferent (const Time& t1, const Time& t2) noexcept - { - return t1 != t2 || t1 == Time(); - } - - enum { menuIdBase = 0x324503f4 }; -} - -bool KnownPluginList::isListingUpToDate (const String& fileOrIdentifier) const -{ - if (getTypeForFile (fileOrIdentifier) == 0) - return false; - - for (int i = types.size(); --i >= 0;) - { - const PluginDescription* const d = types.getUnchecked(i); - - if (d->fileOrIdentifier == fileOrIdentifier - && timesAreDifferent (d->lastFileModTime, getPluginFileModTime (fileOrIdentifier))) - { - return false; - } - } - - return true; -} - -bool KnownPluginList::scanAndAddFile (const String& fileOrIdentifier, - const bool dontRescanIfAlreadyInList, - OwnedArray & typesFound, - AudioPluginFormat& format) -{ - bool addedOne = false; - - 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 (timesAreDifferent (d->lastFileModTime, getPluginFileModTime (fileOrIdentifier))) - needsRescanning = true; - else - typesFound.add (new PluginDescription (*d)); - } - } - - if (! needsRescanning) - return false; - } - - OwnedArray found; - format.findAllTypesForFile (found, fileOrIdentifier); - - for (int i = 0; i < found.size(); ++i) - { - PluginDescription* const desc = found.getUnchecked(i); - jassert (desc != nullptr); - - if (addType (*desc)) - addedOne = true; - - typesFound.add (new PluginDescription (*desc)); - } - - return addedOne; -} - -void KnownPluginList::scanAndAddDragAndDroppedFiles (const StringArray& files, - OwnedArray & typesFound) -{ - for (int i = 0; i < files.size(); ++i) - { - for (int j = 0; j < AudioPluginFormatManager::getInstance()->getNumFormats(); ++j) - { - AudioPluginFormat* const format = AudioPluginFormatManager::getInstance()->getFormat (j); - - if (scanAndAddFile (files[i], true, typesFound, *format)) - return; - } - - const File f (files[i]); - - 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 (s, typesFound); - } - } -} - -//============================================================================== -struct PluginSorter -{ - PluginSorter (KnownPluginList::SortMethod method_) noexcept : method (method_) {} - - int compareElements (const PluginDescription* const first, - const PluginDescription* const second) const - { - int diff = 0; - - switch (method) - { - case KnownPluginList::sortByCategory: diff = first->category.compareLexicographically (second->category); break; - case KnownPluginList::sortByManufacturer: diff = first->manufacturerName.compareLexicographically (second->manufacturerName); break; - case KnownPluginList::sortByFileSystemLocation: diff = lastPathPart (first->fileOrIdentifier).compare (lastPathPart (second->fileOrIdentifier)); break; - default: break; - } - - if (diff == 0) - diff = first->name.compareLexicographically (second->name); - - return diff; - } - -private: - static String lastPathPart (const String& path) - { - return path.replaceCharacter ('\\', '/').upToLastOccurrenceOf ("/", false, false); - } - - KnownPluginList::SortMethod method; -}; - -void KnownPluginList::sort (const SortMethod method) -{ - if (method != defaultOrder) - { - PluginSorter sorter (method); - types.sort (sorter, true); - - sendChangeMessage(); - } -} - -//============================================================================== -XmlElement* KnownPluginList::createXml() const -{ - XmlElement* const e = new XmlElement ("KNOWNPLUGINS"); - - for (int i = 0; i < types.size(); ++i) - e->addChildElement (types.getUnchecked(i)->createXml()); - - return e; -} - -void KnownPluginList::recreateFromXml (const XmlElement& xml) -{ - clear(); - - if (xml.hasTagName ("KNOWNPLUGINS")) - { - forEachXmlChildElement (xml, e) - { - PluginDescription info; - - if (info.loadFromXml (*e)) - addType (info); - } - } -} - -//============================================================================== -// This is used to turn a bunch of paths into a nested menu structure. -class PluginFilesystemTree -{ -public: - void buildTree (const Array & allPlugins) - { - for (int i = 0; i < allPlugins.size(); ++i) - { - String path (allPlugins.getUnchecked(i) - ->fileOrIdentifier.replaceCharacter ('\\', '/') - .upToLastOccurrenceOf ("/", false, false)); - - if (path.substring (1, 2) == ":") - path = path.substring (2); - - addPlugin (allPlugins.getUnchecked(i), path); - } - - optimise(); - } - - void addToMenu (PopupMenu& m, const OwnedArray & allPlugins) const - { - int i; - for (i = 0; i < subFolders.size(); ++i) - { - const PluginFilesystemTree* const sub = subFolders.getUnchecked(i); - - PopupMenu subMenu; - sub->addToMenu (subMenu, allPlugins); - - #if JUCE_MAC - // avoid the special AU formatting nonsense on Mac.. - m.addSubMenu (sub->folder.fromFirstOccurrenceOf (":", false, false), subMenu); - #else - m.addSubMenu (sub->folder, subMenu); - #endif - } - - for (i = 0; i < plugins.size(); ++i) - { - PluginDescription* const plugin = plugins.getUnchecked(i); - - m.addItem (allPlugins.indexOf (plugin) + menuIdBase, - plugin->name, true, false); - } - } - -private: - String folder; - OwnedArray subFolders; - Array plugins; - - void addPlugin (PluginDescription* const pd, const String& path) - { - if (path.isEmpty()) - { - plugins.add (pd); - } - else - { - const String firstSubFolder (path.upToFirstOccurrenceOf ("/", false, false)); - const String remainingPath (path.fromFirstOccurrenceOf ("/", false, false)); - - for (int i = subFolders.size(); --i >= 0;) - { - if (subFolders.getUnchecked(i)->folder.equalsIgnoreCase (firstSubFolder)) - { - subFolders.getUnchecked(i)->addPlugin (pd, remainingPath); - return; - } - } - - PluginFilesystemTree* const newFolder = new PluginFilesystemTree(); - newFolder->folder = firstSubFolder; - subFolders.add (newFolder); - - newFolder->addPlugin (pd, remainingPath); - } - } - - // removes any deeply nested folders that don't contain any actual plugins - void optimise() - { - for (int i = subFolders.size(); --i >= 0;) - { - PluginFilesystemTree* const sub = subFolders.getUnchecked(i); - - sub->optimise(); - - if (sub->plugins.size() == 0) - { - for (int j = 0; j < sub->subFolders.size(); ++j) - subFolders.add (sub->subFolders.getUnchecked(j)); - - sub->subFolders.clear (false); - subFolders.remove (i); - } - } - } -}; - -//============================================================================== -void KnownPluginList::addToMenu (PopupMenu& menu, const SortMethod sortMethod) const -{ - Array sorted; - - { - PluginSorter sorter (sortMethod); - - for (int i = 0; i < types.size(); ++i) - sorted.addSorted (sorter, types.getUnchecked(i)); - } - - if (sortMethod == sortByCategory - || sortMethod == sortByManufacturer) - { - String lastSubMenuName; - PopupMenu sub; - - for (int i = 0; i < sorted.size(); ++i) - { - const PluginDescription* const pd = sorted.getUnchecked(i); - String thisSubMenuName (sortMethod == sortByCategory ? pd->category - : pd->manufacturerName); - - if (! thisSubMenuName.containsNonWhitespaceChars()) - thisSubMenuName = "Other"; - - if (thisSubMenuName != lastSubMenuName) - { - if (sub.getNumItems() > 0) - { - menu.addSubMenu (lastSubMenuName, sub); - sub.clear(); - } - - lastSubMenuName = thisSubMenuName; - } - - sub.addItem (types.indexOf (pd) + menuIdBase, pd->name, true, false); - } - - if (sub.getNumItems() > 0) - menu.addSubMenu (lastSubMenuName, sub); - } - else if (sortMethod == sortByFileSystemLocation) - { - PluginFilesystemTree root; - root.buildTree (sorted); - root.addToMenu (menu, types); - } - else - { - for (int i = 0; i < sorted.size(); ++i) - { - const PluginDescription* const pd = sorted.getUnchecked(i); - menu.addItem (types.indexOf (pd) + menuIdBase, pd->name, true, false); - } - } -} - -int KnownPluginList::getIndexChosenByMenu (const int menuResultCode) const -{ - const int i = menuResultCode - menuIdBase; - - return isPositiveAndBelow (i, types.size()) ? i : -1; -} diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_KnownPluginList.h b/src/juce/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_KnownPluginList.h deleted file mode 100644 index dee4b73e..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_KnownPluginList.h +++ /dev/null @@ -1,164 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_KNOWNPLUGINLIST_JUCEHEADER__ -#define __JUCE_KNOWNPLUGINLIST_JUCEHEADER__ - -#include "../processors/juce_PluginDescription.h" -#include "../format/juce_AudioPluginFormat.h" - - -//============================================================================== -/** - 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]; } - - /** 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); - - /** 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) 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 (const StringArray& filenames, - OwnedArray & typesFound); - - //============================================================================== - /** Sort methods used to change the order of the plugins in the list. - */ - enum SortMethod - { - defaultOrder = 0, - sortAlphabetically, - sortByCategory, - sortByManufacturer, - 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, - const 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 (const SortMethod method); - - //============================================================================== - /** 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); - - -private: - //============================================================================== - OwnedArray types; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (KnownPluginList); -}; - - -#endif // __JUCE_KNOWNPLUGINLIST_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.cpp b/src/juce/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.cpp deleted file mode 100644 index ecca4f08..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.cpp +++ /dev/null @@ -1,121 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -PluginDirectoryScanner::PluginDirectoryScanner (KnownPluginList& listToAddTo, - AudioPluginFormat& formatToLookFor, - FileSearchPath directoriesToSearch, - const bool recursive, - const File& deadMansPedalFile_) - : list (listToAddTo), - format (formatToLookFor), - deadMansPedalFile (deadMansPedalFile_), - nextIndex (0), - 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 (getDeadMansPedalFile()); - - 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); - } -} - -PluginDirectoryScanner::~PluginDirectoryScanner() -{ -} - -//============================================================================== -const String PluginDirectoryScanner::getNextPluginFileThatWillBeScanned() const -{ - return format.getNameOfPluginFromIdentifier (filesOrIdentifiersToScan [nextIndex]); -} - -bool PluginDirectoryScanner::scanNextFile (const bool dontRescanIfAlreadyInList) -{ - String file (filesOrIdentifiersToScan [nextIndex]); - - if (file.isNotEmpty() && ! list.isListingUpToDate (file)) - { - OwnedArray typesFound; - - // Add this plugin to the end of the dead-man's pedal list in case it crashes... - StringArray crashedPlugins (getDeadMansPedalFile()); - 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) - failedFiles.add (file); - } - - return skipNextFile(); -} - -bool PluginDirectoryScanner::skipNextFile() -{ - if (nextIndex >= filesOrIdentifiersToScan.size()) - return false; - - progress = ++nextIndex / (float) filesOrIdentifiersToScan.size(); - return nextIndex < filesOrIdentifiersToScan.size(); -} - -StringArray PluginDirectoryScanner::getDeadMansPedalFile() -{ - StringArray lines; - - if (deadMansPedalFile != File::nonexistent) - { - deadMansPedalFile.readLines (lines); - lines.removeEmptyStrings(); - } - - return lines; -} - -void PluginDirectoryScanner::setDeadMansPedalFile (const StringArray& newContents) -{ - if (deadMansPedalFile != File::nonexistent) - deadMansPedalFile.replaceWithText (newContents.joinIntoString ("\n"), true, true); -} diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.h b/src/juce/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.h deleted file mode 100644 index 2c7e7c5e..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.h +++ /dev/null @@ -1,125 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_PLUGINDIRECTORYSCANNER_JUCEHEADER__ -#define __JUCE_PLUGINDIRECTORYSCANNER_JUCEHEADER__ - -#include "juce_KnownPluginList.h" -#include "../format/juce_AudioPluginFormatManager.h" - - -//============================================================================== -/** - 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. - - Returns false when there are no more files to try. - */ - bool scanNextFile (bool dontRescanIfAlreadyInList); - - /** 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. - */ - const 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; } - -private: - //============================================================================== - KnownPluginList& list; - AudioPluginFormat& format; - StringArray filesOrIdentifiersToScan; - File deadMansPedalFile; - StringArray failedFiles; - int nextIndex; - float progress; - - StringArray getDeadMansPedalFile(); - void setDeadMansPedalFile (const StringArray& newContents); - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (PluginDirectoryScanner); -}; - - -#endif // __JUCE_PLUGINDIRECTORYSCANNER_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginListComponent.cpp b/src/juce/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginListComponent.cpp deleted file mode 100644 index 3076821b..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginListComponent.cpp +++ /dev/null @@ -1,297 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -PluginListComponent::PluginListComponent (KnownPluginList& listToEdit, - const File& deadMansPedalFile_, - PropertiesFile* const propertiesToUse_) - : list (listToEdit), - deadMansPedalFile (deadMansPedalFile_), - optionsButton ("Options..."), - propertiesToUse (propertiesToUse_) -{ - listBox.setModel (this); - addAndMakeVisible (&listBox); - - addAndMakeVisible (&optionsButton); - optionsButton.addListener (this); - optionsButton.setTriggeredOnMouseDown (true); - - setSize (400, 600); - list.addChangeListener (this); - updateList(); -} - -PluginListComponent::~PluginListComponent() -{ - list.removeChangeListener (this); -} - -void PluginListComponent::resized() -{ - listBox.setBounds (0, 0, getWidth(), getHeight() - 30); - optionsButton.changeWidthToFitText (24); - optionsButton.setTopLeftPosition (8, getHeight() - 28); -} - -void PluginListComponent::changeListenerCallback (ChangeBroadcaster*) -{ - updateList(); -} - -void PluginListComponent::updateList() -{ - listBox.updateContent(); - listBox.repaint(); -} - -int PluginListComponent::getNumRows() -{ - return list.getNumTypes(); -} - -void PluginListComponent::paintListBoxItem (int row, Graphics& g, int width, int height, bool rowIsSelected) -{ - if (rowIsSelected) - g.fillAll (findColour (TextEditor::highlightColourId)); - - const PluginDescription* const pd = list.getType (row); - - if (pd != nullptr) - { - GlyphArrangement ga; - ga.addCurtailedLineOfText (Font (height * 0.7f, Font::bold), pd->name, 8.0f, height * 0.8f, width - 10.0f, true); - - g.setColour (Colours::black); - ga.draw (g); - - const Rectangle bb (ga.getBoundingBox (0, -1, false)); - - String desc; - desc << pd->pluginFormatName - << (pd->isInstrument ? " instrument" : " effect") - << " - " - << pd->numInputChannels << (pd->numInputChannels == 1 ? " in" : " ins") - << " / " - << pd->numOutputChannels << (pd->numOutputChannels == 1 ? " out" : " outs"); - - if (pd->manufacturerName.isNotEmpty()) - desc << " - " << pd->manufacturerName; - - if (pd->version.isNotEmpty()) - desc << " - " << pd->version; - - if (pd->category.isNotEmpty()) - desc << " - category: '" << pd->category << '\''; - - g.setColour (Colours::grey); - - ga.clear(); - ga.addCurtailedLineOfText (Font (height * 0.6f), desc, bb.getRight() + 10.0f, height * 0.8f, width - bb.getRight() - 12.0f, true); - ga.draw (g); - } -} - -void PluginListComponent::deleteKeyPressed (int lastRowSelected) -{ - list.removeType (lastRowSelected); -} - -void PluginListComponent::optionsMenuCallback (int result) -{ - switch (result) - { - case 1: list.clear(); break; - - case 2: list.sort (KnownPluginList::sortAlphabetically); break; - case 3: list.sort (KnownPluginList::sortByCategory); break; - case 4: list.sort (KnownPluginList::sortByManufacturer); break; - - case 5: - { - const SparseSet selected (listBox.getSelectedRows()); - - for (int i = list.getNumTypes(); --i >= 0;) - if (selected.contains (i)) - list.removeType (i); - - break; - } - - case 6: - { - const PluginDescription* const desc = list.getType (listBox.getSelectedRow()); - - if (desc != nullptr && File (desc->fileOrIdentifier).existsAsFile()) - File (desc->fileOrIdentifier).getParentDirectory().startAsProcess(); - - break; - } - - case 7: - for (int i = list.getNumTypes(); --i >= 0;) - if (! AudioPluginFormatManager::getInstance()->doesPluginStillExist (*list.getType (i))) - list.removeType (i); - - break; - - default: - if (result != 0) - { - typeToScan = result - 10; - startTimer (1); - } - - break; - } -} - -void PluginListComponent::optionsMenuStaticCallback (int result, PluginListComponent* pluginList) -{ - if (pluginList != nullptr) - pluginList->optionsMenuCallback (result); -} - -void PluginListComponent::buttonClicked (Button* button) -{ - if (button == &optionsButton) - { - PopupMenu menu; - menu.addItem (1, TRANS("Clear list")); - menu.addItem (5, TRANS("Remove selected plugin from list"), listBox.getNumSelectedRows() > 0); - menu.addItem (6, TRANS("Show folder containing selected plugin"), listBox.getNumSelectedRows() > 0); - menu.addItem (7, TRANS("Remove any plugins whose files no longer exist")); - menu.addSeparator(); - menu.addItem (2, TRANS("Sort alphabetically")); - menu.addItem (3, TRANS("Sort by category")); - menu.addItem (4, TRANS("Sort by manufacturer")); - menu.addSeparator(); - - for (int i = 0; i < AudioPluginFormatManager::getInstance()->getNumFormats(); ++i) - { - AudioPluginFormat* const format = AudioPluginFormatManager::getInstance()->getFormat (i); - - if (format->getDefaultLocationsToSearch().getNumPaths() > 0) - menu.addItem (10 + i, "Scan for new or updated " + format->getName() + " plugins..."); - } - - menu.showMenuAsync (PopupMenu::Options().withTargetComponent (&optionsButton), - ModalCallbackFunction::forComponent (optionsMenuStaticCallback, this)); - } -} - -void PluginListComponent::timerCallback() -{ - stopTimer(); - scanFor (AudioPluginFormatManager::getInstance()->getFormat (typeToScan)); -} - -bool PluginListComponent::isInterestedInFileDrag (const StringArray& /*files*/) -{ - return true; -} - -void PluginListComponent::filesDropped (const StringArray& files, int, int) -{ - OwnedArray typesFound; - list.scanAndAddDragAndDroppedFiles (files, typesFound); -} - -void PluginListComponent::scanFor (AudioPluginFormat* format) -{ -#if JUCE_MODAL_LOOPS_PERMITTED - if (format == nullptr) - return; - - FileSearchPath path (format->getDefaultLocationsToSearch()); - - if (propertiesToUse != nullptr) - path = propertiesToUse->getValue ("lastPluginScanPath_" + format->getName(), path.toString()); - - { - AlertWindow aw (TRANS("Select folders to scan..."), String::empty, AlertWindow::NoIcon); - FileSearchPathListComponent pathList; - pathList.setSize (500, 300); - pathList.setPath (path); - - aw.addCustomComponent (&pathList); - aw.addButton (TRANS("Scan"), 1, KeyPress::returnKey); - aw.addButton (TRANS("Cancel"), 0, KeyPress::escapeKey); - - if (aw.runModalLoop() == 0) - return; - - path = pathList.getPath(); - } - - if (propertiesToUse != nullptr) - { - propertiesToUse->setValue ("lastPluginScanPath_" + format->getName(), path.toString()); - propertiesToUse->saveIfNeeded(); - } - - double progress = 0.0; - - AlertWindow aw (TRANS("Scanning for plugins..."), - TRANS("Searching for all possible plugin files..."), AlertWindow::NoIcon); - - aw.addButton (TRANS("Cancel"), 0, KeyPress::escapeKey); - aw.addProgressBarComponent (progress); - aw.enterModalState(); - - MessageManager::getInstance()->runDispatchLoopUntil (300); - - PluginDirectoryScanner scanner (list, *format, path, true, deadMansPedalFile); - - for (;;) - { - aw.setMessage (TRANS("Testing:\n\n") + scanner.getNextPluginFileThatWillBeScanned()); - - MessageManager::getInstance()->runDispatchLoopUntil (100); - - if (! scanner.scanNextFile (true)) - break; - - if (! aw.isCurrentlyModal()) - break; - - progress = scanner.getProgress(); - } - - if (scanner.getFailedFiles().size() > 0) - { - StringArray shortNames; - - for (int i = 0; i < scanner.getFailedFiles().size(); ++i) - shortNames.add (File (scanner.getFailedFiles()[i]).getFileName()); - - AlertWindow::showMessageBox (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 (", ")); - } -#else - jassertfalse; // this method needs refactoring to work without modal loops.. -#endif -} diff --git a/src/juce/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginListComponent.h b/src/juce/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginListComponent.h deleted file mode 100644 index 97520a4f..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginListComponent.h +++ /dev/null @@ -1,97 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_PLUGINLISTCOMPONENT_JUCEHEADER__ -#define __JUCE_PLUGINLISTCOMPONENT_JUCEHEADER__ - -#include "juce_KnownPluginList.h" -#include "../format/juce_AudioPluginFormat.h" - - -//============================================================================== -/** - 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, - public ListBoxModel, - private ChangeListener, - private ButtonListener, // (can't use Button::Listener due to idiotic VC2005 bug) - private Timer -{ -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 (KnownPluginList& listToRepresent, - const File& deadMansPedalFile, - PropertiesFile* propertiesToUse); - - /** Destructor. */ - ~PluginListComponent(); - - //============================================================================== - /** @internal */ - void resized(); - /** @internal */ - bool isInterestedInFileDrag (const StringArray&); - /** @internal */ - void filesDropped (const StringArray&, int, int); - /** @internal */ - int getNumRows(); - /** @internal */ - void paintListBoxItem (int row, Graphics&, int width, int height, bool rowIsSelected); - /** @internal */ - void deleteKeyPressed (int lastRowSelected); - -private: - //============================================================================== - KnownPluginList& list; - File deadMansPedalFile; - ListBox listBox; - TextButton optionsButton; - PropertiesFile* propertiesToUse; - int typeToScan; - - void scanFor (AudioPluginFormat*); - static void optionsMenuStaticCallback (int result, PluginListComponent*); - void optionsMenuCallback (int result); - void updateList(); - - void buttonClicked (Button*); - void changeListenerCallback (ChangeBroadcaster*); - void timerCallback(); - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (PluginListComponent); -}; - - -#endif // __JUCE_PLUGINLISTCOMPONENT_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/containers/juce_AbstractFifo.cpp b/src/juce/JuceLibraryCode/modules/juce_core/containers/juce_AbstractFifo.cpp deleted file mode 100644 index 96a2ac3c..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/containers/juce_AbstractFifo.cpp +++ /dev/null @@ -1,233 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -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(); } - -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& fifo_, int* buffer_) - : Thread ("fifo writer"), fifo (fifo_), buffer (buffer_) - { - startThread(); - } - - ~WriteThread() - { - stopThread (5000); - } - - void run() - { - int n = 0; - Random r; - - while (! threadShouldExit()) - { - int num = r.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())); - - int i; - for (i = 0; i < size1; ++i) - buffer [start1 + i] = n++; - - for (i = 0; i < size2; ++i) - buffer [start2 + i] = n++; - - fifo.finishedWrite (size1 + size2); - } - } - - private: - AbstractFifo& fifo; - int* buffer; - }; - - void runTest() - { - beginTest ("AbstractFifo"); - - int buffer [5000]; - AbstractFifo fifo (numElementsInArray (buffer)); - - WriteThread writer (fifo, buffer); - - int n = 0; - Random r; - - for (int count = 1000000; --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; - - int i; - for (i = 0; i < size1; ++i) - failed = (buffer [start1 + i] != n++) || failed; - - for (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/src/juce/JuceLibraryCode/modules/juce_core/containers/juce_AbstractFifo.h b/src/juce/JuceLibraryCode/modules/juce_core/containers/juce_AbstractFifo.h deleted file mode 100644 index 3faa5b14..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/containers/juce_AbstractFifo.h +++ /dev/null @@ -1,219 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_ABSTRACTFIFO_JUCEHEADER__ -#define __JUCE_ABSTRACTFIFO_JUCEHEADER__ - -#include "../memory/juce_Atomic.h" - - -//============================================================================== -/** - 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 reading 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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/containers/juce_Array.h b/src/juce/JuceLibraryCode/modules/juce_core/containers/juce_Array.h deleted file mode 100644 index 4b0ae529..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/containers/juce_Array.h +++ /dev/null @@ -1,1035 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_ARRAY_JUCEHEADER__ -#define __JUCE_ARRAY_JUCEHEADER__ - -#include "juce_ArrayAllocationBase.h" -#include "juce_ElementComparator.h" -#include "../threads/juce_CriticalSection.h" - - -//============================================================================== -/** - 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 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]); - } - - /** Destructor. */ - ~Array() - { - deleteAllElements(); - } - - /** Copies another array. - @param other the array to copy - */ - Array& operator= (const Array& other) - { - if (this != &other) - { - Array otherCopy (other); - swapWithArray (otherCopy); - } - - return *this; - } - - #if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS - Array& operator= (Array&& other) noexcept - { - 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 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 array) - @see getUnchecked, getFirst, getLast - */ - ElementType operator[] (const int index) const - { - const ScopedLockType lock (getLock()); - return isPositiveAndBelow (index, numUsed) ? data.elements [index] - : 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)); - 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)); - return data.elements [index]; - } - - /** Returns the first element in the array, or 0 if the array is empty. - - @see operator[], getUnchecked, getLast - */ - inline ElementType getFirst() const - { - const ScopedLockType lock (getLock()); - return (numUsed > 0) ? data.elements [0] - : ElementType(); - } - - /** Returns the last element in the array, or 0 if the array is empty. - - @see operator[], getUnchecked, getFirst - */ - inline ElementType getLast() const - { - const ScopedLockType lock (getLock()); - return (numUsed > 0) ? data.elements [numUsed - 1] - : 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 - { - 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 (ParameterType newElement) - { - const ScopedLockType lock (getLock()); - data.ensureAllocatedSize (numUsed + 1); - new (data.elements + numUsed++) ElementType (newElement); - } - - /** 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); - - 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); - } - } - - /** 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; - - if (isPositiveAndBelow (indexToInsertAt, numUsed)) - { - insertPos = data.elements + indexToInsertAt; - const int numberToMove = numUsed - indexToInsertAt; - memmove (insertPos + numberOfElements, insertPos, numberToMove * sizeof (ElementType)); - } - else - { - insertPos = data.elements + 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)) - { - 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 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) - { - const ScopedLockType lock (getLock()); - - if (numElementsToAdd > 0) - { - data.ensureAllocatedSize (numUsed + numElementsToAdd); - - while (--numElementsToAdd >= 0) - { - new (data.elements + numUsed) ElementType (*elementsToAdd++); - ++numUsed; - } - } - } - - /** 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. - */ - void swapWithArray (Array& otherArray) noexcept - { - const ScopedLockType lock1 (getLock()); - const ScopedLockType lock2 (otherArray.getLock()); - - data.swapWith (otherArray.data); - swapVariables (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, ParameterType 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()); - int start = 0; - int end_ = numUsed; - - for (;;) - { - if (start >= end_) - { - return -1; - } - else if (comparator.compareElements (elementToLookFor, data.elements [start]) == 0) - { - return start; - } - else - { - const int halfway = (start + end_) >> 1; - - if (halfway == start) - return -1; - else if (comparator.compareElements (elementToLookFor, data.elements [halfway]) >= 0) - start = halfway; - else - end_ = 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 removeValue, removeRange - */ - ElementType remove (const int indexToRemove) - { - const ScopedLockType lock (getLock()); - - if (isPositiveAndBelow (indexToRemove, numUsed)) - { - --numUsed; - - ElementType* const e = data.elements + indexToRemove; - ElementType removed (*e); - e->~ElementType(); - const int numberToShift = numUsed - indexToRemove; - - if (numberToShift > 0) - memmove (e, e + 1, ((size_t) numberToShift) * sizeof (ElementType)); - - if ((numUsed << 1) < data.numAllocated) - minimiseStorageOverheads(); - - return removed; - } - else - { - 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 removeValue (ParameterType valueToRemove) - { - const ScopedLockType lock (getLock()); - ElementType* const e = data.elements; - - for (int i = 0; i < numUsed; ++i) - { - if (valueToRemove == e[i]) - { - remove (i); - break; - } - } - } - - /** 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, removeValue - */ - 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; - - if ((numUsed << 1) < data.numAllocated) - minimiseStorageOverheads(); - } - } - - /** Removes the last n elements from the array. - - @param howManyToRemove how many elements to remove from the end of the array - @see remove, removeValue, 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; - - if ((numUsed << 1) < data.numAllocated) - minimiseStorageOverheads(); - } - - /** 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, removeValue, 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])) - remove (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, removeValue, 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])) - remove (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)) - { - swapVariables (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; - - -private: - //============================================================================== - ArrayAllocationBase data; - int numUsed; - - inline void deleteAllElements() noexcept - { - for (int i = 0; i < numUsed; ++i) - data.elements[i].~ElementType(); - } -}; - - -#endif // __JUCE_ARRAY_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/containers/juce_ArrayAllocationBase.h b/src/juce/JuceLibraryCode/modules/juce_core/containers/juce_ArrayAllocationBase.h deleted file mode 100644 index 7c72c939..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/containers/juce_ArrayAllocationBase.h +++ /dev/null @@ -1,135 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_ARRAYALLOCATIONBASE_JUCEHEADER__ -#define __JUCE_ARRAYALLOCATIONBASE_JUCEHEADER__ - -#include "../memory/juce_HeapBlock.h" - - -//============================================================================== -/** - 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); - } - - /** 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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/containers/juce_DynamicObject.cpp b/src/juce/JuceLibraryCode/modules/juce_core/containers/juce_DynamicObject.cpp deleted file mode 100644 index c0afb557..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/containers/juce_DynamicObject.cpp +++ /dev/null @@ -1,76 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -DynamicObject::DynamicObject() -{ -} - -DynamicObject::~DynamicObject() -{ -} - -bool DynamicObject::hasProperty (const Identifier& propertyName) const -{ - const var* const v = properties.getVarPointer (propertyName); - return v != nullptr && ! v->isMethod(); -} - -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 (const Identifier& methodName, - const var* parameters, - int numParameters) -{ - return properties [methodName].invokeMethod (this, parameters, numParameters); -} - -void DynamicObject::setMethod (const Identifier& name, - var::MethodFunction methodFunction) -{ - properties.set (name, var (methodFunction)); -} - -void DynamicObject::clear() -{ - properties.clear(); -} diff --git a/src/juce/JuceLibraryCode/modules/juce_core/containers/juce_DynamicObject.h b/src/juce/JuceLibraryCode/modules/juce_core/containers/juce_DynamicObject.h deleted file mode 100644 index d899cb00..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/containers/juce_DynamicObject.h +++ /dev/null @@ -1,122 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_DYNAMICOBJECT_JUCEHEADER__ -#define __JUCE_DYNAMICOBJECT_JUCEHEADER__ - -#include "juce_NamedValueSet.h" -#include "../memory/juce_ReferenceCountedObject.h" - - -//============================================================================== -/** - 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(); - - /** Destructor. */ - virtual ~DynamicObject(); - - //============================================================================== - /** 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 a void if no such property exists. - */ - virtual 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 (const Identifier& methodName, - const var* parameters, - int numParameters); - - /** Sets up a method. - - This is basically the same as calling setProperty (methodName, (var::MethodFunction) myFunction), but - helps to avoid accidentally invoking the wrong type of var constructor. It also makes - the code easier to read, - - The compiler will probably force you to use an explicit cast your method to a (var::MethodFunction), e.g. - @code - setMethod ("doSomething", (var::MethodFunction) &MyClass::doSomething); - @endcode - */ - void setMethod (const Identifier& methodName, - var::MethodFunction methodFunction); - - //============================================================================== - /** Removes all properties and methods from the object. */ - void clear(); - - /** Returns the NamedValueSet that holds the object's properties. */ - NamedValueSet& getProperties() noexcept { return properties; } - -private: - //============================================================================== - NamedValueSet properties; - - JUCE_LEAK_DETECTOR (DynamicObject); -}; - - - -#endif // __JUCE_DYNAMICOBJECT_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/containers/juce_ElementComparator.h b/src/juce/JuceLibraryCode/modules/juce_core/containers/juce_ElementComparator.h deleted file mode 100644 index f976c40c..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/containers/juce_ElementComparator.h +++ /dev/null @@ -1,276 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_ELEMENTCOMPARATOR_JUCEHEADER__ -#define __JUCE_ELEMENTCOMPARATOR_JUCEHEADER__ - - -//============================================================================== -/** - 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) -{ - (void) comparator; // if you pass in an object with a static compareElements() method, this - // avoids getting warning messages about the parameter being unused - - if (lastElement > firstElement) - { - if (retainOrderOfEquivalentItems) - { - for (int i = firstElement; i < lastElement; ++i) - { - if (comparator.compareElements (array[i], array [i + 1]) > 0) - { - std::swap (array[i], array[i + 1]); - - if (i > firstElement) - i -= 2; - } - } - } - else - { - int fromStack[30], toStack[30]; - int stackIndex = 0; - - for (;;) - { - const int size = (lastElement - firstElement) + 1; - - if (size <= 8) - { - int j = lastElement; - int maxIndex; - - while (j > firstElement) - { - maxIndex = firstElement; - for (int k = firstElement + 1; k <= j; ++k) - if (comparator.compareElements (array[k], array [maxIndex]) > 0) - maxIndex = k; - - std::swap (array[j], array[maxIndex]); - --j; - } - } - else - { - const int mid = firstElement + (size >> 1); - std::swap (array[mid], array[firstElement]); - - int i = firstElement; - int j = lastElement + 1; - - for (;;) - { - while (++i <= lastElement - && comparator.compareElements (array[i], array [firstElement]) <= 0) - {} - - while (--j > firstElement - && comparator.compareElements (array[j], array [firstElement]) >= 0) - {} - - if (j < i) - break; - - std::swap (array[i], array[j]); - } - - std::swap (array[j], array[firstElement]); - - if (j - 1 - firstElement >= lastElement - i) - { - if (firstElement + 1 < j) - { - fromStack [stackIndex] = firstElement; - toStack [stackIndex] = j - 1; - ++stackIndex; - } - - if (i < lastElement) - { - firstElement = i; - continue; - } - } - else - { - if (i < lastElement) - { - fromStack [stackIndex] = i; - toStack [stackIndex] = lastElement; - ++stackIndex; - } - - if (firstElement + 1 < j) - { - lastElement = j - 1; - continue; - } - } - } - - if (--stackIndex < 0) - break; - - jassert (stackIndex < numElementsInArray (fromStack)); - - firstElement = fromStack [stackIndex]; - lastElement = toStack [stackIndex]; - } - } - } -} - - -//============================================================================== -/** - 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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/containers/juce_HashMap.h b/src/juce/JuceLibraryCode/modules/juce_core/containers/juce_HashMap.h deleted file mode 100644 index 5ff8c596..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/containers/juce_HashMap.h +++ /dev/null @@ -1,447 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_HASHMAP_JUCEHEADER__ -#define __JUCE_HASHMAP_JUCEHEADER__ - -#include "juce_OwnedArray.h" -#include "juce_LinkedListPointer.h" -#include "../memory/juce_ScopedPointer.h" - - -//============================================================================== -/** - A simple class to generate hash functions for some primitive types, intended for - use with the HashMap class. - @see HashMap -*/ -class DefaultHashFunctions -{ -public: - /** Generates a simple hash from an integer. */ - static int generateHash (const int key, const int upperLimit) noexcept { return std::abs (key) % upperLimit; } - /** Generates a simple hash from a string. */ - static int generateHash (const String& key, const int upperLimit) noexcept { return (int) (((uint32) key.hashCode()) % (uint32) upperLimit); } - /** Generates a simple hash from a variant. */ - static int generateHash (const var& key, const int upperLimit) 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 - { - static int generateHash (MyKeyType key, int upperLimit) - { - // 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 HashFunctionToUse 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 - - @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. - - The numberOfSlots parameter 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(). - */ - explicit HashMap (const int numberOfSlots = defaultHashTableSize) - : totalNumItems (0) - { - slots.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 = slots.size(); --i >= 0;) - { - HashEntry* h = slots.getUnchecked(i); - - while (h != nullptr) - { - const ScopedPointer deleter (h); - h = h->nextEntry; - } - - slots.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 const ValueType operator[] (KeyTypeParameter keyToLookFor) const - { - const ScopedLockType sl (getLock()); - - for (const HashEntry* entry = slots.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 = slots.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 = slots.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 = slots.getUnchecked (hashIndex); - - for (HashEntry* entry = firstEntry; entry != nullptr; entry = entry->nextEntry) - { - if (entry->key == newKey) - { - entry->value = newValue; - return; - } - } - - slots.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 = slots.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 - slots.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 = slots.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 - slots.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 = slots.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 slots.size(); - } - - //============================================================================== - /** Efficiently swaps the contents of two hash-maps. */ - void swapWith (HashMap& otherHashMap) noexcept - { - const ScopedLockType lock1 (getLock()); - const ScopedLockType lock2 (otherHashMap.getLock()); - - slots.swapWithArray (otherHashMap.slots); - 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 key_, ValueTypeParameter value_, HashEntry* const nextEntry_) - : key (key_), value (value_), nextEntry (nextEntry_) - {} - - 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.slots.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; - - Array slots; - 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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/containers/juce_LinkedListPointer.h b/src/juce/JuceLibraryCode/modules/juce_core/containers/juce_LinkedListPointer.h deleted file mode 100644 index f0f7892a..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/containers/juce_LinkedListPointer.h +++ /dev/null @@ -1,370 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_LINKEDLISTPOINTER_JUCEHEADER__ -#define __JUCE_LINKEDLISTPOINTER_JUCEHEADER__ - - -//============================================================================== -/** - 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 = (ObjectType*) 0; - 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 = (ObjectType*) 0; - } - - 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) - { - LinkedListPointer* const l = findPointerTo (itemToRemove); - - if (l != nullptr) - 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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/containers/juce_NamedValueSet.cpp b/src/juce/JuceLibraryCode/modules/juce_core/containers/juce_NamedValueSet.cpp deleted file mode 100644 index 27a5232b..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/containers/juce_NamedValueSet.cpp +++ /dev/null @@ -1,277 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -NamedValueSet::NamedValue::NamedValue() noexcept -{ -} - -inline NamedValueSet::NamedValue::NamedValue (const Identifier& name_, const var& value_) - : name (name_), value (value_) -{ -} - -NamedValueSet::NamedValue::NamedValue (const NamedValue& other) - : name (other.name), value (other.value) -{ -} - -NamedValueSet::NamedValue& NamedValueSet::NamedValue::operator= (const NamedValueSet::NamedValue& other) -{ - name = other.name; - value = other.value; - return *this; -} - -#if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS -NamedValueSet::NamedValue::NamedValue (NamedValue&& other) noexcept - : nextListItem (static_cast &&> (other.nextListItem)), - name (static_cast (other.name)), - value (static_cast (other.value)) -{ -} - -inline NamedValueSet::NamedValue::NamedValue (const Identifier& name_, var&& value_) - : name (name_), value (static_cast (value_)) -{ -} - -NamedValueSet::NamedValue& NamedValueSet::NamedValue::operator= (NamedValue&& other) noexcept -{ - nextListItem = static_cast &&> (other.nextListItem); - name = static_cast (other.name); - value = static_cast (other.value); - return *this; -} -#endif - -bool NamedValueSet::NamedValue::operator== (const NamedValueSet::NamedValue& other) const noexcept -{ - return name == other.name && value == other.value; -} - -//============================================================================== -NamedValueSet::NamedValueSet() noexcept -{ -} - -NamedValueSet::NamedValueSet (const NamedValueSet& other) -{ - values.addCopyOfList (other.values); -} - -NamedValueSet& NamedValueSet::operator= (const NamedValueSet& other) -{ - clear(); - values.addCopyOfList (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() -{ - clear(); -} - -void NamedValueSet::clear() -{ - values.deleteAll(); -} - -bool NamedValueSet::operator== (const NamedValueSet& other) const -{ - const NamedValue* i1 = values; - const NamedValue* i2 = other.values; - - while (i1 != nullptr && i2 != nullptr) - { - if (! (*i1 == *i2)) - return false; - - i1 = i1->nextListItem; - i2 = i2->nextListItem; - } - - return true; -} - -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 -{ - for (NamedValue* i = values; i != nullptr; i = i->nextListItem) - if (i->name == name) - return i->value; - - return var::null; -} - -var NamedValueSet::getWithDefault (const Identifier& name, const var& defaultReturnValue) const -{ - const var* const v = getVarPointer (name); - return v != nullptr ? *v : defaultReturnValue; -} - -var* NamedValueSet::getVarPointer (const Identifier& name) const noexcept -{ - for (NamedValue* i = values; i != nullptr; i = i->nextListItem) - if (i->name == name) - return &(i->value); - - return nullptr; -} - -#if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS -bool NamedValueSet::set (const Identifier& name, var&& newValue) -{ - LinkedListPointer* i = &values; - - while (i->get() != nullptr) - { - NamedValue* const v = i->get(); - - if (v->name == name) - { - if (v->value.equalsWithSameType (newValue)) - return false; - - v->value = static_cast (newValue); - return true; - } - - i = &(v->nextListItem); - } - - i->insertNext (new NamedValue (name, static_cast (newValue))); - return true; -} -#endif - -bool NamedValueSet::set (const Identifier& name, const var& newValue) -{ - LinkedListPointer* i = &values; - - while (i->get() != nullptr) - { - NamedValue* const v = i->get(); - - if (v->name == name) - { - if (v->value.equalsWithSameType (newValue)) - return false; - - v->value = newValue; - return true; - } - - i = &(v->nextListItem); - } - - i->insertNext (new NamedValue (name, newValue)); - return true; -} - -bool NamedValueSet::contains (const Identifier& name) const -{ - return getVarPointer (name) != nullptr; -} - -bool NamedValueSet::remove (const Identifier& name) -{ - LinkedListPointer* i = &values; - - for (;;) - { - NamedValue* const v = i->get(); - - if (v == nullptr) - break; - - if (v->name == name) - { - delete i->removeNext(); - return true; - } - - i = &(v->nextListItem); - } - - return false; -} - -const Identifier NamedValueSet::getName (const int index) const -{ - const NamedValue* const v = values[index]; - jassert (v != nullptr); - return v->name; -} - -const var& NamedValueSet::getValueAt (const int index) const -{ - const NamedValue* const v = values[index]; - jassert (v != nullptr); - return v->value; -} - -void NamedValueSet::setFromXmlAttributes (const XmlElement& xml) -{ - clear(); - LinkedListPointer::Appender appender (values); - - const int numAtts = xml.getNumAttributes(); // xxx inefficient - should write an att iterator.. - - for (int i = 0; i < numAtts; ++i) - appender.append (new NamedValue (xml.getAttributeName (i), var (xml.getAttributeValue (i)))); -} - -void NamedValueSet::copyToXmlAttributes (XmlElement& xml) const -{ - for (NamedValue* i = values; i != nullptr; i = i->nextListItem) - { - jassert (! i->value.isObject()); // DynamicObjects can't be stored as XML! - - xml.setAttribute (i->name.toString(), - i->value.toString()); - } -} diff --git a/src/juce/JuceLibraryCode/modules/juce_core/containers/juce_NamedValueSet.h b/src/juce/JuceLibraryCode/modules/juce_core/containers/juce_NamedValueSet.h deleted file mode 100644 index ded20115..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/containers/juce_NamedValueSet.h +++ /dev/null @@ -1,166 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_NAMEDVALUESET_JUCEHEADER__ -#define __JUCE_NAMEDVALUESET_JUCEHEADER__ - -#include "juce_Variant.h" -#include "../containers/juce_LinkedListPointer.h" -class XmlElement; -#ifndef DOXYGEN - class JSONFormatter; -#endif - - -//============================================================================== -/** 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& other); - - /** Replaces this set with a copy of another set. */ - NamedValueSet& operator= (const NamedValueSet& other); - - #if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS - NamedValueSet (NamedValueSet&& other) noexcept; - NamedValueSet& operator= (NamedValueSet&& other) noexcept; - #endif - - /** Destructor. */ - ~NamedValueSet(); - - bool operator== (const NamedValueSet& other) const; - bool operator!= (const NamedValueSet& other) 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; - - /** 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 the value passed-in. - */ - bool set (const 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 the value passed-in. - */ - bool set (const Identifier& name, var&& newValue); - #endif - - /** Returns true if the set contains an item with the specified name. */ - bool contains (const Identifier& name) const; - - /** 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. - */ - const Identifier getName (int index) const; - - /** 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; - - /** Removes all values. */ - void clear(); - - //============================================================================== - /** 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; - - //============================================================================== - /** 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: - //============================================================================== - class NamedValue - { - public: - NamedValue() noexcept; - NamedValue (const NamedValue&); - NamedValue (const Identifier& name, const var& value); - NamedValue& operator= (const NamedValue&); - #if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS - NamedValue (NamedValue&&) noexcept; - NamedValue (const Identifier& name, var&& value); - NamedValue& operator= (NamedValue&&) noexcept; - #endif - bool operator== (const NamedValue& other) const noexcept; - - LinkedListPointer nextListItem; - Identifier name; - var value; - - private: - JUCE_LEAK_DETECTOR (NamedValue); - }; - - friend class LinkedListPointer; - LinkedListPointer values; - - friend class JSONFormatter; -}; - - -#endif // __JUCE_NAMEDVALUESET_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/containers/juce_OwnedArray.h b/src/juce/JuceLibraryCode/modules/juce_core/containers/juce_OwnedArray.h deleted file mode 100644 index 96c25c2f..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/containers/juce_OwnedArray.h +++ /dev/null @@ -1,822 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_OWNEDARRAY_JUCEHEADER__ -#define __JUCE_OWNEDARRAY_JUCEHEADER__ - -#include "juce_ArrayAllocationBase.h" -#include "juce_ElementComparator.h" -#include "../threads/juce_CriticalSection.h" - - -//============================================================================== -/** 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() - { - clear (true); - } - - #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 - { - 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 (const bool deleteObjects = true) - { - const ScopedLockType lock (getLock()); - - if (deleteObjects) - { - while (numUsed > 0) - delete data.elements [--numUsed]; - } - - data.setAllocatedSize (0); - 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()); - return isPositiveAndBelow (index, numUsed) ? data.elements [index] - : static_cast (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 if always going to be legal. - */ - inline ObjectClass* getUnchecked (const int index) const noexcept - { - const ScopedLockType lock (getLock()); - jassert (isPositiveAndBelow (index, numUsed)); - 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()); - return numUsed > 0 ? data.elements [0] - : static_cast (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()); - return numUsed > 0 ? data.elements [numUsed - 1] - : static_cast (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 - { - 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* const 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* const 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 - @see set, insert, addIfNotAlreadyThere, addSorted - */ - void add (const ObjectClass* const newObject) noexcept - { - const ScopedLockType lock (getLock()); - data.ensureAllocatedSize (numUsed + 1); - data.elements [numUsed++] = const_cast (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 - @see add, addSorted, addIfNotAlreadyThere, set - */ - void insert (int indexToInsertAt, - const ObjectClass* const newObject) noexcept - { - if (indexToInsertAt >= 0) - { - const ScopedLockType lock (getLock()); - - if (indexToInsertAt > numUsed) - indexToInsertAt = numUsed; - - data.ensureAllocatedSize (numUsed + 1); - - ObjectClass** const e = data.elements + indexToInsertAt; - const int numToMove = numUsed - indexToInsertAt; - - if (numToMove > 0) - memmove (e + 1, e, sizeof (ObjectClass*) * (size_t) numToMove); - - *e = const_cast (newObject); - ++numUsed; - } - else - { - add (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 (const 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. - - 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 - */ - void set (const int indexToChange, - const ObjectClass* const newObject, - const bool deleteOldElement = true) - { - if (indexToChange >= 0) - { - ObjectClass* toDelete = nullptr; - - { - const ScopedLockType lock (getLock()); - - if (indexToChange < numUsed) - { - if (deleteOldElement) - { - toDelete = data.elements [indexToChange]; - - if (toDelete == newObject) - toDelete = nullptr; - } - - data.elements [indexToChange] = const_cast (newObject); - } - else - { - data.ensureAllocatedSize (numUsed + 1); - data.elements [numUsed++] = const_cast (newObject); - } - } - - delete toDelete; // don't want to use a ScopedPointer here because if the - // object has a private destructor, both OwnedArray and - // ScopedPointer would need to be friend classes.. - } - 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.. - } - } - - /** 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); - - 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); - - while (--numElementsToAdd >= 0) - { - data.elements [numUsed] = new ObjectClass (*arrayToAddFrom.getUnchecked (startIndex++)); - ++numUsed; - } - } - - /** 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 (const int indexToRemove, - const bool deleteObject = true) - { - ObjectClass* toDelete = nullptr; - - { - 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); - } - } - - delete toDelete; // don't want to use a ScopedPointer here because if the - // object has a private destructor, both OwnedArray and - // ScopedPointer would need to be friend classes.. - - 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 (const 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* const objectToRemove, - const 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, - const int numberToRemove, - const 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) - { - delete 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, - const 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 (const int index1, - const int index2) noexcept - { - const ScopedLockType lock (getLock()); - - if (isPositiveAndBelow (index1, numUsed) - && isPositiveAndBelow (index2, numUsed)) - { - swapVariables (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. - */ - void swapWithArray (OwnedArray& otherArray) noexcept - { - const ScopedLockType lock1 (getLock()); - const ScopedLockType lock2 (otherArray.getLock()); - - data.swapWith (otherArray.data); - swapVariables (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, - 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); - } - - //============================================================================== - /** 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; - - -private: - //============================================================================== - ArrayAllocationBase data; - int numUsed; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (OwnedArray); -}; - - -#endif // __JUCE_OWNEDARRAY_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/containers/juce_PropertySet.cpp b/src/juce/JuceLibraryCode/modules/juce_core/containers/juce_PropertySet.cpp deleted file mode 100644 index 8464c5ba..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/containers/juce_PropertySet.cpp +++ /dev/null @@ -1,220 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -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 (const String& 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 (const String& 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 (const String& 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 (const String& 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 (const String& 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 (const String& 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::null - : var (xml->createDocument (String::empty, true))); -} - -bool PropertySet::containsKey (const String& 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/src/juce/JuceLibraryCode/modules/juce_core/containers/juce_PropertySet.h b/src/juce/JuceLibraryCode/modules/juce_core/containers/juce_PropertySet.h deleted file mode 100644 index b3c4d581..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/containers/juce_PropertySet.h +++ /dev/null @@ -1,226 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_PROPERTYSET_JUCEHEADER__ -#define __JUCE_PROPERTYSET_JUCEHEADER__ - -#include "../text/juce_StringPairArray.h" -#include "../xml/juce_XmlElement.h" -#include "../containers/juce_Variant.h" - - -//============================================================================== -/** - 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 (const String& keyName, - const String& defaultReturnValue = String::empty) 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 (const String& keyName, - const 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 (const String& keyName, - const 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 (const String& keyName, - const 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 0 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 (const String& 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 (const String& keyName); - - /** Returns true if the properies include the given key. */ - bool containsKey (const String& 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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/containers/juce_ReferenceCountedArray.h b/src/juce/JuceLibraryCode/modules/juce_core/containers/juce_ReferenceCountedArray.h deleted file mode 100644 index 88c9b875..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/containers/juce_ReferenceCountedArray.h +++ /dev/null @@ -1,857 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_REFERENCECOUNTEDARRAY_JUCEHEADER__ -#define __JUCE_REFERENCECOUNTEDARRAY_JUCEHEADER__ - -#include "../memory/juce_ReferenceCountedObject.h" -#include "juce_ArrayAllocationBase.h" -#include "juce_ElementComparator.h" -#include "../threads/juce_CriticalSection.h" - - -//============================================================================== -/** - Holds a list of objects derived from ReferenceCountedObject. - - 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(), numUsed * sizeof (ObjectClass*)); - - for (int i = numUsed; --i >= 0;) - if (data.elements[i] != nullptr) - data.elements[i]->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 (data.elements[i] != nullptr) - data.elements[i]->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); - swapWithArray (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); - swapWithArray (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 (data.elements [--numUsed] != nullptr) - data.elements [numUsed]->decReferenceCount(); - - 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 if 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()); - return isPositiveAndBelow (index, numUsed) ? data.elements [index] - : nullptr; - } - - /** 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)); - 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()); - return numUsed > 0 ? data.elements [0] - : static_cast (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 ObjectClassPtr getLast() const noexcept - { - const ScopedLockType lock (getLock()); - return numUsed > 0 ? data.elements [numUsed - 1] - : static_cast (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() 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 end_ = e + numUsed; - - while (e != end_) - { - 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 end_ = e + numUsed; - - while (e != end_) - { - 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 - */ - void add (ObjectClass* const newObject) noexcept - { - const ScopedLockType lock (getLock()); - data.ensureAllocatedSize (numUsed + 1); - data.elements [numUsed++] = newObject; - - if (newObject != nullptr) - newObject->incReferenceCount(); - } - - /** 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 - */ - void insert (int indexToInsertAt, - ObjectClass* const newObject) noexcept - { - if (indexToInsertAt >= 0) - { - const ScopedLockType lock (getLock()); - - if (indexToInsertAt > numUsed) - indexToInsertAt = numUsed; - - data.ensureAllocatedSize (numUsed + 1); - - 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; - } - else - { - add (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 (data.elements [indexToChange] != nullptr) - data.elements [indexToChange]->decReferenceCount(); - - data.elements [indexToChange] = newObject; - } - else - { - data.ensureAllocatedSize (numUsed + 1); - 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 (*e != nullptr) - (*e)->decReferenceCount(); - - --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 (*e != nullptr) - { - removedItem = *e; - (*e)->decReferenceCount(); - } - - --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 end_ = jlimit (0, numUsed, startIndex + numberToRemove); - - if (end_ > start) - { - int i; - for (i = start; i < end_; ++i) - { - if (data.elements[i] != nullptr) - { - data.elements[i]->decReferenceCount(); - data.elements[i] = nullptr; // (in case one of the destructors accesses this array and hits a dangling pointer) - } - } - - const int rangeSize = end_ - start; - ObjectClass** e = data.elements + start; - i = numUsed - end_; - 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. - */ - void swapWithArray (ReferenceCountedArray& otherArray) noexcept - { - const ScopedLockType lock1 (getLock()); - const 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; - - -private: - //============================================================================== - ArrayAllocationBase data; - int numUsed; -}; - - -#endif // __JUCE_REFERENCECOUNTEDARRAY_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/containers/juce_ScopedValueSetter.h b/src/juce/JuceLibraryCode/modules/juce_core/containers/juce_ScopedValueSetter.h deleted file mode 100644 index 9bed5107..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/containers/juce_ScopedValueSetter.h +++ /dev/null @@ -1,97 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_SCOPEDVALUESETTER_JUCEHEADER__ -#define __JUCE_SCOPEDVALUESETTER_JUCEHEADER__ - - -//============================================================================== -/** - 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, - const 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, - const ValueType& newValue, - const 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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/containers/juce_SortedSet.h b/src/juce/JuceLibraryCode/modules/juce_core/containers/juce_SortedSet.h deleted file mode 100644 index d300a459..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/containers/juce_SortedSet.h +++ /dev/null @@ -1,594 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_SORTEDSET_JUCEHEADER__ -#define __JUCE_SORTEDSET_JUCEHEADER__ - -#include "juce_ArrayAllocationBase.h" -#include "../threads/juce_CriticalSection.h" - -#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 - : numUsed (0) - { - } - - /** Creates a copy of another set. - @param other the set to copy - */ - SortedSet (const SortedSet& other) noexcept - { - const ScopedLockType lock (other.getLock()); - numUsed = other.numUsed; - data.setAllocatedSize (other.numUsed); - memcpy (data.elements, other.data.elements, numUsed * sizeof (ElementType)); - } - - /** Destructor. */ - ~SortedSet() noexcept - { - } - - /** Copies another set over this one. - @param other the set to copy - */ - SortedSet& operator= (const SortedSet& other) noexcept - { - if (this != &other) - { - const ScopedLockType lock1 (other.getLock()); - const ScopedLockType lock2 (getLock()); - - data.ensureAllocatedSize (other.size()); - numUsed = other.numUsed; - memcpy (data.elements, other.data.elements, numUsed * sizeof (ElementType)); - minimiseStorageOverheads(); - } - - 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 - { - const ScopedLockType lock (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 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 - { - const ScopedLockType lock (getLock()); - data.setAllocatedSize (0); - numUsed = 0; - } - - /** Removes all elements from the set without freeing the array's allocated storage. - - @see clear - */ - void clearQuick() noexcept - { - const ScopedLockType lock (getLock()); - numUsed = 0; - } - - //============================================================================== - /** Returns the current number of elements in the set. - */ - inline int size() const noexcept - { - return numUsed; - } - - /** 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 - { - const ScopedLockType lock (getLock()); - return isPositiveAndBelow (index, numUsed) ? data.elements [index] - : ElementType(); - } - - /** 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 - { - const ScopedLockType lock (getLock()); - jassert (isPositiveAndBelow (index, numUsed)); - return data.elements [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 - { - const ScopedLockType lock (getLock()); - jassert (isPositiveAndBelow (index, numUsed)); - return data.elements [index]; - } - - /** Returns the first element in the set, or 0 if the set is empty. - - @see operator[], getUnchecked, getLast - */ - inline ElementType getFirst() const noexcept - { - const ScopedLockType lock (getLock()); - return numUsed > 0 ? data.elements [0] : ElementType(); - } - - /** Returns the last element in the set, or 0 if the set is empty. - - @see operator[], getUnchecked, getFirst - */ - inline ElementType getLast() const noexcept - { - const ScopedLockType lock (getLock()); - return numUsed > 0 ? data.elements [numUsed - 1] : ElementType(); - } - - //============================================================================== - /** 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.elements; - } - - /** 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.elements + numUsed; - } - - //============================================================================== - /** 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 (getLock()); - - int start = 0; - int end_ = numUsed; - - for (;;) - { - if (start >= end_) - { - return -1; - } - else if (elementToLookFor == data.elements [start]) - { - return start; - } - else - { - const int halfway = (start + end_) >> 1; - - if (halfway == start) - return -1; - else if (elementToLookFor < data.elements [halfway]) - end_ = halfway; - else - start = 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 - { - const ScopedLockType lock (getLock()); - - int start = 0; - int end_ = numUsed; - - for (;;) - { - if (start >= end_) - { - return false; - } - else if (elementToLookFor == data.elements [start]) - { - return true; - } - else - { - const int halfway = (start + end_) >> 1; - - if (halfway == start) - return false; - else if (elementToLookFor < data.elements [halfway]) - end_ = halfway; - else - start = halfway; - } - } - } - - //============================================================================== - /** Adds a new element to the set, (as long as it's not already in there). - - @param newElement the new object to add to the set - @see set, insert, addIfNotAlreadyThere, addSorted, addSet, addArray - */ - void add (const ElementType newElement) noexcept - { - const ScopedLockType lock (getLock()); - - int start = 0; - int end_ = numUsed; - - for (;;) - { - if (start >= end_) - { - jassert (start <= end_); - insertInternal (start, newElement); - break; - } - else if (newElement == data.elements [start]) - { - break; - } - else - { - const int halfway = (start + end_) >> 1; - - if (halfway == start) - { - if (newElement < data.elements [halfway]) - insertInternal (start, newElement); - else - insertInternal (start + 1, newElement); - - break; - } - else if (newElement < data.elements [halfway]) - end_ = halfway; - else - start = halfway; - } - } - } - - /** 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; - - addArray (setToAddFrom.elements + 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 - { - const ScopedLockType lock (getLock()); - - if (isPositiveAndBelow (indexToRemove, numUsed)) - { - --numUsed; - - ElementType* const e = data.elements + indexToRemove; - ElementType const removed = *e; - const int numberToShift = numUsed - indexToRemove; - - if (numberToShift > 0) - memmove (e, e + 1, sizeof (ElementType) * (size_t) numberToShift); - - if ((numUsed << 1) < data.numAllocated) - minimiseStorageOverheads(); - - return removed; - } - - return ElementType(); - } - - /** 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()); - 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 = numUsed; --i >= 0;) - if (otherSet.contains (data.elements [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 = numUsed; --i >= 0;) - if (! otherSet.contains (data.elements [i])) - remove (i); - } - } - } - - //============================================================================== - /** 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 - { - const ScopedLockType lock (getLock()); - data.shrinkToNoMoreThan (numUsed); - } - - /** 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) - { - 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; - - -private: - //============================================================================== - ArrayAllocationBase data; - int numUsed; - - void insertInternal (const int indexToInsertAt, const ElementType newElement) noexcept - { - data.ensureAllocatedSize (numUsed + 1); - - ElementType* const insertPos = data.elements + indexToInsertAt; - const int numberToMove = numUsed - indexToInsertAt; - - if (numberToMove > 0) - memmove (insertPos + 1, insertPos, sizeof (ElementType) * (size_t) numberToMove); - - *insertPos = newElement; - ++numUsed; - } -}; - -#if JUCE_MSVC - #pragma warning (pop) -#endif - -#endif // __JUCE_SORTEDSET_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/containers/juce_SparseSet.h b/src/juce/JuceLibraryCode/modules/juce_core/containers/juce_SparseSet.h deleted file mode 100644 index 1e3f1a20..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/containers/juce_SparseSet.h +++ /dev/null @@ -1,299 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_SPARSESET_JUCEHEADER__ -#define __JUCE_SPARSESET_JUCEHEADER__ - -#include "../maths/juce_Range.h" -#include "../threads/juce_CriticalSection.h" - - -//============================================================================== -/** - Holds a set of primitive values, storing them as a set of ranges. - - This container acts like an array, but can efficiently hold large continguous - 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 paramter 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)); - else - 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); - - int i; - for (i = getNumRanges(); --i >= 0;) - newItems.removeRange (getRange (i)); - - removeRange (range); - - for (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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/containers/juce_Variant.cpp b/src/juce/JuceLibraryCode/modules/juce_core/containers/juce_Variant.cpp deleted file mode 100644 index 70299caf..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/containers/juce_Variant.cpp +++ /dev/null @@ -1,647 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -enum VariantStreamMarkers -{ - varMarker_Int = 1, - varMarker_BoolTrue = 2, - varMarker_BoolFalse = 3, - varMarker_Double = 4, - varMarker_String = 5, - varMarker_Int64 = 6, - varMarker_Array = 7 -}; - -//============================================================================== -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 0; } - - virtual bool isVoid() 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 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 { return true; } - bool equals (const ValueUnion&, const ValueUnion&, const VariantType& otherType) const noexcept { return otherType.isVoid(); } - void writeToStream (const ValueUnion&, OutputStream& output) const { output.writeCompressedInt (0); } -}; - -//============================================================================== -class var::VariantType_Int : public var::VariantType -{ -public: - VariantType_Int() noexcept {} - static const VariantType_Int instance; - - int toInt (const ValueUnion& data) const noexcept { return data.intValue; }; - int64 toInt64 (const ValueUnion& data) const noexcept { return (int64) data.intValue; }; - double toDouble (const ValueUnion& data) const noexcept { return (double) data.intValue; } - String toString (const ValueUnion& data) const { return String (data.intValue); } - bool toBool (const ValueUnion& data) const noexcept { return data.intValue != 0; } - bool isInt() const noexcept { return true; } - - bool equals (const ValueUnion& data, const ValueUnion& otherData, const VariantType& otherType) const noexcept - { - return otherType.toInt (otherData) == data.intValue; - } - - void writeToStream (const ValueUnion& data, OutputStream& output) const - { - 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 { return (int) data.int64Value; }; - int64 toInt64 (const ValueUnion& data) const noexcept { return data.int64Value; }; - double toDouble (const ValueUnion& data) const noexcept { return (double) data.int64Value; } - String toString (const ValueUnion& data) const { return String (data.int64Value); } - bool toBool (const ValueUnion& data) const noexcept { return data.int64Value != 0; } - bool isInt64() const noexcept { return true; } - - bool equals (const ValueUnion& data, const ValueUnion& otherData, const VariantType& otherType) const noexcept - { - return otherType.toInt64 (otherData) == data.int64Value; - } - - void writeToStream (const ValueUnion& data, OutputStream& output) const - { - 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 { return (int) data.doubleValue; }; - int64 toInt64 (const ValueUnion& data) const noexcept { return (int64) data.doubleValue; }; - double toDouble (const ValueUnion& data) const noexcept { return data.doubleValue; } - String toString (const ValueUnion& data) const { return String (data.doubleValue); } - bool toBool (const ValueUnion& data) const noexcept { return data.doubleValue != 0; } - bool isDouble() const noexcept { return true; } - - bool equals (const ValueUnion& data, const ValueUnion& otherData, const VariantType& otherType) const noexcept - { - return std::abs (otherType.toDouble (otherData) - data.doubleValue) < std::numeric_limits::epsilon(); - } - - void writeToStream (const ValueUnion& data, OutputStream& output) const - { - 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 { return data.boolValue ? 1 : 0; }; - int64 toInt64 (const ValueUnion& data) const noexcept { return data.boolValue ? 1 : 0; }; - double toDouble (const ValueUnion& data) const noexcept { return data.boolValue ? 1.0 : 0.0; } - String toString (const ValueUnion& data) const { return String::charToString (data.boolValue ? (juce_wchar) '1' : (juce_wchar) '0'); } - bool toBool (const ValueUnion& data) const noexcept { return data.boolValue; } - bool isBool() const noexcept { return true; } - - bool equals (const ValueUnion& data, const ValueUnion& otherData, const VariantType& otherType) const noexcept - { - return otherType.toBool (otherData) == data.boolValue; - } - - void writeToStream (const ValueUnion& data, OutputStream& output) const - { - 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 { getString (data)-> ~String(); } - void createCopy (ValueUnion& dest, const ValueUnion& source) const { new (dest.stringValue) String (*getString (source)); } - - bool isString() const noexcept { return true; } - int toInt (const ValueUnion& data) const noexcept { return getString (data)->getIntValue(); }; - int64 toInt64 (const ValueUnion& data) const noexcept { return getString (data)->getLargeIntValue(); }; - double toDouble (const ValueUnion& data) const noexcept { return getString (data)->getDoubleValue(); } - String toString (const ValueUnion& data) const { return *getString (data); } - bool toBool (const ValueUnion& data) const noexcept { 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 - { - return otherType.toString (otherData) == *getString (data); - } - - void writeToStream (const ValueUnion& data, OutputStream& output) const - { - const String* const s = getString (data); - const int len = s->getNumBytesAsUTF8() + 1; - HeapBlock temp ((size_t) len); - s->copyToUTF8 (temp, len); - output.writeCompressedInt (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 { if (data.objectValue != nullptr) data.objectValue->decReferenceCount(); } - - void createCopy (ValueUnion& dest, const ValueUnion& source) const - { - dest.objectValue = source.objectValue; - if (dest.objectValue != nullptr) - dest.objectValue->incReferenceCount(); - } - - String toString (const ValueUnion& data) const { return "Object 0x" + String::toHexString ((int) (pointer_sized_int) data.objectValue); } - bool toBool (const ValueUnion& data) const noexcept { return data.objectValue != 0; } - ReferenceCountedObject* toObject (const ValueUnion& data) const noexcept { return data.objectValue; } - bool isObject() const noexcept { return true; } - - bool equals (const ValueUnion& data, const ValueUnion& otherData, const VariantType& otherType) const noexcept - { - return otherType.toObject (otherData) == data.objectValue; - } - - void writeToStream (const ValueUnion&, OutputStream& output) const - { - jassertfalse; // Can't write an object to a stream! - output.writeCompressedInt (0); - } -}; - -//============================================================================== -class var::VariantType_Array : public var::VariantType -{ -public: - VariantType_Array() noexcept {} - static const VariantType_Array instance; - - void cleanUp (ValueUnion& data) const noexcept { delete data.arrayValue; } - void createCopy (ValueUnion& dest, const ValueUnion& source) const { dest.arrayValue = new Array (*(source.arrayValue)); } - - String toString (const ValueUnion&) const { return "[Array]"; } - bool isArray() const noexcept { return true; } - Array* toArray (const ValueUnion& data) const noexcept { return data.arrayValue; } - - bool equals (const ValueUnion& data, const ValueUnion& otherData, const VariantType& otherType) const noexcept - { - const Array* const otherArray = otherType.toArray (otherData); - return otherArray != nullptr && *otherArray == *(data.arrayValue); - } - - void writeToStream (const ValueUnion& data, OutputStream& output) const - { - MemoryOutputStream buffer (512); - const int numItems = data.arrayValue->size(); - buffer.writeCompressedInt (numItems); - - for (int i = 0; i < numItems; ++i) - data.arrayValue->getReference(i).writeToStream (buffer); - - output.writeCompressedInt (1 + (int) buffer.getDataSize()); - output.writeByte (varMarker_Array); - output << buffer; - } -}; - -//============================================================================== -class var::VariantType_Method : public var::VariantType -{ -public: - VariantType_Method() noexcept {} - static const VariantType_Method instance; - - String toString (const ValueUnion&) const { return "Method"; } - bool toBool (const ValueUnion& data) const noexcept { return data.methodValue != 0; } - bool isMethod() const noexcept { return true; } - - bool equals (const ValueUnion& data, const ValueUnion& otherData, const VariantType& otherType) const noexcept - { - return otherType.isMethod() && otherData.methodValue == data.methodValue; - } - - void writeToStream (const ValueUnion&, OutputStream& output) const - { - jassertfalse; // Can't write a method to a stream! - output.writeCompressedInt (0); - } -}; - -//============================================================================== -const var::VariantType_Void var::VariantType_Void::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_Method var::VariantType_Method::instance; - - -//============================================================================== -var::var() noexcept : type (&VariantType_Void::instance) -{ -} - -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 value_) noexcept : type (&VariantType_Int::instance) { value.intValue = value_; } -var::var (const int64 value_) noexcept : type (&VariantType_Int64::instance) { value.int64Value = value_; } -var::var (const bool value_) noexcept : type (&VariantType_Bool::instance) { value.boolValue = value_; } -var::var (const double value_) noexcept : type (&VariantType_Double::instance) { value.doubleValue = value_; } -var::var (MethodFunction method_) noexcept : type (&VariantType_Method::instance) { value.methodValue = method_; } - -var::var (const String& value_) : type (&VariantType_String::instance) { new (value.stringValue) String (value_); } -var::var (const char* const value_) : type (&VariantType_String::instance) { new (value.stringValue) String (value_); } -var::var (const wchar_t* const value_) : type (&VariantType_String::instance) { new (value.stringValue) String (value_); } - -var::var (const Array& value_) : type (&VariantType_Array::instance) -{ - value.arrayValue = new Array (value_); -} - -var::var (ReferenceCountedObject* const object) : type (&VariantType_Object::instance) -{ - value.objectValue = object; - - if (object != nullptr) - object->incReferenceCount(); -} - -//============================================================================== -bool var::isVoid() const noexcept { return type->isVoid(); } -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::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); } -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= (MethodFunction 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&& value_) : type (&VariantType_String::instance) -{ - new (value.stringValue) String (static_cast (value_)); -} - -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 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::operator[] (const Identifier& propertyName) const -{ - DynamicObject* const o = getDynamicObject(); - return o != nullptr ? o->getProperty (propertyName) : var::null; -} - -var var::operator[] (const char* const propertyName) const -{ - return operator[] (Identifier (propertyName)); -} - -var var::getProperty (const Identifier& propertyName, const var& defaultReturnValue) const -{ - DynamicObject* const o = getDynamicObject(); - return o != nullptr ? o->getProperties().getWithDefault (propertyName, defaultReturnValue) : defaultReturnValue; -} - -var var::invoke (const Identifier& method, const var* arguments, int numArguments) const -{ - DynamicObject* const o = getDynamicObject(); - return o != nullptr ? o->invokeMethod (method, arguments, numArguments) : var::null; -} - -var var::invokeMethod (DynamicObject* const target, const var* const arguments, const int numArguments) const -{ - jassert (target != nullptr); - - if (isMethod()) - return (target->*(value.methodValue)) (arguments, numArguments); - - return var::null; -} - -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 -{ - const Array* const array = getArray(); - return array != nullptr ? array->size() : 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() -{ - Array* array = getArray(); - - if (array == nullptr) - { - const Array tempVar; - var v (tempVar); - array = v.value.arrayValue; - - if (! isVoid()) - array->add (*this); - - swapWith (v); - } - - return array; -} - -void var::append (const var& n) -{ - convertToArray()->add (n); -} - -void var::remove (const int index) -{ - Array* const array = getArray(); - - if (array != nullptr) - 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 -{ - const Array* const array = getArray(); - return array != nullptr ? array->indexOf (n) : -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_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::null; -} diff --git a/src/juce/JuceLibraryCode/modules/juce_core/containers/juce_Variant.h b/src/juce/JuceLibraryCode/modules/juce_core/containers/juce_Variant.h deleted file mode 100644 index 107bc111..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/containers/juce_Variant.h +++ /dev/null @@ -1,280 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_VARIANT_JUCEHEADER__ -#define __JUCE_VARIANT_JUCEHEADER__ - -#include "../text/juce_Identifier.h" -#include "../streams/juce_OutputStream.h" -#include "../streams/juce_InputStream.h" -#include "../containers/juce_Array.h" - -#ifndef DOXYGEN - class ReferenceCountedObject; - class DynamicObject; -#endif - -//============================================================================== -/** - 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: - //============================================================================== - typedef const var (DynamicObject::*MethodFunction) (const var* arguments, int numArguments); - 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 (MethodFunction method) noexcept; - - 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= (MethodFunction method); - - #if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS - var (var&& other) noexcept; - var (String&& value); - var& operator= (var&& other) noexcept; - var& operator= (String&& value); - #endif - - void swapWith (var& other) 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; - Array* getArray() const noexcept; - ReferenceCountedObject* getObject() const noexcept; - DynamicObject* getDynamicObject() const noexcept; - - bool isVoid() 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 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; - - //============================================================================== - /** 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. */ - var operator[] (const Identifier& propertyName) const; - /** If this variant is an object, this returns one of its properties. */ - 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 (const Identifier& propertyName, const var& defaultReturnValue) const; - - /** If this variant is an object, this invokes one of its methods with no arguments. */ - var call (const Identifier& method) const; - /** If this variant is an object, this invokes one of its methods with one argument. */ - var call (const Identifier& method, const var& arg1) const; - /** If this variant is an object, this invokes one of its methods with 2 arguments. */ - var call (const Identifier& method, const var& arg1, const var& arg2) const; - /** If this variant is an object, this invokes one of its methods with 3 arguments. */ - var call (const Identifier& method, const var& arg1, const var& arg2, const var& arg3); - /** If this variant is an object, this invokes one of its methods with 4 arguments. */ - var call (const Identifier& method, const var& arg1, const var& arg2, const var& arg3, const var& arg4) const; - /** If this variant is an object, this invokes one of its methods with 5 arguments. */ - var call (const Identifier& method, const var& arg1, const var& arg2, const var& arg3, const var& arg4, const var& arg5) const; - /** If this variant is an object, this invokes one of its methods with a list of arguments. */ - var invoke (const Identifier& method, const var* arguments, int numArguments) 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_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_Method; friend class VariantType_Method; - - union ValueUnion - { - int intValue; - int64 int64Value; - bool boolValue; - double doubleValue; - char stringValue [sizeof (String)]; - ReferenceCountedObject* objectValue; - Array* arrayValue; - MethodFunction methodValue; - }; - - const VariantType* type; - ValueUnion value; - - Array* convertToArray(); - friend class DynamicObject; - var invokeMethod (DynamicObject*, const var*, int) const; -}; - -/** 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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/files/juce_DirectoryIterator.cpp b/src/juce/JuceLibraryCode/modules/juce_core/files/juce_DirectoryIterator.cpp deleted file mode 100644 index bbe55c10..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/files/juce_DirectoryIterator.cpp +++ /dev/null @@ -1,137 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -DirectoryIterator::DirectoryIterator (const File& directory, - bool isRecursive_, - const String& wildCard_, - const int whatToLookFor_) - : fileFinder (directory, isRecursive_ ? "*" : wildCard_), - wildCard (wildCard_), - path (File::addTrailingSeparator (directory.getFullPathName())), - index (-1), - totalNumFiles (-1), - whatToLookFor (whatToLookFor_), - isRecursive (isRecursive_), - hasBeenAdvanced (false) -{ - // you have to specify the type of files you're looking for! - jassert ((whatToLookFor_ & (File::findFiles | File::findDirectories)) != 0); - jassert (whatToLookFor_ > 0 && whatToLookFor_ <= 7); -} - -DirectoryIterator::~DirectoryIterator() -{ -} - -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) -{ - hasBeenAdvanced = true; - - if (subIterator != nullptr) - { - if (subIterator->next (isDirResult, isHiddenResult, fileSize, modTime, creationTime, isReadOnly)) - return true; - - subIterator = nullptr; - } - - String filename; - bool isDirectory, isHidden; - while (fileFinder.next (filename, &isDirectory, &isHidden, 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 recursive, we're not relying on the OS iterator to do the wildcard match, so do it now.. - if (matches && isRecursive) - matches = filename.matchesWildcard (wildCard, ! File::areFileNamesCaseSensitive()); - - 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; - } - else if (subIterator != nullptr) - { - return next(); - } - } - } - - 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/src/juce/JuceLibraryCode/modules/juce_core/files/juce_DirectoryIterator.h b/src/juce/JuceLibraryCode/modules/juce_core/files/juce_DirectoryIterator.h deleted file mode 100644 index 05e86738..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/files/juce_DirectoryIterator.h +++ /dev/null @@ -1,154 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_DIRECTORYITERATOR_JUCEHEADER__ -#define __JUCE_DIRECTORYITERATOR_JUCEHEADER__ - -#include "juce_File.h" -#include "../memory/juce_ScopedPointer.h" - - -//============================================================================== -/** - Searches through a 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 finding a large number of files, this is better than - using File::findChildFiles() because it doesn't block while it finds them - all, and this is more memory-efficient. - - It can also guess how far it's got using a wildly 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 - @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 class ScopedPointer; - ScopedPointer pimpl; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (NativeIterator); - }; - - friend class ScopedPointer; - NativeIterator fileFinder; - String wildCard, path; - int index; - mutable int totalNumFiles; - const int whatToLookFor; - const bool isRecursive; - bool hasBeenAdvanced; - ScopedPointer subIterator; - File currentFile; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DirectoryIterator); -}; - -#endif // __JUCE_DIRECTORYITERATOR_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/files/juce_File.cpp b/src/juce/JuceLibraryCode/modules/juce_core/files/juce_File.cpp deleted file mode 100644 index 33da2531..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/files/juce_File.cpp +++ /dev/null @@ -1,1061 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -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::empty; - -#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)); - - struct passwd* const pw = getpwnam (userName.toUTF8()); - if (pw != nullptr) - path = addTrailingSeparator (pw->pw_dir) + path.fromFirstOccurrenceOf ("/", false, false); - } - } - else if (! path.startsWithChar (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. - */ - jassert (path.startsWith ("./") || path.startsWith ("../")); // (assume that a path "./xyz" is deliberately intended to be relative to the CWD) - - 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::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 ! 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); - else if (lastSlash == 0) - return separatorString; - else - 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); - else - return fullPath.substring (lastSlash); -} - -bool File::isAChildOf (const File& potentialParent) const -{ - if (potentialParent == File::nonexistent) - 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 (const String& path) -{ - return path.startsWithChar (separator) - #if JUCE_WINDOWS - || (path.isNotEmpty() && path[1] == ':'); - #else - || path.startsWithChar ('~'); - #endif -} - -File File::getChildFile (String relativePath) const -{ - if (isAbsolutePath (relativePath)) - return File (relativePath); - - String path (fullPath); - - // It's relative, so remove any ../ or ./ bits at the start.. - if (relativePath[0] == '.') - { - #if JUCE_WINDOWS - relativePath = relativePath.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.substring (3); - } - else - { - break; - } - } - else if (secondChar == separator) - { - relativePath = relativePath.substring (2); - } - else - { - break; - } - } - } - - return File (addTrailingSeparator (path) + relativePath); -} - -File File::getSiblingFile (const String& 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 (const Time& t) const { return setFileTimesInternal (t.toMilliseconds(), 0, 0); } -bool File::setLastAccessTime (const Time& t) const { return setFileTimesInternal (0, t.toMilliseconds(), 0); } -bool File::setCreationTime (const 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() == in.readIntoMemoryBlock (destBlock); -} - -String File::loadFileAsString() const -{ - if (! existsAsFile()) - return String::empty; - - FileInputStream in (*this); - return in.openedOk() ? in.readEntireStreamAsString() - : String::empty; -} - -void File::readLines (StringArray& destLines) const -{ - destLines.addLines (loadFileAsString()); -} - -//============================================================================== -int File::findChildFiles (Array& results, - const int whatToLookFor, - const bool searchRecursively, - const String& wildCardPattern) const -{ - DirectoryIterator di (*this, searchRecursively, wildCardPattern, whatToLookFor); - - int total = 0; - while (di.next()) - { - results.add (di.getFile()); - ++total; - } - - return total; -} - -int File::getNumberOfChildFiles (const int whatToLookFor, const String& wildCardPattern) const -{ - DirectoryIterator di (*this, false, wildCardPattern, whatToLookFor); - - int total = 0; - while (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::empty; -} - -bool File::hasFileExtension (const String& possibleSuffix) const -{ - if (possibleSuffix.isEmpty()) - return fullPath.lastIndexOfChar ('.') <= fullPath.lastIndexOfChar (separator); - - const int semicolon = possibleSuffix.indexOfChar (0, ';'); - - if (semicolon >= 0) - { - return hasFileExtension (possibleSuffix.substring (0, semicolon).trimEnd()) - || hasFileExtension (possibleSuffix.substring (semicolon + 1).trimStart()); - } - else - { - if (fullPath.endsWithIgnoreCase (possibleSuffix)) - { - if (possibleSuffix.startsWithChar ('.')) - return true; - - const int dotPos = fullPath.length() - possibleSuffix.length() - 1; - - if (dotPos >= 0) - return fullPath [dotPos] == '.'; - } - } - - return false; -} - -File File::withFileExtension (const String& newExtension) const -{ - if (fullPath.isEmpty()) - return File::nonexistent; - - String filePart (getFileName()); - - const int i = filePart.lastIndexOfChar ('.'); - if (i >= 0) - filePart = filePart.substring (0, i); - - if (newExtension.isNotEmpty() && ! newExtension.startsWithChar ('.')) - filePart << '.'; - - return getSiblingFile (filePart + newExtension); -} - -//============================================================================== -bool File::startAsProcess (const String& parameters) const -{ - return exists() && Process::openDocument (fullPath, parameters); -} - -//============================================================================== -FileInputStream* File::createInputStream() const -{ - if (existsAsFile()) - return new FileInputStream (*this); - - return nullptr; -} - -FileOutputStream* File::createOutputStream (const int bufferSize) const -{ - ScopedPointer out (new FileOutputStream (*this, bufferSize)); - - return out->failedToOpen() ? nullptr - : out.release(); -} - -//============================================================================== -bool File::appendData (const void* const dataToAppend, - const int numberOfBytes) const -{ - if (numberOfBytes <= 0) - return true; - - FileOutputStream out (*this, 8192); - return out.openedOk() && out.write (dataToAppend, numberOfBytes); -} - -bool File::replaceWithData (const void* const dataToWrite, - const int numberOfBytes) const -{ - jassert (numberOfBytes >= 0); // a negative number of bytes?? - - 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[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 (const String& fileNameEnding) -{ - const File tempFile (getSpecialLocation (tempDirectory) - .getChildFile ("temp_" + String::toHexString (Random::getSystemRandom().nextInt())) - .withFileExtension (fileNameEnding)); - - if (tempFile.exists()) - return createTempFile (fileNameEnding); - - return tempFile; -} - - -//============================================================================== -#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/src/juce/JuceLibraryCode/modules/juce_core/files/juce_File.h b/src/juce/JuceLibraryCode/modules/juce_core/files/juce_File.h deleted file mode 100644 index cc0a38f4..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/files/juce_File.h +++ /dev/null @@ -1,964 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_FILE_JUCEHEADER__ -#define __JUCE_FILE_JUCEHEADER__ - -#include "../containers/juce_Array.h" -#include "../time/juce_Time.h" -#include "../text/juce_StringArray.h" -#include "../memory/juce_MemoryBlock.h" -#include "../memory/juce_ScopedPointer.h" -#include "../misc/juce_Result.h" -class FileInputStream; -class FileOutputStream; - - -//============================================================================== -/** - 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& path); - - /** Creates a copy of another file object. */ - File (const File& other); - - /** 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& newFilePath); - - /** Copies from another file object. */ - File& operator= (const File& otherFile); - - #if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS - File (File&& otherFile) noexcept; - File& operator= (File&& otherFile) 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. The comparison used is - case-insensitve. 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 (const String& 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 (const String& 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 based on a relative path. - - 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 ("../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 (String relativePath) 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 (const String& 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& otherFile) const; - /** Compares the pathnames for two files. */ - bool operator!= (const File& otherFile) const; - /** Compares the pathnames for two files. */ - bool operator< (const File& otherFile) const; - /** Compares the pathnames for two files. */ - bool operator> (const File& otherFile) 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; - - /** 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; - - /** If this file is a link, this returns the file that it points to. - - If this file isn't actually link, it'll just return itself. - */ - File getLinkedTarget() 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 (const 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 (const 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 (const 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. - - @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 0 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 0 if the file can't be opened for some reason - @see createInputStream, appendData, appendText - */ - FileOutputStream* createOutputStream (int 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 should - automatically cope with unicode/acsii 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, - int 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, - int 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::empty) 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 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, - - /** 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, - - /** 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, - - /** 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, - }; - - /** 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 (const String& 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; - - //============================================================================== - /** Removes illegal characters from a filename. - - 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. - - @see createLegalPathName - */ - static String createLegalFileName (const String& fileNameToFix); - - /** Removes illegal characters from a pathname. - - 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 (const String& 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& path) 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 - -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 modificationTime, int64 accessTime, int64 creationTime) const; - void getFileTimesInternal (int64& modificationTime, int64& accessTime, int64& creationTime) const; - bool setFileReadOnlyInternal (bool shouldBeReadOnly) const; - - JUCE_LEAK_DETECTOR (File); -}; - -#endif // __JUCE_FILE_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/files/juce_FileInputStream.cpp b/src/juce/JuceLibraryCode/modules/juce_core/files/juce_FileInputStream.cpp deleted file mode 100644 index c07fdd36..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/files/juce_FileInputStream.cpp +++ /dev/null @@ -1,89 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -int64 juce_fileSetPosition (void* handle, int64 pos); - -//============================================================================== -FileInputStream::FileInputStream (const File& f) - : file (f), - fileHandle (nullptr), - currentPosition (0), - totalSize (0), - status (Result::ok()), - needToSeek (true) -{ - openHandle(); -} - -FileInputStream::~FileInputStream() -{ - closeHandle(); -} - -//============================================================================== -int64 FileInputStream::getTotalLength() -{ - return totalSize; -} - -int FileInputStream::read (void* buffer, int bytesToRead) -{ - jassert (openedOk()); - jassert (buffer != nullptr && bytesToRead >= 0); - - if (needToSeek) - { - if (juce_fileSetPosition (fileHandle, currentPosition) < 0) - return 0; - - needToSeek = false; - } - - const size_t num = readInternal (buffer, (size_t) bytesToRead); - currentPosition += num; - - return (int) num; -} - -bool FileInputStream::isExhausted() -{ - return currentPosition >= totalSize; -} - -int64 FileInputStream::getPosition() -{ - return currentPosition; -} - -bool FileInputStream::setPosition (int64 pos) -{ - jassert (openedOk()); - pos = jlimit ((int64) 0, totalSize, pos); - - needToSeek |= (currentPosition != pos); - currentPosition = pos; - - return true; -} diff --git a/src/juce/JuceLibraryCode/modules/juce_core/files/juce_FileInputStream.h b/src/juce/JuceLibraryCode/modules/juce_core/files/juce_FileInputStream.h deleted file mode 100644 index 1e45ff14..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/files/juce_FileInputStream.h +++ /dev/null @@ -1,96 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_FILEINPUTSTREAM_JUCEHEADER__ -#define __JUCE_FILEINPUTSTREAM_JUCEHEADER__ - -#include "juce_File.h" -#include "../streams/juce_InputStream.h" - - -//============================================================================== -/** - An input stream that reads from a local file. - - @see InputStream, FileOutputStream, File::createInputStream -*/ -class JUCE_API FileInputStream : public InputStream -{ -public: - //============================================================================== - /** Creates a FileInputStream. - - @param fileToRead the file to read from - if the file can't be accessed for some - reason, then the stream will just contain no data - */ - 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(); - int read (void* destBuffer, int maxBytesToRead); - bool isExhausted(); - int64 getPosition(); - bool setPosition (int64 pos); - -private: - //============================================================================== - File file; - void* fileHandle; - int64 currentPosition, totalSize; - Result status; - bool needToSeek; - - void openHandle(); - void closeHandle(); - size_t readInternal (void* buffer, size_t numBytes); - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (FileInputStream); -}; - -#endif // __JUCE_FILEINPUTSTREAM_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/files/juce_FileOutputStream.cpp b/src/juce/JuceLibraryCode/modules/juce_core/files/juce_FileOutputStream.cpp deleted file mode 100644 index 5409b1dc..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/files/juce_FileOutputStream.cpp +++ /dev/null @@ -1,133 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -int64 juce_fileSetPosition (void* handle, int64 pos); - -//============================================================================== -FileOutputStream::FileOutputStream (const File& f, const int bufferSize_) - : file (f), - fileHandle (nullptr), - status (Result::ok()), - currentPosition (0), - bufferSize (bufferSize_), - bytesInBuffer (0), - buffer ((size_t) jmax (bufferSize_, 16)) -{ - openHandle(); -} - -FileOutputStream::~FileOutputStream() -{ - flushBuffer(); - flushInternal(); - 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) == bytesInBuffer); - bytesInBuffer = 0; - } - - return ok; -} - -void FileOutputStream::flush() -{ - flushBuffer(); - flushInternal(); -} - -bool FileOutputStream::write (const void* const src, const int numBytes) -{ - jassert (src != nullptr && numBytes >= 0); - - if (bytesInBuffer + numBytes < bufferSize) - { - memcpy (buffer + bytesInBuffer, src, (size_t) numBytes); - bytesInBuffer += numBytes; - currentPosition += numBytes; - } - else - { - if (! flushBuffer()) - return false; - - if (numBytes < bufferSize) - { - memcpy (buffer + bytesInBuffer, src, (size_t) numBytes); - bytesInBuffer += numBytes; - currentPosition += numBytes; - } - else - { - const int bytesWritten = writeInternal (src, numBytes); - - if (bytesWritten < 0) - return false; - - currentPosition += bytesWritten; - return bytesWritten == numBytes; - } - } - - return true; -} - -void FileOutputStream::writeRepeatedByte (uint8 byte, int numBytes) -{ - jassert (numBytes >= 0); - - if (bytesInBuffer + numBytes < bufferSize) - { - memset (buffer + bytesInBuffer, byte, (size_t) numBytes); - bytesInBuffer += numBytes; - currentPosition += numBytes; - } - else - { - OutputStream::writeRepeatedByte (byte, numBytes); - } -} diff --git a/src/juce/JuceLibraryCode/modules/juce_core/files/juce_FileOutputStream.h b/src/juce/JuceLibraryCode/modules/juce_core/files/juce_FileOutputStream.h deleted file mode 100644 index 6d078c11..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/files/juce_FileOutputStream.h +++ /dev/null @@ -1,116 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_FILEOUTPUTSTREAM_JUCEHEADER__ -#define __JUCE_FILEOUTPUTSTREAM_JUCEHEADER__ - -#include "juce_File.h" -#include "../streams/juce_OutputStream.h" - - -//============================================================================== -/** - 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, - int 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(); - int64 getPosition(); - bool setPosition (int64 pos); - bool write (const void* data, int numBytes); - void writeRepeatedByte (uint8 byte, int numTimesToRepeat); - - -private: - //============================================================================== - File file; - void* fileHandle; - Result status; - int64 currentPosition; - int bufferSize, bytesInBuffer; - HeapBlock buffer; - - void openHandle(); - void closeHandle(); - void flushInternal(); - bool flushBuffer(); - int64 setPositionInternal (int64 newPosition); - int writeInternal (const void* data, int numBytes); - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (FileOutputStream); -}; - -#endif // __JUCE_FILEOUTPUTSTREAM_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/files/juce_FileSearchPath.cpp b/src/juce/JuceLibraryCode/modules/juce_core/files/juce_FileSearchPath.cpp deleted file mode 100644 index d5d0b1d8..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/files/juce_FileSearchPath.cpp +++ /dev/null @@ -1,168 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -FileSearchPath::FileSearchPath() -{ -} - -FileSearchPath::FileSearchPath (const String& path) -{ - init (path); -} - -FileSearchPath::FileSearchPath (const FileSearchPath& other) - : directories (other.directories) -{ -} - -FileSearchPath::~FileSearchPath() -{ -} - -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/src/juce/JuceLibraryCode/modules/juce_core/files/juce_FileSearchPath.h b/src/juce/JuceLibraryCode/modules/juce_core/files/juce_FileSearchPath.h deleted file mode 100644 index 3ce5524f..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/files/juce_FileSearchPath.h +++ /dev/null @@ -1,166 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_FILESEARCHPATH_JUCEHEADER__ -#define __JUCE_FILESEARCHPATH_JUCEHEADER__ - -#include "juce_File.h" -#include "../text/juce_StringArray.h" - - -//============================================================================== -/** - Encapsulates 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& other); - - /** 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& other); - - /** 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& path); - - JUCE_LEAK_DETECTOR (FileSearchPath); -}; - -#endif // __JUCE_FILESEARCHPATH_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/files/juce_MemoryMappedFile.h b/src/juce/JuceLibraryCode/modules/juce_core/files/juce_MemoryMappedFile.h deleted file mode 100644 index 210d9e87..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/files/juce_MemoryMappedFile.h +++ /dev/null @@ -1,89 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_MEMORYMAPPEDFILE_JUCEHEADER__ -#define __JUCE_MEMORYMAPPEDFILE_JUCEHEADER__ - -#include "juce_File.h" - -//============================================================================== -/** - 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); - - /** 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 length; } - - -private: - //============================================================================== - void* address; - size_t length; - - #if JUCE_WINDOWS - void* fileHandle; - #else - int fileHandle; - #endif - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MemoryMappedFile); -}; - - -#endif // __JUCE_MEMORYMAPPEDFILE_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/files/juce_TemporaryFile.cpp b/src/juce/JuceLibraryCode/modules/juce_core/files/juce_TemporaryFile.cpp deleted file mode 100644 index 24c6f1e1..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/files/juce_TemporaryFile.cpp +++ /dev/null @@ -1,112 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -TemporaryFile::TemporaryFile (const String& suffix, const int optionFlags) -{ - createTempFile (File::getSpecialLocation (File::tempDirectory), - "temp_" + String::toHexString (Random::getSystemRandom().nextInt()), - suffix, - optionFlags); -} - -TemporaryFile::TemporaryFile (const File& targetFile_, const int optionFlags) - : targetFile (targetFile_) -{ - // If you use this constructor, you need to give it a valid target file! - jassert (targetFile != File::nonexistent); - - createTempFile (targetFile.getParentDirectory(), - targetFile.getFileNameWithoutExtension() - + "_temp" + String::toHexString (Random::getSystemRandom().nextInt()), - targetFile.getFileExtension(), - optionFlags); -} - -void TemporaryFile::createTempFile (const File& parentDirectory, String name, - const String& suffix, const int optionFlags) -{ - if ((optionFlags & useHiddenFile) != 0) - name = "." + name; - - temporaryFile = parentDirectory.getNonexistentChildFile (name, suffix, (optionFlags & putNumbersInBrackets) != 0); -} - -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::nonexistent); - - 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/src/juce/JuceLibraryCode/modules/juce_core/files/juce_TemporaryFile.h b/src/juce/JuceLibraryCode/modules/juce_core/files/juce_TemporaryFile.h deleted file mode 100644 index 38e09828..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/files/juce_TemporaryFile.h +++ /dev/null @@ -1,160 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_TEMPORARYFILE_JUCEHEADER__ -#define __JUCE_TEMPORARYFILE_JUCEHEADER__ - -#include "juce_File.h" - - -//============================================================================== -/** - 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::empty, - 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); - - /** 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 { return temporaryFile; } - - /** Returns the target file that was specified in the constructor. */ - const File& getTargetFile() const { 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: - //============================================================================== - File temporaryFile, targetFile; - - void createTempFile (const File& parentDirectory, String name, const String& suffix, int optionFlags); - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (TemporaryFile); -}; - -#endif // __JUCE_TEMPORARYFILE_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/json/juce_JSON.cpp b/src/juce/JuceLibraryCode/modules/juce_core/json/juce_JSON.cpp deleted file mode 100644 index e805c3ab..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/json/juce_JSON.cpp +++ /dev/null @@ -1,634 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -class JSONParser -{ -public: - 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 '-': - 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::null; - 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 String propertyName (propertyNameVar.toString()); - - if (propertyName.isNotEmpty()) - { - t = t.findEndOfWhitespace(); - oldT = t; - - const juce_wchar c2 = t.getAndAdvance(); - if (c2 != ':') - return createFail ("Expected ':', but found", &oldT); - - resultProperties.set (propertyName, var::null); - 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; - else 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::null); - 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; - else if (nextChar == ']') - break; - - return createFail ("Expected object array item, but found", &oldT); - } - - return Result::ok(); - } - - static Result parseString (String::CharPointerType& t, var& result) - { - Array buffer; - buffer.ensureStorageAllocated (256); - - for (;;) - { - juce_wchar c = t.getAndAdvance(); - - if (c == '"') - break; - - if (c == '\\') - { - c = t.getAndAdvance(); - - switch (c) - { - case '"': - case '\\': - case '/': 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.add (c); - } - - buffer.add (0); - result = String (CharPointer_UTF32 (buffer.getRawDataPointer())); - return Result::ok(); - } -}; - -//============================================================================== -class JSONFormatter -{ -public: - static void write (OutputStream& out, const var& v, - const int indentLevel, const bool allOnOneLine) - { - if (v.isString()) - { - writeString (out, v.toString().getCharPointer()); - } - else if (v.isVoid()) - { - out << "null"; - } - else if (v.isBool()) - { - out << (static_cast (v) ? "true" : "false"); - } - else if (v.isArray()) - { - writeArray (out, *v.getArray(), indentLevel, allOnOneLine); - } - else if (v.isObject()) - { - DynamicObject* const object = v.getDynamicObject(); - - jassert (object != nullptr); // Only DynamicObjects can be converted to JSON! - - writeObject (out, *object, indentLevel, allOnOneLine); - } - else - { - jassert (! v.isMethod()); // Can't convert an object with methods to JSON! - - out << v.toString(); - } - } - -private: - enum { indentSize = 2 }; - - 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) - { - out << '"'; - - for (;;) - { - const juce_wchar c (t.getAndAdvance()); - - switch (c) - { - case 0: out << '"'; return; - - case '\"': out << "\\\""; break; - case '\\': out << "\\\\"; 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 (' ', numSpaces); - } - - static void writeArray (OutputStream& out, const Array& array, - const int indentLevel, const bool allOnOneLine) - { - out << '['; - 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 << ']'; - } - - static void writeObject (OutputStream& out, DynamicObject& object, - const int indentLevel, const bool allOnOneLine) - { - NamedValueSet& props = object.getProperties(); - - out << '{'; - if (! allOnOneLine) - out << newLine; - - LinkedListPointer* i = &(props.values); - - for (;;) - { - NamedValueSet::NamedValue* const v = i->get(); - - if (v == nullptr) - break; - - if (! allOnOneLine) - writeSpaces (out, indentLevel + indentSize); - - writeString (out, v->name); - out << ": "; - write (out, v->value, indentLevel + indentSize, allOnOneLine); - - if (v->nextListItem.get() != nullptr) - { - if (allOnOneLine) - out << ", "; - else - out << ',' << newLine; - } - else if (! allOnOneLine) - out << newLine; - - i = &(v->nextListItem); - } - - if (! allOnOneLine) - writeSpaces (out, indentLevel); - - out << '}'; - } -}; - -//============================================================================== -var JSON::parse (const String& text) -{ - var result; - String::CharPointerType t (text.getCharPointer()); - if (! JSONParser::parseAny (t, result)) - result = var::null; - - 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) -{ - String::CharPointerType t (text.getCharPointer()); - return JSONParser::parseAny (t, result); -} - -String JSON::toString (const var& data, const bool allOnOneLine) -{ - MemoryOutputStream mo (1024); - JSONFormatter::write (mo, data, 0, allOnOneLine); - return mo.toString(); -} - -void JSON::writeToStream (OutputStream& output, const var& data, const bool allOnOneLine) -{ - JSONFormatter::write (output, data, 0, allOnOneLine); -} - -//============================================================================== -//============================================================================== -#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::null; - 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::null; - } - } - - void runTest() - { - beginTest ("JSON"); - Random r; - r.setSeedRandomly(); - - expect (JSON::parse (String::empty) == var::null); - expect (JSON::parse ("{}").isObject()); - expect (JSON::parse ("[]").isArray()); - expect (JSON::parse ("1234").isInt()); - expect (JSON::parse ("12345678901234").isInt64()); - expect (JSON::parse ("1.123e3").isDouble()); - expect (JSON::parse ("-1234").isInt()); - expect (JSON::parse ("-12345678901234").isInt64()); - expect (JSON::parse ("-1.123e3").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); - String parsedString (JSON::toString (parsed, oneLine)); - expect (asString.isNotEmpty() && parsedString == asString); - } - } -}; - -static JSONTests JSONUnitTests; - -#endif diff --git a/src/juce/JuceLibraryCode/modules/juce_core/json/juce_JSON.h b/src/juce/JuceLibraryCode/modules/juce_core/json/juce_JSON.h deleted file mode 100644 index 9ad90e42..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/json/juce_JSON.h +++ /dev/null @@ -1,115 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_JSON_JUCEHEADER__ -#define __JUCE_JSON_JUCEHEADER__ - -#include "../misc/juce_Result.h" -#include "../containers/juce_Variant.h" -class InputStream; -class OutputStream; -class File; - - -//============================================================================== -/** - 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 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. - */ - 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. - */ - 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); - - /** 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); - -private: - //============================================================================== - JSON(); // This class can't be instantiated - just use its static methods. -}; - - -#endif // __JUCE_JSON_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/juce_core.cpp b/src/juce/JuceLibraryCode/modules/juce_core/juce_core.cpp deleted file mode 100644 index 842788b2..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/juce_core.cpp +++ /dev/null @@ -1,196 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#if defined (__JUCE_CORE_JUCEHEADER__) && ! 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 - #include - #include - - #if JUCE_MINGW - #include - #endif - -#else - #if JUCE_LINUX || JUCE_ANDROID - #include - #include - #include - #include - #include - #endif - - #include - #include - #include - #include - #include - #include -#endif - -#if JUCE_MAC || JUCE_IOS - #include -#endif - -#if JUCE_ANDROID - #include -#endif - - -//============================================================================== -namespace juce -{ - -// START_AUTOINCLUDE containers/*.cpp, files/*.cpp, json/*.cpp, logging/*.cpp, maths/*.cpp, -// memory/*.cpp, misc/*.cpp, network/*.cpp, streams/*.cpp, system/*.cpp, text/*.cpp, threads/*.cpp, -// time/*.cpp, unit_tests/*.cpp, xml/*.cpp, zip/juce_GZIPD*.cpp, zip/juce_GZIPC*.cpp, zip/juce_Zip*.cpp -#include "containers/juce_AbstractFifo.cpp" -#include "containers/juce_DynamicObject.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 "json/juce_JSON.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_URL.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_OutputStream.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 "text/juce_StringArray.cpp" -#include "text/juce_StringPairArray.cpp" -#include "text/juce_StringPool.cpp" -#include "threads/juce_ChildProcess.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" -// END_AUTOINCLUDE - -//============================================================================== -#if JUCE_MAC || JUCE_IOS -#include "native/juce_osx_ObjCHelpers.h" -#include "native/juce_mac_ObjCSuffix.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_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_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 -} diff --git a/src/juce/JuceLibraryCode/modules/juce_core/juce_core.h b/src/juce/JuceLibraryCode/modules/juce_core/juce_core.h deleted file mode 100644 index e46ecf7a..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/juce_core.h +++ /dev/null @@ -1,428 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_CORE_JUCEHEADER__ -#define __JUCE_CORE_JUCEHEADER__ - -/* This line is here as a sanity-check to catch syntax errors caused by mistakes in 3rd-party - header files that have been included prior to this one. If you hit an error at this line, - there's probably some kind of syntax problem in whatever code immediately precedes this header. - - It also causes an error if you attempt to build using a C or obj-C compiler rather than a C++ one. -*/ -namespace DummyNamespaceStatementToCatchSyntaxErrors {} - -//============================================================================== -#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 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 JUCEApplication::unhandledException() callback. -*/ -#ifndef JUCE_CATCH_UNHANDLED_EXCEPTIONS - //#define JUCE_CATCH_UNHANDLED_EXCEPTIONS 1 -#endif - -//============================================================================= -//============================================================================= -#if JUCE_MSVC - #pragma warning (disable: 4251) // (DLL build warning, must be disabled before pushing the warning state) - #pragma warning (push) - #pragma warning (disable: 4786) // (long class name warning) - #ifdef __INTEL_COMPILER - #pragma warning (disable: 1125) - #endif -#endif - -#include "system/juce_StandardHeader.h" - -namespace juce -{ - -// START_AUTOINCLUDE containers, files, json, logging, maths, memory, misc, network, -// streams, system, text, threads, time, unit_tests, xml, zip -#ifndef __JUCE_ABSTRACTFIFO_JUCEHEADER__ - #include "containers/juce_AbstractFifo.h" -#endif -#ifndef __JUCE_ARRAY_JUCEHEADER__ - #include "containers/juce_Array.h" -#endif -#ifndef __JUCE_ARRAYALLOCATIONBASE_JUCEHEADER__ - #include "containers/juce_ArrayAllocationBase.h" -#endif -#ifndef __JUCE_DYNAMICOBJECT_JUCEHEADER__ - #include "containers/juce_DynamicObject.h" -#endif -#ifndef __JUCE_ELEMENTCOMPARATOR_JUCEHEADER__ - #include "containers/juce_ElementComparator.h" -#endif -#ifndef __JUCE_HASHMAP_JUCEHEADER__ - #include "containers/juce_HashMap.h" -#endif -#ifndef __JUCE_LINKEDLISTPOINTER_JUCEHEADER__ - #include "containers/juce_LinkedListPointer.h" -#endif -#ifndef __JUCE_NAMEDVALUESET_JUCEHEADER__ - #include "containers/juce_NamedValueSet.h" -#endif -#ifndef __JUCE_OWNEDARRAY_JUCEHEADER__ - #include "containers/juce_OwnedArray.h" -#endif -#ifndef __JUCE_PROPERTYSET_JUCEHEADER__ - #include "containers/juce_PropertySet.h" -#endif -#ifndef __JUCE_REFERENCECOUNTEDARRAY_JUCEHEADER__ - #include "containers/juce_ReferenceCountedArray.h" -#endif -#ifndef __JUCE_SCOPEDVALUESETTER_JUCEHEADER__ - #include "containers/juce_ScopedValueSetter.h" -#endif -#ifndef __JUCE_SORTEDSET_JUCEHEADER__ - #include "containers/juce_SortedSet.h" -#endif -#ifndef __JUCE_SPARSESET_JUCEHEADER__ - #include "containers/juce_SparseSet.h" -#endif -#ifndef __JUCE_VARIANT_JUCEHEADER__ - #include "containers/juce_Variant.h" -#endif -#ifndef __JUCE_DIRECTORYITERATOR_JUCEHEADER__ - #include "files/juce_DirectoryIterator.h" -#endif -#ifndef __JUCE_FILE_JUCEHEADER__ - #include "files/juce_File.h" -#endif -#ifndef __JUCE_FILEINPUTSTREAM_JUCEHEADER__ - #include "files/juce_FileInputStream.h" -#endif -#ifndef __JUCE_FILEOUTPUTSTREAM_JUCEHEADER__ - #include "files/juce_FileOutputStream.h" -#endif -#ifndef __JUCE_FILESEARCHPATH_JUCEHEADER__ - #include "files/juce_FileSearchPath.h" -#endif -#ifndef __JUCE_MEMORYMAPPEDFILE_JUCEHEADER__ - #include "files/juce_MemoryMappedFile.h" -#endif -#ifndef __JUCE_TEMPORARYFILE_JUCEHEADER__ - #include "files/juce_TemporaryFile.h" -#endif -#ifndef __JUCE_JSON_JUCEHEADER__ - #include "json/juce_JSON.h" -#endif -#ifndef __JUCE_FILELOGGER_JUCEHEADER__ - #include "logging/juce_FileLogger.h" -#endif -#ifndef __JUCE_LOGGER_JUCEHEADER__ - #include "logging/juce_Logger.h" -#endif -#ifndef __JUCE_BIGINTEGER_JUCEHEADER__ - #include "maths/juce_BigInteger.h" -#endif -#ifndef __JUCE_EXPRESSION_JUCEHEADER__ - #include "maths/juce_Expression.h" -#endif -#ifndef __JUCE_MATHSFUNCTIONS_JUCEHEADER__ - #include "maths/juce_MathsFunctions.h" -#endif -#ifndef __JUCE_RANDOM_JUCEHEADER__ - #include "maths/juce_Random.h" -#endif -#ifndef __JUCE_RANGE_JUCEHEADER__ - #include "maths/juce_Range.h" -#endif -#ifndef __JUCE_ATOMIC_JUCEHEADER__ - #include "memory/juce_Atomic.h" -#endif -#ifndef __JUCE_BYTEORDER_JUCEHEADER__ - #include "memory/juce_ByteOrder.h" -#endif -#ifndef __JUCE_HEAPBLOCK_JUCEHEADER__ - #include "memory/juce_HeapBlock.h" -#endif -#ifndef __JUCE_LEAKEDOBJECTDETECTOR_JUCEHEADER__ - #include "memory/juce_LeakedObjectDetector.h" -#endif -#ifndef __JUCE_MEMORY_JUCEHEADER__ - #include "memory/juce_Memory.h" -#endif -#ifndef __JUCE_MEMORYBLOCK_JUCEHEADER__ - #include "memory/juce_MemoryBlock.h" -#endif -#ifndef __JUCE_OPTIONALSCOPEDPOINTER_JUCEHEADER__ - #include "memory/juce_OptionalScopedPointer.h" -#endif -#ifndef __JUCE_REFERENCECOUNTEDOBJECT_JUCEHEADER__ - #include "memory/juce_ReferenceCountedObject.h" -#endif -#ifndef __JUCE_SCOPEDPOINTER_JUCEHEADER__ - #include "memory/juce_ScopedPointer.h" -#endif -#ifndef __JUCE_SINGLETON_JUCEHEADER__ - #include "memory/juce_Singleton.h" -#endif -#ifndef __JUCE_WEAKREFERENCE_JUCEHEADER__ - #include "memory/juce_WeakReference.h" -#endif -#ifndef __JUCE_RESULT_JUCEHEADER__ - #include "misc/juce_Result.h" -#endif -#ifndef __JUCE_UUID_JUCEHEADER__ - #include "misc/juce_Uuid.h" -#endif -#ifndef __JUCE_WINDOWSREGISTRY_JUCEHEADER__ - #include "misc/juce_WindowsRegistry.h" -#endif -#ifndef __JUCE_MACADDRESS_JUCEHEADER__ - #include "network/juce_MACAddress.h" -#endif -#ifndef __JUCE_NAMEDPIPE_JUCEHEADER__ - #include "network/juce_NamedPipe.h" -#endif -#ifndef __JUCE_SOCKET_JUCEHEADER__ - #include "network/juce_Socket.h" -#endif -#ifndef __JUCE_URL_JUCEHEADER__ - #include "network/juce_URL.h" -#endif -#ifndef __JUCE_BUFFEREDINPUTSTREAM_JUCEHEADER__ - #include "streams/juce_BufferedInputStream.h" -#endif -#ifndef __JUCE_FILEINPUTSOURCE_JUCEHEADER__ - #include "streams/juce_FileInputSource.h" -#endif -#ifndef __JUCE_INPUTSOURCE_JUCEHEADER__ - #include "streams/juce_InputSource.h" -#endif -#ifndef __JUCE_INPUTSTREAM_JUCEHEADER__ - #include "streams/juce_InputStream.h" -#endif -#ifndef __JUCE_MEMORYINPUTSTREAM_JUCEHEADER__ - #include "streams/juce_MemoryInputStream.h" -#endif -#ifndef __JUCE_MEMORYOUTPUTSTREAM_JUCEHEADER__ - #include "streams/juce_MemoryOutputStream.h" -#endif -#ifndef __JUCE_OUTPUTSTREAM_JUCEHEADER__ - #include "streams/juce_OutputStream.h" -#endif -#ifndef __JUCE_SUBREGIONSTREAM_JUCEHEADER__ - #include "streams/juce_SubregionStream.h" -#endif -#ifndef __JUCE_PLATFORMDEFS_JUCEHEADER__ - #include "system/juce_PlatformDefs.h" -#endif -#ifndef __JUCE_STANDARDHEADER_JUCEHEADER__ - #include "system/juce_StandardHeader.h" -#endif -#ifndef __JUCE_SYSTEMSTATS_JUCEHEADER__ - #include "system/juce_SystemStats.h" -#endif -#ifndef __JUCE_TARGETPLATFORM_JUCEHEADER__ - #include "system/juce_TargetPlatform.h" -#endif -#ifndef __JUCE_CHARACTERFUNCTIONS_JUCEHEADER__ - #include "text/juce_CharacterFunctions.h" -#endif -#ifndef __JUCE_CHARPOINTER_ASCII_JUCEHEADER__ - #include "text/juce_CharPointer_ASCII.h" -#endif -#ifndef __JUCE_CHARPOINTER_UTF16_JUCEHEADER__ - #include "text/juce_CharPointer_UTF16.h" -#endif -#ifndef __JUCE_CHARPOINTER_UTF32_JUCEHEADER__ - #include "text/juce_CharPointer_UTF32.h" -#endif -#ifndef __JUCE_CHARPOINTER_UTF8_JUCEHEADER__ - #include "text/juce_CharPointer_UTF8.h" -#endif -#ifndef __JUCE_IDENTIFIER_JUCEHEADER__ - #include "text/juce_Identifier.h" -#endif -#ifndef __JUCE_LOCALISEDSTRINGS_JUCEHEADER__ - #include "text/juce_LocalisedStrings.h" -#endif -#ifndef __JUCE_NEWLINE_JUCEHEADER__ - #include "text/juce_NewLine.h" -#endif -#ifndef __JUCE_STRING_JUCEHEADER__ - #include "text/juce_String.h" -#endif -#ifndef __JUCE_STRINGARRAY_JUCEHEADER__ - #include "text/juce_StringArray.h" -#endif -#ifndef __JUCE_STRINGPAIRARRAY_JUCEHEADER__ - #include "text/juce_StringPairArray.h" -#endif -#ifndef __JUCE_STRINGPOOL_JUCEHEADER__ - #include "text/juce_StringPool.h" -#endif -#ifndef __JUCE_CHILDPROCESS_JUCEHEADER__ - #include "threads/juce_ChildProcess.h" -#endif -#ifndef __JUCE_CRITICALSECTION_JUCEHEADER__ - #include "threads/juce_CriticalSection.h" -#endif -#ifndef __JUCE_DYNAMICLIBRARY_JUCEHEADER__ - #include "threads/juce_DynamicLibrary.h" -#endif -#ifndef __JUCE_INTERPROCESSLOCK_JUCEHEADER__ - #include "threads/juce_InterProcessLock.h" -#endif -#ifndef __JUCE_PROCESS_JUCEHEADER__ - #include "threads/juce_Process.h" -#endif -#ifndef __JUCE_READWRITELOCK_JUCEHEADER__ - #include "threads/juce_ReadWriteLock.h" -#endif -#ifndef __JUCE_SCOPEDLOCK_JUCEHEADER__ - #include "threads/juce_ScopedLock.h" -#endif -#ifndef __JUCE_SCOPEDREADLOCK_JUCEHEADER__ - #include "threads/juce_ScopedReadLock.h" -#endif -#ifndef __JUCE_SCOPEDWRITELOCK_JUCEHEADER__ - #include "threads/juce_ScopedWriteLock.h" -#endif -#ifndef __JUCE_SPINLOCK_JUCEHEADER__ - #include "threads/juce_SpinLock.h" -#endif -#ifndef __JUCE_THREAD_JUCEHEADER__ - #include "threads/juce_Thread.h" -#endif -#ifndef __JUCE_THREADLOCALVALUE_JUCEHEADER__ - #include "threads/juce_ThreadLocalValue.h" -#endif -#ifndef __JUCE_THREADPOOL_JUCEHEADER__ - #include "threads/juce_ThreadPool.h" -#endif -#ifndef __JUCE_TIMESLICETHREAD_JUCEHEADER__ - #include "threads/juce_TimeSliceThread.h" -#endif -#ifndef __JUCE_WAITABLEEVENT_JUCEHEADER__ - #include "threads/juce_WaitableEvent.h" -#endif -#ifndef __JUCE_PERFORMANCECOUNTER_JUCEHEADER__ - #include "time/juce_PerformanceCounter.h" -#endif -#ifndef __JUCE_RELATIVETIME_JUCEHEADER__ - #include "time/juce_RelativeTime.h" -#endif -#ifndef __JUCE_TIME_JUCEHEADER__ - #include "time/juce_Time.h" -#endif -#ifndef __JUCE_UNITTEST_JUCEHEADER__ - #include "unit_tests/juce_UnitTest.h" -#endif -#ifndef __JUCE_XMLDOCUMENT_JUCEHEADER__ - #include "xml/juce_XmlDocument.h" -#endif -#ifndef __JUCE_XMLELEMENT_JUCEHEADER__ - #include "xml/juce_XmlElement.h" -#endif -#ifndef __JUCE_GZIPCOMPRESSOROUTPUTSTREAM_JUCEHEADER__ - #include "zip/juce_GZIPCompressorOutputStream.h" -#endif -#ifndef __JUCE_GZIPDECOMPRESSORINPUTSTREAM_JUCEHEADER__ - #include "zip/juce_GZIPDecompressorInputStream.h" -#endif -#ifndef __JUCE_ZIPFILE_JUCEHEADER__ - #include "zip/juce_ZipFile.h" -#endif -// END_AUTOINCLUDE - -} - -#if JUCE_MSVC - #pragma warning (pop) -#endif - -#endif // __JUCE_CORE_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/juce_core.mm b/src/juce/JuceLibraryCode/modules/juce_core/juce_core.mm deleted file mode 100644 index 6814ebd3..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/juce_core.mm +++ /dev/null @@ -1,26 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#include "juce_core.cpp" diff --git a/src/juce/JuceLibraryCode/modules/juce_core/juce_module_info b/src/juce/JuceLibraryCode/modules/juce_core/juce_module_info deleted file mode 100644 index 4a7b76ea..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/juce_module_info +++ /dev/null @@ -1,36 +0,0 @@ -{ - "id": "juce_core", - "name": "JUCE core classes", - "version": "2.0.21", - "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": "GPL/Commercial", - - "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/*", - "json/*", - "zip/*", - "unit_tests/*", - "misc/*", - "native/*" ], - - "OSXFrameworks": "Cocoa IOKit", - "iOSFrameworks": "Foundation" -} diff --git a/src/juce/JuceLibraryCode/modules/juce_core/logging/juce_FileLogger.cpp b/src/juce/JuceLibraryCode/modules/juce_core/logging/juce_FileLogger.cpp deleted file mode 100644 index 7d796a78..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/logging/juce_FileLogger.cpp +++ /dev/null @@ -1,132 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -FileLogger::FileLogger (const File& logFile_, - const String& welcomeMessage, - const int maxInitialFileSizeBytes) - : logFile (logFile_) -{ - if (maxInitialFileSizeBytes >= 0) - trimFileSize (maxInitialFileSizeBytes); - - if (! logFile_.exists()) - { - // do this so that the parent directories get created.. - logFile_.create(); - } - - 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) -{ - DBG (message); - - const ScopedLock sl (logLock); - - FileOutputStream out (logFile, 256); - out << message << newLine; -} - - -void FileLogger::trimFileSize (int maxFileSizeBytes) const -{ - if (maxFileSizeBytes <= 0) - { - logFile.deleteFile(); - } - else - { - const int64 fileSize = logFile.getSize(); - - if (fileSize > maxFileSizeBytes) - { - ScopedPointer in (logFile.createInputStream()); - jassert (in != nullptr); - - if (in != nullptr) - { - in->setPosition (fileSize - maxFileSizeBytes); - String content; - - { - MemoryBlock contentToSave; - contentToSave.setSize ((size_t) maxFileSizeBytes + 4); - contentToSave.fillWith (0); - - in->read (contentToSave.getData(), maxFileSizeBytes); - in = nullptr; - - content = contentToSave.toString(); - } - - int newStart = 0; - - while (newStart < fileSize - && content[newStart] != '\n' - && content[newStart] != '\r') - ++newStart; - - logFile.deleteFile(); - logFile.appendText (content.substring (newStart), false, false); - } - } - } -} - -//============================================================================== -FileLogger* FileLogger::createDefaultAppLogger (const String& logFileSubDirectoryName, - const String& logFileName, - const String& welcomeMessage, - const int maxInitialFileSizeBytes) -{ - #if JUCE_MAC - File logFile ("~/Library/Logs"); - logFile = logFile.getChildFile (logFileSubDirectoryName) - .getChildFile (logFileName); - - #else - File logFile (File::getSpecialLocation (File::userApplicationDataDirectory)); - - if (logFile.isDirectory()) - { - logFile = logFile.getChildFile (logFileSubDirectoryName) - .getChildFile (logFileName); - } - #endif - - return new FileLogger (logFile, welcomeMessage, maxInitialFileSizeBytes); -} diff --git a/src/juce/JuceLibraryCode/modules/juce_core/logging/juce_FileLogger.h b/src/juce/JuceLibraryCode/modules/juce_core/logging/juce_FileLogger.h deleted file mode 100644 index 1fdd329c..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/logging/juce_FileLogger.h +++ /dev/null @@ -1,108 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_FILELOGGER_JUCEHEADER__ -#define __JUCE_FILELOGGER_JUCEHEADER__ - -#include "juce_Logger.h" -#include "../files/juce_File.h" -#include "../memory/juce_ScopedPointer.h" - - -//============================================================================== -/** - A simple implemenation 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 int maxInitialFileSizeBytes = 128 * 1024); - - /** Destructor. */ - ~FileLogger(); - - //============================================================================== - void logMessage (const String& message); - - File getLogFile() const { return logFile; } - - //============================================================================== - /** Helper function to create a log file in the correct place for this platform. - - 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/[logFileName] - - The method might return 0 if the file can't be created for some reason. - - @param logFileSubDirectoryName if a subdirectory is needed, this is what it will be called - - it's best to use the something like the name of your application here. - @param logFileName the name of the file to create, e.g. "MyAppLog.txt". Don't just - call it "log.txt" because if it goes in a directory with logs - from other applications (as it will do on the Mac) then no-one - will know which one is yours! - @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 int maxInitialFileSizeBytes = 128 * 1024); - -private: - //============================================================================== - File logFile; - CriticalSection logLock; - - void trimFileSize (int maxFileSizeBytes) const; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (FileLogger); -}; - - -#endif // __JUCE_FILELOGGER_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/logging/juce_Logger.cpp b/src/juce/JuceLibraryCode/modules/juce_core/logging/juce_Logger.cpp deleted file mode 100644 index 50bef88a..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/logging/juce_Logger.cpp +++ /dev/null @@ -1,63 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -Logger::Logger() -{ -} - -Logger::~Logger() -{ -} - -//============================================================================== -Logger* Logger::currentLogger = nullptr; - -void Logger::setCurrentLogger (Logger* const newLogger, - const bool deleteOldLogger) -{ - Logger* const oldLogger = currentLogger; - currentLogger = newLogger; - - if (deleteOldLogger) - delete oldLogger; -} - -void Logger::writeToLog (const String& message) -{ - if (currentLogger != nullptr) - currentLogger->logMessage (message); - else - outputDebugString (message); -} - -#if JUCE_LOG_ASSERTIONS -void JUCE_API logAssertion (const char* filename, const int lineNum) noexcept -{ - String m ("JUCE Assertion failure in "); - m << filename << ", line " << lineNum; - - Logger::writeToLog (m); -} -#endif diff --git a/src/juce/JuceLibraryCode/modules/juce_core/logging/juce_Logger.h b/src/juce/JuceLibraryCode/modules/juce_core/logging/juce_Logger.h deleted file mode 100644 index 6bec018b..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/logging/juce_Logger.h +++ /dev/null @@ -1,97 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_LOGGER_JUCEHEADER__ -#define __JUCE_LOGGER_JUCEHEADER__ - -#include "../text/juce_String.h" - - -//============================================================================== -/** - 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 won't be deleted when no longer needed. - A null pointer can be passed-in to disable any logging. - - If deleteOldLogger is set to true, the existing logger will be - deleted (if there is one). - */ - static void JUCE_CALLTYPE setCurrentLogger (Logger* newLogger, - bool deleteOldLogger = false); - - /** 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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/maths/juce_BigInteger.cpp b/src/juce/JuceLibraryCode/modules/juce_core/maths/juce_BigInteger.cpp deleted file mode 100644 index 0db4198e..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/maths/juce_BigInteger.cpp +++ /dev/null @@ -1,1018 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -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; -} - -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_INTRINSICS && ! defined (__INTEL_COMPILER) - #pragma intrinsic (_BitScanReverse) -#endif - -namespace BitFunctions -{ - inline int countBitsInInt32 (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); - } - - inline 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_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 += BitFunctions::countBitsInInt32 (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 BitFunctions::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::empty; - } - - s = s.paddedLeft ('0', minimumNumCharacters); - - return isNegative() ? "-" + s : s; -} - -void BigInteger::parseString (const String& text, const int base) -{ - clear(); - String::CharPointerType t (text.getCharPointer()); - - 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; - } - } - } - - setNegative (text.trimStart().startsWithChar ('-')); -} - -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/src/juce/JuceLibraryCode/modules/juce_core/maths/juce_BigInteger.h b/src/juce/JuceLibraryCode/modules/juce_core/maths/juce_BigInteger.h deleted file mode 100644 index e22ebc76..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/maths/juce_BigInteger.h +++ /dev/null @@ -1,336 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_BIGINTEGER_JUCEHEADER__ -#define __JUCE_BIGINTEGER_JUCEHEADER__ - -#include "../text/juce_String.h" -#include "../memory/juce_HeapBlock.h" -class MemoryBlock; - - -//============================================================================== -/** - 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& other); - - #if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS - BigInteger (BigInteger&& other) noexcept; - BigInteger& operator= (BigInteger&& other) noexcept; - #endif - - /** Destructor. */ - ~BigInteger(); - - //============================================================================== - /** Copies another BigInteger onto this one. */ - BigInteger& operator= (const BigInteger& other); - - /** Swaps the internal contents of this with another object. */ - void swapWith (BigInteger& other) 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 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; - - //============================================================================== - /** 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 = 0) 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 = 0) 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& other); - BigInteger& operator-= (const BigInteger& other); - BigInteger& operator*= (const BigInteger& other); - BigInteger& operator/= (const BigInteger& other); - BigInteger& operator|= (const BigInteger& other); - BigInteger& operator&= (const BigInteger& other); - BigInteger& operator^= (const BigInteger& other); - BigInteger& operator%= (const BigInteger& other); - 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& other) const; - BigInteger operator- (const BigInteger& other) const; - BigInteger operator* (const BigInteger& other) const; - BigInteger operator/ (const BigInteger& other) const; - BigInteger operator| (const BigInteger& other) const; - BigInteger operator& (const BigInteger& other) const; - BigInteger operator^ (const BigInteger& other) const; - BigInteger operator% (const BigInteger& other) const; - BigInteger operator<< (int numBitsToShift) const; - BigInteger operator>> (int numBitsToShift) const; - - bool operator== (const BigInteger& other) const noexcept; - bool operator!= (const BigInteger& other) const noexcept; - bool operator< (const BigInteger& other) const noexcept; - bool operator<= (const BigInteger& other) const noexcept; - bool operator> (const BigInteger& other) const noexcept; - bool operator>= (const BigInteger& other) 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 (const String& 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 numVals); - 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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/maths/juce_Expression.cpp b/src/juce/JuceLibraryCode/modules/juce_core/maths/juce_Expression.cpp deleted file mode 100644 index 67bb6fb7..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/maths/juce_Expression.cpp +++ /dev/null @@ -1,1178 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -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 nullptr; - } - - virtual String getName() const - { - jassertfalse; // You shouldn't call this for an expression that's not actually a function! - return String::empty; - } - - 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& description_) - : description (description_) - { - DBG ("Expression::EvaluationError: " + description); - } - - String description; - }; - - //============================================================================== - class Constant : public Term - { - public: - Constant (const double value_, const bool isResolutionTarget_) - : value (value_), isResolutionTarget (isResolutionTarget_) {} - - 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.getObject() : (index == 1 ? right.getObject() : 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 nullptr; - - const Term* const dest = findDestinationFor (topLevelTerm, this); - - if (dest == nullptr) - return new Constant (overallTarget, false); - - return dest->createTermToEvaluateInput (scope, this, overallTarget, topLevelTerm); - } - }; - - //============================================================================== - class SymbolTerm : public Term - { - public: - explicit SymbolTerm (const String& symbol_) : symbol (symbol_) {} - - 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& functionName_) : functionName (functionName_) {} - - Function (const String& functionName_, const Array& parameters_) - : functionName (functionName_), parameters (parameters_) - {} - - 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& input_, const int recursionCount_) - : input (input_), output (input_), recursionCount (recursionCount_) {} - - 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& input_, SymbolVisitor& visitor_, const int recursionCount_) - : input (input_), visitor (visitor_), recursionCount (recursionCount_) {} - - 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& input_, const Expression::Symbol& symbol_, const String& newName_, const int recursionCount_) - : input (input_), 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.getObject()); } - - JUCE_DECLARE_NON_COPYABLE (DotOperator); - }; - - //============================================================================== - class Negate : public Term - { - public: - explicit Negate (const TermPtr& input_) : input (input_) - { - jassert (input_ != 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.getObject() : 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* input_, double overallTarget, Term* topLevelTerm) const - { - (void) input_; - jassert (input_ == 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() + ")"; - else - 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 nullptr; - - 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 nullptr; - - if (input == left) - return new Add (newDest, right->clone()); - else - 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 nullptr; - - 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 nullptr; - - if (input == left) - return new Multiply (newDest, right->clone()); - else - 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 term (readUnaryExpression()); - - if (term == nullptr) - throw ParseError ("Expected expression after \"" + String::charToString ((juce_wchar) (uint8) opType) + "\""); - - if (opType == '-') - term = term->negated(); - - return term; - } - - 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 \")\""); - } - else 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); - } - else // just a symbol.. - { - jassert (identifier.trim() == identifier); - return new SymbolTerm (identifier); - } - } - - return nullptr; - } - - TermPtr readParenthesisedExpression() - { - if (! readOperator ("(")) - return nullptr; - - const TermPtr e (readExpression()); - if (e == nullptr || ! readOperator (")")) - return nullptr; - - 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 -{ - throw Helpers::EvaluationError ("Unknown symbol: " + symbol); -} - -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; - } - else if (functionName == "max") - { - double v = parameters[0]; - for (int i = 1; i < numParams; ++i) - v = jmax (v, parameters[i]); - - return v; - } - else if (numParams == 1) - { - if (functionName == "sin") return sin (parameters[0]); - else if (functionName == "cos") return cos (parameters[0]); - else if (functionName == "tan") return tan (parameters[0]); - else 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::empty; -} diff --git a/src/juce/JuceLibraryCode/modules/juce_core/maths/juce_Expression.h b/src/juce/JuceLibraryCode/modules/juce_core/maths/juce_Expression.h deleted file mode 100644 index da2c5e51..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/maths/juce_Expression.h +++ /dev/null @@ -1,271 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_EXPRESSION_JUCEHEADER__ -#define __JUCE_EXPRESSION_JUCEHEADER__ - -#include "../memory/juce_ReferenceCountedObject.h" -#include "../containers/juce_Array.h" -#include "../memory/juce_ScopedPointer.h" - - -//============================================================================== -/** - 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& other); - - /** Copies another expression. */ - Expression& operator= (const Expression& other); - - #if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS - Expression (Expression&& other) noexcept; - Expression& operator= (Expression&& other) 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 addtion operation of two existing expressions. */ - Expression operator+ (const Expression& other) const; - /** Returns an expression which is a subtraction operation of two existing expressions. */ - Expression operator- (const Expression& other) const; - /** Returns an expression which is a multiplication operation of two existing expressions. */ - Expression operator* (const Expression& other) const; - /** Returns an expression which is a division operation of two existing expressions. */ - Expression operator/ (const Expression& other) 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 class ScopedPointer; - friend class ReferenceCountedObjectPtr; - ReferenceCountedObjectPtr term; - - explicit Expression (Term*); -}; - -#endif // __JUCE_EXPRESSION_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/maths/juce_MathsFunctions.h b/src/juce/JuceLibraryCode/modules/juce_core/maths/juce_MathsFunctions.h deleted file mode 100644 index b436f520..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/maths/juce_MathsFunctions.h +++ /dev/null @@ -1,507 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_MATHSFUNCTIONS_JUCEHEADER__ -#define __JUCE_MATHSFUNCTIONS_JUCEHEADER__ - -//============================================================================== -/* - 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; - /** A platform-independent macro for writing 64-bit literals, needed because - different compilers have different syntaxes for this. - - E.g. writing literal64bit (0x1000000000) will translate to 0x1000000000LL for - GCC, or 0x1000000000 for MSVC. - */ - #define literal64bit(longLiteral) ((__int64) longLiteral) -#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; - /** A platform-independent macro for writing 64-bit literals, needed because - different compilers have different syntaxes for this. - - E.g. writing literal64bit (0x1000000000) will translate to 0x1000000000LL for - GCC, or 0x1000000000 for MSVC. - */ - #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)); } - -/** 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_WINDOWS - 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; -} - -//============================================================================== -/** A predefined value for Pi, at double-precision. - - @see float_Pi -*/ -const double double_Pi = 3.1415926535897932384626433832795; - -/** A predefined value for Pi, at sngle-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) - #pragma float_control (precise, on, push) -#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 -{ - 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 -} - -#if JUCE_MSVC - #pragma float_control (pop) - #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 -{ - 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; -} - -/** Performs a modulo operation, but can cope with the dividend being negative. - The divisor must be greater than zero. -*/ -template -int negativeAwareModulo (IntegerType dividend, const IntegerType divisor) noexcept -{ - jassert (divisor > 0); - dividend %= divisor; - return (dividend < 0) ? (dividend + divisor) : dividend; -} - -//============================================================================== -#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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/maths/juce_Random.cpp b/src/juce/JuceLibraryCode/modules/juce_core/maths/juce_Random.cpp deleted file mode 100644 index ef6447ab..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/maths/juce_Random.cpp +++ /dev/null @@ -1,173 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -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 * literal64bit (0x5deece66d) + 11) & literal64bit (0xffffffffffff); - - return (int) (seed >> 16); -} - -int Random::nextInt (const int maxValue) noexcept -{ - jassert (maxValue > 0); - return (int) ((((unsigned int) nextInt()) * (uint64) maxValue) >> 32); -} - -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()) / (float) 0xffffffff; -} - -double Random::nextDouble() noexcept -{ - return static_cast (nextInt()) / (double) 0xffffffff; -} - -BigInteger Random::nextLargeNumber (const BigInteger& maximumValue) -{ - BigInteger n; - - do - { - fillBitsRandomly (n, 0, maximumValue.getHighestBit() + 1); - } - while (n >= maximumValue); - - return n; -} - -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"); - - for (int j = 10; --j >= 0;) - { - Random r; - r.setSeedRandomly(); - - for (int i = 20; --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/src/juce/JuceLibraryCode/modules/juce_core/maths/juce_Random.h b/src/juce/JuceLibraryCode/modules/juce_core/maths/juce_Random.h deleted file mode 100644 index b2cc04f9..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/maths/juce_Random.h +++ /dev/null @@ -1,137 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_RANDOM_JUCEHEADER__ -#define __JUCE_RANDOM_JUCEHEADER__ - -#include "juce_BigInteger.h" - - -//============================================================================== -/** - 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 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); - - /** 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; - - /** 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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/maths/juce_Range.h b/src/juce/JuceLibraryCode/modules/juce_core/maths/juce_Range.h deleted file mode 100644 index 14a4699b..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/maths/juce_Range.h +++ /dev/null @@ -1,267 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_RANGE_JUCEHEADER__ -#define __JUCE_RANGE_JUCEHEADER__ - - -//============================================================================== -/** A general-purpose range object, that simply represents any linear range with - a start and end point. - - 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 (ValueType()), end (ValueType()) - { - } - - /** Constructs a range with given start and end values. */ - Range (const ValueType start_, const ValueType end_) noexcept - : start (start_), end (jmax (start_, end_)) - { - } - - /** Constructs a copy of another range. */ - Range (const Range& other) noexcept - : start (other.start), end (other.end) - { - } - - /** Copies another range object. */ - Range& operator= (const Range& other) noexcept - { - start = other.start; - end = other.end; - return *this; - } - - /** Destructor. */ - ~Range() noexcept - { - } - - /** 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 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 start 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 const Range& operator+= (const ValueType amountToAdd) noexcept - { - start += amountToAdd; - end += amountToAdd; - return *this; - } - - /** Subtracts an amount from the start and end of the range. */ - inline const 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== (const Range& other) const noexcept { return start == other.start && end == other.end; } - bool operator!= (const 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. */ - bool contains (const Range& other) const noexcept - { - return start <= other.start && end >= other.end; - } - - /** Returns true if the given range intersects this one. */ - bool intersects (const 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 (const 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 (const Range& other) const noexcept - { - return Range (jmin (start, other.start), - jmax (end, other.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 (const Range& rangeToConstrain) const noexcept - { - const ValueType otherLen = rangeToConstrain.getLength(); - return getLength() <= otherLen - ? *this - : rangeToConstrain.movedToStartAt (jlimit (start, end - otherLen, rangeToConstrain.getStart())); - } - -private: - //============================================================================== - ValueType start, end; -}; - - -#endif // __JUCE_RANGE_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/memory/juce_Atomic.h b/src/juce/JuceLibraryCode/modules/juce_core/memory/juce_Atomic.h deleted file mode 100644 index 7bc4dd64..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/memory/juce_Atomic.h +++ /dev/null @@ -1,390 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_ATOMIC_JUCEHEADER__ -#define __JUCE_ATOMIC_JUCEHEADER__ - - -//============================================================================== -/** - 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 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: - static inline Type castFrom32Bit (int32 value) noexcept { return *(Type*) &value; } - static inline Type castFrom64Bit (int64 value) noexcept { return *(Type*) &value; } - static inline int32 castTo32Bit (Type value) noexcept { return *(int32*) &value; } - static inline int64 castTo64Bit (Type value) noexcept { return *(int64*) &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_IOS || (JUCE_MAC && (JUCE_PPC || defined (__clang__) || __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 2))) - #define JUCE_ATOMICS_MAC 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 || JUCE_IOS - // None of these atomics are available for PPC or for iPhoneOS 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 - #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_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 - 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 || 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 - 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 - 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 (Type) __sync_add_and_fetch (&value, 1); - #endif -} - -template -inline Type Atomic::operator--() noexcept -{ - #if JUCE_ATOMICS_MAC - 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 (Type) __sync_add_and_fetch (&value, -1); - #endif -} - -template -inline bool Atomic::compareAndSetBool (const Type newValue, const Type valueToCompare) noexcept -{ - #if JUCE_ATOMICS_MAC - 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 - 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 - OSMemoryBarrier(); - #elif JUCE_ATOMICS_GCC - __sync_synchronize(); - #elif JUCE_ATOMICS_WINDOWS - juce_MemoryBarrier(); - #endif -} - -#if JUCE_MSVC - #pragma warning (pop) -#endif - -#endif // __JUCE_ATOMIC_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/memory/juce_ByteOrder.h b/src/juce/JuceLibraryCode/modules/juce_core/memory/juce_ByteOrder.h deleted file mode 100644 index aca5bbf7..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/memory/juce_ByteOrder.h +++ /dev/null @@ -1,183 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_BYTEORDER_JUCEHEADER__ -#define __JUCE_BYTEORDER_JUCEHEADER__ - - -//============================================================================== -/** 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); - - /** Reverses the order of the 4 bytes in a 32-bit integer. */ - static uint32 swap (uint32 value); - - /** Reverses the order of the 8 bytes in a 64-bit integer. */ - static uint64 swap (uint64 value); - - //============================================================================== - /** Swaps the byte order of a 16-bit int if the CPU is big-endian */ - static uint16 swapIfBigEndian (uint16 value); - - /** Swaps the byte order of a 32-bit int if the CPU is big-endian */ - static uint32 swapIfBigEndian (uint32 value); - - /** Swaps the byte order of a 64-bit int if the CPU is big-endian */ - static uint64 swapIfBigEndian (uint64 value); - - /** Swaps the byte order of a 16-bit int if the CPU is little-endian */ - static uint16 swapIfLittleEndian (uint16 value); - - /** Swaps the byte order of a 32-bit int if the CPU is little-endian */ - static uint32 swapIfLittleEndian (uint32 value); - - /** Swaps the byte order of a 64-bit int if the CPU is little-endian */ - static uint64 swapIfLittleEndian (uint64 value); - - //============================================================================== - /** Turns 4 bytes into a little-endian integer. */ - static uint32 littleEndianInt (const void* bytes); - - /** Turns 2 bytes into a little-endian integer. */ - static uint16 littleEndianShort (const void* bytes); - - /** Turns 4 bytes into a big-endian integer. */ - static uint32 bigEndianInt (const void* bytes); - - /** Turns 2 bytes into a big-endian integer. */ - static uint16 bigEndianShort (const void* bytes); - - //============================================================================== - /** Converts 3 little-endian bytes into a signed 24-bit value (which is sign-extended to 32 bits). */ - static int littleEndian24Bit (const char* bytes); - - /** Converts 3 big-endian bytes into a signed 24-bit value (which is sign-extended to 32 bits). */ - static int bigEndian24Bit (const char* bytes); - - /** Copies a 24-bit number to 3 little-endian bytes. */ - static void littleEndian24BitToChars (int value, char* destBytes); - - /** Copies a 24-bit number to 3 big-endian bytes. */ - static void bigEndian24BitToChars (int value, char* destBytes); - - //============================================================================== - /** Returns true if the current CPU is big-endian. */ - static bool isBigEndian(); - -private: - ByteOrder(); - - JUCE_DECLARE_NON_COPYABLE (ByteOrder); -}; - - -//============================================================================== -#if JUCE_USE_INTRINSICS && ! defined (__INTEL_COMPILER) - #pragma intrinsic (_byteswap_ulong) -#endif - -inline uint16 ByteOrder::swap (uint16 n) -{ - #if JUCE_USE_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) -{ - #if JUCE_MAC || JUCE_IOS - return OSSwapInt32 (n); - #elif JUCE_GCC && JUCE_INTEL - asm("bswap %%eax" : "=a"(n) : "a"(n)); - return n; - #elif JUCE_USE_INTRINSICS - return _byteswap_ulong (n); - #elif JUCE_MSVC - __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) -{ - #if JUCE_MAC || JUCE_IOS - return OSSwapInt64 (value); - #elif JUCE_USE_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) { return v; } - inline uint32 ByteOrder::swapIfBigEndian (const uint32 v) { return v; } - inline uint64 ByteOrder::swapIfBigEndian (const uint64 v) { return v; } - inline uint16 ByteOrder::swapIfLittleEndian (const uint16 v) { return swap (v); } - inline uint32 ByteOrder::swapIfLittleEndian (const uint32 v) { return swap (v); } - inline uint64 ByteOrder::swapIfLittleEndian (const uint64 v) { return swap (v); } - inline uint32 ByteOrder::littleEndianInt (const void* const bytes) { return *static_cast (bytes); } - inline uint16 ByteOrder::littleEndianShort (const void* const bytes) { return *static_cast (bytes); } - inline uint32 ByteOrder::bigEndianInt (const void* const bytes) { return swap (*static_cast (bytes)); } - inline uint16 ByteOrder::bigEndianShort (const void* const bytes) { return swap (*static_cast (bytes)); } - inline bool ByteOrder::isBigEndian() { return false; } -#else - inline uint16 ByteOrder::swapIfBigEndian (const uint16 v) { return swap (v); } - inline uint32 ByteOrder::swapIfBigEndian (const uint32 v) { return swap (v); } - inline uint64 ByteOrder::swapIfBigEndian (const uint64 v) { return swap (v); } - inline uint16 ByteOrder::swapIfLittleEndian (const uint16 v) { return v; } - inline uint32 ByteOrder::swapIfLittleEndian (const uint32 v) { return v; } - inline uint64 ByteOrder::swapIfLittleEndian (const uint64 v) { return v; } - inline uint32 ByteOrder::littleEndianInt (const void* const bytes) { return swap (*static_cast (bytes)); } - inline uint16 ByteOrder::littleEndianShort (const void* const bytes) { return swap (*static_cast (bytes)); } - inline uint32 ByteOrder::bigEndianInt (const void* const bytes) { return *static_cast (bytes); } - inline uint16 ByteOrder::bigEndianShort (const void* const bytes) { return *static_cast (bytes); } - inline bool ByteOrder::isBigEndian() { return true; } -#endif - -inline int ByteOrder::littleEndian24Bit (const char* const bytes) { return (((int) bytes[2]) << 16) | (((int) (uint8) bytes[1]) << 8) | ((int) (uint8) bytes[0]); } -inline int ByteOrder::bigEndian24Bit (const char* const bytes) { return (((int) bytes[0]) << 16) | (((int) (uint8) bytes[1]) << 8) | ((int) (uint8) bytes[2]); } -inline void ByteOrder::littleEndian24BitToChars (const int value, char* const destBytes) { destBytes[0] = (char)(value & 0xff); destBytes[1] = (char)((value >> 8) & 0xff); destBytes[2] = (char)((value >> 16) & 0xff); } -inline void ByteOrder::bigEndian24BitToChars (const int value, char* const destBytes) { destBytes[0] = (char)((value >> 16) & 0xff); destBytes[1] = (char)((value >> 8) & 0xff); destBytes[2] = (char)(value & 0xff); } - - -#endif // __JUCE_BYTEORDER_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/memory/juce_HeapBlock.h b/src/juce/JuceLibraryCode/modules/juce_core/memory/juce_HeapBlock.h deleted file mode 100644 index 4f6a66ea..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/memory/juce_HeapBlock.h +++ /dev/null @@ -1,294 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_HEAPBLOCK_JUCEHEADER__ -#define __JUCE_HEAPBLOCK_JUCEHEADER__ - -#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 instead. - */ - explicit HeapBlock (const size_t numElements) - : data (static_cast (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, const bool initialiseToZero) - { - std::free (data); - - if (initialiseToZero) - data = static_cast (std::calloc (newNumElements, sizeof (ElementType))); - else - data = static_cast (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)) - { - if (data == nullptr) - data = static_cast (std::malloc (newNumElements * elementSize)); - else - data = static_cast (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); - } - -private: - //============================================================================== - ElementType* data; - - void throwOnAllocationFailure() const - { - HeapBlockHelper::ThrowOnFail::check (data); - } - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (HeapBlock); - - JUCE_PREVENT_HEAP_ALLOCATION; // Creating a 'new HeapBlock' would be missing the point! -}; - - -#endif // __JUCE_HEAPBLOCK_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/memory/juce_LeakedObjectDetector.h b/src/juce/JuceLibraryCode/modules/juce_core/memory/juce_LeakedObjectDetector.h deleted file mode 100644 index a707314d..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/memory/juce_LeakedObjectDetector.h +++ /dev/null @@ -1,145 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_LEAKEDOBJECTDETECTOR_JUCEHEADER__ -#define __JUCE_LEAKEDOBJECTDETECTOR_JUCEHEADER__ - -#include "../text/juce_String.h" -#include "juce_Atomic.h" - - -//============================================================================== -/** - 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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/memory/juce_Memory.h b/src/juce/JuceLibraryCode/modules/juce_core/memory/juce_Memory.h deleted file mode 100644 index 7c21a633..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/memory/juce_Memory.h +++ /dev/null @@ -1,96 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_MEMORY_JUCEHEADER__ -#define __JUCE_MEMORY_JUCEHEADER__ - -//============================================================================== -#if JUCE_MINGW - /** This allocator is not defined in mingw gcc. */ - #define alloca __builtin_alloca -#endif - -//============================================================================== -/** 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, int 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 (Type* pointer) { return pointer != nullptr ? new Type (*pointer) : nullptr; } - -//============================================================================== -/* 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) && ! 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 ((int) 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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/memory/juce_MemoryBlock.cpp b/src/juce/JuceLibraryCode/modules/juce_core/memory/juce_MemoryBlock.cpp deleted file mode 100644 index 83bfd889..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/memory/juce_MemoryBlock.cpp +++ /dev/null @@ -1,408 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -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 (jmax ((size_t) 0, sizeInBytes)) -{ - jassert (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) - { - data.free(); - size = 0; - } - 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::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::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 -= offset; - offset = 0; - } - - if (offset + num > size) - num = size - 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 += offset; - offset = 0; - } - - if (offset + num > size) - { - const size_t newNum = size - offset; - zeromem (d + newNum, num - newNum); - num = newNum; - } - - if (num > 0) - memcpy (d, data + offset, num); -} - -String MemoryBlock::toString() const -{ - return String (CharPointer_UTF8 (data), size); -} - -//============================================================================== -int MemoryBlock::getBitRange (const size_t bitRangeStart, size_t numBits) const noexcept -{ - int res = 0; - - size_t byte = bitRangeStart >> 3; - int offsetInByte = (int) bitRangeStart & 7; - size_t bitsSoFar = 0; - - while (numBits > 0 && (size_t) byte < size) - { - const int bitsThisTime = jmin ((int) 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; - int offsetInByte = (int) bitRangeStart & 7; - unsigned int mask = ~((((unsigned int) 0xffffffff) << (32 - numBits)) >> (32 - numBits)); - - while (numBits > 0 && (size_t) byte < size) - { - const int bitsThisTime = jmin ((int) numBits, 8 - offsetInByte); - - const unsigned int tempMask = (mask << offsetInByte) | ~((((unsigned int) 0xffffffff) >> offsetInByte) << offsetInByte); - const unsigned int tempBits = (unsigned int) bitsToSet << offsetInByte; - - data[byte] = (char) ((data[byte] & tempMask) | tempBits); - - ++byte; - numBits -= bitsThisTime; - bitsToSet >>= bitsThisTime; - mask >>= bitsThisTime; - offsetInByte = 0; - } -} - -//============================================================================== -void MemoryBlock::loadFromHexString (const String& hex) -{ - ensureSize ((size_t) hex.length() >> 1); - char* dest = data; - String::CharPointerType t (hex.getCharPointer()); - - 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; - } - else if (c >= 'a' && c <= 'z') - { - byte |= c - ('a' - 10); - break; - } - else if (c >= 'A' && c <= 'Z') - { - byte |= c - ('A' - 10); - break; - } - else if (c == 0) - { - setSize (static_cast (dest - data)); - return; - } - } - } - - *dest++ = (char) byte; - } -} - -//============================================================================== -const char* const MemoryBlock::encodingTable = ".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) * (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) encodingTable [getBitRange (i * 6, 6)]); - - d.writeNull(); - return destString; -} - -bool MemoryBlock::fromBase64Encoding (const String& s) -{ - const int startPos = s.indexOfChar ('.') + 1; - - if (startPos <= 0) - return false; - - const int numBytesNeeded = s.substring (0, startPos - 1).getIntValue(); - - setSize ((size_t) numBytesNeeded, true); - - const int numChars = s.length() - startPos; - - String::CharPointerType srcChars (s.getCharPointer()); - srcChars += startPos; - int pos = 0; - - for (int i = 0; i < numChars; ++i) - { - const char c = (char) srcChars.getAndAdvance(); - - for (int j = 0; j < 64; ++j) - { - if (encodingTable[j] == c) - { - setBitRange ((size_t) pos, 6, j); - pos += 6; - break; - } - } - } - - return true; -} diff --git a/src/juce/JuceLibraryCode/modules/juce_core/memory/juce_MemoryBlock.h b/src/juce/JuceLibraryCode/modules/juce_core/memory/juce_MemoryBlock.h deleted file mode 100644 index 5410c3d9..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/memory/juce_MemoryBlock.h +++ /dev/null @@ -1,252 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_MEMORYBLOCK_JUCEHEADER__ -#define __JUCE_MEMORYBLOCK_JUCEHEADER__ - -#include "../text/juce_String.h" -#include "../memory/juce_HeapBlock.h" - - -//============================================================================== -/** - 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& other); - - /** 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& other); - - #if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS - MemoryBlock (MemoryBlock&& other) noexcept; - MemoryBlock& operator= (MemoryBlock&& other) 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. - - This will try to keep as much of the block's current content as it can, - and can optionally be made to clear any new space that gets allocated at - the end of the block. - - @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); - - //============================================================================== - /** 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); - - /** 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 (const String& 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 (const String& encodedString); - - -private: - //============================================================================== - HeapBlock data; - size_t size; - static const char* const encodingTable; - - JUCE_LEAK_DETECTOR (MemoryBlock); -}; - - -#endif // __JUCE_MEMORYBLOCK_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/memory/juce_OptionalScopedPointer.h b/src/juce/JuceLibraryCode/modules/juce_core/memory/juce_OptionalScopedPointer.h deleted file mode 100644 index 113b74ba..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/memory/juce_OptionalScopedPointer.h +++ /dev/null @@ -1,147 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_OPTIONALSCOPEDPOINTER_JUCEHEADER__ -#define __JUCE_OPTIONALSCOPEDPOINTER_JUCEHEADER__ - -#include "juce_ScopedPointer.h" - - -//============================================================================== -/** - 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& 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(); - } - - //============================================================================== - /** 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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/memory/juce_ReferenceCountedObject.h b/src/juce/JuceLibraryCode/modules/juce_core/memory/juce_ReferenceCountedObject.h deleted file mode 100644 index b038570c..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/memory/juce_ReferenceCountedObject.h +++ /dev/null @@ -1,385 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_REFERENCECOUNTEDOBJECT_JUCEHEADER__ -#define __JUCE_REFERENCECOUNTEDOBJECT_JUCEHEADER__ - -#include "juce_Atomic.h" - - -//============================================================================== -/** - Adds reference-counting to an object. - - 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. - */ - inline void incReferenceCount() noexcept - { - ++refCount; - } - - /** Decreases the object's reference count. - - If the count gets to zero, the object will be deleted. - */ - inline void decReferenceCount() noexcept - { - jassert (getReferenceCount() > 0); - - if (--refCount == 0) - delete this; - } - - /** Returns the object's current reference count. */ - inline 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; -}; - - -//============================================================================== -/** - Adds reference-counting to an object. - - This is efectively 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. - */ - inline void incReferenceCount() noexcept - { - ++refCount; - } - - /** Decreases the object's reference count. - - If the count gets to zero, the object will be deleted. - */ - inline void decReferenceCount() noexcept - { - jassert (getReferenceCount() > 0); - - if (--refCount == 0) - delete this; - } - - /** Returns the object's current reference count. */ - inline 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; -}; - - -//============================================================================== -/** - 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, - but if you need to, you could roll your own reference-countable class by implementing a pair of - mathods called incReferenceCount() and decReferenceCount(). - - When using this class, you'll probably want to create a typedef to abbreviate the full - templated name - e.g. - @code typedef ReferenceCountedObjectPtr MyClassPtr;@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. */ - inline ReferenceCountedObjectPtr() noexcept - : referencedObject (nullptr) - { - } - - /** Creates a pointer to an object. - - This will increment the object's reference-count if it is non-null. - */ - inline ReferenceCountedObjectPtr (ReferenceCountedObjectClass* const refCountedObject) noexcept - : referencedObject (refCountedObject) - { - if (refCountedObject != nullptr) - refCountedObject->incReferenceCount(); - } - - /** Copies another pointer. - This will increment the object's reference-count (if it is non-null). - */ - inline ReferenceCountedObjectPtr (const ReferenceCountedObjectPtr& other) noexcept - : referencedObject (other.referencedObject) - { - if (referencedObject != nullptr) - referencedObject->incReferenceCount(); - } - - #if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS - /** Takes-over the object from another pointer. */ - inline ReferenceCountedObjectPtr (ReferenceCountedObjectPtr&& other) noexcept - : referencedObject (other.referencedObject) - { - other.referencedObject = nullptr; - } - #endif - - /** Copies another pointer. - This will increment the object's reference-count (if it is non-null). - */ - template - inline ReferenceCountedObjectPtr (const ReferenceCountedObjectPtr& other) noexcept - : referencedObject (static_cast (other.getObject())) - { - if (referencedObject != nullptr) - referencedObject->incReferenceCount(); - } - - /** 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.getObject())); - } - - #if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS - /** Takes-over the object from another pointer. */ - ReferenceCountedObjectPtr& operator= (ReferenceCountedObjectPtr&& other) - { - std::swap (referencedObject, other.referencedObject); - return *this; - } - #endif - - /** 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= (ReferenceCountedObjectClass* const newObject) - { - if (referencedObject != newObject) - { - if (newObject != nullptr) - newObject->incReferenceCount(); - - ReferenceCountedObjectClass* const oldObject = referencedObject; - referencedObject = newObject; - - if (oldObject != nullptr) - oldObject->decReferenceCount(); - } - - return *this; - } - - /** Destructor. - - This will decrement the object's reference-count, and may delete it if it - gets to zero. - */ - inline ~ReferenceCountedObjectPtr() - { - if (referencedObject != nullptr) - referencedObject->decReferenceCount(); - } - - /** Returns the object that this pointer references. - The pointer returned may be zero, of course. - */ - inline operator ReferenceCountedObjectClass*() const noexcept - { - return referencedObject; - } - - // the -> operator is called on the referenced object - inline ReferenceCountedObjectClass* operator->() const noexcept - { - return referencedObject; - } - - /** Returns the object that this pointer references. - The pointer returned may be zero, of course. - */ - inline ReferenceCountedObjectClass* getObject() const noexcept - { - return referencedObject; - } - -private: - //============================================================================== - ReferenceCountedObjectClass* referencedObject; -}; - - -/** Compares two ReferenceCountedObjectPointers. */ -template -bool operator== (const ReferenceCountedObjectPtr& object1, ReferenceCountedObjectClass* const object2) noexcept -{ - return object1.getObject() == object2; -} - -/** Compares two ReferenceCountedObjectPointers. */ -template -bool operator== (const ReferenceCountedObjectPtr& object1, const ReferenceCountedObjectPtr& object2) noexcept -{ - return object1.getObject() == object2.getObject(); -} - -/** Compares two ReferenceCountedObjectPointers. */ -template -bool operator== (ReferenceCountedObjectClass* object1, ReferenceCountedObjectPtr& object2) noexcept -{ - return object1 == object2.getObject(); -} - -/** Compares two ReferenceCountedObjectPointers. */ -template -bool operator!= (const ReferenceCountedObjectPtr& object1, const ReferenceCountedObjectClass* object2) noexcept -{ - return object1.getObject() != object2; -} - -/** Compares two ReferenceCountedObjectPointers. */ -template -bool operator!= (const ReferenceCountedObjectPtr& object1, ReferenceCountedObjectPtr& object2) noexcept -{ - return object1.getObject() != object2.getObject(); -} - -/** Compares two ReferenceCountedObjectPointers. */ -template -bool operator!= (ReferenceCountedObjectClass* object1, ReferenceCountedObjectPtr& object2) noexcept -{ - return object1 != object2.getObject(); -} - - -#endif // __JUCE_REFERENCECOUNTEDOBJECT_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/memory/juce_ScopedPointer.h b/src/juce/JuceLibraryCode/modules/juce_core/memory/juce_ScopedPointer.h deleted file mode 100644 index 40d06269..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/memory/juce_ScopedPointer.h +++ /dev/null @@ -1,230 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_SCOPEDPOINTER_JUCEHEADER__ -#define __JUCE_SCOPEDPOINTER_JUCEHEADER__ - -//============================================================================== -/** - 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() { delete 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; - delete 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 is may be null. - */ - ScopedPointer& operator= (ObjectType* const newObjectToTakePossessionOf) - { - if (object != newObjectToTakePossessionOf) - { - ObjectType* const oldObject = object; - object = newObjectToTakePossessionOf; - delete oldObject; - } - - return *this; - } - - //============================================================================== - /** 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); - - 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) - /* These 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 you may hit a puzzling compiler 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 fis though - just write it like this: - - ScopedPointer m (new MyClass()); // Compiles OK - - It's good practice to always use the latter form when writing your object declarations anyway, - rather than writing them as assignments and assuming (or hoping) that the compiler will be - smart enough to replace your construction + assignment with a single constructor. - */ - ScopedPointer (const ScopedPointer&); - ScopedPointer& operator= (const 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; -} - -#endif // __JUCE_SCOPEDPOINTER_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/memory/juce_Singleton.h b/src/juce/JuceLibraryCode/modules/juce_core/memory/juce_Singleton.h deleted file mode 100644 index b9b6e82d..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/memory/juce_Singleton.h +++ /dev/null @@ -1,289 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_SINGLETON_JUCEHEADER__ -#define __JUCE_SINGLETON_JUCEHEADER__ - - -//============================================================================== -/** - 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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/memory/juce_WeakReference.h b/src/juce/JuceLibraryCode/modules/juce_core/memory/juce_WeakReference.h deleted file mode 100644 index 030e641b..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/memory/juce_WeakReference.h +++ /dev/null @@ -1,211 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_WEAKREFERENCE_JUCEHEADER__ -#define __JUCE_WEAKREFERENCE_JUCEHEADER__ - -#include "juce_ReferenceCountedObject.h" - - -//============================================================================== -/** - 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 owner_) noexcept : owner (owner_) {} - - 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() - { - // 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() - { - 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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/misc/juce_Result.cpp b/src/juce/JuceLibraryCode/modules/juce_core/misc/juce_Result.cpp deleted file mode 100644 index d25dba9c..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/misc/juce_Result.cpp +++ /dev/null @@ -1,83 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -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::ok() noexcept -{ - return Result (String::empty); -} - -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/src/juce/JuceLibraryCode/modules/juce_core/misc/juce_Result.h b/src/juce/JuceLibraryCode/modules/juce_core/misc/juce_Result.h deleted file mode 100644 index 03225c8e..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/misc/juce_Result.h +++ /dev/null @@ -1,121 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_RESULT_JUCEHEADER__ -#define __JUCE_RESULT_JUCEHEADER__ - -#include "../text/juce_String.h" - - -//============================================================================== -/** - 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; - - /** 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& other); - Result& operator= (const Result& other); - - #if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS - Result (Result&& other) noexcept; - Result& operator= (Result&& other) noexcept; - #endif - - bool operator== (const Result& other) const noexcept; - bool operator!= (const Result& other) const noexcept; - -private: - String errorMessage; - - 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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/misc/juce_Uuid.cpp b/src/juce/JuceLibraryCode/modules/juce_core/misc/juce_Uuid.cpp deleted file mode 100644 index ecd8c443..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/misc/juce_Uuid.cpp +++ /dev/null @@ -1,111 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -namespace -{ - int64 getRandomSeedFromMACAddresses() - { - Array result; - MACAddress::findAllAddresses (result); - - Random r; - for (int i = 0; i < result.size(); ++i) - r.combineSeed (result[i].toInt64()); - - return r.nextInt64(); - } -} - -//============================================================================== -Uuid::Uuid() -{ - // The normal random seeding is pretty good, but we'll throw some MAC addresses - // into the mix too, to make it very very unlikely that two UUIDs will ever be the same.. - - static Random r1 (getRandomSeedFromMACAddresses()); - Random r2; - - for (size_t i = 0; i < sizeof (uuid); ++i) - uuid[i] = (uint8) (r1.nextInt() ^ r2.nextInt()); -} - -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); } - -bool Uuid::isNull() const noexcept -{ - for (size_t i = 0; i < sizeof (uuid); ++i) - if (uuid[i] != 0) - return false; - - return true; -} - -String Uuid::toString() const -{ - return String::toHexString (uuid, sizeof (uuid), 0); -} - -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) -{ - 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/src/juce/JuceLibraryCode/modules/juce_core/misc/juce_Uuid.h b/src/juce/JuceLibraryCode/modules/juce_core/misc/juce_Uuid.h deleted file mode 100644 index 8a1fc39d..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/misc/juce_Uuid.h +++ /dev/null @@ -1,111 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_UUID_JUCEHEADER__ -#define __JUCE_UUID_JUCEHEADER__ - -#include "../text/juce_String.h" - - -//============================================================================== -/** - A universally unique 128-bit identifier. - - This class generates very random unique numbers based on the system time - and MAC addresses if any are available. It's extremely unlikely that two identical - UUIDs would ever be created by chance. - - 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. */ - Uuid(); - - /** Destructor. */ - ~Uuid() noexcept; - - /** Creates a copy of another UUID. */ - Uuid (const Uuid& other) noexcept; - - /** Copies another UUID. */ - Uuid& operator= (const Uuid& other) noexcept; - - //============================================================================== - /** Returns true if the ID is zero. */ - bool isNull() const noexcept; - - bool operator== (const Uuid& other) const noexcept; - bool operator!= (const Uuid& other) 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; - - /** 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); - - /** Sets this UUID from 16-bytes of raw data. */ - Uuid& operator= (const uint8* rawData) noexcept; - - -private: - //============================================================================== - uint8 uuid[16]; - - JUCE_LEAK_DETECTOR (Uuid); -}; - - -#endif // __JUCE_UUID_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/misc/juce_WindowsRegistry.h b/src/juce/JuceLibraryCode/modules/juce_core/misc/juce_WindowsRegistry.h deleted file mode 100644 index 0e82fe5e..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/misc/juce_WindowsRegistry.h +++ /dev/null @@ -1,118 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_WINDOWSREGISTRY_JUCEHEADER__ -#define __JUCE_WINDOWSREGISTRY_JUCEHEADER__ - -#if JUCE_WINDOWS || DOXYGEN - -/** - Contains some static helper functions for manipulating the MS Windows registry - (Only available on Windows, of course!) -*/ -class WindowsRegistry -{ -public: - //============================================================================== - /** 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 getValue (const String& regValuePath, - const String& defaultValue = String::empty); - - /** Returns a string from the WOW64 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 getValueWow64 (const String& regValuePath, - const String& defaultValue = String::empty); - - /** 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 getBinaryValue (const String& regValuePath, MemoryBlock& resultData); - - /** 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 setValue (const String& regValuePath, const String& value); - - /** 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 setValue (const String& regValuePath, uint32 value); - - /** 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 setValue (const String& regValuePath, uint64 value); - - /** 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 setValue (const String& regValuePath, const MemoryBlock& value); - - /** Returns true if the given value exists in the registry. */ - static bool valueExists (const String& regValuePath); - - /** Deletes a registry value. */ - static void deleteValue (const String& regValuePath); - - /** Deletes a registry key (which is registry-talk for 'folder'). */ - static void deleteKey (const String& regKeyPath); - - /** 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. - */ - static bool registerFileAssociation (const String& fileExtension, - const String& symbolicDescription, - const String& fullDescription, - const File& targetExecutable, - int iconResourceNumber, - bool registerForCurrentUserOnly); - -private: - WindowsRegistry(); - JUCE_DECLARE_NON_COPYABLE (WindowsRegistry); -}; - -#endif -#endif // __JUCE_WINDOWSREGISTRY_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/native/java/ComponentPeerView.java b/src/juce/JuceLibraryCode/modules/juce_core/native/java/ComponentPeerView.java deleted file mode 100644 index edd982e8..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/native/java/ComponentPeerView.java +++ /dev/null @@ -1,124 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-10 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -package com.juce; - -import android.content.Context; -import android.view.*; -import android.graphics.*; - -//============================================================================== -public class ComponentPeerView extends View - implements View.OnFocusChangeListener -{ - public ComponentPeerView (Context context, boolean opaque_) - { - super (context); - opaque = opaque_; - setFocusable (true); - setFocusableInTouchMode (true); - setOnFocusChangeListener (this); - requestFocus(); - } - - //============================================================================== - private native void handlePaint (Canvas canvas); - - @Override - public void draw (Canvas canvas) - { - handlePaint (canvas); - } - - @Override - public boolean isOpaque() - { - return opaque; - } - - private boolean opaque; - - //============================================================================== - private native void handleMouseDown (float x, float y, long time); - private native void handleMouseDrag (float x, float y, long time); - private native void handleMouseUp (float x, float y, long time); - - @Override - public boolean onTouchEvent (MotionEvent event) - { - switch (event.getAction()) - { - case MotionEvent.ACTION_DOWN: handleMouseDown (event.getX(), event.getY(), event.getEventTime()); return true; - case MotionEvent.ACTION_MOVE: handleMouseDrag (event.getX(), event.getY(), event.getEventTime()); return true; - case MotionEvent.ACTION_CANCEL: - case MotionEvent.ACTION_UP: handleMouseUp (event.getX(), event.getY(), event.getEventTime()); return true; - default: break; - } - - return false; - } - - //============================================================================== - @Override - protected void onSizeChanged (int w, int h, int oldw, int oldh) - { - viewSizeChanged(); - } - - @Override - protected void onLayout (boolean changed, int left, int top, int right, int bottom) - { - } - - private native void viewSizeChanged(); - - @Override - public void onFocusChange (View v, boolean hasFocus) - { - if (v == this) - focusChanged (hasFocus); - } - - private native void focusChanged (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 - } -} diff --git a/src/juce/JuceLibraryCode/modules/juce_core/native/java/JuceAppActivity.java b/src/juce/JuceLibraryCode/modules/juce_core/native/java/JuceAppActivity.java deleted file mode 100644 index e64abf3e..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/native/java/JuceAppActivity.java +++ /dev/null @@ -1,498 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-10 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce 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.net.Uri; -import android.os.Bundle; -import android.view.*; -import android.graphics.*; -import android.opengl.*; -import android.text.ClipboardManager; -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; - -//============================================================================== -public final class JuceAppActivity extends Activity -{ - //============================================================================== - static - { - System.loadLibrary ("juce_jni"); - } - - @Override - public final void onCreate (Bundle savedInstanceState) - { - super.onCreate (savedInstanceState); - - viewHolder = new ViewHolder (this); - setContentView (viewHolder); - } - - @Override - protected final void onDestroy() - { - quitApp(); - super.onDestroy(); - } - - private void callAppLauncher() - { - launchApp (getApplicationInfo().publicSourceDir, - getApplicationInfo().dataDir); - } - - //============================================================================== - private native void launchApp (String appFile, String appDataDir); - private native void quitApp(); - private native void setScreenSize (int screenWidth, int screenHeight); - - //============================================================================== - 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) - { - ComponentPeerView v = new ComponentPeerView (this, opaque); - viewHolder.addView (v); - return v; - } - - public final void deleteView (ComponentPeerView 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()); - - if (isFirstResize) - { - isFirstResize = false; - callAppLauncher(); - } - } - - 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_) - { - super (context); - setWillNotDraw (false); - opaque = opaque_; - - setFocusable (true); - setFocusableInTouchMode (true); - setOnFocusChangeListener (this); - requestFocus(); - } - - //============================================================================== - private native void handlePaint (Canvas canvas); - - @Override - public void draw (Canvas canvas) - { - super.draw (canvas); - handlePaint (canvas); - } - - @Override - public boolean isOpaque() - { - return opaque; - } - - private boolean opaque; - - //============================================================================== - private native void handleMouseDown (float x, float y, long time); - private native void handleMouseDrag (float x, float y, long time); - private native void handleMouseUp (float x, float y, long time); - - @Override - public boolean onTouchEvent (MotionEvent event) - { - switch (event.getAction()) - { - case MotionEvent.ACTION_DOWN: handleMouseDown (event.getX(), event.getY(), event.getEventTime()); return true; - case MotionEvent.ACTION_MOVE: handleMouseDrag (event.getX(), event.getY(), event.getEventTime()); return true; - case MotionEvent.ACTION_CANCEL: - case MotionEvent.ACTION_UP: handleMouseUp (event.getX(), event.getY(), event.getEventTime()); return true; - default: break; - } - - return false; - } - - //============================================================================== - @Override - protected void onSizeChanged (int w, int h, int oldw, int oldh) - { - super.onSizeChanged (w, h, oldw, oldh); - viewSizeChanged(); - } - - @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(); - - @Override - public void onFocusChange (View v, boolean hasFocus) - { - if (v == this) - focusChanged (hasFocus); - } - - private native void focusChanged (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 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 = 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_) throws IOException - { - connection = connection_; - inputStream = new BufferedInputStream (connection.getInputStream()); - } - - 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, - java.lang.StringBuffer responseHeaders) - { - try - { - HttpURLConnection connection = (HttpURLConnection) (new URL (address).openConnection()); - - if (connection != null) - { - try - { - if (isPost) - { - connection.setConnectTimeout (timeOutMs); - connection.setDoOutput (true); - connection.setChunkedStreamingMode (0); - - OutputStream out = connection.getOutputStream(); - out.write (postData); - out.flush(); - } - - return new HTTPStream (connection); - } - 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))); - } -} diff --git a/src/juce/JuceLibraryCode/modules/juce_core/native/juce_BasicNativeHeaders.h b/src/juce/JuceLibraryCode/modules/juce_core/native/juce_BasicNativeHeaders.h deleted file mode 100644 index 40ef0b18..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/native/juce_BasicNativeHeaders.h +++ /dev/null @@ -1,213 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_BASICNATIVEHEADERS_JUCEHEADER__ -#define __JUCE_BASICNATIVEHEADERS_JUCEHEADER__ - -#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 - -//============================================================================== -#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 - #define _WIN32_WINNT 0x0600 - #define _UNICODE 1 - #define UNICODE 1 - #ifndef _WIN32_IE - #define _WIN32_IE 0x0400 - #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, "shell32.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 - - functionName: function to import - localFunctionName: name you want to use to actually call it (must be different) - returnType: the return type - object: the DynamicLibrary to use - params: list of params (bracketed) - */ - #define JUCE_DLL_FUNCTION(functionName, localFunctionName, returnType, object, params) \ - typedef returnType (WINAPI *type##localFunctionName) params; \ - type##localFunctionName localFunctionName = (type##localFunctionName)object.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 - -//============================================================================== -#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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/native/juce_android_Files.cpp b/src/juce/JuceLibraryCode/modules/juce_core/native/juce_android_Files.cpp deleted file mode 100644 index d75d20c6..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/native/juce_android_Files.cpp +++ /dev/null @@ -1,237 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -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::isOnCDRomDrive() const -{ - return false; -} - -bool File::isOnHardDisk() const -{ - return true; -} - -bool File::isOnRemovableDrive() const -{ - return false; -} - -bool File::isHidden() const -{ - return getFileName().startsWithChar ('.'); -} - -//============================================================================== -namespace -{ - File juce_readlink (const String& file, const File& defaultFile) - { - const int size = 8192; - HeapBlock buffer; - buffer.malloc (size + 4); - - const size_t numBytes = readlink (file.toUTF8(), buffer, size); - - if (numBytes > 0 && numBytes <= size) - return File (file).getSiblingFile (String::fromUTF8 (buffer, (int) numBytes)); - - return defaultFile; - } -} - -File File::getLinkedTarget() const -{ - return juce_readlink (getFullPathName().toUTF8(), *this); -} - -//============================================================================== -File File::getSpecialLocation (const SpecialLocationType type) -{ - switch (type) - { - case userHomeDirectory: - case userDocumentsDirectory: - case userMusicDirectory: - case userMoviesDirectory: - case userApplicationDataDirectory: - case userDesktopDirectory: - return File (android.appDataDir); - - case commonApplicationDataDirectory: - return File (android.appDataDir); - - case globalApplicationsDirectory: - return File ("/system/app"); - - case tempDirectory: - //return File (AndroidStatsHelpers::getSystemProperty ("java.io.tmpdir")); - return File (android.appDataDir).getChildFile (".temp"); - - case invokedExecutableFile: - case currentExecutableFile: - case currentApplicationFile: - case hostApplicationPath: - return juce_getExecutableFile(); - - default: - jassertfalse; // unknown type? - break; - } - - return File::nonexistent; -} - -//============================================================================== -String File::getVersion() const -{ - return String::empty; -} - -//============================================================================== -bool File::moveToTrash() const -{ - if (! exists()) - return true; - - // TODO - - return false; -} - -//============================================================================== -class DirectoryIterator::NativeIterator::Pimpl -{ -public: - Pimpl (const File& directory, const String& wildCard_) - : parentDir (File::addTrailingSeparator (directory.getFullPathName())), - wildCard (wildCard_), - dir (opendir (directory.getFullPathName().toUTF8())) - { - } - - ~Pimpl() - { - if (dir != 0) - 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 != 0) - { - 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 != 0) - *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* 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 Process::openDocument (const String& fileName, const String& parameters) -{ - const LocalRef t (javaString (fileName)); - android.activity.callVoidMethod (JuceAppActivity.launchURL, t.get()); -} - -void File::revealToUser() const -{ -} diff --git a/src/juce/JuceLibraryCode/modules/juce_core/native/juce_android_JNIHelpers.h b/src/juce/JuceLibraryCode/modules/juce_core/native/juce_android_JNIHelpers.h deleted file mode 100644 index 4f9bd7b7..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/native/juce_android_JNIHelpers.h +++ /dev/null @@ -1,402 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_ANDROID_JNIHELPERS_JUCEHEADER__ -#define __JUCE_ANDROID_JNIHELPERS_JUCEHEADER__ - -#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 obj_) : obj (retain (obj_)) {} - 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 obj_) noexcept : obj (obj_) {} - 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; -}; - -extern AndroidSystem android; - -//============================================================================== -class ThreadLocalJNIEnvHolder -{ -public: - ThreadLocalJNIEnvHolder() - : 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() - { - JNIEnv* env = nullptr; - jvm->AttachCurrentThread (&env, nullptr); - - if (env != nullptr) - addEnv (env); - - return env; - } - - void detach() - { - 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 - { - JNIEnv* env = get(); - - if (env == nullptr) - env = attach(); - - jassert (env != nullptr); - return env; - } - - 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; - } - - enum { maxThreads = 32 }; - -private: - JavaVM* jvm; - pthread_t threads [maxThreads]; - JNIEnv* envs [maxThreads]; - SpinLock addRemoveLock; - - void addEnv (JNIEnv* env) - { - SpinLock::ScopedLockType sl (addRemoveLock); - - if (get() == nullptr) - { - const pthread_t thisThread = pthread_self(); - - for (int i = 0; i < maxThreads; ++i) - { - if (threads[i] == 0) - { - envs[i] = env; - threads[i] = thisThread; - return; - } - } - } - - jassertfalse; // too many threads! - } -}; - -extern ThreadLocalJNIEnvHolder threadLocalJNIEnvHolder; - -//============================================================================== -#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \ - METHOD (createNewView, "createNewView", "(Z)L" JUCE_ANDROID_ACTIVITY_CLASSPATH "$ComponentPeerView;") \ - METHOD (deleteView, "deleteView", "(L" JUCE_ANDROID_ACTIVITY_CLASSPATH "$ComponentPeerView;)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;ILjava/lang/StringBuffer;)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") \ - -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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/native/juce_android_Misc.cpp b/src/juce/JuceLibraryCode/modules/juce_core/native/juce_android_Misc.cpp deleted file mode 100644 index 36c1685b..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/native/juce_android_Misc.cpp +++ /dev/null @@ -1,29 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -void Logger::outputDebugString (const String& text) -{ - __android_log_print (ANDROID_LOG_INFO, "JUCE", text.toUTF8()); -} diff --git a/src/juce/JuceLibraryCode/modules/juce_core/native/juce_android_Network.cpp b/src/juce/JuceLibraryCode/modules/juce_core/native/juce_android_Network.cpp deleted file mode 100644 index 415e7351..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/native/juce_android_Network.cpp +++ /dev/null @@ -1,173 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -//============================================================================== -#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 -} - - -bool 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) - { - 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)); - - stream = GlobalRef (env->CallStaticObjectMethod (JuceAppActivity, - JuceAppActivity.createHTTPStream, - javaString (address).get(), - (jboolean) isPost, - postDataArray, - javaString (headers).get(), - (jint) timeOutMs, - responseHeaderBuffer.get())); - - 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 isExhausted() { return stream != nullptr && stream.callBooleanMethod (HTTPStream.isExhausted); } - int64 getTotalLength() { return stream != nullptr ? stream.callLongMethod (HTTPStream.getTotalLength) : 0; } - int64 getPosition() { return stream != nullptr ? stream.callLongMethod (HTTPStream.getPosition) : 0; } - bool setPosition (int64 wantedPos) { return stream != nullptr && stream.callBooleanMethod (HTTPStream.setPosition, (jlong) wantedPos); } - - int read (void* buffer, int bytesToRead) - { - 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; - -private: - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (WebInputStream); -}; - -InputStream* URL::createNativeStream (const String& address, bool isPost, const MemoryBlock& postData, - OpenStreamProgressCallback* progressCallback, void* progressCallbackContext, - const String& headers, const int timeOutMs, StringPairArray* responseHeaders) -{ - ScopedPointer wi (new WebInputStream (address, isPost, postData, - progressCallback, progressCallbackContext, - headers, timeOutMs, responseHeaders)); - - return wi->stream != 0 ? wi.release() : nullptr; -} diff --git a/src/juce/JuceLibraryCode/modules/juce_core/native/juce_android_SystemStats.cpp b/src/juce/JuceLibraryCode/modules/juce_core/native/juce_android_SystemStats.cpp deleted file mode 100644 index b64064a5..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/native/juce_android_SystemStats.cpp +++ /dev/null @@ -1,296 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -JNIClassBase::JNIClassBase (const char* classPath_) - : classPath (classPath_), classRef (0) -{ - getClasses().add (this); -} - -JNIClassBase::~JNIClassBase() -{ - getClasses().removeValue (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; - exit (0); - } - #endif - - return threadLocalJNIEnvHolder.getOrAttach(); -} - -extern "C" jint JNI_OnLoad (JavaVM*, void*) -{ - return JNI_VERSION_1_2; -} - -//============================================================================== -AndroidSystem::AndroidSystem() : screenWidth (0), screenHeight (0) -{ -} - -void AndroidSystem::initialise (JNIEnv* env, jobject activity_, - jstring appFile_, jstring appDataDir_) -{ - screenWidth = screenHeight = 0; - JNIClassBase::initialiseAllClasses (env); - - threadLocalJNIEnvHolder.initialise (env); - #if JUCE_DEBUG - systemInitialised = true; - #endif - - activity = GlobalRef (activity_); - appFile = juceString (env, appFile_); - appDataDir = juceString (env, appDataDir_); -} - -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()))); - } -} - -//============================================================================== -SystemStats::OperatingSystemType SystemStats::getOperatingSystemType() -{ - return Android; -} - -String SystemStats::getOperatingSystemName() -{ - return "Android " + AndroidStatsHelpers::getSystemProperty ("os.version"); -} - -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() -{ - const char* user = getenv ("USER"); - - if (user == 0) - { - struct passwd* const pw = getpwuid (getuid()); - if (pw != 0) - user = pw->pw_name; - } - - return CharPointer_UTF8 (user); -} - -String SystemStats::getFullUserName() -{ - return getLogonName(); -} - -String SystemStats::getComputerName() -{ - char name [256] = { 0 }; - if (gethostname (name, sizeof (name) - 1) == 0) - return name; - - return String::empty; -} - -//============================================================================== -SystemStats::CPUFlags::CPUFlags() -{ - // TODO - hasMMX = false; - hasSSE = false; - hasSSE2 = false; - has3DNow = false; - - numCpus = jmax (1, 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/src/juce/JuceLibraryCode/modules/juce_core/native/juce_android_Threads.cpp b/src/juce/JuceLibraryCode/modules/juce_core/native/juce_android_Threads.cpp deleted file mode 100644 index f8d9e74c..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/native/juce_android_Threads.cpp +++ /dev/null @@ -1,79 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -/* - 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 -void 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); -} - -void Process::terminate() -{ - // TODO - exit (0); -} - -JUCE_API bool JUCE_CALLTYPE juce_isRunningUnderDebugger() -{ - return false; -} - -JUCE_API bool JUCE_CALLTYPE Process::isRunningUnderDebugger() -{ - return juce_isRunningUnderDebugger(); -} - -void Process::raisePrivilege() {} -void Process::lowerPrivilege() {} diff --git a/src/juce/JuceLibraryCode/modules/juce_core/native/juce_linux_Files.cpp b/src/juce/JuceLibraryCode/modules/juce_core/native/juce_linux_Files.cpp deleted file mode 100644 index 37cb07cb..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/native/juce_linux_Files.cpp +++ /dev/null @@ -1,345 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -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::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::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: - // Assume anything else is a hard-disk (but note it could - // be a RAM disk. There isn't a good way of determining - // this for sure) - return true; - } - } - - // Assume so if this fails for some reason - return true; -} - -bool File::isOnRemovableDrive() const -{ - jassertfalse; // xxx not implemented for linux! - return false; -} - -bool File::isHidden() const -{ - return getFileName().startsWithChar ('.'); -} - -//============================================================================== -namespace -{ - File juce_readlink (const String& file, const File& defaultFile) - { - const int size = 8192; - HeapBlock buffer; - buffer.malloc (size + 4); - - const size_t numBytes = readlink (file.toUTF8(), buffer, size); - - if (numBytes > 0 && numBytes <= size) - return File (file).getSiblingFile (String::fromUTF8 (buffer, (int) numBytes)); - - return defaultFile; - } -} - -File File::getLinkedTarget() const -{ - return juce_readlink (getFullPathName().toUTF8(), *this); -} - -//============================================================================== -const char* juce_Argv0 = nullptr; // referenced from juce_Application.cpp - -File File::getSpecialLocation (const SpecialLocationType type) -{ - switch (type) - { - case userHomeDirectory: - { - const char* homeDir = getenv ("HOME"); - - if (homeDir == nullptr) - { - struct passwd* const pw = getpwuid (getuid()); - if (pw != nullptr) - homeDir = pw->pw_dir; - } - - return File (CharPointer_UTF8 (homeDir)); - } - - case userDocumentsDirectory: - case userMusicDirectory: - case userMoviesDirectory: - case userApplicationDataDirectory: - return File ("~"); - - case userDesktopDirectory: - return File ("~/Desktop"); - - 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_Argv0 != nullptr) - return File (CharPointer_UTF8 (juce_Argv0)); - // deliberate fall-through... - - case currentExecutableFile: - case currentApplicationFile: - return juce_getExecutableFile(); - - case hostApplicationPath: - return juce_readlink ("/proc/self/exe", juce_getExecutableFile()); - - default: - jassertfalse; // unknown type? - break; - } - - return File::nonexistent; -} - -//============================================================================== -String File::getVersion() const -{ - return String::empty; // xxx not yet implemented -} - -//============================================================================== -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())); -} - -//============================================================================== -class DirectoryIterator::NativeIterator::Pimpl -{ -public: - Pimpl (const File& directory, const String& wildCard_) - : parentDir (File::addTrailingSeparator (directory.getFullPathName())), - wildCard (wildCard_), - 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* 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 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)) - { - // create a command that tries to launch a bunch of likely browsers - const char* const browserNames[] = { "xdg-open", "/etc/alternatives/x-www-browser", "firefox", "mozilla", "konqueror", "opera" }; - - 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/src/juce/JuceLibraryCode/modules/juce_core/native/juce_linux_Network.cpp b/src/juce/JuceLibraryCode/modules/juce_core/native/juce_linux_Network.cpp deleted file mode 100644 index 2e9aa416..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/native/juce_linux_Network.cpp +++ /dev/null @@ -1,458 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -void MACAddress::findAllAddresses (Array& result) -{ - const int s = socket (AF_INET, SOCK_DGRAM, 0); - if (s != -1) - { - char buf [1024]; - struct ifconf ifc; - ifc.ifc_len = sizeof (buf); - ifc.ifc_buf = buf; - ioctl (s, SIOCGIFCONF, &ifc); - - for (unsigned int i = 0; i < ifc.ifc_len / sizeof (struct ifreq); ++i) - { - struct ifreq ifr; - strcpy (ifr.ifr_name, ifc.ifc_req[i].ifr_name); - - if (ioctl (s, SIOCGIFFLAGS, &ifr) == 0 - && (ifr.ifr_flags & IFF_LOOPBACK) == 0 - && ioctl (s, SIOCGIFHWADDR, &ifr) == 0) - { - result.addIfNotAlreadyThere (MACAddress ((const uint8*) ifr.ifr_hwaddr.sa_data)); - } - } - - close (s); - } -} - - -bool 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) - : socketHandle (-1), levelsOfRedirection (0), - address (address_), headers (headers_), postData (postData_), position (0), - finished (false), isPost (isPost_), timeOutMs (timeOutMs_) - { - createConnection (progressCallback, progressCallbackContext); - - 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() { return finished; } - int64 getPosition() { return position; } - - int64 getTotalLength() - { - //xxx to do - return -1; - } - - int read (void* buffer, int bytesToRead) - { - 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) - { - if (isError()) - return false; - - if (wantedPos != position) - { - finished = false; - - if (wantedPos < position) - { - closeSocket(); - position = 0; - createConnection (0, 0); - } - - skipNextBytes (wantedPos - position); - } - - return true; - } - - //============================================================================== -private: - int socketHandle, levelsOfRedirection; - StringArray headerLines; - String address, headers; - MemoryBlock postData; - int64 position; - bool finished; - const bool isPost; - const int timeOutMs; - - void closeSocket() - { - if (socketHandle >= 0) - close (socketHandle); - - socketHandle = -1; - levelsOfRedirection = 0; - } - - void createConnection (URL::OpenStreamProgressCallback* progressCallback, void* progressCallbackContext) - { - closeSocket(); - - uint32 timeOutTime = Time::getMillisecondCounter(); - - if (timeOutMs == 0) - timeOutTime += 60000; - else if (timeOutMs < 0) - timeOutTime = 0xffffffff; - else - timeOutTime += timeOutMs; - - String hostName, hostPath; - int hostPort; - if (! decomposeURL (address, hostName, hostPath, hostPort)) - return; - - 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; - - serverName = proxyName; - port = proxyPort; - } - else - { - serverName = hostName; - port = hostPort; - } - - struct addrinfo hints = { 0 }; - 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; - - socketHandle = socket (result->ai_family, result->ai_socktype, 0); - - if (socketHandle == -1) - { - freeaddrinfo (result); - return; - } - - 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; - } - - freeaddrinfo (result); - - { - const MemoryBlock requestHeader (createRequestHeader (hostName, hostPort, proxyName, proxyPort, - hostPath, address, headers, postData, isPost)); - - if (! sendHeader (socketHandle, requestHeader, timeOutTime, progressCallback, progressCallbackContext)) - { - closeSocket(); - return; - } - } - - String responseHeader (readResponse (socketHandle, timeOutTime)); - - if (responseHeader.isNotEmpty()) - { - headerLines.clear(); - headerLines.addLines (responseHeader); - - const int statusCode = responseHeader.fromFirstOccurrenceOf (" ", false, false) - .substring (0, 3).getIntValue(); - - //int contentLength = findHeaderItem (lines, "Content-Length:").getIntValue(); - //bool isChunked = findHeaderItem (lines, "Transfer-Encoding:").equalsIgnoreCase ("chunked"); - - String location (findHeaderItem (headerLines, "Location:")); - - if (statusCode >= 300 && statusCode < 400 && location.isNotEmpty()) - { - if (! location.startsWithIgnoreCase ("http://")) - location = "http://" + location; - - if (++levelsOfRedirection <= 3) - { - address = location; - createConnection (progressCallback, progressCallbackContext); - return; - } - } - else - { - levelsOfRedirection = 0; - return; - } - } - - closeSocket(); - } - - //============================================================================== - static String readResponse (const int socketHandle, const uint32 timeOutTime) - { - int bytesRead = 0, numConsecutiveLFs = 0; - MemoryBlock buffer (1024, true); - - while (numConsecutiveLFs < 2 && bytesRead < 32768 - && Time::getMillisecondCounter() <= timeOutTime) - { - fd_set readbits; - FD_ZERO (&readbits); - FD_SET (socketHandle, &readbits); - - struct timeval tv; - tv.tv_sec = jmax (1, (int) (timeOutTime - Time::getMillisecondCounter()) / 1000); - tv.tv_usec = 0; - - if (select (socketHandle + 1, &readbits, 0, 0, &tv) <= 0) - return String::empty; // (timeout) - - buffer.ensureSize (bytesRead + 8, true); - char* const dest = (char*) buffer.getData() + bytesRead; - - if (recv (socketHandle, dest, 1, 0) == -1) - return String::empty; - - const char lastByte = *dest; - ++bytesRead; - - if (lastByte == '\n') - ++numConsecutiveLFs; - else if (lastByte != '\r') - numConsecutiveLFs = 0; - } - - const String header (CharPointer_UTF8 ((const char*) buffer.getData())); - - if (header.startsWithIgnoreCase ("HTTP/")) - return header.trimEnd(); - - return String::empty; - } - - 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, const int port) - { - dest << (isPost ? "POST " : "GET ") << path << " HTTP/1.0\r\nHost: " << host; - - if (port > 0) - dest << ':' << port; - } - - 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 << "\r\n" << userHeaders - << "\r\n" << postData; - - 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::empty; - } - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (WebInputStream); -}; - -InputStream* URL::createNativeStream (const String& address, bool isPost, const MemoryBlock& postData, - OpenStreamProgressCallback* progressCallback, void* progressCallbackContext, - const String& headers, const int timeOutMs, StringPairArray* responseHeaders) -{ - ScopedPointer wi (new WebInputStream (address, isPost, postData, - progressCallback, progressCallbackContext, - headers, timeOutMs, responseHeaders)); - - return wi->isError() ? nullptr : wi.release(); -} diff --git a/src/juce/JuceLibraryCode/modules/juce_core/native/juce_linux_SystemStats.cpp b/src/juce/JuceLibraryCode/modules/juce_core/native/juce_linux_SystemStats.cpp deleted file mode 100644 index c70b127c..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/native/juce_linux_SystemStats.cpp +++ /dev/null @@ -1,168 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -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].startsWithIgnoreCase (key)) - return lines[i].fromFirstOccurrenceOf (":", false, false).trim(); - - return String::empty; - } -} - -String SystemStats::getCpuVendor() -{ - return LinuxStatsHelpers::getCpuInfo ("vendor_id"); -} - -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() -{ - const char* user = getenv ("USER"); - - if (user == nullptr) - { - struct passwd* const pw = getpwuid (getuid()); - if (pw != nullptr) - user = pw->pw_name; - } - - return CharPointer_UTF8 (user); -} - -String SystemStats::getFullUserName() -{ - return getLogonName(); -} - -String SystemStats::getComputerName() -{ - char name [256] = { 0 }; - if (gethostname (name, sizeof (name) - 1) == 0) - return name; - - return String::empty; -} - -//============================================================================== -SystemStats::CPUFlags::CPUFlags() -{ - const String flags (LinuxStatsHelpers::getCpuInfo ("flags")); - hasMMX = flags.contains ("mmx"); - hasSSE = flags.contains ("sse"); - hasSSE2 = flags.contains ("sse2"); - 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/src/juce/JuceLibraryCode/modules/juce_core/native/juce_linux_Threads.cpp b/src/juce/JuceLibraryCode/modules/juce_core/native/juce_linux_Threads.cpp deleted file mode 100644 index 6e999b27..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/native/juce_linux_Threads.cpp +++ /dev/null @@ -1,98 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -/* - Note that a lot of methods that you'd expect to find in this file actually - live in juce_posix_SharedCode.h! -*/ - -//============================================================================== -void 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); -} - -void Process::terminate() -{ - exit (0); -} - -JUCE_API bool JUCE_CALLTYPE juce_isRunningUnderDebugger() -{ - 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; -} - -JUCE_API bool JUCE_CALLTYPE Process::isRunningUnderDebugger() -{ - return juce_isRunningUnderDebugger(); -} - -void Process::raisePrivilege() -{ - // If running suid root, change effective user to root - if (geteuid() != 0 && getuid() == 0) - { - setreuid (geteuid(), getuid()); - setregid (getegid(), getgid()); - } -} - -void Process::lowerPrivilege() -{ - // If runing suid root, change effective user back to real user - if (geteuid() == 0 && getuid() != 0) - { - setreuid (geteuid(), getuid()); - setregid (getegid(), getgid()); - } -} diff --git a/src/juce/JuceLibraryCode/modules/juce_core/native/juce_mac_Files.mm b/src/juce/JuceLibraryCode/modules/juce_core/native/juce_mac_Files.mm deleted file mode 100644 index 2fbb6030..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/native/juce_mac_Files.mm +++ /dev/null @@ -1,475 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -/* - 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.toUTF8().getAddress(), kFSPathMakeRefDoNotFollowLeafSymlink, &ref, 0) == noErr - && LSCopyItemInfoForRef (&ref, kLSRequestBasicFlagsOnly, &info) == noErr - && (info.flags & kLSItemInfoIsInvisible) != 0; - #endif - } - - #if JUCE_IOS - 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 -{ - const char* const cdTypes[] = { "cd9660", "cdfs", "cddafs", "udf", 0 }; - - return FileHelpers::isFileOnDriveType (*this, cdTypes); -} - -bool File::isOnHardDisk() const -{ - const char* const nonHDTypes[] = { "nfs", "smbfs", "ramfs", 0 }; - - 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* juce_Argv0 = nullptr; // referenced from juce_Application.cpp - -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 tmp.getFullPathName(); - } - #endif - case userMusicDirectory: resultPath = "~/Music"; break; - case userMoviesDirectory: resultPath = "~/Movies"; break; - case userApplicationDataDirectory: resultPath = "~/Library"; break; - case commonApplicationDataDirectory: resultPath = "/Library"; break; - case globalApplicationsDirectory: resultPath = "/Applications"; break; - - case invokedExecutableFile: - if (juce_Argv0 != 0) - return File (CharPointer_UTF8 (juce_Argv0)); - // 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 String::fromUTF8 (buffer, size); - } - - default: - jassertfalse; // unknown type? - break; - } - - if (resultPath.isNotEmpty()) - return File (resultPath.convertToPrecomposedUnicode()); - - return File::nonexistent; -} - -//============================================================================== -String File::getVersion() const -{ - JUCE_AUTORELEASEPOOL - String result; - - NSBundle* bundle = [NSBundle bundleWithPath: juceStringToNS (getFullPathName())]; - - if (bundle != nil) - { - NSDictionary* info = [bundle infoDictionary]; - - if (info != nil) - { - NSString* name = [info valueForKey: nsStringLiteral ("CFBundleShortVersionString")]; - - if (name != nil) - result = nsStringToJuce (name); - } - } - - return result; -} - -//============================================================================== -File File::getLinkedTarget() const -{ - #if JUCE_IOS || (defined (MAC_OS_X_VERSION_10_5) && MAC_OS_X_VERSION_MIN_ALLOWED >= MAC_OS_X_VERSION_10_5) - NSString* dest = [[NSFileManager defaultManager] destinationOfSymbolicLinkAtPath: juceStringToNS (getFullPathName()) error: nil]; - - #else - // (the cast here avoids a deprecation warning) - NSString* dest = [((id) [NSFileManager defaultManager]) pathContentOfSymbolicLinkAtPath: juceStringToNS (getFullPathName())]; - #endif - - if (dest != nil) - return File (nsStringToJuce (dest)); - - return *this; -} - -//============================================================================== -bool File::moveToTrash() const -{ - if (! exists()) - return true; - - #if JUCE_IOS - return deleteFile(); //xxx is there a trashcan on the iPhone? - #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); - - if (wildcardUTF8 == nullptr) - wildcardUTF8 = wildCard.toUTF8(); - - if (fnmatch (wildcardUTF8, filenameFound.toUTF8(), FNM_CASEFOLD) != 0) - continue; - - const String path (parentDir + filenameFound); - updateStatInfoForFile (path, isDir, fileSize, modTime, creationTime, isReadOnly); - - if (isHidden != nullptr) - *isHidden = FileHelpers::isHiddenFile (path); - - 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 Process::openDocument (const String& fileName, const String& parameters) -{ - #if JUCE_IOS - return [[UIApplication sharedApplication] openURL: [NSURL URLWithString: juceStringToNS (fileName)]]; - #else - JUCE_AUTORELEASEPOOL - - if (parameters.isEmpty()) - { - return [[NSWorkspace sharedWorkspace] openFile: juceStringToNS (fileName)] - || [[NSWorkspace sharedWorkspace] openURL: [NSURL URLWithString: juceStringToNS (fileName)]]; - } - - bool ok = false; - const File file (fileName); - - if (file.isBundle()) - { - NSMutableArray* urls = [NSMutableArray array]; - - StringArray docs; - docs.addTokens (parameters, true); - for (int i = 0; i < docs.size(); ++i) - [urls addObject: juceStringToNS (docs[i])]; - - ok = [[NSWorkspace sharedWorkspace] openURLs: urls - withAppBundleIdentifier: [[NSBundle bundleWithPath: juceStringToNS (fileName)] bundleIdentifier] - options: 0 - additionalEventParamDescriptor: nil - launchIdentifiers: nil]; - } - else if (file.exists()) - { - ok = FileHelpers::launchExecutable ("\"" + fileName + "\" " + parameters); - } - - return ok; - #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_ALLOWED >= 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/src/juce/JuceLibraryCode/modules/juce_core/native/juce_mac_Network.mm b/src/juce/JuceLibraryCode/modules/juce_core/native/juce_mac_Network.mm deleted file mode 100644 index fb8a1f00..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/native/juce_mac_Network.mm +++ /dev/null @@ -1,473 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -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 - #define IFT_ETHER 6 - #endif - - if (sadd->sdl_type == IFT_ETHER) - result.addIfNotAlreadyThere (MACAddress (((const uint8*) sadd->sdl_data) + sadd->sdl_nlen)); - } - } - - freeifaddrs (addrs); - } -} - -//============================================================================== -bool Process::openEmailWithAttachments (const String& targetEmailAddress, - const String& emailSubject, - const String& bodyText, - const StringArray& filesToAttach) -{ - #if JUCE_IOS - //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 -} - -//============================================================================== -} // (juce namespace) - -using namespace juce; - -//============================================================================== -#define JuceURLConnection MakeObjCClassName(JuceURLConnection) - -@interface JuceURLConnection : NSObject -{ -@public - NSURLRequest* request; - NSURLConnection* connection; - NSMutableData* data; - Thread* runLoopThread; - bool initialised, hasFailed, hasFinished; - int position; - int64 contentLength; - NSDictionary* headers; - NSLock* dataLock; -} - -- (JuceURLConnection*) initWithRequest: (NSURLRequest*) req withCallback: (URL::OpenStreamProgressCallback*) callback withContext: (void*) context; -- (void) dealloc; -- (void) connection: (NSURLConnection*) connection didReceiveResponse: (NSURLResponse*) response; -- (void) connection: (NSURLConnection*) connection didFailWithError: (NSError*) error; -- (void) connection: (NSURLConnection*) connection didReceiveData: (NSData*) data; -- (void) connectionDidFinishLoading: (NSURLConnection*) connection; - -- (BOOL) isOpen; -- (int) read: (char*) dest numBytes: (int) num; -- (int) readPosition; -- (void) stop; -- (void) createConnection; - -@end - -class JuceURLConnectionMessageThread : public Thread -{ -public: - JuceURLConnectionMessageThread (JuceURLConnection* owner_) - : Thread ("http connection"), - owner (owner_) - { - } - - ~JuceURLConnectionMessageThread() - { - stopThread (10000); - } - - void run() - { - [owner createConnection]; - - while (! threadShouldExit()) - { - JUCE_AUTORELEASEPOOL - [[NSRunLoop currentRunLoop] runUntilDate: [NSDate dateWithTimeIntervalSinceNow: 0.01]]; - } - } - -private: - JuceURLConnection* owner; -}; - - -@implementation JuceURLConnection - -- (JuceURLConnection*) initWithRequest: (NSURLRequest*) req - withCallback: (URL::OpenStreamProgressCallback*) callback - withContext: (void*) context; -{ - [super init]; - request = req; - [request retain]; - data = [[NSMutableData data] retain]; - dataLock = [[NSLock alloc] init]; - connection = nil; - initialised = false; - hasFailed = false; - hasFinished = false; - contentLength = -1; - headers = nil; - - runLoopThread = new JuceURLConnectionMessageThread (self); - runLoopThread->startThread(); - - while (runLoopThread->isThreadRunning() && ! initialised) - { - if (callback != nullptr) - callback (context, -1, (int) [[request HTTPBody] length]); - - Thread::sleep (1); - } - - return self; -} - -- (void) dealloc -{ - [self stop]; - - deleteAndZero (runLoopThread); - [connection release]; - [data release]; - [dataLock release]; - [request release]; - [headers release]; - [super dealloc]; -} - -- (void) createConnection -{ - NSUInteger oldRetainCount = [self retainCount]; - connection = [[NSURLConnection alloc] initWithRequest: request - delegate: self]; - - if (oldRetainCount == [self retainCount]) - [self retain]; // newer SDK should already retain this, but there were problems in older versions.. - - if (connection == nil) - runLoopThread->signalThreadShouldExit(); -} - -- (void) connection: (NSURLConnection*) conn didReceiveResponse: (NSURLResponse*) response -{ - (void) conn; - [dataLock lock]; - [data setLength: 0]; - [dataLock unlock]; - initialised = true; - contentLength = [response expectedContentLength]; - - [headers release]; - headers = nil; - - if ([response isKindOfClass: [NSHTTPURLResponse class]]) - headers = [[((NSHTTPURLResponse*) response) allHeaderFields] retain]; -} - -- (void) connection: (NSURLConnection*) conn didFailWithError: (NSError*) error -{ - (void) conn; - DBG (nsStringToJuce ([error description])); - hasFailed = true; - initialised = true; - - if (runLoopThread != nullptr) - runLoopThread->signalThreadShouldExit(); -} - -- (void) connection: (NSURLConnection*) conn didReceiveData: (NSData*) newData -{ - (void) conn; - [dataLock lock]; - [data appendData: newData]; - [dataLock unlock]; - initialised = true; -} - -- (void) connectionDidFinishLoading: (NSURLConnection*) conn -{ - (void) conn; - hasFinished = true; - initialised = true; - - if (runLoopThread != nullptr) - runLoopThread->signalThreadShouldExit(); -} - -- (BOOL) isOpen -{ - return connection != nil && ! hasFailed; -} - -- (int) readPosition -{ - return position; -} - -- (int) read: (char*) dest numBytes: (int) numNeeded -{ - int numDone = 0; - - while (numNeeded > 0) - { - int available = jmin (numNeeded, (int) [data length]); - - if (available > 0) - { - [dataLock lock]; - [data getBytes: dest length: available]; - [data replaceBytesInRange: NSMakeRange (0, available) withBytes: nil length: 0]; - [dataLock unlock]; - - numDone += available; - numNeeded -= available; - dest += available; - } - else - { - if (hasFailed || hasFinished) - break; - - Thread::sleep (1); - } - } - - position += numDone; - return numDone; -} - -- (void) stop -{ - [connection cancel]; - - if (runLoopThread != nullptr) - runLoopThread->stopThread (10000); -} - -@end - -namespace juce -{ - -//============================================================================== -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) - : connection (nil), - address (address_), headers (headers_), postData (postData_), position (0), - finished (false), isPost (isPost_), timeOutMs (timeOutMs_) - { - JUCE_AUTORELEASEPOOL - connection = createConnection (progressCallback, progressCallbackContext); - - if (responseHeaders != nullptr && connection != nil && connection->headers != nil) - { - NSEnumerator* enumerator = [connection->headers keyEnumerator]; - NSString* key; - - while ((key = [enumerator nextObject]) != nil) - responseHeaders->set (nsStringToJuce (key), - nsStringToJuce ((NSString*) [connection->headers objectForKey: key])); - } - } - - ~WebInputStream() - { - close(); - } - - //============================================================================== - bool isError() const { return connection == nil; } - int64 getTotalLength() { return connection == nil ? -1 : connection->contentLength; } - bool isExhausted() { return finished; } - int64 getPosition() { return position; } - - int read (void* buffer, int bytesToRead) - { - jassert (buffer != nullptr && bytesToRead >= 0); - - if (finished || isError()) - { - return 0; - } - else - { - JUCE_AUTORELEASEPOOL - const int bytesRead = [connection read: static_cast (buffer) numBytes: bytesToRead]; - position += bytesRead; - - if (bytesRead == 0) - finished = true; - - return bytesRead; - } - } - - bool setPosition (int64 wantedPos) - { - if (wantedPos != position) - { - finished = false; - - if (wantedPos < position) - { - close(); - position = 0; - connection = createConnection (0, 0); - } - - skipNextBytes (wantedPos - position); - } - - return true; - } - - //============================================================================== -private: - JuceURLConnection* connection; - String address, headers; - MemoryBlock postData; - int64 position; - bool finished; - const bool isPost; - const int timeOutMs; - - void close() - { - [connection stop]; - [connection release]; - connection = nil; - } - - JuceURLConnection* createConnection (URL::OpenStreamProgressCallback* progressCallback, - void* progressCallbackContext) - { - NSMutableURLRequest* req = [NSMutableURLRequest requestWithURL: [NSURL URLWithString: juceStringToNS (address)] - cachePolicy: NSURLRequestReloadIgnoringLocalCacheData - timeoutInterval: timeOutMs <= 0 ? 60.0 : (timeOutMs / 1000.0)]; - - if (req == nil) - return 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()]]; - - JuceURLConnection* const s = [[JuceURLConnection alloc] initWithRequest: req - withCallback: progressCallback - withContext: progressCallbackContext]; - - if ([s isOpen]) - return s; - - [s release]; - return nil; - } - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (WebInputStream); -}; - -InputStream* URL::createNativeStream (const String& address, bool isPost, const MemoryBlock& postData, - OpenStreamProgressCallback* progressCallback, void* progressCallbackContext, - const String& headers, const int timeOutMs, StringPairArray* responseHeaders) -{ - ScopedPointer wi (new WebInputStream (address, isPost, postData, - progressCallback, progressCallbackContext, - headers, timeOutMs, responseHeaders)); - - return wi->isError() ? nullptr : wi.release(); -} diff --git a/src/juce/JuceLibraryCode/modules/juce_core/native/juce_mac_ObjCSuffix.h b/src/juce/JuceLibraryCode/modules/juce_core/native/juce_mac_ObjCSuffix.h deleted file mode 100644 index 835825ef..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/native/juce_mac_ObjCSuffix.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_MAC_OBJCSUFFIX_JUCEHEADER__ -#define __JUCE_MAC_OBJCSUFFIX_JUCEHEADER__ - -/** This suffix is used for naming all Obj-C classes that are used inside juce. - - Because of the flat naming structure used by Obj-C, you can get horrible situations where - two DLLs are loaded into a host, each of which uses classes with the same names, and these get - cross-linked so that when you make a call to a class that you thought was private, it ends up - actually calling into a similarly named class in the other module's address space. - - By changing this macro to a unique value, you ensure that all the obj-C classes in your app - have unique names, and should avoid this problem. - - If you're using the amalgamated version, you can just set this macro to something unique before - you include juce_amalgamated.cpp. -*/ -#ifndef JUCE_ObjCExtraSuffix - #define JUCE_ObjCExtraSuffix 3 -#endif - -#ifndef DOXYGEN - #define appendMacro1(a, b, c, d, e) a ## _ ## b ## _ ## c ## _ ## d ## _ ## e - #define appendMacro2(a, b, c, d, e) appendMacro1(a, b, c, d, e) - #define MakeObjCClassName(rootName) appendMacro2 (rootName, JUCE_MAJOR_VERSION, JUCE_MINOR_VERSION, JUCE_BUILDNUMBER, JUCE_ObjCExtraSuffix) -#endif - -#endif // __JUCE_MAC_OBJCSUFFIX_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/native/juce_mac_Strings.mm b/src/juce/JuceLibraryCode/modules/juce_core/native/juce_mac_Strings.mm deleted file mode 100644 index bd025065..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/native/juce_mac_Strings.mm +++ /dev/null @@ -1,91 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -String String::fromCFString (CFStringRef cfString) -{ - if (cfString == 0) - return String::empty; - - CFRange range = { 0, CFStringGetLength (cfString) }; - HeapBlock u (range.length + 1); - CFStringGetCharacters (cfString, range, u); - u[range.length] = 0; - - return String (CharPointer_UTF16 ((const CharPointer_UTF16::CharType*) u.getData())); -} - -CFStringRef String::toCFString() const -{ - CharPointer_UTF16 utf16 (toUTF16()); - return CFStringCreateWithCharacters (kCFAllocatorDefault, (const UniChar*) utf16.getAddress(), utf16.length()); -} - -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 int 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/src/juce/JuceLibraryCode/modules/juce_core/native/juce_mac_SystemStats.mm b/src/juce/JuceLibraryCode/modules/juce_core/native/juce_mac_SystemStats.mm deleted file mode 100644 index d0f4143a..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/native/juce_mac_SystemStats.mm +++ /dev/null @@ -1,263 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -ScopedAutoReleasePool::ScopedAutoReleasePool() -{ - pool = [[NSAutoreleasePool alloc] init]; -} - -ScopedAutoReleasePool::~ScopedAutoReleasePool() -{ - [((NSAutoreleasePool*) pool) release]; -} - -//============================================================================== -void Logger::outputDebugString (const String& text) -{ - std::cerr << text << std::endl; -} - -//============================================================================== -namespace SystemStatsHelpers -{ - #if JUCE_INTEL - 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 -} - -//============================================================================== -SystemStats::CPUFlags::CPUFlags() -{ - #if JUCE_INTEL - uint32 familyModel = 0, extFeatures = 0, features = 0, dummy = 0; - SystemStatsHelpers::doCPUID (familyModel, extFeatures, dummy, features, 1); - - hasMMX = (features & (1 << 23)) != 0; - hasSSE = (features & (1 << 25)) != 0; - hasSSE2 = (features & (1 << 26)) != 0; - has3DNow = (extFeatures & (1 << 31)) != 0; - #else - hasMMX = false; - hasSSE = false; - hasSSE2 = false; - has3DNow = false; - #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 - -//============================================================================== -SystemStats::OperatingSystemType SystemStats::getOperatingSystemType() -{ - return MacOSX; -} - -String SystemStats::getOperatingSystemName() -{ - #if JUCE_IOS - return "iOS " + nsStringToJuce ([[UIDevice currentDevice] systemVersion]); - #else - SInt32 major, minor; - Gestalt (gestaltSystemVersionMajor, &major); - Gestalt (gestaltSystemVersionMinor, &minor); - - String s ("Mac OSX "); - s << (int) major << '.' << (int) minor; - return s; - #endif -} - -#if ! JUCE_IOS -int SystemStats::getOSXMinorVersionNumber() -{ - SInt32 versionMinor = 0; - OSErr err = Gestalt (gestaltSystemVersionMinor, &versionMinor); - (void) err; - jassert (err == noErr); - return (int) versionMinor; -} -#endif - -bool SystemStats::isOperatingSystem64Bit() -{ - #if JUCE_IOS - return false; - #elif JUCE_64BIT - return true; - #else - return getOSXMinorVersionNumber() >= 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 - 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::empty; - #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::empty; -} - -//============================================================================== -class HiResCounterHandler -{ -public: - HiResCounterHandler() - { - mach_timebase_info_data_t timebase; - (void) mach_timebase_info (&timebase); - - if (timebase.numer % 1000000 == 0) - { - numerator = timebase.numer / 1000000; - denominator = timebase.denom; - } - else - { - numerator = timebase.numer; - denominator = timebase.denom * (int64) 1000000; - } - - highResTimerFrequency = (timebase.denom * (int64) 1000000000) / timebase.numer; - highResTimerToMillisecRatio = numerator / (double) denominator; - } - - inline uint32 millisecondsSinceStartup() const noexcept - { - return (uint32) ((mach_absolute_time() * numerator) / denominator); - } - - inline double getMillisecondCounterHiRes() const noexcept - { - return mach_absolute_time() * highResTimerToMillisecRatio; - } - - int64 highResTimerFrequency; - -private: - int64 numerator, denominator; - double highResTimerToMillisecRatio; -}; - -static HiResCounterHandler hiResCounterHandler; - -uint32 juce_millisecondsSinceStartup() noexcept { return hiResCounterHandler.millisecondsSinceStartup(); } -double Time::getMillisecondCounterHiRes() noexcept { return hiResCounterHandler.getMillisecondCounterHiRes(); } -int64 Time::getHighResolutionTicksPerSecond() noexcept { return hiResCounterHandler.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/src/juce/JuceLibraryCode/modules/juce_core/native/juce_mac_Threads.mm b/src/juce/JuceLibraryCode/modules/juce_core/native/juce_mac_Threads.mm deleted file mode 100644 index a98e9951..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/native/juce_mac_Threads.mm +++ /dev/null @@ -1,81 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -/* - Note that a lot of methods that you'd expect to find in this file actually - live in juce_posix_SharedCode.h! -*/ - -//============================================================================== -bool Process::isForegroundProcess() -{ - #if JUCE_MAC - return [NSApp isActive]; - #else - return true; // xxx change this if more than one app is ever possible on the iPhone! - #endif -} - -void Process::raisePrivilege() -{ - jassertfalse; -} - -void Process::lowerPrivilege() -{ - jassertfalse; -} - -void Process::terminate() -{ - exit (0); -} - -void 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/src/juce/JuceLibraryCode/modules/juce_core/native/juce_osx_ObjCHelpers.h b/src/juce/JuceLibraryCode/modules/juce_core/native/juce_osx_ObjCHelpers.h deleted file mode 100644 index 89daf3cb..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/native/juce_osx_ObjCHelpers.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_OSX_OBJCHELPERS_JUCEHEADER__ -#define __JUCE_OSX_OBJCHELPERS_JUCEHEADER__ - - -/* 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 -{ - //============================================================================== - String nsStringToJuce (NSString* s) - { - return CharPointer_UTF8 ([s UTF8String]); - } - - NSString* juceStringToNS (const String& s) - { - return [NSString stringWithUTF8String: s.toUTF8()]; - } - - NSString* nsStringLiteral (const char* const s) noexcept - { - return [NSString stringWithUTF8String: s]; - } - - NSString* nsEmptyString() noexcept - { - return [NSString string]; - } -} - - -#endif // __JUCE_OSX_OBJCHELPERS_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/native/juce_posix_NamedPipe.cpp b/src/juce/JuceLibraryCode/modules/juce_core/native/juce_posix_NamedPipe.cpp deleted file mode 100644 index 603e0dcb..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/native/juce_posix_NamedPipe.cpp +++ /dev/null @@ -1,209 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -class NamedPipe::Pimpl -{ -public: - Pimpl (const String& pipePath, bool createPipe) - : pipeInName (pipePath + "_in"), - pipeOutName (pipePath + "_out"), - pipeIn (-1), pipeOut (-1), - createdPipe (createPipe), - blocked (false), stopReadOperation (false) - { - signal (SIGPIPE, signalHandler); - 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 bytesRead = -1; - blocked = true; - - if (pipeIn == -1) - { - pipeIn = ::open ((createdPipe ? pipeInName - : pipeOutName).toUTF8(), O_RDWR); - - if (pipeIn == -1) - { - blocked = false; - return -1; - } - } - - bytesRead = 0; - - while (bytesRead < maxBytesToRead) - { - const int bytesThisTime = maxBytesToRead - bytesRead; - const int numRead = (int) ::read (pipeIn, destBuffer, bytesThisTime); - - if (numRead <= 0 || stopReadOperation) - { - bytesRead = -1; - break; - } - - bytesRead += numRead; - destBuffer += numRead; - } - - blocked = false; - return bytesRead; - } - - int write (const char* sourceBuffer, int numBytesToWrite, int timeOutMilliseconds) - { - int bytesWritten = -1; - - if (pipeOut == -1) - { - pipeOut = ::open ((createdPipe ? pipeOutName - : pipeInName).toUTF8(), O_WRONLY); - - if (pipeOut == -1) - return -1; - } - - bytesWritten = 0; - const uint32 timeOutTime = Time::getMillisecondCounter() + timeOutMilliseconds; - - while (bytesWritten < numBytesToWrite - && (timeOutMilliseconds < 0 || Time::getMillisecondCounter() < timeOutTime)) - { - const int bytesThisTime = numBytesToWrite - bytesWritten; - const int numWritten = (int) ::write (pipeOut, sourceBuffer, bytesThisTime); - - if (numWritten <= 0) - { - bytesWritten = -1; - break; - } - - 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 volatile blocked, stopReadOperation; - -private: - static void signalHandler (int) {} - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Pimpl); -}; - -NamedPipe::NamedPipe() -{ -} - -NamedPipe::~NamedPipe() -{ - close(); -} - -void NamedPipe::cancelPendingReads() -{ - while (pimpl != nullptr && pimpl->blocked) - { - pimpl->stopReadOperation = true; - - char buffer[1] = { 0 }; - int bytesWritten = (int) ::write (pimpl->pipeIn, buffer, 1); - (void) bytesWritten; - - int timeout = 2000; - while (pimpl->blocked && --timeout >= 0) - Thread::sleep (2); - - pimpl->stopReadOperation = false; - } -} - -void NamedPipe::close() -{ - cancelPendingReads(); - ScopedPointer deleter (pimpl); // (clears the pimpl member variable before deleting it) -} - -bool NamedPipe::openInternal (const String& pipeName, const bool createPipe) -{ - close(); - - #if JUCE_IOS - pimpl = new Pimpl (File::getSpecialLocation (File::tempDirectory) - .getChildFile (File::createLegalFileName (pipeName)).getFullPathName(), createPipe); - #else - pimpl = new Pimpl ("/tmp/" + File::createLegalFileName (pipeName), createPipe); - #endif - - if (createPipe && ! pimpl->createFifos()) - { - pimpl = nullptr; - return false; - } - - return true; -} - -int NamedPipe::read (void* destBuffer, int maxBytesToRead, int /*timeOutMilliseconds*/) -{ - return pimpl != nullptr ? pimpl->read (static_cast (destBuffer), maxBytesToRead) : -1; -} - -int NamedPipe::write (const void* sourceBuffer, int numBytesToWrite, int timeOutMilliseconds) -{ - return pimpl != nullptr ? pimpl->write (static_cast (sourceBuffer), numBytesToWrite, timeOutMilliseconds) : -1; -} - -bool NamedPipe::isOpen() const -{ - return pimpl != nullptr; -} diff --git a/src/juce/JuceLibraryCode/modules/juce_core/native/juce_posix_SharedCode.h b/src/juce/JuceLibraryCode/modules/juce_core/native/juce_posix_SharedCode.h deleted file mode 100644 index 417fee8b..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/native/juce_posix_SharedCode.h +++ /dev/null @@ -1,1086 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -/* - This file contains posix routines that are common to both the Linux and Mac builds. - - It gets included directly in the cpp files for these platforms. -*/ - - -//============================================================================== -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 (&internal, &atts); -} - -CriticalSection::~CriticalSection() noexcept -{ - pthread_mutex_destroy (&internal); -} - -void CriticalSection::enter() const noexcept -{ - pthread_mutex_lock (&internal); -} - -bool CriticalSection::tryEnter() const noexcept -{ - return pthread_mutex_trylock (&internal) == 0; -} - -void CriticalSection::exit() const noexcept -{ - pthread_mutex_unlock (&internal); -} - - -//============================================================================== -class WaitableEventImpl -{ -public: - WaitableEventImpl (const bool manualReset_) - : triggered (false), - manualReset (manualReset_) - { - 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); - } - - ~WaitableEventImpl() - { - pthread_cond_destroy (&condition); - pthread_mutex_destroy (&mutex); - } - - bool wait (const int timeOutMillisecs) 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 signal() noexcept - { - pthread_mutex_lock (&mutex); - triggered = true; - pthread_cond_broadcast (&condition); - pthread_mutex_unlock (&mutex); - } - - void reset() noexcept - { - pthread_mutex_lock (&mutex); - triggered = false; - pthread_mutex_unlock (&mutex); - } - -private: - pthread_cond_t condition; - pthread_mutex_t mutex; - bool triggered; - const bool manualReset; - - JUCE_DECLARE_NON_COPYABLE (WaitableEventImpl); -}; - -WaitableEvent::WaitableEvent (const bool manualReset) noexcept - : internal (new WaitableEventImpl (manualReset)) -{ -} - -WaitableEvent::~WaitableEvent() noexcept -{ - delete static_cast (internal); -} - -bool WaitableEvent::wait (const int timeOutMillisecs) const noexcept -{ - return static_cast (internal)->wait (timeOutMillisecs); -} - -void WaitableEvent::signal() const noexcept -{ - static_cast (internal)->signal(); -} - -void WaitableEvent::reset() const noexcept -{ - static_cast (internal)->reset(); -} - -//============================================================================== -void JUCE_CALLTYPE Thread::sleep (int millisecs) -{ - struct timespec time; - time.tv_sec = millisecs / 1000; - time.tv_nsec = (millisecs % 1000) * 1000000; - nanosleep (&time, 0); -} - - -//============================================================================== -const juce_wchar File::separator = '/'; -const String File::separatorString ("/"); - -//============================================================================== -File File::getCurrentWorkingDirectory() -{ - HeapBlock heapBuffer; - - char localBuffer [1024]; - char* cwd = getcwd (localBuffer, sizeof (localBuffer) - 1); - int 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; -} - -//============================================================================== -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; - } - - 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 ? info.st_size : 0; - if (modTime != nullptr) *modTime = Time (statOk ? (int64) info.st_mtime * 1000 : 0); - if (creationTime != nullptr) *creationTime = Time (statOk ? (int64) info.st_ctime * 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; - } -} - -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; -} - -//============================================================================== -bool File::hasWriteAccess() const -{ - if (exists()) - return access (fullPath.toUTF8(), W_OK) == 0; - - if ((! isDirectory()) && fullPath.containsChar (separator)) - return getParentDirectory().hasWriteAccess(); - - return false; -} - -bool File::setFileReadOnlyInternal (const bool shouldBeReadOnly) const -{ - juce_statStruct info; - if (! juce_stat (fullPath, info)) - return false; - - info.st_mode &= 0777; // Just permissions - - if (shouldBeReadOnly) - info.st_mode &= ~(S_IWUSR | S_IWGRP | S_IWOTH); - else - // Give everybody write permission? - info.st_mode |= S_IWUSR | S_IWGRP | S_IWOTH; - - return chmod (fullPath.toUTF8(), info.st_mode) == 0; -} - -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() -{ - totalSize = file.getSize(); - - const int f = open (file.getFullPathName().toUTF8(), O_RDONLY, 00644); - - if (f != -1) - fileHandle = (void*) f; - else - status = getResultForErrno(); -} - -void FileInputStream::closeHandle() -{ - if (fileHandle != 0) - { - close (getFD (fileHandle)); - fileHandle = 0; - } -} - -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 = (void*) 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 = (void*) f; - else - status = getResultForErrno(); - } -} - -void FileOutputStream::closeHandle() -{ - if (fileHandle != 0) - { - close (getFD (fileHandle)); - fileHandle = 0; - } -} - -int FileOutputStream::writeInternal (const void* const data, const int numBytes) -{ - ssize_t result = 0; - - if (fileHandle != 0) - { - result = ::write (getFD (fileHandle), data, numBytes); - - if (result == -1) - status = getResultForErrno(); - } - - return (int) result; -} - -void FileOutputStream::flushInternal() -{ - if (fileHandle != 0) - if (fsync (getFD (fileHandle)) == -1) - status = getResultForErrno(); -} - -Result FileOutputStream::truncate() -{ - if (fileHandle == 0) - return status; - - flush(); - return getResultForReturnValue (ftruncate (getFD (fileHandle), (off_t) currentPosition)); -} - -//============================================================================== -MemoryMappedFile::MemoryMappedFile (const File& file, MemoryMappedFile::AccessMode mode) - : address (nullptr), - length (0), - fileHandle (0) -{ - jassert (mode == readOnly || mode == readWrite); - - fileHandle = open (file.getFullPathName().toUTF8(), - mode == readWrite ? (O_CREAT + O_RDWR) : O_RDONLY, 00644); - - if (fileHandle != -1) - { - const int64 fileSize = file.getSize(); - - void* m = mmap (0, (size_t) fileSize, - mode == readWrite ? (PROT_READ | PROT_WRITE) : PROT_READ, - MAP_SHARED, fileHandle, 0); - - if (m != MAP_FAILED) - { - address = m; - length = (size_t) fileSize; - } - } -} - -MemoryMappedFile::~MemoryMappedFile() -{ - if (address != nullptr) - munmap (address, length); - - if (fileHandle != 0) - close (fileHandle); -} - -//============================================================================== -File juce_getExecutableFile(); -File juce_getExecutableFile() -{ - #if 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 = { 0 }; - 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::empty; -} - -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; -} - -//============================================================================== -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; -} - - -//============================================================================== -class InterProcessLock::Pimpl -{ -public: - Pimpl (const String& name, const int timeOutMillisecs) - : handle (0), refCount (1) - { - #if JUCE_IOS - handle = 1; // On iOS we can't run multiple apps, so just assume success. - #else - - // Note that we can't get the normal temp folder here, as it might be different for each app. - #if JUCE_MAC - File tempFolder ("~/Library/Caches/com.juce.locks"); - #else - File tempFolder ("/var/tmp"); - - if (! tempFolder.isDirectory()) - tempFolder = "/tmp"; - #endif - - const File temp (tempFolder.getChildFile (name)); - - temp.create(); - handle = open (temp.getFullPathName().toUTF8(), O_RDWR); - - if (handle != 0) - { - struct flock fl = { 0 }; - 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; - - if (errno != EINTR) - { - if (timeOutMillisecs == 0 - || (timeOutMillisecs > 0 && Time::currentTimeMillis() >= endTime)) - break; - - Thread::sleep (10); - } - } - } - - closeFile(); - #endif - } - - ~Pimpl() - { - closeFile(); - } - - void closeFile() - { - #if ! JUCE_IOS - if (handle != 0) - { - struct flock fl = { 0 }; - fl.l_whence = SEEK_SET; - fl.l_type = F_UNLCK; - - while (! (fcntl (handle, F_SETLKW, &fl) >= 0 || errno != EINTR)) - {} - - close (handle); - handle = 0; - } - #endif - } - - int handle, 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; -} - -//============================================================================== -void JUCE_API juce_threadEntryPoint (void*); - -extern "C" void* threadEntryProc (void*); -extern "C" void* threadEntryProc (void* userData) -{ - JUCE_AUTORELEASEPOOL - - #if JUCE_ANDROID - struct AndroidThreadScope - { - AndroidThreadScope() { threadLocalJNIEnvHolder.attach(); } - ~AndroidThreadScope() { threadLocalJNIEnvHolder.detach(); } - }; - - 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 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 - prctl (PR_SET_NAME, name.toUTF8().getAddress(), 0, 0, 0); - #endif -} - -bool Thread::setThreadPriority (void* handle, int priority) -{ - struct sched_param param; - int policy; - priority = jlimit (0, 10, priority); - - if (handle == 0) - 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 Thread::getCurrentThreadId() -{ - return (ThreadID) pthread_self(); -} - -void 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 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.toUTF8(), RTLD_LOCAL | RTLD_NOW); - return handle != 0; -} - -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) - : childPID (0), pipeHandle (0), readHandle (0) - { - 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 - dup2 (pipeHandles[1], 1); // turns the pipe into stdout - close (pipeHandles[1]); - - Array argv; - for (int i = 0; i < arguments.size(); ++i) - argv.add (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 - { - 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) - { - jassert (dest != nullptr); - - if (readHandle == 0 && childPID != 0) - readHandle = fdopen (pipeHandle, "r"); - - if (readHandle != 0) - return fread (dest, 1, numBytes, readHandle); - - return 0; - } - - bool killProcess() const - { - return ::kill (childPID, SIGKILL) == 0; - } - - int childPID; - -private: - int pipeHandle; - FILE* readHandle; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ActiveProcess); -}; - -bool ChildProcess::start (const String& command) -{ - StringArray tokens; - tokens.addTokens (command, true); - tokens.removeEmptyStrings (true); - - if (tokens.size() == 0) - return false; - - activeProcess = new ActiveProcess (tokens); - - if (activeProcess->childPID == 0) - activeProcess = nullptr; - - return activeProcess != nullptr; -} - -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(); -} diff --git a/src/juce/JuceLibraryCode/modules/juce_core/native/juce_win32_ComSmartPtr.h b/src/juce/JuceLibraryCode/modules/juce_core/native/juce_win32_ComSmartPtr.h deleted file mode 100644 index d4373b9a..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/native/juce_win32_ComSmartPtr.h +++ /dev/null @@ -1,146 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_WIN32_COMSMARTPTR_JUCEHEADER__ -#define __JUCE_WIN32_COMSMARTPTR_JUCEHEADER__ - - -//============================================================================== -/** A simple COM smart pointer. -*/ -template -class ComSmartPtr -{ -public: - ComSmartPtr() throw() : p (0) {} - ComSmartPtr (ComClass* const p_) : p (p_) { if (p_ != 0) p_->AddRef(); } - ComSmartPtr (const ComSmartPtr& p_) : p (p_.p) { if (p != 0) 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) - { - #if ! JUCE_MINGW - return ::CoCreateInstance (classUUID, 0, dwClsContext, __uuidof (ComClass), (void**) resetAndGetPointerAddress()); - #else - jassertfalse; // need to find a mingw equivalent of __uuidof to make this possible - return E_NOTIMPL; - #endif - } - - 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 - { - #if ! JUCE_MINGW - return this->QueryInterface (__uuidof (OtherComClass), destObject); - #else - jassertfalse; // need to find a mingw equivalent of __uuidof to make this possible - return E_NOTIMPL; - #endif - } - -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() : refCount (1) {} - virtual ~ComBaseClassHelperBase() {} - - ULONG __stdcall AddRef() { return ++refCount; } - ULONG __stdcall Release() { const ULONG r = --refCount; if (r == 0) delete this; return r; } - - void resetReferenceCount() noexcept { refCount = 0; } - -protected: - ULONG refCount; -}; - -/** Handy base class for writing COM objects, providing ref-counting and a basic QueryInterface method. -*/ -template -class ComBaseClassHelper : public ComBaseClassHelperBase -{ -public: - ComBaseClassHelper() {} - ~ComBaseClassHelper() {} - - JUCE_COMRESULT QueryInterface (REFIID refId, void** result) - { - #if ! JUCE_MINGW - if (refId == __uuidof (ComClass)) { AddRef(); *result = dynamic_cast (this); return S_OK; } - #else - jassertfalse; // need to find a mingw equivalent of __uuidof to make this possible - #endif - - if (refId == IID_IUnknown) { AddRef(); *result = dynamic_cast (this); return S_OK; } - - *result = 0; - return E_NOINTERFACE; - } -}; - -#endif // __JUCE_WIN32_COMSMARTPTR_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/native/juce_win32_Files.cpp b/src/juce/JuceLibraryCode/modules/juce_core/native/juce_win32_Files.cpp deleted file mode 100644 index 2052961e..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/native/juce_win32_Files.cpp +++ /dev/null @@ -1,958 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#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 - literal64bit (116444736000000000)) / 10000); - } - - FILETIME* timeToFileTime (const int64 time, FILETIME* const ft) noexcept - { - if (time <= 0) - return nullptr; - - reinterpret_cast (ft)->QuadPart = (ULONGLONG) (time * 10000 + literal64bit (116444736000000000)); - 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, (int) 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::nonexistent; - } - - 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 (exists()) - return (WindowsFileHelpers::getAtts (fullPath) & FILE_ATTRIBUTE_READONLY) == 0; - - // on windows, it seems that even read-only directories can still be written into, - // so checking the parent directory's permissions would return the wrong result.. - return true; -} - -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::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, (int) 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() -{ - totalSize = file.getSize(); - - 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(); -} - -void FileInputStream::closeHandle() -{ - 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); -} - -int FileOutputStream::writeInternal (const void* buffer, int numBytes) -{ - if (fileHandle != nullptr) - { - DWORD actualNum = 0; - if (! WriteFile ((HANDLE) fileHandle, buffer, (DWORD) numBytes, &actualNum, 0)) - status = WindowsFileHelpers::getResultForLastError(); - - return (int) 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(); -} - -//============================================================================== -MemoryMappedFile::MemoryMappedFile (const File& file, MemoryMappedFile::AccessMode mode) - : address (nullptr), - length (0), - fileHandle (nullptr) -{ - jassert (mode == readOnly || mode == readWrite); - - 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, 0); - - if (h != INVALID_HANDLE_VALUE) - { - fileHandle = (void*) h; - const int64 fileSize = file.getSize(); - - HANDLE mappingHandle = CreateFileMapping (h, 0, protect, (DWORD) (fileSize >> 32), (DWORD) fileSize, 0); - if (mappingHandle != 0) - { - address = MapViewOfFile (mappingHandle, access, 0, 0, (SIZE_T) fileSize); - - if (address != nullptr) - length = (size_t) fileSize; - - 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); -} - -//============================================================================== -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; - else - 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 globalApplicationsDirectory: csidlType = CSIDL_PROGRAM_FILES; break; - case userMusicDirectory: csidlType = 0x0d /*CSIDL_MYMUSIC*/; break; - case userMoviesDirectory: csidlType = 0x0e /*CSIDL_MYVIDEO*/; break; - - case tempDirectory: - { - WCHAR dest [2048]; - dest[0] = 0; - GetTempPath ((DWORD) numElementsInArray (dest), 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::nonexistent; - } - - 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; -} - -//============================================================================== -File File::getLinkedTarget() const -{ - File result (*this); - String p (getFullPathName()); - - if (! exists()) - p += ".lnk"; - else if (getFileExtension() != ".lnk") - return result; - - ComSmartPtr shellLink; - if (SUCCEEDED (shellLink.CoCreateInstance (CLSID_ShellLink))) - { - ComSmartPtr persistFile; - if (SUCCEEDED (shellLink.QueryInterface (persistFile))) - { - if (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; -} - - -//============================================================================== -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 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 -{ - #if JUCE_MINGW - jassertfalse; // not supported in MinGW.. - #else - #pragma warning (push) - #pragma warning (disable: 4090) // (alignment warning) - ITEMIDLIST* const itemIDList = ILCreateFromPath (fullPath.toWideCharPointer()); - #pragma warning (pop) - - if (itemIDList != nullptr) - { - SHOpenFolderAndSelectItems (itemIDList, 0, nullptr, 0); - ILFree (itemIDList); - } - #endif -} - -//============================================================================== -class NamedPipe::Pimpl -{ -public: - Pimpl (const String& file, const bool isPipe_) - : pipeH (0), - cancelEvent (CreateEvent (0, FALSE, FALSE, 0)), - connected (false), - isPipe (isPipe_) - { - pipeH = isPipe ? CreateNamedPipe (file.toWideCharPointer(), - PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED, 0, - PIPE_UNLIMITED_INSTANCES, 4096, 4096, 0, 0) - : CreateFile (file.toWideCharPointer(), - GENERIC_READ | GENERIC_WRITE, 0, 0, - OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0); - } - - ~Pimpl() - { - disconnectPipe(); - - if (pipeH != 0) - CloseHandle (pipeH); - - CloseHandle (cancelEvent); - } - - bool connect (const int timeOutMs) - { - if (! isPipe) - return true; - - if (! connected) - { - OVERLAPPED over = { 0 }; - over.hEvent = CreateEvent (0, TRUE, FALSE, 0); - - if (ConnectNamedPipe (pipeH, &over)) - { - connected = false; // yes, you read that right. In overlapped mode it should always return 0. - } - else - { - const DWORD err = GetLastError(); - - if (err == ERROR_IO_PENDING || err == ERROR_PIPE_LISTENING) - { - HANDLE handles[] = { over.hEvent, cancelEvent }; - - if (WaitForMultipleObjects (2, handles, FALSE, - timeOutMs >= 0 ? timeOutMs : INFINITE) == WAIT_OBJECT_0) - connected = true; - } - else if (err == ERROR_PIPE_CONNECTED) - { - connected = true; - } - } - - CloseHandle (over.hEvent); - } - - return connected; - } - - void disconnectPipe() - { - if (connected) - { - DisconnectNamedPipe (pipeH); - connected = false; - } - } - - bool isConnected() const noexcept { return connected; } - - HANDLE pipeH, cancelEvent; - bool connected, isPipe; -}; - -NamedPipe::NamedPipe() -{ -} - -NamedPipe::~NamedPipe() -{ - close(); -} - -bool NamedPipe::isOpen() const -{ - return pimpl != nullptr && pimpl->connected; -} - -void NamedPipe::cancelPendingReads() -{ - if (pimpl != nullptr) - SetEvent (pimpl->cancelEvent); -} - -void NamedPipe::close() -{ - cancelPendingReads(); - - const ScopedLock sl (lock); - ScopedPointer deleter (pimpl); // (clears the pimpl member variable before deleting it) -} - -bool NamedPipe::openInternal (const String& pipeName, const bool createPipe) -{ - close(); - - pimpl = new Pimpl ("\\\\.\\pipe\\" + File::createLegalFileName (pipeName), createPipe); - - if (pimpl->pipeH != INVALID_HANDLE_VALUE) - return true; - - pimpl = nullptr; - return false; -} - -int NamedPipe::read (void* destBuffer, const int maxBytesToRead, const int timeOutMilliseconds) -{ - const ScopedLock sl (lock); - int bytesRead = -1; - bool waitAgain = true; - - while (waitAgain && pimpl != nullptr) - { - waitAgain = false; - - if (! pimpl->connect (timeOutMilliseconds)) - break; - - if (maxBytesToRead <= 0) - return 0; - - OVERLAPPED over = { 0 }; - over.hEvent = CreateEvent (0, TRUE, FALSE, 0); - - unsigned long numRead; - - if (ReadFile (pimpl->pipeH, destBuffer, (DWORD) maxBytesToRead, &numRead, &over)) - { - bytesRead = (int) numRead; - } - else - { - const DWORD lastError = GetLastError(); - - if (lastError == ERROR_IO_PENDING) - { - HANDLE handles[] = { over.hEvent, pimpl->cancelEvent }; - DWORD waitResult = WaitForMultipleObjects (2, handles, FALSE, - timeOutMilliseconds >= 0 ? timeOutMilliseconds - : INFINITE); - if (waitResult != WAIT_OBJECT_0) - { - // if the operation timed out, let's cancel it... - CancelIo (pimpl->pipeH); - WaitForSingleObject (over.hEvent, INFINITE); // makes sure cancel is complete - } - - if (GetOverlappedResult (pimpl->pipeH, &over, &numRead, FALSE)) - { - bytesRead = (int) numRead; - } - else if ((GetLastError() == ERROR_BROKEN_PIPE || GetLastError() == ERROR_PIPE_NOT_CONNECTED) && pimpl->isPipe) - { - pimpl->disconnectPipe(); - waitAgain = true; - } - } - else if (pimpl->isPipe) - { - waitAgain = true; - - if (lastError == ERROR_BROKEN_PIPE || lastError == ERROR_PIPE_NOT_CONNECTED) - pimpl->disconnectPipe(); - else - Sleep (5); - } - } - - CloseHandle (over.hEvent); - } - - return bytesRead; -} - -int NamedPipe::write (const void* sourceBuffer, int numBytesToWrite, int timeOutMilliseconds) -{ - int bytesWritten = -1; - - if (pimpl != nullptr && pimpl->connect (timeOutMilliseconds)) - { - if (numBytesToWrite <= 0) - return 0; - - OVERLAPPED over = { 0 }; - over.hEvent = CreateEvent (0, TRUE, FALSE, 0); - - unsigned long numWritten; - - if (WriteFile (pimpl->pipeH, sourceBuffer, (DWORD) numBytesToWrite, &numWritten, &over)) - { - bytesWritten = (int) numWritten; - } - else if (GetLastError() == ERROR_IO_PENDING) - { - HANDLE handles[] = { over.hEvent, pimpl->cancelEvent }; - DWORD waitResult; - - waitResult = WaitForMultipleObjects (2, handles, FALSE, - timeOutMilliseconds >= 0 ? timeOutMilliseconds - : INFINITE); - - if (waitResult != WAIT_OBJECT_0) - { - CancelIo (pimpl->pipeH); - WaitForSingleObject (over.hEvent, INFINITE); - } - - if (GetOverlappedResult (pimpl->pipeH, &over, &numWritten, FALSE)) - { - bytesWritten = (int) numWritten; - } - else if (GetLastError() == ERROR_BROKEN_PIPE && pimpl->isPipe) - { - pimpl->disconnectPipe(); - } - } - - CloseHandle (over.hEvent); - } - - return bytesWritten; -} diff --git a/src/juce/JuceLibraryCode/modules/juce_core/native/juce_win32_Network.cpp b/src/juce/JuceLibraryCode/modules/juce_core/native/juce_win32_Network.cpp deleted file mode 100644 index 8b3e4ad5..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/native/juce_win32_Network.cpp +++ /dev/null @@ -1,486 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef INTERNET_FLAG_NEED_FILE - #define INTERNET_FLAG_NEED_FILE 0x00000010 -#endif - -#ifndef INTERNET_OPTION_DISABLE_AUTODIAL - #define INTERNET_OPTION_DISABLE_AUTODIAL 70 -#endif - -//============================================================================== -#ifndef WORKAROUND_TIMEOUT_BUG - //#define WORKAROUND_TIMEOUT_BUG 1 -#endif - -#if WORKAROUND_TIMEOUT_BUG -// Required because of a Microsoft bug in setting a timeout -class InternetConnectThread : public Thread -{ -public: - InternetConnectThread (URL_COMPONENTS& uc_, HINTERNET sessionHandle_, HINTERNET& connection_, const bool isFtp_) - : Thread ("Internet"), uc (uc_), sessionHandle (sessionHandle_), connection (connection_), isFtp (isFtp_) - { - startThread(); - } - - ~InternetConnectThread() - { - stopThread (60000); - } - - void run() - { - connection = InternetConnect (sessionHandle, uc.lpszHostName, - uc.nPort, _T(""), _T(""), - isFtp ? INTERNET_SERVICE_FTP - : INTERNET_SERVICE_HTTP, - 0, 0); - notify(); - } - -private: - URL_COMPONENTS& uc; - HINTERNET sessionHandle; - HINTERNET& connection; - const bool isFtp; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (InternetConnectThread); -}; -#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) - : connection (0), request (0), - address (address_), headers (headers_), postData (postData_), position (0), - finished (false), isPost (isPost_), timeOutMs (timeOutMs_) - { - createConnection (progressCallback, progressCallbackContext); - - if (responseHeaders != nullptr && ! isError()) - { - DWORD bufferSizeBytes = 4096; - - for (;;) - { - HeapBlock buffer ((size_t) bufferSizeBytes); - - if (HttpQueryInfo (request, HTTP_QUERY_RAW_HEADERS_CRLF, buffer.getData(), &bufferSizeBytes, 0)) - { - StringArray headersArray; - headersArray.addLines (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 ((*responseHeaders) [key]); - - responseHeaders->set (key, previousValue.isEmpty() ? value : (previousValue + "," + value)); - } - - break; - } - - if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) - 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; - } - -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; - - InternetSetOption (sessionHandle, INTERNET_OPTION_CONNECT_TIMEOUT, &timeOutMs, sizeof (timeOutMs)); - - const bool isFtp = address.startsWithIgnoreCase ("ftp:"); - - #if WORKAROUND_TIMEOUT_BUG - connection = 0; - - { - InternetConnectThread connectThread (uc, sessionHandle, connection, isFtp); - connectThread.wait (timeOutMs); - - if (connection == 0) - { - InternetCloseHandle (sessionHandle); - sessionHandle = 0; - } - } - #else - connection = InternetConnect (sessionHandle, uc.lpszHostName, uc.nPort, - uc.lpszUserName, uc.lpszPassword, - isFtp ? (DWORD) INTERNET_SERVICE_FTP - : (DWORD) INTERNET_SERVICE_HTTP, - 0, 0); - #endif - - 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 openHTTPConnection (URL_COMPONENTS& uc, URL::OpenStreamProgressCallback* progressCallback, - void* progressCallbackContext) - { - const TCHAR* mimeTypes[] = { _T("*/*"), 0 }; - - DWORD flags = INTERNET_FLAG_RELOAD | INTERNET_FLAG_NO_CACHE_WRITE | INTERNET_FLAG_NO_COOKIES; - - 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) - { - 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(); - } - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (WebInputStream); -}; - -InputStream* URL::createNativeStream (const String& address, bool isPost, const MemoryBlock& postData, - OpenStreamProgressCallback* progressCallback, void* progressCallbackContext, - const String& headers, const int timeOutMs, StringPairArray* responseHeaders) -{ - ScopedPointer wi (new WebInputStream (address, isPost, postData, - progressCallback, progressCallbackContext, - headers, timeOutMs, responseHeaders)); - - return wi->isError() ? nullptr : wi.release(); -} - - -//============================================================================== -namespace MACAddressHelpers -{ - void getViaGetAdaptersInfo (Array& result) - { - DynamicLibrary dll ("iphlpapi.dll"); - JUCE_DLL_FUNCTION (GetAdaptersInfo, getAdaptersInfo, DWORD, dll, (PIP_ADAPTER_INFO, PULONG)) - - if (getAdaptersInfo != nullptr) - { - ULONG len = sizeof (IP_ADAPTER_INFO); - HeapBlock adapterInfo (1); - - if (getAdaptersInfo (adapterInfo, &len) == ERROR_BUFFER_OVERFLOW) - adapterInfo.malloc (len, 1); - - if (getAdaptersInfo (adapterInfo, &len) == NO_ERROR) - { - for (PIP_ADAPTER_INFO adapter = adapterInfo; adapter != nullptr; adapter = adapter->Next) - if (adapter->AddressLength >= 6) - result.addIfNotAlreadyThere (MACAddress (adapter->Address)); - } - } - } - - void getViaNetBios (Array& result) - { - DynamicLibrary dll ("netapi32.dll"); - JUCE_DLL_FUNCTION (Netbios, NetbiosCall, UCHAR, dll, (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 = { 0 }; - ncb.ncb_buffer = (unsigned char*) &astat; - ncb.ncb_length = sizeof (ASTAT); - - if (NetbiosCall (&ncb) == 0 && astat.adapt.adapter_type == 0xfe) - result.addIfNotAlreadyThere (MACAddress (astat.adapt.adapter_address)); - } - } - } - } -} - -void MACAddress::findAllAddresses (Array& result) -{ - MACAddressHelpers::getViaGetAdaptersInfo (result); - MACAddressHelpers::getViaNetBios (result); -} - -//============================================================================== -bool Process::openEmailWithAttachments (const String& targetEmailAddress, - const String& emailSubject, - const String& bodyText, - const StringArray& filesToAttach) -{ - typedef ULONG (WINAPI *MAPISendMailType) (LHANDLE, ULONG, lpMapiMessage, ::FLAGS, ULONG); - - DynamicLibrary mapiLib ("MAPI32.dll"); - MAPISendMailType mapiSendMail = (MAPISendMailType) mapiLib.getFunction ("MAPISendMail"); - - if (mapiSendMail == nullptr) - return false; - - MapiMessage message = { 0 }; - message.lpszSubject = (LPSTR) emailSubject.toUTF8().getAddress(); - message.lpszNoteText = (LPSTR) bodyText.toUTF8().getAddress(); - - 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_.toUTF8().getAddress(); - 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].toUTF8().getAddress(); - } - - return mapiSendMail (0, 0, &message, MAPI_DIALOG | MAPI_LOGON_UI, 0) == SUCCESS_SUCCESS; -} diff --git a/src/juce/JuceLibraryCode/modules/juce_core/native/juce_win32_Registry.cpp b/src/juce/JuceLibraryCode/modules/juce_core/native/juce_win32_Registry.cpp deleted file mode 100644 index d71f1c7f..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/native/juce_win32_Registry.cpp +++ /dev/null @@ -1,208 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -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 RegistryKeyWrapper key (regValuePath, true, 0); - - 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; - } - - HKEY key; - const wchar_t* wideCharValueName; - String valueName; - - JUCE_DECLARE_NON_COPYABLE (RegistryKeyWrapper); -}; - -uint32 WindowsRegistry::getBinaryValue (const String& regValuePath, MemoryBlock& result) -{ - return RegistryKeyWrapper::getBinaryValue (regValuePath, result, 0); -} - -String WindowsRegistry::getValue (const String& regValuePath, const String& defaultValue) -{ - return RegistryKeyWrapper::getValue (regValuePath, defaultValue, 0); -} - -String WindowsRegistry::getValueWow64 (const String& regValuePath, const String& defaultValue) -{ - return RegistryKeyWrapper::getValue (regValuePath, defaultValue, KEY_WOW64_64KEY); -} - -bool WindowsRegistry::setValue (const String& regValuePath, const String& value) -{ - return RegistryKeyWrapper::setValue (regValuePath, REG_SZ, value.toWideCharPointer(), - CharPointer_UTF16::getBytesRequiredFor (value.getCharPointer())); -} - -bool WindowsRegistry::setValue (const String& regValuePath, const uint32 value) -{ - return RegistryKeyWrapper::setValue (regValuePath, REG_DWORD, &value, sizeof (value)); -} - -bool WindowsRegistry::setValue (const String& regValuePath, const uint64 value) -{ - return RegistryKeyWrapper::setValue (regValuePath, REG_QWORD, &value, sizeof (value)); -} - -bool WindowsRegistry::setValue (const String& regValuePath, const MemoryBlock& value) -{ - return RegistryKeyWrapper::setValue (regValuePath, REG_BINARY, value.getData(), value.getSize()); -} - -bool WindowsRegistry::valueExists (const String& regValuePath) -{ - const RegistryKeyWrapper key (regValuePath, false, 0); - - 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; -} - -void WindowsRegistry::deleteValue (const String& regValuePath) -{ - const RegistryKeyWrapper key (regValuePath, true, 0); - - if (key.key != 0) - RegDeleteValue (key.key, key.wideCharValueName); -} - -void WindowsRegistry::deleteKey (const String& regKeyPath) -{ - const RegistryKeyWrapper key (regKeyPath, true, 0); - - if (key.key != 0) - RegDeleteKey (key.key, key.wideCharValueName); -} - -bool WindowsRegistry::registerFileAssociation (const String& fileExtension, - const String& symbolicDescription, - const String& fullDescription, - const File& targetExecutable, - const int iconResourceNumber, - const bool registerForCurrentUserOnly) -{ - const char* const root = registerForCurrentUserOnly ? "HKEY_CURRENT_USER\\Software\\Classes\\" - : "HKEY_CLASSES_ROOT\\"; - const String key (root + symbolicDescription); - - return setValue (root + fileExtension + "\\", symbolicDescription) - && setValue (key + "\\", fullDescription) - && setValue (key + "\\shell\\open\\command\\", targetExecutable.getFullPathName() + " \"%1\"") - && (iconResourceNumber == 0 - || setValue (key + "\\DefaultIcon\\", - targetExecutable.getFullPathName() + "," + String (-iconResourceNumber))); -} diff --git a/src/juce/JuceLibraryCode/modules/juce_core/native/juce_win32_SystemStats.cpp b/src/juce/JuceLibraryCode/modules/juce_core/native/juce_win32_SystemStats.cpp deleted file mode 100644 index 5b21f63f..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/native/juce_win32_SystemStats.cpp +++ /dev/null @@ -1,372 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -void Logger::outputDebugString (const String& text) -{ - OutputDebugString ((text + "\n").toWideCharPointer()); -} - -//============================================================================== -#ifdef JUCE_DLL - 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_INTRINSICS - -// CPU info functions using intrinsics... - -#pragma intrinsic (__cpuid) -#pragma intrinsic (__rdtsc) - -String SystemStats::getCpuVendor() -{ - int info [4]; - __cpuid (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); -} - -#else - -//============================================================================== -// CPU info functions using old fashioned inline asm... - -static void juce_getCpuVendor (char* const v) -{ - int vendor[4] = { 0 }; - - #if ! JUCE_MINGW - __try - #endif - { - #if JUCE_GCC - unsigned int dummy = 0; - __asm__ ("cpuid" : "=a" (dummy), "=b" (vendor[0]), "=c" (vendor[2]),"=d" (vendor[1]) : "a" (0)); - #else - __asm - { - mov eax, 0 - cpuid - mov [vendor], ebx - mov [vendor + 4], edx - mov [vendor + 8], ecx - } - #endif - } - #if ! JUCE_MINGW - __except (EXCEPTION_EXECUTE_HANDLER) - { - *v = 0; - } - #endif - - memcpy (v, vendor, 16); -} - -String SystemStats::getCpuVendor() -{ - char v [16]; - juce_getCpuVendor (v); - return String (v, 16); -} -#endif - - -//============================================================================== -SystemStats::CPUFlags::CPUFlags() -{ - hasMMX = IsProcessorFeaturePresent (PF_MMX_INSTRUCTIONS_AVAILABLE) != 0; - hasSSE = IsProcessorFeaturePresent (PF_XMMI_INSTRUCTIONS_AVAILABLE) != 0; - hasSSE2 = IsProcessorFeaturePresent (PF_XMMI64_INSTRUCTIONS_AVAILABLE) != 0; - #ifdef PF_AMD3D_INSTRUCTIONS_AVAILABLE - has3DNow = IsProcessorFeaturePresent (PF_AMD3D_INSTRUCTIONS_AVAILABLE) != 0; - #else - has3DNow = IsProcessorFeaturePresent (PF_3DNOW_INSTRUCTIONS_AVAILABLE) != 0; - #endif - - 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 - -//============================================================================== -SystemStats::OperatingSystemType SystemStats::getOperatingSystemType() -{ - OSVERSIONINFO info; - info.dwOSVersionInfoSize = sizeof (info); - GetVersionEx (&info); - - if (info.dwPlatformId == VER_PLATFORM_WIN32_NT) - { - switch (info.dwMajorVersion) - { - case 5: return (info.dwMinorVersion == 0) ? Win2000 : WinXP; - case 6: return (info.dwMinorVersion == 0) ? WinVista : Windows7; - default: jassertfalse; break; // !! not a supported OS! - } - } - else if (info.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) - { - jassert (info.dwMinorVersion != 0); // !! still running on Windows 95?? - return Win98; - } - - return UnknownOS; -} - -String SystemStats::getOperatingSystemName() -{ - const char* name = "Unknown OS"; - - switch (getOperatingSystemType()) - { - case Windows7: name = "Windows 7"; break; - case WinVista: name = "Windows Vista"; break; - case WinXP: name = "Windows XP"; break; - case Win2000: name = "Windows 2000"; break; - case Win98: name = "Windows 98"; break; - default: jassertfalse; break; // !! new type of OS? - } - - return name; -} - -bool SystemStats::isOperatingSystem64Bit() -{ - #ifdef _WIN64 - return true; - #else - typedef BOOL (WINAPI* LPFN_ISWOW64PROCESS) (HANDLE, PBOOL); - - LPFN_ISWOW64PROCESS fnIsWow64Process = (LPFN_ISWOW64PROCESS) GetProcAddress (GetModuleHandle (_T("kernel32")), "IsWow64Process"); - - BOOL isWow64 = FALSE; - - return fnIsWow64Process != 0 - && fnIsWow64Process (GetCurrentProcess(), &isWow64) - && (isWow64 != FALSE); - #endif -} - -//============================================================================== -int SystemStats::getMemorySizeInMegabytes() -{ - MEMORYSTATUSEX mem; - mem.dwLength = sizeof (mem); - GlobalMemoryStatusEx (&mem); - return (int) (mem.ullTotalPhys / (1024 * 1024)) + 1; -} - -//============================================================================== -uint32 juce_millisecondsSinceStartup() noexcept -{ - return (uint32) timeGetTime(); -} - -//============================================================================== -class HiResCounterHandler -{ -public: - HiResCounterHandler() - : hiResTicksOffset (0) - { - const MMRESULT res = timeBeginPeriod (1); - (void) res; - jassert (res == TIMERR_NOERROR); - - 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_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); -} diff --git a/src/juce/JuceLibraryCode/modules/juce_core/native/juce_win32_Threads.cpp b/src/juce/JuceLibraryCode/modules/juce_core/native/juce_win32_Threads.cpp deleted file mode 100644 index 9f2b2420..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/native/juce_win32_Threads.cpp +++ /dev/null @@ -1,581 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -HWND juce_messageWindowHandle = 0; // (this is used by other parts of the codebase) - -//============================================================================== -#if ! JUCE_USE_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 (internal)); - #endif - - InitializeCriticalSection ((CRITICAL_SECTION*) internal); -} - -CriticalSection::~CriticalSection() noexcept -{ - DeleteCriticalSection ((CRITICAL_SECTION*) internal); -} - -void CriticalSection::enter() const noexcept -{ - EnterCriticalSection ((CRITICAL_SECTION*) internal); -} - -bool CriticalSection::tryEnter() const noexcept -{ - return TryEnterCriticalSection ((CRITICAL_SECTION*) internal) != FALSE; -} - -void CriticalSection::exit() const noexcept -{ - LeaveCriticalSection ((CRITICAL_SECTION*) internal); -} - -//============================================================================== -WaitableEvent::WaitableEvent (const bool manualReset) noexcept - : internal (CreateEvent (0, manualReset ? TRUE : FALSE, FALSE, 0)) -{ -} - -WaitableEvent::~WaitableEvent() noexcept -{ - CloseHandle (internal); -} - -bool WaitableEvent::wait (const int timeOutMillisecs) const noexcept -{ - return WaitForSingleObject (internal, (DWORD) timeOutMillisecs) == WAIT_OBJECT_0; -} - -void WaitableEvent::signal() const noexcept -{ - SetEvent (internal); -} - -void WaitableEvent::reset() const noexcept -{ - ResetEvent (internal); -} - -//============================================================================== -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) 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 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 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 Thread::setCurrentThreadAffinityMask (const uint32 affinityMask) -{ - SetThreadAffinityMask (GetCurrentThread(), affinityMask); -} - -//============================================================================== -struct SleepEvent -{ - SleepEvent() - : handle (CreateEvent (0, 0, 0, - #if JUCE_DEBUG - _T("Juce Sleep Event"))) - #else - 0)) - #endif - { - } - - HANDLE handle; -}; - -static SleepEvent sleepEvent; - -void JUCE_CALLTYPE Thread::sleep (const int millisecs) -{ - if (millisecs >= 10) - { - 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 by WindowDriver because Windows does wierd 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 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(); -} - -String JUCE_CALLTYPE Process::getCurrentCommandLineParams() -{ - return CharacterFunctions::findEndOfToken (CharPointer_UTF16 (GetCommandLineW()), - CharPointer_UTF16 (L" "), - CharPointer_UTF16 (L"\"")).findEndOfWhitespace(); -} - -static void* currentModuleHandle = nullptr; - -void* Process::getCurrentModuleInstanceHandle() noexcept -{ - if (currentModuleHandle == nullptr) - currentModuleHandle = GetModuleHandle (0); - - return currentModuleHandle; -} - -void Process::setCurrentModuleInstanceHandle (void* const newHandle) noexcept -{ - currentModuleHandle = newHandle; -} - -void Process::raisePrivilege() -{ - jassertfalse; // xxx not implemented -} - -void Process::lowerPrivilege() -{ - jassertfalse; // xxx not implemented -} - -void Process::terminate() -{ - #if JUCE_MSVC && JUCE_CHECK_MEMORY_LEAKS - _CrtDumpMemoryLeaks(); - #endif - - // bullet in the head in case there's a problem shutting down.. - ExitProcess (0); -} - -bool juce_IsRunningInWine() -{ - HMODULE ntdll = GetModuleHandle (_T("ntdll.dll")); - return ntdll != 0 && GetProcAddress (ntdll, "wine_get_version") != 0; -} - -//============================================================================== -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) - : 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.hStdError = writePipe; - startupInfo.hStdOutput = writePipe; - 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 - { - return WaitForSingleObject (processInfo.hProcess, 0) != WAIT_OBJECT_0; - } - - int read (void* dest, int numNeeded) const - { - 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 - { - return TerminateProcess (processInfo.hProcess, 0) != FALSE; - } - - bool ok; - -private: - HANDLE readPipe, writePipe; - PROCESS_INFORMATION processInfo; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ActiveProcess); -}; - -bool ChildProcess::start (const String& command) -{ - activeProcess = new ActiveProcess (command); - - if (! activeProcess->ok) - activeProcess = nullptr; - - return activeProcess != nullptr; -} - -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(); -} diff --git a/src/juce/JuceLibraryCode/modules/juce_core/network/juce_MACAddress.cpp b/src/juce/JuceLibraryCode/modules/juce_core/network/juce_MACAddress.cpp deleted file mode 100644 index 03eb7348..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/network/juce_MACAddress.cpp +++ /dev/null @@ -1,75 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -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/src/juce/JuceLibraryCode/modules/juce_core/network/juce_MACAddress.h b/src/juce/JuceLibraryCode/modules/juce_core/network/juce_MACAddress.h deleted file mode 100644 index 126785e6..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/network/juce_MACAddress.h +++ /dev/null @@ -1,86 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_MACADDRESS_JUCEHEADER__ -#define __JUCE_MACADDRESS_JUCEHEADER__ - -#include "../containers/juce_Array.h" - - -//============================================================================== -/** - 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 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& other); - - /** Creates a copy of another address. */ - MACAddress& operator= (const MACAddress& other); - - /** 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& other) const noexcept; - bool operator!= (const MACAddress& other) const noexcept; - - //============================================================================== -private: - uint8 address[6]; -}; - - -#endif // __JUCE_MACADDRESS_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/network/juce_NamedPipe.cpp b/src/juce/JuceLibraryCode/modules/juce_core/network/juce_NamedPipe.cpp deleted file mode 100644 index da13493f..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/network/juce_NamedPipe.cpp +++ /dev/null @@ -1,43 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -bool NamedPipe::openExisting (const String& pipeName) -{ - currentPipeName = pipeName; - return openInternal (pipeName, false); -} - -bool NamedPipe::createNewPipe (const String& pipeName) -{ - 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/src/juce/JuceLibraryCode/modules/juce_core/network/juce_NamedPipe.h b/src/juce/JuceLibraryCode/modules/juce_core/network/juce_NamedPipe.h deleted file mode 100644 index 0864e9de..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/network/juce_NamedPipe.h +++ /dev/null @@ -1,111 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_NAMEDPIPE_JUCEHEADER__ -#define __JUCE_NAMEDPIPE_JUCEHEADER__ - - -//============================================================================== -/** - A cross-process pipe that can have data written to and read from it. - - Two or more processes can use these for inter-process communication. - - @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 = 5000); - - /** Writes some data to the pipe. - - If the operation fails, it returns -1, otherwise, it will return the number of - bytes written. - */ - int write (const void* sourceBuffer, int numBytesToWrite, - int timeOutMilliseconds = 2000); - - /** If any threads are currently blocked on a read operation, this tells them to abort. - */ - void cancelPendingReads(); - -private: - //============================================================================== - class Pimpl; - ScopedPointer pimpl; - String currentPipeName; - CriticalSection lock; - - bool openInternal (const String& pipeName, const bool createPipe); - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (NamedPipe); -}; - - -#endif // __JUCE_NAMEDPIPE_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/network/juce_Socket.cpp b/src/juce/JuceLibraryCode/modules/juce_core/network/juce_Socket.cpp deleted file mode 100644 index b6fea1f1..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/network/juce_Socket.cpp +++ /dev/null @@ -1,580 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#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; -#else - typedef socklen_t juce_socklen_t; -#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 int 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 int handle, const int port) noexcept - { - if (handle <= 0 || port <= 0) - return false; - - struct sockaddr_in servTmpAddr = { 0 }; - 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 int 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), 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 int 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 (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 int 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 = { 0 }; - 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, (int) 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; - } -} - -//============================================================================== -StreamingSocket::StreamingSocket() - : portNumber (0), - handle (-1), - connected (false), - isListener (false) -{ - SocketHelpers::initSockets(); -} - -StreamingSocket::StreamingSocket (const String& hostName_, - const int portNumber_, - const int handle_) - : hostName (hostName_), - portNumber (portNumber_), - handle (handle_), - connected (true), - isListener (false) -{ - SocketHelpers::initSockets(); - SocketHelpers::resetSocketOptions (handle_, 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, 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 ("localhost", portNumber, 1000); - } - } - - if (handle != -1) - ::close (handle); - #endif - - hostName = String::empty; - 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 = { 0 }; - 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; - - const int reuse = 1; - setsockopt (handle, SOL_SOCKET, SO_REUSEADDR, (const char*) &reuse, sizeof (reuse)); - - 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 -{ - jassert (isListener || ! connected); // to call this method, you first have to use createListener() to - // prepare this socket as a listener. - - 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 allowBroadcast_) - : portNumber (0), - handle (-1), - connected (true), - allowBroadcast (allowBroadcast_), - serverAddress (nullptr) -{ - SocketHelpers::initSockets(); - - handle = (int) socket (AF_INET, SOCK_DGRAM, 0); - bindToPort (localPortNumber); -} - -DatagramSocket::DatagramSocket (const String& hostName_, const int portNumber_, - const int handle_, const int localPortNumber) - : hostName (hostName_), - portNumber (portNumber_), - handle (handle_), - connected (true), - allowBroadcast (false), - serverAddress (nullptr) -{ - SocketHelpers::initSockets(); - - SocketHelpers::resetSocketOptions (handle_, 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 = String::empty; - 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, - numBytesToWrite, 0, - static_cast (serverAddress)->ai_addr, - 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/src/juce/JuceLibraryCode/modules/juce_core/network/juce_Socket.h b/src/juce/JuceLibraryCode/modules/juce_core/network/juce_Socket.h deleted file mode 100644 index 57cce142..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/network/juce_Socket.h +++ /dev/null @@ -1,300 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_SOCKET_JUCEHEADER__ -#define __JUCE_SOCKET_JUCEHEADER__ - -#include "../text/juce_String.h" - - -//============================================================================== -/** - 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; - - //============================================================================== - /** 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::empty); - - /** 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; - - //============================================================================== - /** 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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/network/juce_URL.cpp b/src/juce/JuceLibraryCode/modules/juce_core/network/juce_URL.cpp deleted file mode 100644 index 2460626b..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/network/juce_URL.cpp +++ /dev/null @@ -1,471 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -URL::URL() -{ -} - -URL::URL (const String& url_) - : url (url_) -{ - 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 URL& other) - : url (other.url), - postData (other.postData), - parameterNames (other.parameterNames), - parameterValues (other.parameterValues), - filesToUpload (other.filesToUpload), - mimeTypes (other.mimeTypes) -{ -} - -URL& URL::operator= (const URL& other) -{ - url = other.url; - postData = other.postData; - parameterNames = other.parameterNames; - parameterValues = other.parameterValues; - filesToUpload = other.filesToUpload; - mimeTypes = other.mimeTypes; - - 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 - && mimeTypes == other.mimeTypes; -} - -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 createHeadersAndPostData (const URL& url, String& headers, MemoryBlock& postData) - { - MemoryOutputStream data (postData, false); - - if (url.getFilesToUpload().size() > 0) - { - // need to upload some files, so do it as multi-part... - const String boundary (String::toHexString (Random::getSystemRandom().nextInt64())); - - headers << "Content-Type: multipart/form-data; boundary=" << boundary << "\r\n"; - - data << "--" << boundary; - - int i; - for (i = 0; i < url.getParameterNames().size(); ++i) - { - data << "\r\nContent-Disposition: form-data; name=\"" - << url.getParameterNames() [i] - << "\"\r\n\r\n" - << url.getParameterValues() [i] - << "\r\n--" - << boundary; - } - - for (i = 0; i < url.getFilesToUpload().size(); ++i) - { - const File file (url.getFilesToUpload().getAllValues() [i]); - const String paramName (url.getFilesToUpload().getAllKeys() [i]); - - data << "\r\nContent-Disposition: form-data; name=\"" << paramName - << "\"; filename=\"" << file.getFileName() << "\"\r\n"; - - const String mimeType (url.getMimeTypesOfUploadFiles() - .getValue (paramName, String::empty)); - - if (mimeType.isNotEmpty()) - data << "Content-Type: " << mimeType << "\r\n"; - - data << "Content-Transfer-Encoding: binary\r\n\r\n" - << file << "\r\n--" << boundary; - } - - data << "--\r\n"; - } - else - { - data << getMangledParameters (url) - << url.getPostData(); - - // just a short text attachment, so use simple url encoding.. - headers << "Content-Type: application/x-www-form-urlencoded\r\nContent-length: " - << (int) data.getDataSize() << "\r\n"; - } - } - - 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); - else - return url; -} - -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::empty - : 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; -} - -//============================================================================== -bool URL::isProbablyAWebsiteURL (const String& possibleURL) -{ - 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, - const String& extraHeaders, - const int timeOutMs, - StringPairArray* const responseHeaders) const -{ - String headers; - MemoryBlock headersAndPostData; - - if (usePostCommand) - URLHelpers::createHeadersAndPostData (*this, headers, headersAndPostData); - - headers += extraHeaders; - - if (! headers.endsWithChar ('\n')) - headers << "\r\n"; - - return createNativeStream (toString (! usePostCommand), usePostCommand, headersAndPostData, - progressCallback, progressCallbackContext, - headers, timeOutMs, responseHeaders); -} - -//============================================================================== -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::empty; -} - -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::withFileToUpload (const String& parameterName, - const File& fileToUpload, - const String& mimeType) const -{ - jassert (mimeType.isNotEmpty()); // You need to supply a mime type! - - URL u (*this); - u.filesToUpload.set (parameterName, fileToUpload.getFullPathName()); - u.mimeTypes.set (parameterName, mimeType); - return u; -} - -URL URL::withPOSTData (const String& postData_) const -{ - URL u (*this); - u.postData = postData_; - return u; -} - -const StringPairArray& URL::getFilesToUpload() const -{ - return filesToUpload; -} - -const StringPairArray& URL::getMimeTypesOfUploadFiles() const -{ - return mimeTypes; -} - -//============================================================================== -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.toUTF8().getAddress(), 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.toUTF8().getAddress(), 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::empty); -} diff --git a/src/juce/JuceLibraryCode/modules/juce_core/network/juce_URL.h b/src/juce/JuceLibraryCode/modules/juce_core/network/juce_URL.h deleted file mode 100644 index d416302d..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/network/juce_URL.h +++ /dev/null @@ -1,347 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_URL_JUCEHEADER__ -#define __JUCE_URL_JUCEHEADER__ - -#include "../text/juce_StringPairArray.h" -#include "../files/juce_File.h" -class InputStream; -class XmlElement; - - -//============================================================================== -/** - 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. */ - 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; - - /** 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 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. - */ - URL withFileToUpload (const String& parameterName, - const File& fileToUpload, - 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 "haddock". - - 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 the set of files that should be uploaded as part of a POST operation. - - This is the set of files that were added to the URL with the withFileToUpload() - method. - */ - const StringPairArray& getFilesToUpload() const; - - /** Returns the set of mime types associated with each of the upload files. - */ - const StringPairArray& getMimeTypesOfUploadFiles() const; - - /** 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 paramters, 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-zero, all the (key, value) pairs received as headers - in the response will be stored in this array - @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, - const String& extraHeaders = String::empty, - int connectionTimeOutMs = 0, - StringPairArray* responseHeaders = nullptr) 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); - -private: - //============================================================================== - String url, postData; - StringArray parameterNames, parameterValues; - StringPairArray filesToUpload, mimeTypes; - - void addParameter (const String&, const String&); - - static InputStream* createNativeStream (const String& address, bool isPost, const MemoryBlock& postData, - OpenStreamProgressCallback* progressCallback, - void* progressCallbackContext, const String& headers, - const int timeOutMs, StringPairArray* responseHeaders); - JUCE_LEAK_DETECTOR (URL); -}; - - -#endif // __JUCE_URL_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/streams/juce_BufferedInputStream.cpp b/src/juce/JuceLibraryCode/modules/juce_core/streams/juce_BufferedInputStream.cpp deleted file mode 100644 index 05d64b51..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/streams/juce_BufferedInputStream.cpp +++ /dev/null @@ -1,196 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -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/src/juce/JuceLibraryCode/modules/juce_core/streams/juce_BufferedInputStream.h b/src/juce/JuceLibraryCode/modules/juce_core/streams/juce_BufferedInputStream.h deleted file mode 100644 index 8e958ad5..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/streams/juce_BufferedInputStream.h +++ /dev/null @@ -1,93 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_BUFFEREDINPUTSTREAM_JUCEHEADER__ -#define __JUCE_BUFFEREDINPUTSTREAM_JUCEHEADER__ - -#include "juce_InputStream.h" -#include "../memory/juce_OptionalScopedPointer.h" -#include "../memory/juce_HeapBlock.h" - - -//============================================================================== -/** 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(); - int64 getPosition(); - bool setPosition (int64 newPosition); - int read (void* destBuffer, int maxBytesToRead); - String readString(); - bool isExhausted(); - - -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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/streams/juce_FileInputSource.cpp b/src/juce/JuceLibraryCode/modules/juce_core/streams/juce_FileInputSource.cpp deleted file mode 100644 index e803a3ff..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/streams/juce_FileInputSource.cpp +++ /dev/null @@ -1,53 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -FileInputSource::FileInputSource (const File& file_, bool useFileTimeInHashGeneration_) - : file (file_), useFileTimeInHashGeneration (useFileTimeInHashGeneration_) -{ -} - -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/src/juce/JuceLibraryCode/modules/juce_core/streams/juce_FileInputSource.h b/src/juce/JuceLibraryCode/modules/juce_core/streams/juce_FileInputSource.h deleted file mode 100644 index 35b1984d..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/streams/juce_FileInputSource.h +++ /dev/null @@ -1,66 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_FILEINPUTSOURCE_JUCEHEADER__ -#define __JUCE_FILEINPUTSOURCE_JUCEHEADER__ - -#include "juce_InputSource.h" -#include "../files/juce_File.h" - - -//============================================================================== -/** - 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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/streams/juce_InputSource.h b/src/juce/JuceLibraryCode/modules/juce_core/streams/juce_InputSource.h deleted file mode 100644 index 456949ff..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/streams/juce_InputSource.h +++ /dev/null @@ -1,76 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_INPUTSOURCE_JUCEHEADER__ -#define __JUCE_INPUTSOURCE_JUCEHEADER__ - -#include "juce_InputStream.h" - -//============================================================================== -/** - 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 0 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 0 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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/streams/juce_InputStream.cpp b/src/juce/JuceLibraryCode/modules/juce_core/streams/juce_InputStream.cpp deleted file mode 100644 index f5afaf30..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/streams/juce_InputStream.cpp +++ /dev/null @@ -1,233 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -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); -} - -int InputStream::readIntoMemoryBlock (MemoryBlock& block, ssize_t numBytes) -{ - MemoryOutputStream mo (block, true); - return 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/src/juce/JuceLibraryCode/modules/juce_core/streams/juce_InputStream.h b/src/juce/JuceLibraryCode/modules/juce_core/streams/juce_InputStream.h deleted file mode 100644 index 187f219c..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/streams/juce_InputStream.h +++ /dev/null @@ -1,295 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_INPUTSTREAM_JUCEHEADER__ -#define __JUCE_INPUTSTREAM_JUCEHEADER__ - -#include "../text/juce_String.h" -class MemoryBlock; - - -//============================================================================== -/** 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 - 1 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 UTF8 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 UTF8 string from the stream. - - This will read characters from the stream until it hits a zero 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, and - will try to make an educated guess about whether it's unicode or an 8-bit encoding. - */ - 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 int 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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/streams/juce_MemoryInputStream.cpp b/src/juce/JuceLibraryCode/modules/juce_core/streams/juce_MemoryInputStream.cpp deleted file mode 100644 index 6ca74365..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/streams/juce_MemoryInputStream.cpp +++ /dev/null @@ -1,157 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -MemoryInputStream::MemoryInputStream (const void* const sourceData, - const size_t sourceDataSize, - const bool keepInternalCopy) - : data (static_cast (sourceData)), - dataSize (sourceDataSize), - position (0) -{ - if (keepInternalCopy) - createInternalCopy(); -} - -MemoryInputStream::MemoryInputStream (const MemoryBlock& sourceData, - const bool keepInternalCopy) - : data (static_cast (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 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, data + position, (size_t) num); - position += num; - return (int) 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 position; -} - - -//============================================================================== -#if JUCE_UNIT_TESTS - -class MemoryStreamTests : public UnitTest -{ -public: - MemoryStreamTests() : UnitTest ("MemoryInputStream & MemoryOutputStream") {} - - void runTest() - { - beginTest ("Basics"); - Random r; - - int randomInt = r.nextInt(); - int64 randomInt64 = r.nextInt64(); - double randomDouble = r.nextDouble(); - String randomString (createRandomWideCharString()); - - 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() - { - juce_wchar buffer [50] = { 0 }; - Random r; - - 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/src/juce/JuceLibraryCode/modules/juce_core/streams/juce_MemoryInputStream.h b/src/juce/JuceLibraryCode/modules/juce_core/streams/juce_MemoryInputStream.h deleted file mode 100644 index 74b9e14b..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/streams/juce_MemoryInputStream.h +++ /dev/null @@ -1,91 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_MEMORYINPUTSTREAM_JUCEHEADER__ -#define __JUCE_MEMORYINPUTSTREAM_JUCEHEADER__ - -#include "juce_InputStream.h" -#include "../memory/juce_HeapBlock.h" - - -//============================================================================== -/** - Allows a block of data and 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(); - - //============================================================================== - int64 getPosition(); - bool setPosition (int64 pos); - int64 getTotalLength(); - bool isExhausted(); - int read (void* destBuffer, int maxBytesToRead); - -private: - //============================================================================== - const char* data; - size_t dataSize, position; - HeapBlock internalCopy; - - void createInternalCopy(); - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MemoryInputStream); -}; - -#endif // __JUCE_MEMORYINPUTSTREAM_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/streams/juce_MemoryOutputStream.cpp b/src/juce/JuceLibraryCode/modules/juce_core/streams/juce_MemoryOutputStream.cpp deleted file mode 100644 index 40492634..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/streams/juce_MemoryOutputStream.cpp +++ /dev/null @@ -1,167 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -MemoryOutputStream::MemoryOutputStream (const size_t initialSize) - : data (internalBlock), - position (0), - size (0) -{ - internalBlock.setSize (initialSize, false); -} - -MemoryOutputStream::MemoryOutputStream (MemoryBlock& memoryBlockToWriteTo, - const bool appendToExistingBlockContent) - : data (memoryBlockToWriteTo), - position (0), - size (0) -{ - if (appendToExistingBlockContent) - position = size = memoryBlockToWriteTo.getSize(); -} - -MemoryOutputStream::~MemoryOutputStream() -{ - trimExternalBlockSize(); -} - -void MemoryOutputStream::flush() -{ - trimExternalBlockSize(); -} - -void MemoryOutputStream::trimExternalBlockSize() -{ - if (&data != &internalBlock) - data.setSize (size, false); -} - -void MemoryOutputStream::preallocate (const size_t bytesToPreallocate) -{ - data.ensureSize (bytesToPreallocate + 1); -} - -void MemoryOutputStream::reset() noexcept -{ - position = 0; - size = 0; -} - -void MemoryOutputStream::prepareToWrite (int numBytes) -{ - const size_t storageNeeded = position + numBytes; - - if (storageNeeded >= data.getSize()) - data.ensureSize ((storageNeeded + jmin ((int) (storageNeeded / 2), 1024 * 1024) + 32) & ~31); -} - -bool MemoryOutputStream::write (const void* const buffer, int howMany) -{ - jassert (buffer != nullptr && howMany >= 0); - - if (howMany > 0) - { - prepareToWrite (howMany); - memcpy (static_cast (data.getData()) + position, buffer, (size_t) howMany); - position += howMany; - size = jmax (size, position); - } - - return true; -} - -void MemoryOutputStream::writeRepeatedByte (uint8 byte, int howMany) -{ - if (howMany > 0) - { - prepareToWrite (howMany); - memset (static_cast (data.getData()) + position, byte, (size_t) howMany); - position += howMany; - size = jmax (size, position); - } -} - -MemoryBlock MemoryOutputStream::getMemoryBlock() const -{ - return MemoryBlock (getData(), getDataSize()); -} - -const void* MemoryOutputStream::getData() const noexcept -{ - if (data.getSize() > size) - static_cast (data.getData()) [size] = 0; - - return data.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; - } - else - { - // trying to make it bigger isn't a good thing to do.. - return false; - } -} - -int 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 > 0 && maxNumBytesToWrite < availableData) - availableData = maxNumBytesToWrite; - - preallocate (data.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 int dataSize = (int) streamToRead.getDataSize(); - if (dataSize > 0) - stream.write (streamToRead.getData(), dataSize); - - return stream; -} diff --git a/src/juce/JuceLibraryCode/modules/juce_core/streams/juce_MemoryOutputStream.h b/src/juce/JuceLibraryCode/modules/juce_core/streams/juce_MemoryOutputStream.h deleted file mode 100644 index af137a28..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/streams/juce_MemoryOutputStream.h +++ /dev/null @@ -1,132 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_MEMORYOUTPUTSTREAM_JUCEHEADER__ -#define __JUCE_MEMORYOUTPUTSTREAM_JUCEHEADER__ - -#include "juce_OutputStream.h" -#include "../memory/juce_MemoryBlock.h" -#include "../memory/juce_ScopedPointer.h" - - -//============================================================================== -/** - 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 for writing 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); - - /** 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); - - /** 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* buffer, int howMany); - int64 getPosition() { return position; } - bool setPosition (int64 newPosition); - int writeFromInputStream (InputStream& source, int64 maxNumBytesToWrite); - void writeRepeatedByte (uint8 byte, int numTimesToRepeat); - -private: - //============================================================================== - MemoryBlock& data; - MemoryBlock internalBlock; - size_t position, size; - - void trimExternalBlockSize(); - void prepareToWrite (int numBytes); - - 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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/streams/juce_OutputStream.cpp b/src/juce/JuceLibraryCode/modules/juce_core/streams/juce_OutputStream.cpp deleted file mode 100644 index 45b41cb7..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/streams/juce_OutputStream.cpp +++ /dev/null @@ -1,317 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#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.removeValue (this); - #endif -} - -//============================================================================== -void OutputStream::writeBool (const bool b) -{ - writeByte (b ? (char) 1 - : (char) 0); -} - -void OutputStream::writeByte (char byte) -{ - write (&byte, 1); -} - -void OutputStream::writeRepeatedByte (uint8 byte, int numTimesToRepeat) -{ - while (--numTimesToRepeat >= 0) - writeByte ((char) byte); -} - -void OutputStream::writeShort (short value) -{ - const unsigned short v = ByteOrder::swapIfBigEndian ((unsigned short) value); - write (&v, 2); -} - -void OutputStream::writeShortBigEndian (short value) -{ - const unsigned short v = ByteOrder::swapIfLittleEndian ((unsigned short) value); - write (&v, 2); -} - -void OutputStream::writeInt (int value) -{ - const unsigned int v = ByteOrder::swapIfBigEndian ((unsigned int) value); - write (&v, 4); -} - -void OutputStream::writeIntBigEndian (int value) -{ - const unsigned int v = ByteOrder::swapIfLittleEndian ((unsigned int) value); - write (&v, 4); -} - -void 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; - - write (data, num + 1); -} - -void OutputStream::writeInt64 (int64 value) -{ - const uint64 v = ByteOrder::swapIfBigEndian ((uint64) value); - write (&v, 8); -} - -void OutputStream::writeInt64BigEndian (int64 value) -{ - const uint64 v = ByteOrder::swapIfLittleEndian ((uint64) value); - write (&v, 8); -} - -void OutputStream::writeFloat (float value) -{ - union { int asInt; float asFloat; } n; - n.asFloat = value; - writeInt (n.asInt); -} - -void OutputStream::writeFloatBigEndian (float value) -{ - union { int asInt; float asFloat; } n; - n.asFloat = value; - writeIntBigEndian (n.asInt); -} - -void OutputStream::writeDouble (double value) -{ - union { int64 asInt; double asDouble; } n; - n.asDouble = value; - writeInt64 (n.asInt); -} - -void OutputStream::writeDoubleBigEndian (double value) -{ - union { int64 asInt; double asDouble; } n; - n.asDouble = value; - writeInt64BigEndian (n.asInt); -} - -void OutputStream::writeString (const String& text) -{ - // (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 int numBytes = text.getNumBytesAsUTF8() + 1; - HeapBlock temp ((size_t) numBytes); - text.copyToUTF8 (temp, numBytes); - write (temp, numBytes); -} - -void 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'); - writeShort ((short) c); - } - } - else - { - const char* src = text.toUTF8(); - const char* t = src; - - for (;;) - { - if (*t == '\n') - { - if (t > src) - write (src, (int) (t - src)); - - write ("\r\n", 2); - src = t + 1; - } - else if (*t == '\r') - { - if (t[1] == '\n') - ++t; - } - else if (*t == 0) - { - if (t > src) - write (src, (int) (t - src)); - - break; - } - - ++t; - } - } -} - -int OutputStream::writeFromInputStream (InputStream& source, int64 numBytesToWrite) -{ - if (numBytesToWrite < 0) - numBytesToWrite = std::numeric_limits::max(); - - int numWritten = 0; - - while (numBytesToWrite > 0 && ! source.isExhausted()) - { - char buffer [8192]; - const int num = source.read (buffer, (int) jmin (numBytesToWrite, (int64) sizeof (buffer))); - - if (num <= 0) - break; - - write (buffer, num); - - numBytesToWrite -= num; - numWritten += num; - } - - return numWritten; -} - -//============================================================================== -void OutputStream::setNewLineString (const String& newLineString_) -{ - newLineString = newLineString_; -} - -//============================================================================== -OutputStream& JUCE_CALLTYPE operator<< (OutputStream& stream, const int number) -{ - return stream << String (number); -} - -OutputStream& JUCE_CALLTYPE operator<< (OutputStream& stream, const double number) -{ - return stream << String (number); -} - -OutputStream& JUCE_CALLTYPE operator<< (OutputStream& stream, const char character) -{ - stream.writeByte (character); - return stream; -} - -OutputStream& JUCE_CALLTYPE operator<< (OutputStream& stream, const char* const text) -{ - stream.write (text, (int) strlen (text)); - return stream; -} - -OutputStream& JUCE_CALLTYPE operator<< (OutputStream& stream, const MemoryBlock& data) -{ - if (data.getSize() > 0) - stream.write (data.getData(), (int) data.getSize()); - - return stream; -} - -OutputStream& JUCE_CALLTYPE operator<< (OutputStream& stream, const File& fileToRead) -{ - FileInputStream in (fileToRead); - - if (in.openedOk()) - return stream << in; - - return stream; -} - -OutputStream& JUCE_CALLTYPE operator<< (OutputStream& stream, InputStream& streamToRead) -{ - stream.writeFromInputStream (streamToRead, -1); - return stream; -} - -OutputStream& JUCE_CALLTYPE operator<< (OutputStream& stream, const NewLine&) -{ - return stream << stream.getNewLineString(); -} diff --git a/src/juce/JuceLibraryCode/modules/juce_core/streams/juce_OutputStream.h b/src/juce/JuceLibraryCode/modules/juce_core/streams/juce_OutputStream.h deleted file mode 100644 index 36f2dcbe..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/streams/juce_OutputStream.h +++ /dev/null @@ -1,261 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_OUTPUTSTREAM_JUCEHEADER__ -#define __JUCE_OUTPUTSTREAM_JUCEHEADER__ - -#include "../text/juce_String.h" -#include "../text/juce_NewLine.h" -class InputStream; -class MemoryBlock; -class File; - - -//============================================================================== -/** - 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. This must not be negative. - @returns false if the write operation fails for some reason - */ - virtual bool write (const void* dataToWrite, - int numberOfBytes) = 0; - - //============================================================================== - /** Writes a single byte to the stream. - - @see InputStream::readByte - */ - virtual void 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. - @see InputStream::readBool - */ - virtual void 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). - @see InputStream::readShort - */ - virtual void 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). - @see InputStream::readShortBigEndian - */ - virtual void writeShortBigEndian (short value); - - /** Writes a 32-bit integer to the stream in a little-endian byte order. - @see InputStream::readInt - */ - virtual void writeInt (int value); - - /** Writes a 32-bit integer to the stream in a big-endian byte order. - @see InputStream::readIntBigEndian - */ - virtual void writeIntBigEndian (int value); - - /** Writes a 64-bit integer to the stream in a little-endian byte order. - @see InputStream::readInt64 - */ - virtual void writeInt64 (int64 value); - - /** Writes a 64-bit integer to the stream in a big-endian byte order. - @see InputStream::readInt64BigEndian - */ - virtual void 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. - @see InputStream::readFloat - */ - virtual void 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. - @see InputStream::readFloatBigEndian - */ - virtual void 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. - @see InputStream::readDouble - */ - virtual void 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 - */ - virtual void writeDoubleBigEndian (double value); - - /** Writes a byte to the output stream a given number of times. */ - virtual void writeRepeatedByte (uint8 byte, int 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. - - @see InputStream::readCompressedInt - */ - virtual void 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<< - - @see InputStream::readString, writeText, operator<< - */ - virtual void 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'. - */ - virtual void 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) - */ - virtual int 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 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. */ -OutputStream& JUCE_CALLTYPE operator<< (OutputStream& stream, int number); - -/** Writes a number to a stream as 8-bit characters in the default system encoding. */ -OutputStream& JUCE_CALLTYPE operator<< (OutputStream& stream, double number); - -/** Writes a character to a stream. */ -OutputStream& JUCE_CALLTYPE operator<< (OutputStream& stream, char character); - -/** Writes a null-terminated text string to a stream. */ -OutputStream& JUCE_CALLTYPE operator<< (OutputStream& stream, const char* text); - -/** Writes a block of data from a MemoryBlock to a stream. */ -OutputStream& JUCE_CALLTYPE operator<< (OutputStream& stream, const MemoryBlock& data); - -/** Writes the contents of a file to a stream. */ -OutputStream& JUCE_CALLTYPE operator<< (OutputStream& stream, const File& fileToRead); - -/** Writes the complete contents of an input stream to an output stream. */ -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 -*/ -OutputStream& JUCE_CALLTYPE operator<< (OutputStream& stream, const NewLine&); - - -#endif // __JUCE_OUTPUTSTREAM_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/streams/juce_SubregionStream.cpp b/src/juce/JuceLibraryCode/modules/juce_core/streams/juce_SubregionStream.cpp deleted file mode 100644 index 65790b74..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/streams/juce_SubregionStream.cpp +++ /dev/null @@ -1,84 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -SubregionStream::SubregionStream (InputStream* const sourceStream, - const int64 startPositionInSourceStream_, - const int64 lengthOfSourceStream_, - const bool deleteSourceWhenDestroyed) - : source (sourceStream, deleteSourceWhenDestroyed), - startPositionInSourceStream (startPositionInSourceStream_), - lengthOfSourceStream (lengthOfSourceStream_) -{ - 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); - } - else - { - maxBytesToRead = (int) jmin ((int64) maxBytesToRead, lengthOfSourceStream - getPosition()); - - if (maxBytesToRead <= 0) - return 0; - - return source->read (destBuffer, maxBytesToRead); - } -} - -bool SubregionStream::isExhausted() -{ - if (lengthOfSourceStream >= 0) - return (getPosition() >= lengthOfSourceStream) || source->isExhausted(); - else - return source->isExhausted(); -} diff --git a/src/juce/JuceLibraryCode/modules/juce_core/streams/juce_SubregionStream.h b/src/juce/JuceLibraryCode/modules/juce_core/streams/juce_SubregionStream.h deleted file mode 100644 index 2b3a712b..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/streams/juce_SubregionStream.h +++ /dev/null @@ -1,89 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_SUBREGIONSTREAM_JUCEHEADER__ -#define __JUCE_SUBREGIONSTREAM_JUCEHEADER__ - -#include "juce_InputStream.h" -#include "../memory/juce_OptionalScopedPointer.h" - - -//============================================================================== -/** 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(); - int64 getPosition(); - bool setPosition (int64 newPosition); - int read (void* destBuffer, int maxBytesToRead); - bool isExhausted(); - - - //============================================================================== -private: - OptionalScopedPointer source; - const int64 startPositionInSourceStream, lengthOfSourceStream; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (SubregionStream); -}; - -#endif // __JUCE_SUBREGIONSTREAM_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/system/juce_PlatformDefs.h b/src/juce/JuceLibraryCode/modules/juce_core/system/juce_PlatformDefs.h deleted file mode 100644 index 353e7d59..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/system/juce_PlatformDefs.h +++ /dev/null @@ -1,320 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_PLATFORMDEFS_JUCEHEADER__ -#define __JUCE_PLATFORMDEFS_JUCEHEADER__ - -//============================================================================== -/* 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 - #define juce_LogCurrentAssertion juce::logAssertion (__FILE__, __LINE__); -#elif JUCE_DEBUG - #define juce_LogCurrentAssertion std::cerr << "JUCE Assertion failure in " << __FILE__ << ", line " << __LINE__ << std::endl; -#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_INTRINSICS - #ifndef __INTEL_COMPILER - #pragma intrinsic (__debugbreak) - #endif - #define juce_breakDebugger { __debugbreak(); } -#elif JUCE_GCC || JUCE_MAC - #define juce_breakDebugger { asm ("int $3"); } -#else - #define juce_breakDebugger { __asm int 3 } -#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) { 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 { juce_LogCurrentAssertion; if (juce::juce_isRunningUnderDebugger()) juce_breakDebugger; } - - //============================================================================== - /** 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) { if (! (expression)) jassertfalse; } - -#else - //============================================================================== - // If debugging is disabled, these dummy debug and assertion macros are used.. - - #define DBG(dbgtext) - #define jassertfalse { juce_LogCurrentAssertion } - - #if JUCE_LOG_ASSERTIONS - #define jassert(expression) { if (! (expression)) jassertfalse; } - #else - #define jassert(a) {} - #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&);\ - className& operator= (const className&) - -/** 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); \ - static void operator delete (void*); - - -//============================================================================== -#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_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 JUCEApplication - object so they can be logged by the application if it wants to. - */ - #define JUCE_CATCH_EXCEPTION \ - catch (const std::exception& e) \ - { \ - JUCEApplication::sendUnhandledException (&e, __FILE__, __LINE__); \ - } \ - catch (...) \ - { \ - JUCEApplication::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.. -#if DOXYGEN || (JUCE_MSVC && ! JUCE_NO_DEPRECATION_WARNINGS) - /** This can be used to wrap a function which has been deprecated. */ - #define JUCE_DEPRECATED(functionDef) __declspec(deprecated) functionDef -#elif JUCE_GCC && ! JUCE_NO_DEPRECATION_WARNINGS - #define JUCE_DEPRECATED(functionDef) functionDef __attribute__ ((deprecated)) -#else - #define JUCE_DEPRECATED(functionDef) functionDef -#endif - -//============================================================================== -#if JUCE_ANDROID && ! DOXYGEN - #define JUCE_MODAL_LOOPS_PERMITTED 0 -#else - /** 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 - -//============================================================================== -// Here, we'll check for C++11 compiler support, and if it's not available, define -// a few workarounds, so that we can still use some of the newer language features. -#if defined (__GXX_EXPERIMENTAL_CXX0X__) && defined (__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)) - #define JUCE_COMPILER_SUPPORTS_NOEXCEPT 1 - #define JUCE_COMPILER_SUPPORTS_NULLPTR 1 - #define JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS 1 -#endif - -#if defined (__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 -#endif - -#if defined (_MSC_VER) && _MSC_VER >= 1600 - #if _MSC_VER >= 1700 - #define JUCE_COMPILER_SUPPORTS_NOEXCEPT 1 - #else - #define JUCE_COMPILER_SUPPORTS_NOEXCEPT 0 - #endif - #define JUCE_COMPILER_SUPPORTS_NULLPTR 1 - #define JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS 1 -#endif - -//============================================================================== -// Declare some fake versions of nullptr and noexcept, for older compilers: -#if ! (DOXYGEN || JUCE_COMPILER_SUPPORTS_NOEXCEPT) - #define noexcept throw() -#endif - -#if ! (DOXYGEN || JUCE_COMPILER_SUPPORTS_NULLPTR) - #define nullptr (0) -#endif - -#endif // __JUCE_PLATFORMDEFS_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/system/juce_StandardHeader.h b/src/juce/JuceLibraryCode/modules/juce_core/system/juce_StandardHeader.h deleted file mode 100644 index aaf05337..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/system/juce_StandardHeader.h +++ /dev/null @@ -1,200 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_STANDARDHEADER_JUCEHEADER__ -#define __JUCE_STANDARDHEADER_JUCEHEADER__ - -//============================================================================== -/** Current JUCE version number. - - See also SystemStats::getJUCEVersion() for a string version. -*/ -#define JUCE_MAJOR_VERSION 2 -#define JUCE_MINOR_VERSION 0 -#define JUCE_BUILDNUMBER 21 - -/** 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 "juce_TargetPlatform.h" // (sets up the various JUCE_WINDOWS, JUCE_MAC, etc flags) - -//============================================================================== -#ifndef DOXYGEN - // These are old macros that are now deprecated: you should just use the juce namespace directly. - #define JUCE_NAMESPACE juce - #define BEGIN_JUCE_NAMESPACE namespace juce { - #define END_JUCE_NAMESPACE } -#endif - -//============================================================================== -#include "juce_PlatformDefs.h" - -// Now we'll include any OS headers we need.. (at this point we are outside the Juce namespace). -#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 - -#if JUCE_USE_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 - -//============================================================================== -// 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 (__GNUC__) && ((__GNUC__ >= 4) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) - #ifdef JUCE_DLL_BUILD - #define JUCE_API __attribute__ ((visibility("default"))) - #endif -#endif - -#ifndef JUCE_API - /** This macro is added to all juce public class declarations. */ - #define JUCE_API -#endif - -/** This macro is added to all juce public function declarations. */ -#define JUCE_PUBLIC_FUNCTION JUCE_API JUCE_CALLTYPE - -/** This turns on some non-essential bits of code that should prevent old code from compiling - in cases where method signatures have changed, etc. -*/ -#if (! defined (JUCE_CATCH_DEPRECATED_CODE_MISUSE)) && JUCE_DEBUG && ! DOXYGEN - #define JUCE_CATCH_DEPRECATED_CODE_MISUSE 1 -#endif - -//============================================================================== -// Now include some basics that are needed by most of the Juce classes... -BEGIN_JUCE_NAMESPACE - -extern JUCE_API bool JUCE_CALLTYPE juce_isRunningUnderDebugger(); - -#if JUCE_LOG_ASSERTIONS - extern JUCE_API void logAssertion (const char* filename, int lineNum) noexcept; -#endif - -#undef max -#undef min - -#include "../memory/juce_Memory.h" -#include "../maths/juce_MathsFunctions.h" -#include "../memory/juce_ByteOrder.h" -#include "../logging/juce_Logger.h" -#include "../memory/juce_LeakedObjectDetector.h" - -// unbelievably, some system headers actually use macros to define these symbols: -#undef check -#undef TYPE_BOOL - -//============================================================================== -#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. */ - #define JUCE_AUTORELEASEPOOL const juce::ScopedAutoReleasePool JUCE_JOIN_MACRO (autoReleasePool_, __LINE__); - -#else - #define JUCE_AUTORELEASEPOOL -#endif - -END_JUCE_NAMESPACE - - -#endif // __JUCE_STANDARDHEADER_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/system/juce_SystemStats.cpp b/src/juce/JuceLibraryCode/modules/juce_core/system/juce_SystemStats.cpp deleted file mode 100644 index 78118aed..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/system/juce_SystemStats.cpp +++ /dev/null @@ -1,61 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -const SystemStats::CPUFlags& SystemStats::getCPUFlags() -{ - static CPUFlags cpuFlags; - return cpuFlags; -} - -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_DEBUG && ! JUCE_ANDROID - struct JuceVersionPrinter - { - JuceVersionPrinter() - { - DBG (SystemStats::getJUCEVersion()); - } - }; - - static JuceVersionPrinter juceVersionPrinter; -#endif diff --git a/src/juce/JuceLibraryCode/modules/juce_core/system/juce_SystemStats.h b/src/juce/JuceLibraryCode/modules/juce_core/system/juce_SystemStats.h deleted file mode 100644 index 7d67acef..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/system/juce_SystemStats.h +++ /dev/null @@ -1,178 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_SYSTEMSTATS_JUCEHEADER__ -#define __JUCE_SYSTEMSTATS_JUCEHEADER__ - -#include "../text/juce_StringArray.h" - - -//============================================================================== -/** - 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, - - MacOSX = 0x1000, - Linux = 0x2000, - Android = 0x3000, - - Win95 = 0x4001, - Win98 = 0x4002, - WinNT351 = 0x4103, - WinNT40 = 0x4104, - Win2000 = 0x4105, - WinXP = 0x4106, - WinVista = 0x4107, - Windows7 = 0x4108, - - Windows = 0x4000, /**< To test whether any version of Windows is running, - you can use the expression ((getOperatingSystemType() & Windows) != 0). */ - WindowsNT = 0x0100, /**< To test whether the platform is Windows NT or later (i.e. not Win95 or 98), - you can use the expression ((getOperatingSystemType() & WindowsNT) != 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(); - - #if JUCE_MAC || DOXYGEN - /** OSX ONLY - Returns the current OS version number. - E.g. if it's running on 10.4, this will be 4, 10.5 will return 5, etc. - */ - static int getOSXMinorVersionNumber(); - #endif - - //============================================================================== - /** 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(); - - //============================================================================== - // CPU and memory information.. - - /** Returns the number of CPUs. */ - static int getNumCpus() noexcept { return getCPUFlags().numCpus; } - - /** 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(); - - /** Checks whether Intel MMX instructions are available. */ - static bool hasMMX() noexcept { return getCPUFlags().hasMMX; } - - /** Checks whether Intel SSE instructions are available. */ - static bool hasSSE() noexcept { return getCPUFlags().hasSSE; } - - /** Checks whether Intel SSE2 instructions are available. */ - static bool hasSSE2() noexcept { return getCPUFlags().hasSSE2; } - - /** Checks whether AMD 3DNOW instructions are available. */ - static bool has3DNow() noexcept { return getCPUFlags().has3DNow; } - - //============================================================================== - /** 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(); - - -private: - //============================================================================== - struct CPUFlags - { - CPUFlags(); - - int numCpus; - bool hasMMX : 1; - bool hasSSE : 1; - bool hasSSE2 : 1; - bool has3DNow : 1; - }; - - SystemStats(); - static const CPUFlags& getCPUFlags(); - - JUCE_DECLARE_NON_COPYABLE (SystemStats); -}; - - -#endif // __JUCE_SYSTEMSTATS_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/system/juce_TargetPlatform.h b/src/juce/JuceLibraryCode/modules/juce_core/system/juce_TargetPlatform.h deleted file mode 100644 index 13517229..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/system/juce_TargetPlatform.h +++ /dev/null @@ -1,189 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_TARGETPLATFORM_JUCEHEADER__ -#define __JUCE_TARGETPLATFORM_JUCEHEADER__ - -//============================================================================== -/* 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 -#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 - #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 -#endif - -#if JUCE_MAC - - #if defined (__ppc__) || defined (__ppc64__) - #define JUCE_PPC 1 - #else - #define JUCE_INTEL 1 - #endif - - #ifdef __LP64__ - #define JUCE_64BIT 1 - #else - #define JUCE_32BIT 1 - #endif - - #if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_4 - #error "Building for OSX 10.3 is no longer supported!" - #endif - - #ifndef 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) - #define JUCE_64BIT 1 - #else - #define JUCE_32BIT 1 - #endif - - #if __MMX__ || __SSE__ || __amd64__ - #define JUCE_INTEL 1 - #endif -#endif - -//============================================================================== -// Compiler type macros. - -#ifdef __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_INTRINSICS 1 - #endif -#else - #error unknown compiler -#endif - - -#endif // __JUCE_TARGETPLATFORM_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/text/juce_CharPointer_ASCII.h b/src/juce/JuceLibraryCode/modules/juce_core/text/juce_CharPointer_ASCII.h deleted file mode 100644 index 66630add..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/text/juce_CharPointer_ASCII.h +++ /dev/null @@ -1,384 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_CHARPOINTER_ASCII_JUCEHEADER__ -#define __JUCE_CHARPOINTER_ASCII_JUCEHEADER__ - - -//============================================================================== -/** - 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== (const CharPointer_ASCII& other) const noexcept { return data == other.data; } - inline bool operator!= (const CharPointer_ASCII& other) const noexcept { return data != other.data; } - inline bool operator<= (const CharPointer_ASCII& other) const noexcept { return data <= other.data; } - inline bool operator< (const CharPointer_ASCII& other) const noexcept { return data < other.data; } - inline bool operator>= (const CharPointer_ASCII& other) const noexcept { return data >= other.data; } - inline bool operator> (const 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 - int writeWithDestByteLimit (const CharPointer& src, const int 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_WINDOWS - return stricmp (data, other.data); - #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 - 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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/text/juce_CharPointer_UTF16.h b/src/juce/JuceLibraryCode/modules/juce_core/text/juce_CharPointer_UTF16.h deleted file mode 100644 index c44fb8ea..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/text/juce_CharPointer_UTF16.h +++ /dev/null @@ -1,498 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_CHARPOINTER_UTF16_JUCEHEADER__ -#define __JUCE_CHARPOINTER_UTF16_JUCEHEADER__ - - -//============================================================================== -/** - 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= (const 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== (const CharPointer_UTF16& other) const noexcept { return data == other.data; } - inline bool operator!= (const CharPointer_UTF16& other) const noexcept { return data != other.data; } - inline bool operator<= (const CharPointer_UTF16& other) const noexcept { return data <= other.data; } - inline bool operator< (const CharPointer_UTF16& other) const noexcept { return data < other.data; } - inline bool operator>= (const CharPointer_UTF16& other) const noexcept { return data >= other.data; } - inline bool operator> (const 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 - int writeWithDestByteLimit (const CharPointer& src, const int 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_WINDOWS && ! 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_WINDOWS - return _wtoi (data); - #else - return CharacterFunctions::getIntValue (*this); - #endif - } - - /** Parses this string as a 64-bit integer. */ - int64 getIntValue64() const noexcept - { - #if JUCE_WINDOWS - 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 /= 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 - }; - -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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/text/juce_CharPointer_UTF32.h b/src/juce/JuceLibraryCode/modules/juce_core/text/juce_CharPointer_UTF32.h deleted file mode 100644 index 7d707b9f..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/text/juce_CharPointer_UTF32.h +++ /dev/null @@ -1,375 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_CHARPOINTER_UTF32_JUCEHEADER__ -#define __JUCE_CHARPOINTER_UTF32_JUCEHEADER__ - - -//============================================================================== -/** - 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= (const 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== (const CharPointer_UTF32& other) const noexcept { return data == other.data; } - inline bool operator!= (const CharPointer_UTF32& other) const noexcept { return data != other.data; } - inline bool operator<= (const CharPointer_UTF32& other) const noexcept { return data <= other.data; } - inline bool operator< (const CharPointer_UTF32& other) const noexcept { return data < other.data; } - inline bool operator>= (const CharPointer_UTF32& other) const noexcept { return data >= other.data; } - inline bool operator> (const 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 - int writeWithDestByteLimit (const CharPointer& src, const int 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 /= 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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/text/juce_CharPointer_UTF8.h b/src/juce/JuceLibraryCode/modules/juce_core/text/juce_CharPointer_UTF8.h deleted file mode 100644 index 6df77e15..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/text/juce_CharPointer_UTF8.h +++ /dev/null @@ -1,571 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_CHARPOINTER_UTF8_JUCEHEADER__ -#define __JUCE_CHARPOINTER_UTF8_JUCEHEADER__ - -//============================================================================== -/** - 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= (const 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== (const CharPointer_UTF8& other) const noexcept { return data == other.data; } - inline bool operator!= (const CharPointer_UTF8& other) const noexcept { return data != other.data; } - inline bool operator<= (const CharPointer_UTF8& other) const noexcept { return data <= other.data; } - inline bool operator< (const CharPointer_UTF8& other) const noexcept { return data < other.data; } - inline bool operator>= (const CharPointer_UTF8& other) const noexcept { return data >= other.data; } - inline bool operator> (const 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 - { - 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 - { - const char n = *--data; - - if ((n & 0xc0) == 0xc0) - { - int count = 3; - - do - { - --data; - } - while ((*data & 0xc0) == 0xc0 && --count >= 0); - } - - 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; - - 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) - { - uint32 bit = 0x40; - - while ((n & bit) != 0) - { - ++d; - bit >>= 1; - - if (bit == 0) - break; // illegal utf-8 sequence - } - } - 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 - int writeWithDestByteLimit (const CharPointer& src, const int 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_WINDOWS - return stricmp (data, other.data); - #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 { return *data == ' ' || (*data <= 13 && *data >= 9); } - /** Returns true if the first character of this string is a digit. */ - bool isDigit() const noexcept { return *data >= '0' && *data <= '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 - 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) - { - uint32 n = (uint32) (uint8) byte; - uint32 mask = 0x7f; - uint32 bit = 0x40; - int numExtraValues = 0; - - while ((n & bit) != 0) - { - if (bit <= 0x10) - return false; - - mask >>= 1; - ++numExtraValues; - bit >>= 1; - } - - n &= mask; - - while (--numExtraValues >= 0) - { - const uint32 nextByte = (uint32) (uint8) *dataToTest++; - - if ((nextByte & 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 - }; - -private: - CharType* data; -}; - -#endif // __JUCE_CHARPOINTER_UTF8_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/text/juce_CharacterFunctions.cpp b/src/juce/JuceLibraryCode/modules/juce_core/text/juce_CharacterFunctions.cpp deleted file mode 100644 index e58814f7..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/text/juce_CharacterFunctions.cpp +++ /dev/null @@ -1,151 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -//============================================================================== -#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 = 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/src/juce/JuceLibraryCode/modules/juce_core/text/juce_CharacterFunctions.h b/src/juce/JuceLibraryCode/modules/juce_core/text/juce_CharacterFunctions.h deleted file mode 100644 index b5e25c0f..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/text/juce_CharacterFunctions.h +++ /dev/null @@ -1,581 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_CHARACTERFUNCTIONS_JUCEHEADER__ -#define __JUCE_CHARACTERFUNCTIONS_JUCEHEADER__ - - -//============================================================================== -#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; - } - - //============================================================================== - /** 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 int copyWithDestByteLimit (DestCharPointerType& dest, SrcCharPointerType src, int maxBytes) noexcept - { - typename DestCharPointerType::CharType const* const startAddress = dest.getAddress(); - maxBytes -= sizeof (typename DestCharPointerType::CharType); // (allow for a terminating null) - - for (;;) - { - const juce_wchar c = src.getAndAdvance(); - const int bytesNeeded = (int) DestCharPointerType::getBytesRequiredFor (c); - - maxBytes -= bytesNeeded; - if (c == 0 || maxBytes < 0) - break; - - dest.write (c); - } - - dest.writeNull(); - - return (int) (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; - else 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; - else 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 (;;) - { - int c1 = (int) s1.toUpperCase(); - int c2 = (int) s2.toUpperCase(); - ++s1; - ++s2; - - const int diff = c1 - c2; - if (diff != 0) - return diff < 0 ? -1 : 1; - else if (c1 == 0) - break; - } - - 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) - { - int c1 = s1.toUpperCase(); - int c2 = s2.toUpperCase(); - ++s1; - ++s2; - - const int diff = c1 - c2; - if (diff != 0) - return diff < 0 ? -1 : 1; - else if (c1 == 0) - break; - } - - 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 haystack, const CharPointerType2& needle) noexcept - { - int index = 0; - const int needleLength = (int) needle.length(); - - for (;;) - { - if (haystack.compareUpTo (needle, needleLength) == 0) - return index; - - if (haystack.getAndAdvance() == 0) - return -1; - - ++index; - } - } - - /** 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 (const Type& text) noexcept - { - Type p (text); - - while (p.isWhitespace()) - ++p; - - return p; - } - - /** Returns a pointer to the first character in the string which is found in - the breakCharacters string. - */ - template - static Type findEndOfToken (const Type& text, const Type& breakCharacters, const Type& quoteCharacters) - { - Type t (text); - juce_wchar currentQuoteChar = 0; - - while (! t.isEmpty()) - { - const juce_wchar c = t.getAndAdvance(); - - if (currentQuoteChar == 0 && breakCharacters.indexOf (c) >= 0) - { - --t; - break; - } - - if (quoteCharacters.indexOf (c) >= 0) - { - if (currentQuoteChar == 0) - currentQuoteChar = c; - else if (currentQuoteChar == c) - currentQuoteChar = 0; - } - } - - return t; - } - -private: - static double mulexp10 (const double value, int exponent) noexcept; -}; - - -#endif // __JUCE_CHARACTERFUNCTIONS_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/text/juce_Identifier.cpp b/src/juce/JuceLibraryCode/modules/juce_core/text/juce_Identifier.cpp deleted file mode 100644 index 2bfe8e42..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/text/juce_Identifier.cpp +++ /dev/null @@ -1,72 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -StringPool& Identifier::getPool() -{ - static StringPool pool; - return pool; -} - -Identifier::Identifier() noexcept - : name (nullptr) -{ -} - -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& name_) - : name (Identifier::getPool().getPooledString (name_)) -{ - /* 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 (name_)); -} - -Identifier::Identifier (const char* const name_) - : name (Identifier::getPool().getPooledString (name_)) -{ - /* 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() -{ -} - -bool Identifier::isValidIdentifier (const String& possibleIdentifier) noexcept -{ - return possibleIdentifier.isNotEmpty() - && possibleIdentifier.containsOnly ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-:#@$%"); -} diff --git a/src/juce/JuceLibraryCode/modules/juce_core/text/juce_Identifier.h b/src/juce/JuceLibraryCode/modules/juce_core/text/juce_Identifier.h deleted file mode 100644 index 875b4090..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/text/juce_Identifier.h +++ /dev/null @@ -1,99 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_IDENTIFIER_JUCEHEADER__ -#define __JUCE_IDENTIFIER_JUCEHEADER__ - -class StringPool; - - -//============================================================================== -/** - Represents a string identifier, designed for accessing properties by name. - - Identifier objects are very light and fast to copy, but slower to initialise - from a string, so it's much faster to keep a static identifier object to refer - to frequently-used names, rather than constructing them each time you need it. - - @see NamedPropertySet, 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 a copy of another identifier. */ - Identifier (const Identifier& other) noexcept; - - /** Creates a copy of another identifier. */ - Identifier& operator= (const Identifier& other) noexcept; - - /** Destructor */ - ~Identifier(); - - /** Compares two identifiers. This is a very fast operation. */ - inline bool operator== (const Identifier& other) const noexcept { return name == other.name; } - - /** Compares two identifiers. This is a very fast operation. */ - inline bool operator!= (const Identifier& other) const noexcept { return name != other.name; } - - /** Returns this identifier as a string. */ - String toString() const { return name; } - - /** Returns this identifier's raw string pointer. */ - operator const String::CharPointerType() const noexcept { return name; } - - /** Returns this identifier's raw string pointer. */ - const String::CharPointerType getCharPointer() const noexcept { return name; } - - /** 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::CharPointerType name; - - static StringPool& getPool(); -}; - - -#endif // __JUCE_IDENTIFIER_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/text/juce_LocalisedStrings.cpp b/src/juce/JuceLibraryCode/modules/juce_core/text/juce_LocalisedStrings.cpp deleted file mode 100644 index 2ac7fae0..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/text/juce_LocalisedStrings.cpp +++ /dev/null @@ -1,188 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -LocalisedStrings::LocalisedStrings (const String& fileContents) -{ - loadFromText (fileContents); -} - -LocalisedStrings::LocalisedStrings (const File& fileToLoad) -{ - loadFromText (fileToLoad.loadFileAsString()); -} - -LocalisedStrings::~LocalisedStrings() -{ -} - -//============================================================================== -String LocalisedStrings::translate (const String& text) const -{ - return translations.getValue (text, text); -} - -String LocalisedStrings::translate (const String& text, const String& resultIfNotFound) const -{ - 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())); - } - }; - - LeakAvoidanceTrick leakAvoidanceTrick; - #endif - - SpinLock currentMappingsLock; - ScopedPointer currentMappings; - - 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; - } - - String unescapeString (const String& s) - { - return s.replace ("\\\"", "\"") - .replace ("\\\'", "\'") - .replace ("\\t", "\t") - .replace ("\\r", "\r") - .replace ("\\n", "\n"); - } -} - -void LocalisedStrings::loadFromText (const String& fileContents) -{ - 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(); - } - } -} - -void LocalisedStrings::setIgnoresCase (const bool shouldIgnoreCase) -{ - translations.setIgnoresCase (shouldIgnoreCase); -} - -//============================================================================== -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 (String (text)); -} - -String translate (const String& text) -{ - return translate (text, text); -} - -String translate (const char* const literal) -{ - const String text (literal); - return translate (text, text); -} - -String translate (const String& text, const String& resultIfNotFound) -{ - const SpinLock::ScopedLockType sl (currentMappingsLock); - - const LocalisedStrings* const currentMappings = LocalisedStrings::getCurrentMappings(); - if (currentMappings != nullptr) - return currentMappings->translate (text, resultIfNotFound); - - return resultIfNotFound; -} diff --git a/src/juce/JuceLibraryCode/modules/juce_core/text/juce_LocalisedStrings.h b/src/juce/JuceLibraryCode/modules/juce_core/text/juce_LocalisedStrings.h deleted file mode 100644 index ce552cde..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/text/juce_LocalisedStrings.h +++ /dev/null @@ -1,214 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_LOCALISEDSTRINGS_JUCEHEADER__ -#define __JUCE_LOCALISEDSTRINGS_JUCEHEADER__ - -#include "juce_StringPairArray.h" -#include "../files/juce_File.h" - -//============================================================================== -/** - 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); - - /** 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); - - /** 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 zero 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 0 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; } - - - //============================================================================== - /** Indicates whether to use a case-insensitive search when looking up a string. - This defaults to true. - */ - void setIgnoresCase (bool shouldIgnoreCase); - -private: - //============================================================================== - String languageName; - StringArray countryCodes; - StringPairArray translations; - - void loadFromText (const String& fileContents); - - 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 - -/** Uses the LocalisedStrings class to translate the given string literal. - @see LocalisedStrings -*/ -String translate (const String& stringLiteral); - -/** Uses the LocalisedStrings class to translate the given string literal. - @see LocalisedStrings -*/ -String translate (const char* stringLiteral); - -/** Uses the LocalisedStrings class to translate the given string literal. - @see LocalisedStrings -*/ -String translate (const String& stringLiteral, const String& resultIfNotFound); - - -#endif // __JUCE_LOCALISEDSTRINGS_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/text/juce_NewLine.h b/src/juce/JuceLibraryCode/modules/juce_core/text/juce_NewLine.h deleted file mode 100644 index c8dda472..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/text/juce_NewLine.h +++ /dev/null @@ -1,75 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_NEWLINE_JUCEHEADER__ -#define __JUCE_NEWLINE_JUCEHEADER__ - - -//============================================================================== -/** 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(); } -}; - -//============================================================================== -/** 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&); - - -#endif // __JUCE_NEWLINE_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/text/juce_String.cpp b/src/juce/JuceLibraryCode/modules/juce_core/text/juce_String.cpp deleted file mode 100644 index bb9e5609..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/text/juce_String.cpp +++ /dev/null @@ -1,2389 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#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)); -} - -//============================================================================== -class StringHolder -{ -public: - StringHolder() - : refCount (0x3fffffff), allocatedNumBytes (sizeof (*text)) - { - text[0] = 0; - } - - typedef String::CharPointerType CharPointerType; - typedef String::CharPointerType::CharType CharType; - - //============================================================================== - static const CharPointerType createUninitialisedBytes (const size_t numBytes) - { - 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 const CharPointerType createFromCharPointer (const CharPointer& text) - { - if (text.getAddress() == nullptr || text.isEmpty()) - return getEmpty(); - - 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 const CharPointerType createFromCharPointer (const CharPointer& text, size_t maxChars) - { - if (text.getAddress() == nullptr || text.isEmpty() || maxChars == 0) - return getEmpty(); - - 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 const CharPointerType createFromCharPointer (const CharPointer& start, const CharPointer& end) - { - if (start.getAddress() == nullptr || start.isEmpty()) - return getEmpty(); - - 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 const 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 inline const CharPointerType getEmpty() noexcept - { - return CharPointerType (empty.text); - } - - //============================================================================== - static void retain (const CharPointerType& text) noexcept - { - ++(bufferFromText (text)->refCount); - } - - static inline void release (StringHolder* const b) noexcept - { - if (--(b->refCount) == -1 && b != &empty) - delete[] reinterpret_cast (b); - } - - static void release (const CharPointerType& text) noexcept - { - release (bufferFromText (text)); - } - - //============================================================================== - static CharPointerType makeUnique (const CharPointerType& text) - { - StringHolder* const b = bufferFromText (text); - - if (b->refCount.get() <= 0) - return text; - - CharPointerType newText (createUninitialisedBytes (b->allocatedNumBytes)); - memcpy (newText.getAddress(), text.getAddress(), b->allocatedNumBytes); - release (b); - - return newText; - } - - static CharPointerType makeUniqueWithByteSize (const CharPointerType& text, size_t numBytes) - { - StringHolder* const b = bufferFromText (text); - - if (b->refCount.get() <= 0 && b->allocatedNumBytes >= numBytes) - 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]; - - static StringHolder empty; - -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 - } -}; - -StringHolder StringHolder::empty; -const String String::empty; - -//============================================================================== -void String::preallocateBytes (const size_t numBytesNeeded) -{ - text = StringHolder::makeUniqueWithByteSize (text, numBytesNeeded + sizeof (CharPointerType::CharType)); -} - -//============================================================================== -String::String() noexcept - : text (StringHolder::getEmpty()) -{ -} - -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); -} - -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 = StringHolder::getEmpty(); -} - -String& String::operator= (String&& other) noexcept -{ - std::swap (text, other.text); - return *this; -} -#endif - -inline String::PreallocationBytes::PreallocationBytes (const size_t numBytes_) : numBytes (numBytes_) {} - -String::String (const PreallocationBytes& preallocationSize) - : text (StringHolder::createUninitialisedBytes (preallocationSize.numBytes + sizeof (CharPointerType::CharType))) -{ -} - -//============================================================================== -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. - */ - 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. - */ - 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::charToString (const juce_wchar character) -{ - String result (PreallocationBytes (CharPointerType::getBytesRequiredFor (character))); - CharPointerType t (result.text); - t.write (character); - t.writeNull(); - return result; -} - -//============================================================================== -namespace NumberToStringConverters -{ - // pass in a pointer to the END of a buffer.. - static char* numberToString (char* t, const int64 n) noexcept - { - *--t = 0; - int64 v = (n >= 0) ? n : -n; - - do - { - *--t = (char) ('0' + (int) (v % 10)); - v /= 10; - - } while (v > 0); - - if (n < 0) - *--t = '-'; - - return t; - } - - static char* numberToString (char* t, uint64 v) noexcept - { - *--t = 0; - - do - { - *--t = (char) ('0' + (int) (v % 10)); - v /= 10; - - } while (v > 0); - - return t; - } - - static char* numberToString (char* t, const int n) noexcept - { - if (n == (int) 0x80000000) // (would cause an overflow) - return numberToString (t, (int64) n); - - *--t = 0; - int v = abs (n); - - do - { - *--t = (char) ('0' + (v % 10)); - v /= 10; - - } while (v > 0); - - if (n < 0) - *--t = '-'; - - return t; - } - - static char* numberToString (char* t, unsigned int v) noexcept - { - *--t = 0; - - do - { - *--t = (char) ('0' + (v % 10)); - v /= 10; - - } while (v > 0); - - return t; - } - - static char* doubleToString (char* buffer, const int numChars, double n, int numDecPlaces, size_t& len) noexcept - { - if (numDecPlaces > 0 && 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; - } - else - { - // Use a locale-free sprintf where possible (not available on linux AFAICT) - #if JUCE_WINDOWS - len = (size_t) _sprintf_l (buffer, "%.9g", _create_locale (LC_NUMERIC, "C"), n); - #elif JUCE_MAC || JUCE_IOS - len = (size_t) sprintf_l (buffer, nullptr, "%.9g", n); - #else - len = (size_t) sprintf (buffer, "%.9g", n); - #endif - - return buffer; - } - } - - template - String::CharPointerType createFromInteger (const IntegerType number) - { - char buffer [32]; - 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 [48]; - 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(); -} - -size_t String::getByteOffsetOfEnd() const noexcept -{ - return (size_t) (((char*) text.findTerminatingNull().getAddress()) - (char*) text.getAddress()); -} - -const juce_wchar String::operator[] (int index) const noexcept -{ - jassert (index == 0 || (index > 0 && index <= (int) text.lengthUpTo ((size_t) index + 1))); - return text [index]; -} - -int String::hashCode() const noexcept -{ - CharPointerType t (text); - int result = 0; - - while (! t.isEmpty()) - result = 31 * result + (int) t.getAndAdvance(); - - return result; -} - -int64 String::hashCode64() const noexcept -{ - CharPointerType t (text); - int64 result = 0; - - while (! t.isEmpty()) - result = 101 * result + t.getAndAdvance(); - - return result; -} - -//============================================================================== -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* const s2) noexcept { return s1.compare (s2) == 0; } -JUCE_API bool JUCE_CALLTYPE operator== (const String& s1, const wchar_t* const s2) noexcept { return s1.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_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 char* const s2) noexcept { return s1.compare (s2) != 0; } -JUCE_API bool JUCE_CALLTYPE operator!= (const String& s1, const wchar_t* const s2) noexcept { return s1.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_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 (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); } - -int String::compareLexicographically (const String& other) const noexcept -{ - CharPointerType s1 (text); - - while (! (s1.isEmpty() || s1.isLetterOrDigit())) - ++s1; - - CharPointerType s2 (other.text); - - while (! (s2.isEmpty() || s2.isLetterOrDigit())) - ++s2; - - return s1.compareIgnoreCase (s2); -} - -//============================================================================== -void String::append (const String& textToAppend, size_t maxCharsToTake) -{ - appendCharPointer (textToAppend.text, maxCharsToTake); -} - -String& String::operator+= (const wchar_t* const t) -{ - appendCharPointer (castToCharPointer_wchar_t (t)); - return *this; -} - -String& String::operator+= (const char* const 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. - */ - jassert (t == nullptr || CharPointer_ASCII::isValidString (t, std::numeric_limits::max())); - - appendCharPointer (CharPointer_ASCII (t)); - return *this; -} - -String& String::operator+= (const String& other) -{ - if (isEmpty()) - return operator= (other); - - 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* const end = buffer + numElementsInArray (buffer); - char* const start = NumberToStringConverters::numberToString (end, number); - - const int numExtraChars = (int) (end - start); - - if (numExtraChars > 0) - { - const size_t byteOffsetOfNull = getByteOffsetOfEnd(); - const size_t newBytesNeeded = sizeof (CharPointerType::CharType) + byteOffsetOfNull - + sizeof (CharPointerType::CharType) * numExtraChars; - - text = StringHolder::makeUniqueWithByteSize (text, newBytesNeeded); - - CharPointerType newEnd (addBytesToPointer (text.getAddress(), (int) byteOffsetOfNull)); - newEnd.writeWithCharLimit (CharPointer_ASCII (start), numExtraChars); - } - - return *this; -} - -//============================================================================== -JUCE_API String JUCE_CALLTYPE operator+ (const char* const string1, const String& string2) -{ - String s (string1); - return s += string2; -} - -JUCE_API String JUCE_CALLTYPE operator+ (const wchar_t* const string1, const String& string2) -{ - String s (string1); - return s += string2; -} - -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; } -#if ! JUCE_NATIVE_WCHAR_IS_UTF32 -JUCE_API String JUCE_CALLTYPE operator+ (const juce_wchar s1, const String& s2) { return String::charToString (s1) + s2; } -#endif - -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+ (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; } -#if ! JUCE_NATIVE_WCHAR_IS_UTF32 -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* 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 short number) { return s1 += (int) number; } -JUCE_API String& JUCE_CALLTYPE operator<< (String& s1, const int number) { return s1 += 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 float number) { return s1 += String (number); } -JUCE_API String& JUCE_CALLTYPE operator<< (String& s1, const double number) { return s1 += String (number); } - -JUCE_API OutputStream& JUCE_CALLTYPE operator<< (OutputStream& stream, const String& text) -{ - const int numBytes = text.getNumBytesAsUTF8(); - - #if (JUCE_STRING_UTF_TYPE == 8) - stream.write (text.getCharPointer().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.getCharPointer()); - 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 (const String& 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 (const String& other) const noexcept -{ - return other.isEmpty() ? 0 : text.indexOf (other.text); -} - -int String::indexOfIgnoreCase (const String& other) const noexcept -{ - return other.isEmpty() ? 0 : CharacterFunctions::indexOfIgnoreCase (text, other.text); -} - -int String::indexOf (const int startIndex, const String& 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, const String& 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 (const String& other) const noexcept -{ - if (other.isNotEmpty()) - { - const int len = other.length(); - int i = length() - len; - - if (i >= 0) - { - CharPointerType n (text + i); - - while (i >= 0) - { - if (n.compareUpTo (other.text, len) == 0) - return i; - - --n; - --i; - } - } - } - - return -1; -} - -int String::lastIndexOfIgnoreCase (const String& other) const noexcept -{ - if (other.isNotEmpty()) - { - const int len = other.length(); - int i = length() - len; - - if (i >= 0) - { - CharPointerType n (text + i); - - while (i >= 0) - { - if (n.compareIgnoreCaseUpTo (other.text, len) == 0) - return i; - - --n; - --i; - } - } - } - - return -1; -} - -int String::lastIndexOfAnyOf (const String& 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 (const String& other) const noexcept -{ - return indexOf (other) >= 0; -} - -bool String::containsChar (const juce_wchar character) const noexcept -{ - return text.indexOf (character) >= 0; -} - -bool String::containsIgnoreCase (const String& t) const noexcept -{ - return indexOfIgnoreCase (t) >= 0; -} - -int String::indexOfWholeWord (const String& 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 (const String& 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 (const String& wordToLookFor) const noexcept -{ - return indexOfWholeWord (wordToLookFor) >= 0; -} - -bool String::containsWholeWordIgnoreCase (const String& 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 (const String& wildcard, const bool ignoreCase) const noexcept -{ - return WildCardMatcher::matches (wildcard.text, text, ignoreCase); -} - -//============================================================================== -String String::repeatedString (const String& stringToRepeat, int numberOfTimesToRepeat) -{ - if (numberOfTimesToRepeat <= 0) - return empty; - - String result (PreallocationBytes (stringToRepeat.getByteOffsetOfEnd() * 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 + 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 + 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, const String& 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; - } - - int i = 0; - CharPointerType insertPoint (text); - - while (i < index) - { - if (insertPoint.isEmpty()) - { - // replacing beyond the end of the string? - jassertfalse; - return *this + stringToInsert; - } - - ++insertPoint; - ++i; - } - - CharPointerType startOfRemainder (insertPoint); - - i = 0; - while (i < numCharsToReplace && ! startOfRemainder.isEmpty()) - { - ++startOfRemainder; - ++i; - } - - if (insertPoint == text && startOfRemainder.isEmpty()) - return stringToInsert; - - const size_t initialBytes = (size_t) (((char*) insertPoint.getAddress()) - (char*) text.getAddress()); - const size_t newStringBytes = stringToInsert.getByteOffsetOfEnd(); - 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::empty; - - 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 (const String& stringToReplace, const String& 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& source_) - : source (source_), dest (nullptr), allocatedBytes (StringHolder::getAllocatedNumBytes (source)), 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 (const String& charactersToReplace, const String& charactersToInsertInstead) const -{ - StringCreationHelper builder (text); - - for (;;) - { - juce_wchar c = builder.source.getAndAdvance(); - - const int index = charactersToReplace.indexOfChar (c); - if (index >= 0) - c = charactersToInsertInstead [index]; - - builder.write (c); - - if (c == 0) - break; - } - - return builder.result; -} - -//============================================================================== -bool String::startsWith (const String& other) const noexcept -{ - return text.compareUpTo (other.text, other.length()) == 0; -} - -bool String::startsWithIgnoreCase (const String& 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 (const String& 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 (const String& 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.source); - builder.write (c); - - if (c == 0) - break; - } - - return builder.result; -} - -String String::toLowerCase() const -{ - StringCreationHelper builder (text); - - for (;;) - { - const juce_wchar c = builder.source.toLowerCase(); - ++(builder.source); - builder.write (c); - - if (c == 0) - break; - } - - 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 empty; - - int i = 0; - CharPointerType t1 (text); - - while (i < start) - { - if (t1.isEmpty()) - return empty; - - ++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 empty; - - ++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 (const String& sub, - const bool includeSubString, - const bool ignoreCase) const -{ - const int i = ignoreCase ? indexOfIgnoreCase (sub) - : indexOf (sub); - if (i < 0) - return empty; - - return substring (includeSubString ? i : i + sub.length()); -} - -String String::fromLastOccurrenceOf (const String& 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 (const String& 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 (const String& 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 empty; - - 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 empty; - else 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 (const String& charactersToTrim) const -{ - CharPointerType t (text); - - while (charactersToTrim.containsChar (*t)) - ++t; - - return t == text ? *this : String (t); -} - -String String::trimCharactersAtEnd (const String& charactersToTrim) const -{ - if (isNotEmpty()) - { - const CharPointerType end (text.findTerminatingNull()); - CharPointerType trimmedEnd (end); - - while (trimmedEnd > text) - { - if (! charactersToTrim.containsChar (*--trimmedEnd)) - { - ++trimmedEnd; - break; - } - } - - if (trimmedEnd < end) - return String (text, trimmedEnd); - } - - return *this; -} - -//============================================================================== -String String::retainCharacters (const String& charactersToRetain) const -{ - if (isEmpty()) - return empty; - - StringCreationHelper builder (text); - - for (;;) - { - juce_wchar c = builder.source.getAndAdvance(); - - if (charactersToRetain.containsChar (c)) - builder.write (c); - - if (c == 0) - break; - } - - builder.write (0); - return builder.result; -} - -String String::removeCharacters (const String& charactersToRemove) const -{ - if (isEmpty()) - return empty; - - StringCreationHelper builder (text); - - for (;;) - { - juce_wchar c = builder.source.getAndAdvance(); - - if (! charactersToRemove.containsChar (c)) - builder.write (c); - - if (c == 0) - break; - } - - return builder.result; -} - -String String::initialSectionContainingOnly (const String& permittedCharacters) const -{ - CharPointerType t (text); - - while (! t.isEmpty()) - { - if (! permittedCharacters.containsChar (*t)) - return String (text, t); - - ++t; - } - - return *this; -} - -String String::initialSectionNotContaining (const String& charactersToStopAt) const -{ - CharPointerType t (text); - - while (! t.isEmpty()) - { - if (charactersToStopAt.containsChar (*t)) - return String (text, t); - - ++t; - } - - return *this; -} - -bool String::containsOnly (const String& chars) const noexcept -{ - CharPointerType t (text); - - while (! t.isEmpty()) - if (! chars.containsChar (t.getAndAdvance())) - return false; - - return true; -} - -bool String::containsAnyOf (const String& chars) const noexcept -{ - CharPointerType t (text); - - while (! t.isEmpty()) - if (chars.containsChar (t.getAndAdvance())) - return true; - - return false; -} - -bool String::containsNonWhitespaceChars() const noexcept -{ - CharPointerType t (text); - - while (! t.isEmpty()) - { - if (! t.isWhitespace()) - return true; - - ++t; - } - - 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 empty; -} - -//============================================================================== -int String::getIntValue() const noexcept -{ - return text.getIntValue32(); -} - -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; -} - -int64 String::getLargeIntValue() const noexcept -{ - return text.getIntValue64(); -} - -float String::getFloatValue() const noexcept -{ - return (float) getDoubleValue(); -} - -double String::getDoubleValue() const noexcept -{ - return text.getDoubleValue(); -} - -static const char hexDigits[] = "0123456789abcdef"; - -template -struct HexConverter -{ - static String hexToString (Type v) - { - char buffer[32]; - char* const end = buffer + 32; - char* t = end; - *--t = 0; - - do - { - *--t = hexDigits [(int) (v & 15)]; - v >>= 4; - - } while (v != 0); - - return String (t, (size_t) (end - t) - 1); - } - - static Type stringToHex (String::CharPointerType t) noexcept - { - Type result = 0; - - while (! t.isEmpty()) - { - const int hexValue = CharacterFunctions::getHexDigitValue (t.getAndAdvance()); - - if (hexValue >= 0) - result = (result << 4) | hexValue; - } - - return result; - } -}; - -String String::toHexString (const int number) -{ - return HexConverter ::hexToString ((unsigned int) number); -} - -String String::toHexString (const int64 number) -{ - return HexConverter ::hexToString ((uint64) number); -} - -String String::toHexString (const 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 empty; - - 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 HexConverter::stringToHex (text); -} - -int64 String::getHexValue64() const noexcept -{ - return HexConverter::stringToHex (text); -} - -//============================================================================== -String String::createStringFromData (const void* const data_, const int size) -{ - const uint8* const data = static_cast (data_); - - if (size <= 0 || data == nullptr) - { - return empty; - } - else if (size == 1) - { - return charToString ((juce_wchar) data[0]); - } - else if ((data[0] == (uint8) CharPointer_UTF16::byteOrderMarkBE1 && data[1] == (uint8) CharPointer_UTF16::byteOrderMarkBE2) - || (data[0] == (uint8) CharPointer_UTF16::byteOrderMarkLE1 && data[1] == (uint8) CharPointer_UTF16::byteOrderMarkLE2)) - { - const bool bigEndian = (data[0] == (uint8) CharPointer_UTF16::byteOrderMarkBE1); - const int numChars = size / 2 - 1; - - StringCreationHelper builder ((size_t) numChars); - - const uint16* const src = (const uint16*) (data + 2); - - if (bigEndian) - { - 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; - } - else - { - const uint8* start = data; - const uint8* end = data + size; - - if (size >= 3 - && data[0] == (uint8) CharPointer_UTF8::byteOrderMark1 - && data[1] == (uint8) CharPointer_UTF8::byteOrderMark2 - && data[2] == (uint8) CharPointer_UTF8::byteOrderMark3) - start += 3; - - return String (CharPointer_UTF8 ((const char*) start), - CharPointer_UTF8 ((const char*) end)); - } -} - -//============================================================================== -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); - const size_t endOffset = (text.sizeInBytes() + 3) & ~3; // 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 int bytesToClear = jmin ((int) extraBytesNeeded, 4); - zeromem (addBytesToPointer (newSpace, (int) (extraBytesNeeded - bytesToClear)), (size_t) 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 wchar_t* String::toWideCharPointer() const -{ - return StringEncodingConverter ::convert (*this).getAddress(); -} - -//============================================================================== -template -struct StringCopier -{ - static int copyToBuffer (const CharPointerType_Src& source, typename CharPointerType_Dest::CharType* const buffer, const int maxBufferSizeBytes) - { - jassert (maxBufferSizeBytes >= 0); // keep this value positive, or no characters will be copied! - - if (buffer == nullptr) - return (int) (CharPointerType_Dest::getBytesRequiredFor (source) + sizeof (typename CharPointerType_Dest::CharType)); - - return CharPointerType_Dest (buffer).writeWithDestByteLimit (source, maxBufferSizeBytes); - } -}; - -int String::copyToUTF8 (CharPointer_UTF8::CharType* const buffer, const int maxBufferSizeBytes) const noexcept -{ - return StringCopier ::copyToBuffer (text, buffer, maxBufferSizeBytes); -} - -int String::copyToUTF16 (CharPointer_UTF16::CharType* const buffer, int maxBufferSizeBytes) const noexcept -{ - return StringCopier ::copyToBuffer (text, buffer, maxBufferSizeBytes); -} - -int String::copyToUTF32 (CharPointer_UTF32::CharType* const buffer, int maxBufferSizeBytes) const noexcept -{ - return StringCopier ::copyToBuffer (text, buffer, maxBufferSizeBytes); -} - -//============================================================================== -int String::getNumBytesAsUTF8() const noexcept -{ - return (int) CharPointer_UTF8::getBytesRequiredFor (text); -} - -String String::fromUTF8 (const char* const buffer, int bufferSizeBytes) -{ - if (buffer != nullptr) - { - if (bufferSizeBytes < 0) - return String (CharPointer_UTF8 (buffer)); - else if (bufferSizeBytes > 0) - return String (CharPointer_UTF8 (buffer), CharPointer_UTF8 (buffer + bufferSizeBytes)); - } - - return String::empty; -} - -#if JUCE_MSVC - #pragma warning (pop) -#endif - -//============================================================================== -//============================================================================== -#if JUCE_UNIT_TESTS - -class StringTests : public UnitTest -{ -public: - StringTests() : UnitTest ("String class") {} - - template - struct TestUTFConversion - { - static void test (UnitTest& test) - { - String s (createRandomWideCharString()); - - 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); - } - }; - - static String createRandomWideCharString() - { - juce_wchar buffer[50] = { 0 }; - Random r; - - 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() - { - { - 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 (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 (L"45") == 4); - expect (String ("444445").indexOf ("45") == 4); - expect (String ("444445").lastIndexOfChar ('4') == 4); - expect (String ("45454545x").lastIndexOf (L"45") == 6); - expect (String ("45454545x").lastIndexOfAnyOf ("456") == 7); - expect (String ("45454545x").lastIndexOfAnyOf (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"); - - 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 (("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 (L"xyzf", 2, false) == -1); - expect (s3.indexOfAnyOf ("xyzF", 2, false) == 5); - expect (s3.containsAnyOf (L"zzzFs")); - expect (s3.startsWith ("abcd")); - expect (s3.startsWithIgnoreCase (L"abCD")); - expect (s3.startsWith (String::empty)); - expect (s3.startsWithChar ('a')); - expect (s3.endsWith (String ("HIJ"))); - expect (s3.endsWithIgnoreCase (L"Hij")); - expect (s3.endsWith (String::empty)); - expect (s3.endsWithChar (L'J')); - expect (s3.indexOf ("HIJ") == 7); - expect (s3.indexOf (L"HIJK") == -1); - expect (s3.indexOfIgnoreCase ("hij") == 7); - expect (s3.indexOfIgnoreCase (L"hijk") == -1); - - 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 (L"word")); - expect (s5.containsWholeWord ("word3")); - expect (s5.containsWholeWord (s5)); - expect (s5.containsWholeWordIgnoreCase (L"Word2")); - expect (s5.indexOfWholeWordIgnoreCase ("Word2") == 5); - expect (s5.containsWholeWordIgnoreCase (L"Word")); - expect (s5.containsWholeWordIgnoreCase ("Word3")); - expect (! s5.containsWholeWordIgnoreCase (L"Wordx")); - expect (!s5.containsWholeWordIgnoreCase ("xWord2")); - expect (s5.containsNonWhitespaceChars()); - expect (s5.containsOnly ("ordw23 ")); - expect (! String (" \n\r\t").containsNonWhitespaceChars()); - - expect (s5.matchesWildcard (L"wor*", false)); - expect (s5.matchesWildcard ("wOr*", true)); - expect (s5.matchesWildcard (L"*word3", true)); - expect (s5.matchesWildcard ("*word?", true)); - expect (s5.matchesWildcard (L"Word*3", true)); - expect (! s5.matchesWildcard (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 (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 (L"Word2", false, true), s5.getLastCharacters (6)); - - expectEquals (s5.fromLastOccurrenceOf (String::empty, true, false), s5); - expectEquals (s5.fromLastOccurrenceOf (L"wordx", true, false), s5); - expectEquals (s5.fromLastOccurrenceOf ("word", true, false), s5.getLastCharacters (5)); - expectEquals (s5.fromLastOccurrenceOf (L"worD", true, true), s5.getLastCharacters (5)); - expectEquals (s5.fromLastOccurrenceOf ("word", false, false), s5.getLastCharacters (1)); - expectEquals (s5.fromLastOccurrenceOf (L"worD", false, true), s5.getLastCharacters (1)); - - expect (s5.upToFirstOccurrenceOf (String::empty, true, false).isEmpty()); - expectEquals (s5.upToFirstOccurrenceOf ("word4", true, false), s5); - expectEquals (s5.upToFirstOccurrenceOf (L"word2", true, false), s5.substring (0, 10)); - expectEquals (s5.upToFirstOccurrenceOf ("Word2", true, true), s5.substring (0, 10)); - expectEquals (s5.upToFirstOccurrenceOf (L"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", L"xyz", false), String ("xyz xyz2 xyz3")); - expect (s5.replace (L"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", L"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", L"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); - TestUTFConversion ::test (*this); - TestUTFConversion ::test (*this); - } - - { - 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'-")); - } - } -}; - -static StringTests stringUnitTests; - -#endif diff --git a/src/juce/JuceLibraryCode/modules/juce_core/text/juce_String.h b/src/juce/JuceLibraryCode/modules/juce_core/text/juce_String.h deleted file mode 100644 index 032fb4ee..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/text/juce_String.h +++ /dev/null @@ -1,1327 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_STRING_JUCEHEADER__ -#define __JUCE_STRING_JUCEHEADER__ - -#include "juce_CharacterFunctions.h" - -#ifndef JUCE_STRING_UTF_TYPE - #define JUCE_STRING_UTF_TYPE 8 -#endif - -#if JUCE_MSVC - #pragma warning (push) - #pragma warning (disable: 4514 4996) -#endif - -#include "../memory/juce_Atomic.h" -#include "juce_CharPointer_UTF8.h" -#include "juce_CharPointer_UTF16.h" -#include "juce_CharPointer_UTF32.h" -#include "juce_CharPointer_ASCII.h" - -#if JUCE_MSVC - #pragma warning (pop) -#endif - -class OutputStream; - -//============================================================================== -/** - 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 the 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 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 (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; - - /** 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 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 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; - size_t numChars = 0; - - for (CharPointer t (textToAppend); numChars < maxCharsToTake && ! t.isEmpty();) - { - extraBytesNeeded += CharPointerType::getBytesRequiredFor (t.getAndAdvance()); - ++numChars; - } - - if (numChars > 0) - { - const size_t byteOffsetOfNull = getByteOffsetOfEnd(); - - preallocateBytes (byteOffsetOfNull + extraBytesNeeded); - CharPointerType (addBytesToPointer (text.getAddress(), (int) byteOffsetOfNull)).writeWithCharLimit (textToAppend, (int) (numChars + 1)); - } - } - } - - /** Appends a string to the end of this one. */ - template - void appendCharPointer (const CharPointer& textToAppend) - { - if (textToAppend.getAddress() != nullptr) - { - size_t extraBytesNeeded = 0; - - for (CharPointer t (textToAppend); ! t.isEmpty();) - extraBytesNeeded += CharPointerType::getBytesRequiredFor (t.getAndAdvance()); - - if (extraBytesNeeded > 0) - { - const size_t byteOffsetOfNull = getByteOffsetOfEnd(); - - preallocateBytes (byteOffsetOfNull + extraBytesNeeded); - CharPointerType (addBytesToPointer (text.getAddress(), (int) byteOffsetOfNull)).writeAll (textToAppend); - } - } - } - - //============================================================================== - // 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; } - - /** Case-insensitive comparison with another string. */ - bool equalsIgnoreCase (const String& 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; - - /** Lexicographic comparison with another string. - - The comparison used here is case-insensitive and ignores leading non-alphanumeric - characters, making it good for sorting human-readable strings. - - @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 compareLexicographically (const String& 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 (const String& 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 (const String& 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 (const String& 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 (const String& 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 (const String& 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 (const String& text) const noexcept; - - /** Tests whether the string contains another substring as a distict word. - - @returns true if the string contains this word, surrounded by - non-alphanumeric characters - @see indexOfWholeWord, containsWholeWordIgnoreCase - */ - bool containsWholeWord (const String& wordToLookFor) const noexcept; - - /** Tests whether the string contains another substring as a distict word. - - @returns true if the string contains this word, surrounded by - non-alphanumeric characters - @see indexOfWholeWordIgnoreCase, containsWholeWord - */ - bool containsWholeWordIgnoreCase (const String& wordToLookFor) const noexcept; - - /** Finds an instance of another substring if it exists as a distict 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 (const String& wordToLookFor) const noexcept; - - /** Finds an instance of another substring if it exists as a distict 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 (const String& 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 (const String& 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 (const String& 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 (const String& 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 (const String& 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 (const String& 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, const String& 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 (const String& 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, const String& 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 (const String& 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 (const String& 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 (const String& 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 - */ - const 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 (const String& 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 (const String& 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 (const String& 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 (const String& 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 (const String& 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 (const String& 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, - const String& 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 (const String& stringToReplace, - const String& 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 (const String& charactersToReplace, - const String& 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 (const String& 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 (const String& 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 (const String& 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 (const String& 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 (const String& 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 const 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 getCharPointer, toUTF16, toUTF32 - */ - CharPointer_UTF8 toUTF8() 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. - - 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; - - //============================================================================== - /** 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 - */ - int 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 - */ - int copyToUTF8 (CharPointer_UTF8::CharType* destBuffer, int 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 - */ - int copyToUTF16 (CharPointer_UTF16::CharType* destBuffer, int 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-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 - */ - int copyToUTF32 (CharPointer_UTF32::CharType* destBuffer, int 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 - /** MAC ONLY - Creates a String from an OSX CFString. */ - static String fromCFString (CFStringRef cfString); - - /** MAC 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; - - /** MAC ONLY - Returns a copy of this string in which any decomposed unicode characters have - been converted to their precomposed equivalents. */ - String convertToPrecomposedUnicode() const; - #endif - -private: - //============================================================================== - CharPointerType text; - - //============================================================================== - struct PreallocationBytes - { - explicit PreallocationBytes (size_t); - size_t numBytes; - }; - - explicit String (const PreallocationBytes&); // This constructor preallocates a certain amount of memory - void appendFixedLength (const char* text, int numExtraChars); - size_t getByteOffsetOfEnd() const noexcept; - JUCE_DEPRECATED (String (const String& stringToCopy, size_t charsToAllocate)); - - // 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, 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.toUTF8().getAddress(); -} - -/** 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); - - -#endif // __JUCE_STRING_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/text/juce_StringArray.cpp b/src/juce/JuceLibraryCode/modules/juce_core/text/juce_StringArray.cpp deleted file mode 100644 index 81407e60..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/text/juce_StringArray.cpp +++ /dev/null @@ -1,487 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -//============================================================================== -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); -} - -namespace StringArrayHelpers -{ - template - void addArray (Array& dest, const CharType* const* strings) - { - if (strings != nullptr) - while (*strings != nullptr) - dest.add (*strings++); - } - - template - void addArray (Array& dest, const CharType* const* const strings, const int numberOfStrings) - { - for (int i = 0; i < numberOfStrings; ++i) - dest.add (strings [i]); - } -} - -StringArray::StringArray (const char* const* const initialStrings) -{ - StringArrayHelpers::addArray (strings, initialStrings); -} - -StringArray::StringArray (const char* const* const initialStrings, const int numberOfStrings) -{ - StringArrayHelpers::addArray (strings, initialStrings, numberOfStrings); -} - -StringArray::StringArray (const wchar_t* const* const initialStrings) -{ - StringArrayHelpers::addArray (strings, initialStrings); -} - -StringArray::StringArray (const wchar_t* const* const initialStrings, const int numberOfStrings) -{ - StringArrayHelpers::addArray (strings, 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 - -StringArray::~StringArray() -{ -} - -bool StringArray::operator== (const StringArray& other) const noexcept -{ - if (other.size() != size()) - return false; - - for (int i = size(); --i >= 0;) - if (other.strings.getReference(i) != strings.getReference(i)) - return false; - - return true; -} - -bool StringArray::operator!= (const StringArray& other) const noexcept -{ - return ! operator== (other); -} - -void StringArray::clear() -{ - strings.clear(); -} - -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 -{ - jassert (isPositiveAndBelow (index, strings.size())); - return strings.getReference (index); -} - -void StringArray::add (const String& newString) -{ - strings.add (newString); -} - -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 (const String& stringToLookFor, const bool ignoreCase) const -{ - if (ignoreCase) - { - for (int i = size(); --i >= 0;) - if (strings.getReference(i).equalsIgnoreCase (stringToLookFor)) - return true; - } - else - { - for (int i = size(); --i >= 0;) - if (stringToLookFor == strings.getReference(i)) - return true; - } - - return false; -} - -int StringArray::indexOf (const String& stringToLookFor, const bool ignoreCase, int i) const -{ - if (i < 0) - i = 0; - - const int numElements = size(); - - if (ignoreCase) - { - while (i < numElements) - { - if (strings.getReference(i).equalsIgnoreCase (stringToLookFor)) - return i; - - ++i; - } - } - else - { - while (i < numElements) - { - if (stringToLookFor == strings.getReference (i)) - return i; - - ++i; - } - } - - return -1; -} - -//============================================================================== -void StringArray::remove (const int index) -{ - strings.remove (index); -} - -void StringArray::removeString (const String& 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& first, String& second) { return first.compare (second); } -}; - -struct InternalStringArrayComparator_CaseInsensitive -{ - static int compareElements (String& first, String& second) { return first.compareIgnoreCase (second); } -}; - -void StringArray::sort (const bool ignoreCase) -{ - if (ignoreCase) - { - InternalStringArrayComparator_CaseInsensitive comp; - strings.sort (comp); - } - else - { - InternalStringArrayComparator_CaseSensitive comp; - strings.sort (comp); - } -} - -void StringArray::move (const int currentIndex, int newIndex) noexcept -{ - strings.move (currentIndex, newIndex); -} - - -//============================================================================== -String StringArray::joinIntoString (const String& 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::empty; - - if (start == last - 1) - return strings.getReference (start); - - const size_t separatorBytes = separator.getCharPointer().sizeInBytes() - sizeof (String::CharPointerType::CharType); - size_t bytesNeeded = separatorBytes * (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.getCharPointer()); - } - - dest.writeNull(); - - return result; -} - -int StringArray::addTokens (const String& text, const bool preserveQuotedStrings) -{ - return addTokens (text, " \n\r\t", preserveQuotedStrings ? "\"" : ""); -} - -int StringArray::addTokens (const String& text, const String& breakCharacters, const String& quoteCharacters) -{ - int num = 0; - String::CharPointerType t (text.getCharPointer()); - - if (! t.isEmpty()) - { - for (;;) - { - String::CharPointerType tokenEnd (CharacterFunctions::findEndOfToken (t, - breakCharacters.getCharPointer(), - quoteCharacters.getCharPointer())); - add (String (t, tokenEnd)); - ++num; - - if (tokenEnd.isEmpty()) - break; - - t = ++tokenEnd; - } - } - - return num; -} - -int StringArray::addLines (const String& sourceText) -{ - int numLines = 0; - String::CharPointerType text (sourceText.getCharPointer()); - bool finished = text.isEmpty(); - - while (! finished) - { - String::CharPointerType startOfLine (text); - size_t numChars = 0; - - for (;;) - { - const juce_wchar c = text.getAndAdvance(); - - if (c == 0) - { - finished = true; - break; - } - - if (c == '\n') - break; - - if (c == '\r') - { - if (*text == '\n') - ++text; - - break; - } - - ++numChars; - } - - add (String (startOfLine, numChars)); - ++numLines; - } - - return numLines; -} - -//============================================================================== -void StringArray::removeDuplicates (const bool ignoreCase) -{ - for (int i = 0; i < size() - 1; ++i) - { - const String s (strings.getReference(i)); - - int nextIndex = i + 1; - - for (;;) - { - 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::minimiseStorageOverheads() -{ - strings.minimiseStorageOverheads(); -} diff --git a/src/juce/JuceLibraryCode/modules/juce_core/text/juce_StringArray.h b/src/juce/JuceLibraryCode/modules/juce_core/text/juce_StringArray.h deleted file mode 100644 index 6deb6c1f..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/text/juce_StringArray.h +++ /dev/null @@ -1,348 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_STRINGARRAY_JUCEHEADER__ -#define __JUCE_STRINGARRAY_JUCEHEADER__ - -#include "juce_String.h" -#include "../containers/juce_Array.h" - - -//============================================================================== -/** - 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& other); - - #if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS - StringArray (StringArray&& other) noexcept; - #endif - - /** Creates an array containing a single string. */ - explicit StringArray (const String& firstValue); - - /** 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); - - /** Destructor. */ - ~StringArray(); - - /** Copies the contents of another string array into this one */ - StringArray& operator= (const StringArray& other); - - #if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS - StringArray& operator= (StringArray&& other) noexcept; - #endif - - //============================================================================== - /** 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& other) 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& other) 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; - - /** 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 (const String& 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 (const String& stringToLookFor, - bool ignoreCase = false, - int startIndex = 0) const; - - //============================================================================== - /** Appends a string at the end of the array. */ - void add (const String& stringToAdd); - - /** 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 - */ - int addTokens (const String& 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 - */ - int addTokens (const String& stringToTokenise, - const String& breakCharacters, - const String& 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 (const String& stringToBreakUp); - - //============================================================================== - /** Removes all elements from the array. */ - void clear(); - - /** 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 (const String& 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 (const String& 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); - - //============================================================================== - /** 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: - //============================================================================== - Array strings; - - JUCE_LEAK_DETECTOR (StringArray); -}; - - -#endif // __JUCE_STRINGARRAY_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/text/juce_StringPairArray.cpp b/src/juce/JuceLibraryCode/modules/juce_core/text/juce_StringPairArray.cpp deleted file mode 100644 index 2a8f520b..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/text/juce_StringPairArray.cpp +++ /dev/null @@ -1,139 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -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[] (const String& key) const -{ - return values [keys.indexOf (key, ignoreCase)]; -} - -String StringPairArray::getValue (const String& key, const String& defaultReturnValue) const -{ - const int i = keys.indexOf (key, ignoreCase); - - if (i >= 0) - return values[i]; - - return defaultReturnValue; -} - -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 (const String& 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/src/juce/JuceLibraryCode/modules/juce_core/text/juce_StringPairArray.h b/src/juce/JuceLibraryCode/modules/juce_core/text/juce_StringPairArray.h deleted file mode 100644 index 383cdd8c..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/text/juce_StringPairArray.h +++ /dev/null @@ -1,160 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_STRINGPAIRARRAY_JUCEHEADER__ -#define __JUCE_STRINGPAIRARRAY_JUCEHEADER__ - -#include "juce_StringArray.h" - - -//============================================================================== -/** - 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[] (const String& 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 (const String& key, const String& defaultReturnValue) const; - - - /** 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 (const String& 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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/text/juce_StringPool.cpp b/src/juce/JuceLibraryCode/modules/juce_core/text/juce_StringPool.cpp deleted file mode 100644 index d8571cac..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/text/juce_StringPool.cpp +++ /dev/null @@ -1,111 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -StringPool::StringPool() noexcept {} -StringPool::~StringPool() {} - -namespace StringPoolHelpers -{ - template - String::CharPointerType getPooledStringFromArray (Array& strings, - StringType newString, - const CriticalSection& lock) - { - const ScopedLock sl (lock); - int start = 0; - int end = strings.size(); - - for (;;) - { - if (start >= end) - { - jassert (start <= end); - strings.insert (start, newString); - return strings.getReference (start).getCharPointer(); - } - else - { - const String& startString = strings.getReference (start); - - if (startString == newString) - return startString.getCharPointer(); - - const int halfway = (start + end) >> 1; - - if (halfway == start) - { - if (startString.compare (newString) < 0) - ++start; - - strings.insert (start, newString); - return strings.getReference (start).getCharPointer(); - } - - const int comp = strings.getReference (halfway).compare (newString); - - if (comp == 0) - return strings.getReference (halfway).getCharPointer(); - else if (comp < 0) - start = halfway; - else - end = halfway; - } - } - } -} - -String::CharPointerType StringPool::getPooledString (const String& s) -{ - if (s.isEmpty()) - return String::empty.getCharPointer(); - - return StringPoolHelpers::getPooledStringFromArray (strings, s, lock); -} - -String::CharPointerType StringPool::getPooledString (const char* const s) -{ - if (s == nullptr || *s == 0) - return String::empty.getCharPointer(); - - return StringPoolHelpers::getPooledStringFromArray (strings, s, lock); -} - -String::CharPointerType StringPool::getPooledString (const wchar_t* const s) -{ - if (s == nullptr || *s == 0) - return String::empty.getCharPointer(); - - return StringPoolHelpers::getPooledStringFromArray (strings, s, lock); -} - -int StringPool::size() const noexcept -{ - return strings.size(); -} - -String::CharPointerType StringPool::operator[] (const int index) const noexcept -{ - return strings [index].getCharPointer(); -} diff --git a/src/juce/JuceLibraryCode/modules/juce_core/text/juce_StringPool.h b/src/juce/JuceLibraryCode/modules/juce_core/text/juce_StringPool.h deleted file mode 100644 index 9e3aa80f..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/text/juce_StringPool.h +++ /dev/null @@ -1,92 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_STRINGPOOL_JUCEHEADER__ -#define __JUCE_STRINGPOOL_JUCEHEADER__ - -#include "juce_String.h" -#include "../containers/juce_Array.h" - - -//============================================================================== -/** - 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 copy of the string that is passed in. - - The pool will always return the same pointer when asked for a string that matches it. - The pool will own all the pointers that it returns, deleting them when the pool itself - is deleted. - */ - String::CharPointerType getPooledString (const String& original); - - /** Returns a pointer to a copy of the string that is passed in. - - The pool will always return the same pointer when asked for a string that matches it. - The pool will own all the pointers that it returns, deleting them when the pool itself - is deleted. - */ - String::CharPointerType getPooledString (const char* original); - - /** Returns a pointer to a copy of the string that is passed in. - - The pool will always return the same pointer when asked for a string that matches it. - The pool will own all the pointers that it returns, deleting them when the pool itself - is deleted. - */ - String::CharPointerType getPooledString (const wchar_t* original); - - //============================================================================== - /** Returns the number of strings in the pool. */ - int size() const noexcept; - - /** Returns one of the strings in the pool, by index. */ - String::CharPointerType operator[] (int index) const noexcept; - -private: - Array strings; - CriticalSection lock; -}; - - -#endif // __JUCE_STRINGPOOL_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/threads/juce_ChildProcess.cpp b/src/juce/JuceLibraryCode/modules/juce_core/threads/juce_ChildProcess.cpp deleted file mode 100644 index 723e8788..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/threads/juce_ChildProcess.cpp +++ /dev/null @@ -1,90 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -ChildProcess::ChildProcess() {} -ChildProcess::~ChildProcess() {} - -bool ChildProcess::waitForProcessToFinish (const int timeoutMs) const -{ - const int64 timeoutTime = Time::getMillisecondCounter() + 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, 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/src/juce/JuceLibraryCode/modules/juce_core/threads/juce_ChildProcess.h b/src/juce/JuceLibraryCode/modules/juce_core/threads/juce_ChildProcess.h deleted file mode 100644 index 454a6c6c..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/threads/juce_ChildProcess.h +++ /dev/null @@ -1,93 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_CHILDPROCESS_JUCEHEADER__ -#define __JUCE_CHILDPROCESS_JUCEHEADER__ - - -//============================================================================== -/** - 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(); - - /** 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. - */ - bool start (const String& command); - - /** 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; - - /** 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 class ScopedPointer; - ScopedPointer activeProcess; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ChildProcess); -}; - - -#endif // __JUCE_CHILDPROCESS_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/threads/juce_CriticalSection.h b/src/juce/JuceLibraryCode/modules/juce_core/threads/juce_CriticalSection.h deleted file mode 100644 index 23b7f846..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/threads/juce_CriticalSection.h +++ /dev/null @@ -1,254 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_CRITICALSECTION_JUCEHEADER__ -#define __JUCE_CRITICALSECTION_JUCEHEADER__ - -#include "juce_ScopedLock.h" - - -//============================================================================== -/** - A mutex class. - - A CriticalSection acts as a re-entrant mutex lock. 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. - - @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 internal [44]; - #else - uint8 internal [24]; - #endif - #else - mutable pthread_mutex_t internal; - #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. - - Use one of these as a local variable to provide RAII-based locking of a CriticalSection. - - e.g. @code - - CriticalSection myCriticalSection; - - for (;;) - { - const ScopedLock myScopedLock (myCriticalSection); - // myCriticalSection is now locked - - ...do some stuff... - - // myCriticalSection gets unlocked here. - } - @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 - - CriticalSection myCriticalSection; - - for (;;) - { - const ScopedLock myScopedLock (myCriticalSection); - // myCriticalSection is now locked - - ... do some stuff with it locked .. - - while (xyz) - { - ... do some stuff with it locked .. - - const ScopedUnlock 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 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 - CriticalSection myCriticalSection; - - for (;;) - { - const ScopedTryLock 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, ScopedLock, ScopedUnlock, ScopedReadLock -*/ -typedef CriticalSection::ScopedTryLockType ScopedTryLock; - - -#endif // __JUCE_CRITICALSECTION_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/threads/juce_DynamicLibrary.h b/src/juce/JuceLibraryCode/modules/juce_core/threads/juce_DynamicLibrary.h deleted file mode 100644 index 1b81f496..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/threads/juce_DynamicLibrary.h +++ /dev/null @@ -1,82 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_DYNAMICLIBRARY_JUCEHEADER__ -#define __JUCE_DYNAMICLIBRARY_JUCEHEADER__ - -/** - 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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/threads/juce_InterProcessLock.h b/src/juce/JuceLibraryCode/modules/juce_core/threads/juce_InterProcessLock.h deleted file mode 100644 index 33e8f2f3..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/threads/juce_InterProcessLock.h +++ /dev/null @@ -1,132 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_INTERPROCESSLOCK_JUCEHEADER__ -#define __JUCE_INTERPROCESSLOCK_JUCEHEADER__ - -#include "../text/juce_String.h" -#include "../memory/juce_ScopedPointer.h" - - -//============================================================================== -/** - 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& lock) : lock_ (lock) { lockWasSuccessful = lock.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() { lock_.exit(); } - - /** Returns true if the InterProcessLock was successfully locked. */ - bool isLocked() const noexcept { return lockWasSuccessful; } - - private: - //============================================================================== - InterProcessLock& lock_; - bool lockWasSuccessful; - - JUCE_DECLARE_NON_COPYABLE (ScopedLockType); - }; - -private: - //============================================================================== - class Pimpl; - friend class ScopedPointer ; - ScopedPointer pimpl; - - CriticalSection lock; - String name; - - JUCE_DECLARE_NON_COPYABLE (InterProcessLock); -}; - - -#endif // __JUCE_INTERPROCESSLOCK_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/threads/juce_Process.h b/src/juce/JuceLibraryCode/modules/juce_core/threads/juce_Process.h deleted file mode 100644 index 522d2a66..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/threads/juce_Process.h +++ /dev/null @@ -1,144 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_PROCESS_JUCEHEADER__ -#define __JUCE_PROCESS_JUCEHEADER__ - -#include "../text/juce_String.h" - - -//============================================================================== -/** Represents the current executable's process. - - This contains methods for controlling the current application at the - process-level. - - @see Thread, JUCEApplication -*/ -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 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 JUCEApplication::quit - */ - static void terminate(); - - //============================================================================== - /** Returns true if this application process is the one that the user is - currently using. - */ - static bool isForegroundProcess(); - - //============================================================================== - /** 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 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 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 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 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; - - /** WINDOWS ONLY - Gets the command-line params as a string. - This is needed to avoid unicode problems with the argc type params. - */ - static String JUCE_CALLTYPE getCurrentCommandLineParams(); - #endif - -private: - Process(); - JUCE_DECLARE_NON_COPYABLE (Process); -}; - - -#endif // __JUCE_PROCESS_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/threads/juce_ReadWriteLock.cpp b/src/juce/JuceLibraryCode/modules/juce_core/threads/juce_ReadWriteLock.cpp deleted file mode 100644 index a263e2a9..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/threads/juce_ReadWriteLock.cpp +++ /dev/null @@ -1,161 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -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 -{ - const Thread::ThreadID threadId = Thread::getCurrentThreadId(); - const SpinLock::ScopedLockType sl (accessLock); - - for (;;) - { - jassert (readerThreads.size() % 2 == 0); - - int i; - for (i = 0; i < readerThreads.size(); i += 2) - if (readerThreads.getUnchecked(i) == threadId) - break; - - if (i < readerThreads.size() - || numWriters + numWaitingWriters == 0 - || (threadId == writerThreadId && numWriters > 0)) - { - if (i < readerThreads.size()) - { - readerThreads.set (i + 1, (Thread::ThreadID) (1 + (pointer_sized_int) readerThreads.getUnchecked (i + 1))); - } - else - { - readerThreads.add (threadId); - readerThreads.add ((Thread::ThreadID) 1); - } - - return; - } - - const SpinLock::ScopedUnlockType ul (accessLock); - waitEvent.wait (100); - } -} - -void ReadWriteLock::exitRead() const noexcept -{ - const Thread::ThreadID threadId = Thread::getCurrentThreadId(); - const SpinLock::ScopedLockType sl (accessLock); - - for (int i = 0; i < readerThreads.size(); i += 2) - { - if (readerThreads.getUnchecked(i) == threadId) - { - const pointer_sized_int newCount = ((pointer_sized_int) readerThreads.getUnchecked (i + 1)) - 1; - - if (newCount == 0) - { - readerThreads.removeRange (i, 2); - waitEvent.signal(); - } - else - { - readerThreads.set (i + 1, (Thread::ThreadID) newCount); - } - - 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); - - for (;;) - { - if (readerThreads.size() + numWriters == 0 - || threadId == writerThreadId - || (readerThreads.size() == 2 - && readerThreads.getUnchecked(0) == threadId)) - { - writerThreadId = threadId; - ++numWriters; - break; - } - - ++numWaitingWriters; - accessLock.exit(); - waitEvent.wait (100); - accessLock.enter(); - --numWaitingWriters; - } -} - -bool ReadWriteLock::tryEnterWrite() const noexcept -{ - const Thread::ThreadID threadId = Thread::getCurrentThreadId(); - const SpinLock::ScopedLockType sl (accessLock); - - if (readerThreads.size() + numWriters == 0 - || threadId == writerThreadId - || (readerThreads.size() == 2 - && readerThreads.getUnchecked(0) == 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/src/juce/JuceLibraryCode/modules/juce_core/threads/juce_ReadWriteLock.h b/src/juce/JuceLibraryCode/modules/juce_core/threads/juce_ReadWriteLock.h deleted file mode 100644 index 7b729a74..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/threads/juce_ReadWriteLock.h +++ /dev/null @@ -1,138 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_READWRITELOCK_JUCEHEADER__ -#define __JUCE_READWRITELOCK_JUCEHEADER__ - -#include "juce_CriticalSection.h" -#include "juce_SpinLock.h" -#include "juce_WaitableEvent.h" -#include "juce_Thread.h" -#include "../containers/juce_Array.h" - - -//============================================================================== -/** - 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 unpredictable. - */ - ~ReadWriteLock() noexcept; - - //============================================================================== - /** Locks this object for reading. - - Multiple threads can simulaneously 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; - - /** 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. - - @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; - mutable Array readerThreads; - - JUCE_DECLARE_NON_COPYABLE (ReadWriteLock); -}; - - -#endif // __JUCE_READWRITELOCK_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/threads/juce_ScopedLock.h b/src/juce/JuceLibraryCode/modules/juce_core/threads/juce_ScopedLock.h deleted file mode 100644 index 83cc9dcb..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/threads/juce_ScopedLock.h +++ /dev/null @@ -1,234 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_SCOPEDLOCK_JUCEHEADER__ -#define __JUCE_SCOPEDLOCK_JUCEHEADER__ - - -//============================================================================== -/** - 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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/threads/juce_ScopedReadLock.h b/src/juce/JuceLibraryCode/modules/juce_core/threads/juce_ScopedReadLock.h deleted file mode 100644 index ff68f36c..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/threads/juce_ScopedReadLock.h +++ /dev/null @@ -1,89 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_SCOPEDREADLOCK_JUCEHEADER__ -#define __JUCE_SCOPEDREADLOCK_JUCEHEADER__ - -#include "juce_ReadWriteLock.h" - - -//============================================================================== -/** - 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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/threads/juce_ScopedWriteLock.h b/src/juce/JuceLibraryCode/modules/juce_core/threads/juce_ScopedWriteLock.h deleted file mode 100644 index b52a6b5c..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/threads/juce_ScopedWriteLock.h +++ /dev/null @@ -1,89 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_SCOPEDWRITELOCK_JUCEHEADER__ -#define __JUCE_SCOPEDWRITELOCK_JUCEHEADER__ - -#include "juce_ReadWriteLock.h" - - -//============================================================================== -/** - 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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/threads/juce_SpinLock.h b/src/juce/JuceLibraryCode/modules/juce_core/threads/juce_SpinLock.h deleted file mode 100644 index 3dac9117..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/threads/juce_SpinLock.h +++ /dev/null @@ -1,90 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_SPINLOCK_JUCEHEADER__ -#define __JUCE_SPINLOCK_JUCEHEADER__ - -#include "juce_ScopedLock.h" - - -//============================================================================== -/** - 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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/threads/juce_Thread.cpp b/src/juce/JuceLibraryCode/modules/juce_core/threads/juce_Thread.cpp deleted file mode 100644 index 5df2ee57..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/threads/juce_Thread.cpp +++ /dev/null @@ -1,356 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -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 (100); -} - -//============================================================================== -// 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 CurrentThreadHolder::Ptr getCurrentThreadHolder() -{ - static CurrentThreadHolder::Ptr currentThreadHolder; - SpinLock::ScopedLockType lock (*reinterpret_cast (currentThreadHolderLock)); - - if (currentThreadHolder == nullptr) - currentThreadHolder = new CurrentThreadHolder(); - - return currentThreadHolder; -} - -void Thread::threadEntryPoint() -{ - const CurrentThreadHolder::Ptr currentThreadHolder (getCurrentThreadHolder()); - currentThreadHolder->value = this; - - JUCE_TRY - { - if (threadName.isNotEmpty()) - setCurrentThreadName (threadName); - - if (startSuspensionEvent.wait (10000)) - { - jassert (getCurrentThreadId() == threadId); - - if (affinityMask != 0) - setCurrentThreadAffinityMask (affinityMask); - - run(); - } - } - JUCE_CATCH_ALL_ASSERT - - 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* 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 int sleepMsPerIteration = 5; - int count = timeOutMilliseconds / sleepMsPerIteration; - - while (isThreadRunning()) - { - if (timeOutMilliseconds >= 0 && --count < 0) - return false; - - sleep (sleepMsPerIteration); - } - - return true; -} - -void 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; - } - } -} - -//============================================================================== -bool Thread::setPriority (const int newPriority) -{ - const ScopedLock sl (startStopLock); - - if (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) literal64bit (0x1122334455667788)) == literal64bit (0x8877665544332211)); - - 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/src/juce/JuceLibraryCode/modules/juce_core/threads/juce_Thread.h b/src/juce/JuceLibraryCode/modules/juce_core/threads/juce_Thread.h deleted file mode 100644 index d4645567..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/threads/juce_Thread.h +++ /dev/null @@ -1,289 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_THREAD_JUCEHEADER__ -#define __JUCE_THREAD_JUCEHEADER__ - -#include "juce_WaitableEvent.h" -#include "juce_CriticalSection.h" - - -//============================================================================== -/** - 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. - - 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). - */ - 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 start the thread's run() method. - (if it's already started, 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. - @see signalThreadShouldExit, threadShouldExit, waitForThreadToExit, isThreadRunning - */ - void 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 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 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* 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 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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/threads/juce_ThreadLocalValue.h b/src/juce/JuceLibraryCode/modules/juce_core/threads/juce_ThreadLocalValue.h deleted file mode 100644 index 7009d9e8..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/threads/juce_ThreadLocalValue.h +++ /dev/null @@ -1,196 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_THREADLOCALVALUE_JUCEHEADER__ -#define __JUCE_THREADLOCALVALUE_JUCEHEADER__ - -// (NB: on win32, native thread-locals aren't possible in a dynamically loaded DLL in XP). -#if ! ((JUCE_MSVC && (defined (_WIN64) || ! defined (JucePlugin_PluginCode))) \ - || (JUCE_MAC && defined (__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 could be a primitive type, or any class that - has a default constructor and copy operator. - - 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& threadId_) - : threadId (threadId_), 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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/threads/juce_ThreadPool.cpp b/src/juce/JuceLibraryCode/modules/juce_core/threads/juce_ThreadPool.cpp deleted file mode 100644 index 2c9bf4c1..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/threads/juce_ThreadPool.cpp +++ /dev/null @@ -1,377 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -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; -} - -//============================================================================== -class ThreadPool::ThreadPoolThread : public Thread -{ -public: - ThreadPoolThread (ThreadPool& pool_) - : Thread ("Pool"), - pool (pool_) - { - } - - void run() - { - while (! threadShouldExit()) - { - if (! pool.runNextJob()) - wait (500); - } - } - -private: - ThreadPool& pool; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ThreadPoolThread); -}; - -//============================================================================== -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 + 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.removeValue (job); - addToDeleteList (deletionList, job); - } - } - } - - return dontWait || waitForJobToFinish (job, timeOutMs); -} - -bool ThreadPool::removeAllJobs (const bool interruptRunningJobs, const int timeOutMs, - ThreadPool::JobSelector* 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 + 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() -{ - ThreadPoolJob* const job = pickNextJobToRun(); - - if (job == nullptr) - return false; - - ThreadPoolJob::JobStatus result = ThreadPoolJob::jobHasFinished; - - JUCE_TRY - { - result = job->runJob(); - } - JUCE_CATCH_ALL_ASSERT - - OwnedArray deletionList; - - { - const ScopedLock sl (lock); - - if (jobs.contains (job)) - { - job->isActive = false; - - if (result != ThreadPoolJob::jobNeedsRunningAgain || job->shouldStop) - { - jobs.removeValue (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; -} - -void ThreadPool::addToDeleteList (OwnedArray& deletionList, ThreadPoolJob* const job) const -{ - job->shouldStop = true; - job->pool = nullptr; - - if (job->shouldBeDeleted) - deletionList.add (job); -} diff --git a/src/juce/JuceLibraryCode/modules/juce_core/threads/juce_ThreadPool.h b/src/juce/JuceLibraryCode/modules/juce_core/threads/juce_ThreadPool.h deleted file mode 100644 index 1e6744f6..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/threads/juce_ThreadPool.h +++ /dev/null @@ -1,315 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_THREADPOOL_JUCEHEADER__ -#define __JUCE_THREADPOOL_JUCEHEADER__ - -#include "juce_Thread.h" -#include "../text/juce_StringArray.h" -#include "../containers/juce_Array.h" -#include "../containers/juce_OwnedArray.h" -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(); - - //============================================================================== -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 run() 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 sucessfully - 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 0 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 ThreadPoolThread; - friend class OwnedArray ; - OwnedArray threads; - - CriticalSection lock; - WaitableEvent jobFinishedSignal; - - bool runNextJob(); - 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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/threads/juce_TimeSliceThread.cpp b/src/juce/JuceLibraryCode/modules/juce_core/threads/juce_TimeSliceThread.cpp deleted file mode 100644 index c9ca6246..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/threads/juce_TimeSliceThread.cpp +++ /dev/null @@ -1,169 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -TimeSliceThread::TimeSliceThread (const String& threadName) - : Thread (threadName), - 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.removeValue (client); - } - else - { - clients.removeValue (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; - - TimeSliceClient* const firstClient = getNextClient (index); - if (firstClient != nullptr) - 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 += RelativeTime::milliseconds (msUntilNextCall); - else - clients.removeValue (clientBeingCalled); - - clientBeingCalled = nullptr; - } - } - } - - if (timeToWait > 0) - wait (timeToWait); - } -} diff --git a/src/juce/JuceLibraryCode/modules/juce_core/threads/juce_TimeSliceThread.h b/src/juce/JuceLibraryCode/modules/juce_core/threads/juce_TimeSliceThread.h deleted file mode 100644 index ef99d0ab..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/threads/juce_TimeSliceThread.h +++ /dev/null @@ -1,149 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_TIMESLICETHREAD_JUCEHEADER__ -#define __JUCE_TIMESLICETHREAD_JUCEHEADER__ - -#include "juce_Thread.h" -#include "../containers/juce_Array.h" -#include "../time/juce_Time.h" -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(); - #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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/threads/juce_WaitableEvent.h b/src/juce/JuceLibraryCode/modules/juce_core/threads/juce_WaitableEvent.h deleted file mode 100644 index 11e146fd..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/threads/juce_WaitableEvent.h +++ /dev/null @@ -1,110 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_WAITABLEEVENT_JUCEHEADER__ -#define __JUCE_WAITABLEEVENT_JUCEHEADER__ - -#include "../text/juce_String.h" - - -//============================================================================== -/** - 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. - - @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. - */ - 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: - //============================================================================== - void* internal; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (WaitableEvent); -}; - - -#endif // __JUCE_WAITABLEEVENT_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/time/juce_PerformanceCounter.cpp b/src/juce/JuceLibraryCode/modules/juce_core/time/juce_PerformanceCounter.cpp deleted file mode 100644 index 80ac6589..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/time/juce_PerformanceCounter.cpp +++ /dev/null @@ -1,92 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -PerformanceCounter::PerformanceCounter (const String& name_, - const int runsPerPrintout, - const File& loggingFile) - : name (name_), - numRuns (0), - runsPerPrint (runsPerPrintout), - totalTime (0), - outputFile (loggingFile) -{ - if (outputFile != File::nonexistent) - { - String s ("**** Counter for \""); - s << name_ << "\" started at: " - << Time::getCurrentTime().toString (true, true) - << newLine; - - outputFile.appendText (s, false, false); - } -} - -PerformanceCounter::~PerformanceCounter() -{ - printStatistics(); -} - -void PerformanceCounter::start() -{ - started = Time::getHighResolutionTicks(); -} - -void PerformanceCounter::stop() -{ - const int64 now = Time::getHighResolutionTicks(); - - totalTime += 1000.0 * Time::highResolutionTicksToSeconds (now - started); - - if (++numRuns == runsPerPrint) - printStatistics(); -} - -void PerformanceCounter::printStatistics() -{ - if (numRuns > 0) - { - String s ("Performance count for \""); - s << name << "\" - average over " << numRuns << " run(s) = "; - - const int micros = (int) (totalTime * (1000.0 / numRuns)); - - if (micros > 10000) - s << (micros/1000) << " millisecs"; - else - s << micros << " microsecs"; - - s << ", total = " << String (totalTime / 1000, 5) << " seconds"; - - Logger::outputDebugString (s); - - s << newLine; - - if (outputFile != File::nonexistent) - outputFile.appendText (s, false, false); - - numRuns = 0; - totalTime = 0; - } -} diff --git a/src/juce/JuceLibraryCode/modules/juce_core/time/juce_PerformanceCounter.h b/src/juce/JuceLibraryCode/modules/juce_core/time/juce_PerformanceCounter.h deleted file mode 100644 index 3e022299..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/time/juce_PerformanceCounter.h +++ /dev/null @@ -1,105 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_PERFORMANCECOUNTER_JUCEHEADER__ -#define __JUCE_PERFORMANCECOUNTER_JUCEHEADER__ - -#include "../files/juce_File.h" - - -//============================================================================== -/** 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::nonexistent); - - /** Destructor. */ - ~PerformanceCounter(); - - //============================================================================== - /** Starts timing. - - @see stop - */ - void start(); - - /** 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 - */ - void 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(); - -private: - //============================================================================== - String name; - int numRuns, runsPerPrint; - double totalTime; - int64 started; - File outputFile; -}; - -#endif // __JUCE_PERFORMANCECOUNTER_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/time/juce_RelativeTime.cpp b/src/juce/JuceLibraryCode/modules/juce_core/time/juce_RelativeTime.cpp deleted file mode 100644 index 378ad4e0..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/time/juce_RelativeTime.cpp +++ /dev/null @@ -1,167 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -RelativeTime::RelativeTime (const double seconds_) noexcept - : seconds (seconds_) -{ -} - -RelativeTime::RelativeTime (const RelativeTime& other) noexcept - : seconds (other.seconds) -{ -} - -RelativeTime::~RelativeTime() noexcept -{ -} - -//============================================================================== -const RelativeTime RelativeTime::milliseconds (const int milliseconds) noexcept { return RelativeTime (milliseconds * 0.001); } -const RelativeTime RelativeTime::milliseconds (const int64 milliseconds) noexcept { return RelativeTime (milliseconds * 0.001); } -const RelativeTime RelativeTime::minutes (const double numberOfMinutes) noexcept { return RelativeTime (numberOfMinutes * 60.0); } -const RelativeTime RelativeTime::hours (const double numberOfHours) noexcept { return RelativeTime (numberOfHours * (60.0 * 60.0)); } -const RelativeTime RelativeTime::days (const double numberOfDays) noexcept { return RelativeTime (numberOfDays * (60.0 * 60.0 * 24.0)); } -const 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) (seconds * 1000.0); } -double RelativeTime::inMinutes() const noexcept { return seconds / 60.0; } -double RelativeTime::inHours() const noexcept { return seconds / (60.0 * 60.0); } -double RelativeTime::inDays() const noexcept { return seconds / (60.0 * 60.0 * 24.0); } -double RelativeTime::inWeeks() const noexcept { return seconds / (60.0 * 60.0 * 24.0 * 7.0); } - -//============================================================================== -String RelativeTime::getDescription (const String& returnValueForZeroTime) const -{ - if (seconds < 0.001 && seconds > -0.001) - return returnValueForZeroTime; - - String result; - result.preallocateBytes (32); - - if (seconds < 0) - result << '-'; - - int fieldsShown = 0; - int n = std::abs ((int) inWeeks()); - if (n > 0) - { - result << n << (n == 1 ? TRANS(" week ") - : TRANS(" weeks ")); - ++fieldsShown; - } - - n = std::abs ((int) inDays()) % 7; - if (n > 0) - { - result << n << (n == 1 ? TRANS(" day ") - : TRANS(" days ")); - ++fieldsShown; - } - - if (fieldsShown < 2) - { - n = std::abs ((int) inHours()) % 24; - if (n > 0) - { - result << n << (n == 1 ? TRANS(" hr ") - : TRANS(" hrs ")); - ++fieldsShown; - } - - if (fieldsShown < 2) - { - n = std::abs ((int) inMinutes()) % 60; - if (n > 0) - { - result << n << (n == 1 ? TRANS(" min ") - : TRANS(" mins ")); - ++fieldsShown; - } - - if (fieldsShown < 2) - { - n = std::abs ((int) inSeconds()) % 60; - if (n > 0) - { - result << n << (n == 1 ? TRANS(" sec ") - : TRANS(" secs ")); - ++fieldsShown; - } - - if (fieldsShown == 0) - { - n = std::abs ((int) inMilliseconds()) % 1000; - if (n > 0) - result << n << TRANS(" ms"); - } - } - } - } - - return result.trimEnd(); -} - -//============================================================================== -RelativeTime& RelativeTime::operator= (const RelativeTime& other) noexcept -{ - seconds = other.seconds; - return *this; -} - -//============================================================================== -const RelativeTime& RelativeTime::operator+= (const RelativeTime& timeToAdd) noexcept -{ - seconds += timeToAdd.seconds; - return *this; -} - -const RelativeTime& RelativeTime::operator-= (const RelativeTime& timeToSubtract) noexcept -{ - seconds -= timeToSubtract.seconds; - return *this; -} - -const RelativeTime& RelativeTime::operator+= (const double secondsToAdd) noexcept -{ - seconds += secondsToAdd; - return *this; -} - -const RelativeTime& RelativeTime::operator-= (const double secondsToSubtract) noexcept -{ - seconds -= secondsToSubtract; - return *this; -} - -bool operator== (const RelativeTime& t1, const RelativeTime& t2) noexcept { return t1.inSeconds() == t2.inSeconds(); } -bool operator!= (const RelativeTime& t1, const RelativeTime& t2) noexcept { return t1.inSeconds() != t2.inSeconds(); } -bool operator> (const RelativeTime& t1, const RelativeTime& t2) noexcept { return t1.inSeconds() > t2.inSeconds(); } -bool operator< (const RelativeTime& t1, const RelativeTime& t2) noexcept { return t1.inSeconds() < t2.inSeconds(); } -bool operator>= (const RelativeTime& t1, const RelativeTime& t2) noexcept { return t1.inSeconds() >= t2.inSeconds(); } -bool operator<= (const RelativeTime& t1, const RelativeTime& t2) noexcept { return t1.inSeconds() <= t2.inSeconds(); } - -RelativeTime operator+ (const RelativeTime& t1, const RelativeTime& t2) noexcept { RelativeTime t (t1); return t += t2; } -RelativeTime operator- (const RelativeTime& t1, const RelativeTime& t2) noexcept { RelativeTime t (t1); return t -= t2; } diff --git a/src/juce/JuceLibraryCode/modules/juce_core/time/juce_RelativeTime.h b/src/juce/JuceLibraryCode/modules/juce_core/time/juce_RelativeTime.h deleted file mode 100644 index 21d86bf9..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/time/juce_RelativeTime.h +++ /dev/null @@ -1,178 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_RELATIVETIME_JUCEHEADER__ -#define __JUCE_RELATIVETIME_JUCEHEADER__ - -#include "../text/juce_String.h" - - -//============================================================================== -/** 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 minutes, hours, days, weeks - */ - static const RelativeTime milliseconds (int milliseconds) noexcept; - - /** Creates a new RelativeTime object representing a number of milliseconds. - @see minutes, hours, days, weeks - */ - static const RelativeTime milliseconds (int64 milliseconds) noexcept; - - /** Creates a new RelativeTime object representing a number of minutes. - @see milliseconds, hours, days, weeks - */ - static const RelativeTime minutes (double numberOfMinutes) noexcept; - - /** Creates a new RelativeTime object representing a number of hours. - @see milliseconds, minutes, days, weeks - */ - static const RelativeTime hours (double numberOfHours) noexcept; - - /** Creates a new RelativeTime object representing a number of days. - @see milliseconds, minutes, hours, weeks - */ - static const RelativeTime days (double numberOfDays) noexcept; - - /** Creates a new RelativeTime object representing a number of weeks. - @see milliseconds, minutes, hours, days - */ - static const 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 seconds; } - - /** 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. */ - const RelativeTime& operator+= (const RelativeTime& timeToAdd) noexcept; - /** Subtracts another RelativeTime from this one. */ - const RelativeTime& operator-= (const RelativeTime& timeToSubtract) noexcept; - - /** Adds a number of seconds to this time. */ - const RelativeTime& operator+= (double secondsToAdd) noexcept; - /** Subtracts a number of seconds from this time. */ - const RelativeTime& operator-= (double secondsToSubtract) noexcept; - -private: - //============================================================================== - double seconds; -}; - -//============================================================================== -/** Compares two RelativeTimes. */ -bool operator== (const RelativeTime& t1, const RelativeTime& t2) noexcept; -/** Compares two RelativeTimes. */ -bool operator!= (const RelativeTime& t1, const RelativeTime& t2) noexcept; -/** Compares two RelativeTimes. */ -bool operator> (const RelativeTime& t1, const RelativeTime& t2) noexcept; -/** Compares two RelativeTimes. */ -bool operator< (const RelativeTime& t1, const RelativeTime& t2) noexcept; -/** Compares two RelativeTimes. */ -bool operator>= (const RelativeTime& t1, const RelativeTime& t2) noexcept; -/** Compares two RelativeTimes. */ -bool operator<= (const RelativeTime& t1, const RelativeTime& t2) noexcept; - -//============================================================================== -/** Adds two RelativeTimes together. */ -RelativeTime operator+ (const RelativeTime& t1, const RelativeTime& t2) noexcept; -/** Subtracts two RelativeTimes. */ -RelativeTime operator- (const RelativeTime& t1, const RelativeTime& t2) noexcept; - - - -#endif // __JUCE_RELATIVETIME_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/time/juce_Time.cpp b/src/juce/JuceLibraryCode/modules/juce_core/time/juce_Time.cpp deleted file mode 100644 index 408d38d1..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/time/juce_Time.cpp +++ /dev/null @@ -1,485 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#if JUCE_MSVC - #pragma warning (push) - #pragma warning (disable: 4514) -#endif - -#if JUCE_MSVC - #pragma warning (pop) - - #ifdef _INC_TIME_INL - #define USE_NEW_SECURE_TIME_FNS - #endif -#endif - -//============================================================================== -namespace TimeHelpers -{ - static struct tm millisToLocal (const int64 millis) noexcept - { - struct tm result; - const int64 seconds = millis / 1000; - - if (seconds < literal64bit (86400) || seconds >= literal64bit (2145916800)) - { - // 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 + literal64bit (210866803200); - - const int days = (int) (jdm / literal64bit (86400)); - 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 % literal64bit (86400)); - 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 USE_NEW_SECURE_TIME_FNS - 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 int doFTime (CharPointer_UTF32 dest, const size_t maxChars, - const String& format, const struct tm* const tm) noexcept - { - #if JUCE_ANDROID - HeapBlock tempDest; - tempDest.calloc (maxChars + 2); - const int result = (int) strftime (tempDest, maxChars, format.toUTF8(), tm); - if (result > 0) - dest.writeAll (CharPointer_UTF8 (tempDest.getData())); - return result; - #elif JUCE_WINDOWS - HeapBlock tempDest; - tempDest.calloc (maxChars + 2); - const int result = (int) wcsftime (tempDest, maxChars, format.toWideCharPointer(), tm); - if (result > 0) - dest.writeAll (CharPointer_UTF16 (tempDest.getData())); - return result; - #else - return (int) wcsftime (dest.getAddress(), maxChars, format.toUTF32(), tm); - #endif - } - - 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) * literal64bit (86400) - literal64bit (210866803200); - - 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 -{ - static uint32 lastCounterResult = 0xffffffff; - static int64 correction = 0; - - const uint32 now = getMillisecondCounter(); - - // check the counter hasn't wrapped (also triggered the first time this function is called) - if (now < lastCounterResult) - { - // double-check it's actually wrapped, in case multi-cpu machines have timers that drift a bit. - if (lastCounterResult == 0xffffffff || now < lastCounterResult - 10) - { - // get the time once using normal library calls, and store the difference needed to - // turn the millisecond counter into a real time. - #if JUCE_WINDOWS - struct _timeb t; - #ifdef USE_NEW_SECURE_TIME_FNS - _ftime_s (&t); - #else - _ftime (&t); - #endif - correction = (((int64) t.time) * 1000 + t.millitm) - now; - #else - struct timeval tv; - struct timezone tz; - gettimeofday (&tv, &tz); - correction = (((int64) tv.tv_sec) * 1000 + tv.tv_usec / 1000) - now; - #endif - } - } - - lastCounterResult = now; - - return correction + now; -} - -//============================================================================== -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()); -} - - -//============================================================================== -Time JUCE_CALLTYPE Time::getCurrentTime() noexcept -{ - return Time (currentTimeMillis()); -} - -//============================================================================== -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 -{ - size_t bufferSize = 128; - HeapBlock buffer (128); - - struct tm t (TimeHelpers::millisToLocal (millisSinceEpoch)); - - while (TimeHelpers::doFTime (CharPointer_UTF32 (buffer.getData()), bufferSize, format, &t) <= 0) - { - bufferSize += 128; - buffer.malloc (bufferSize); - } - - return CharPointer_UTF32 (buffer.getData()); -} - -//============================================================================== -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; - else if (hours <= 12) - return hours; - else - 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_WINDOWS - _tzset(); - - #ifdef USE_NEW_SECURE_TIME_FNS - 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 - tzset(); - 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); -} - -String Time::getMonthName (int monthNumber, const bool threeLetterVersion) -{ - const char* const shortMonthNames[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; - const char* const longMonthNames[] = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" }; - - monthNumber %= 12; - - return TRANS (threeLetterVersion ? shortMonthNames [monthNumber] - : longMonthNames [monthNumber]); -} - -String Time::getWeekdayName (int day, const bool threeLetterVersion) -{ - const char* const shortDayNames[] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }; - const char* const longDayNames[] = { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" }; - - day %= 7; - - return TRANS (threeLetterVersion ? shortDayNames [day] - : longDayNames [day]); -} - -//============================================================================== -Time& Time::operator+= (const RelativeTime& delta) { millisSinceEpoch += delta.inMilliseconds(); return *this; } -Time& Time::operator-= (const RelativeTime& delta) { millisSinceEpoch -= delta.inMilliseconds(); return *this; } - -Time operator+ (const Time& time, const RelativeTime& delta) { Time t (time); return t += delta; } -Time operator- (const Time& time, const RelativeTime& delta) { Time t (time); return t -= delta; } -Time operator+ (const RelativeTime& delta, const Time& time) { Time t (time); return t += delta; } -const RelativeTime operator- (const Time& time1, const Time& time2) { return RelativeTime::milliseconds (time1.toMilliseconds() - time2.toMilliseconds()); } - -bool operator== (const Time& time1, const Time& time2) { return time1.toMilliseconds() == time2.toMilliseconds(); } -bool operator!= (const Time& time1, const Time& time2) { return time1.toMilliseconds() != time2.toMilliseconds(); } -bool operator< (const Time& time1, const Time& time2) { return time1.toMilliseconds() < time2.toMilliseconds(); } -bool operator> (const Time& time1, const Time& time2) { return time1.toMilliseconds() > time2.toMilliseconds(); } -bool operator<= (const Time& time1, const Time& time2) { return time1.toMilliseconds() <= time2.toMilliseconds(); } -bool operator>= (const Time& time1, const Time& time2) { return time1.toMilliseconds() >= time2.toMilliseconds(); } diff --git a/src/juce/JuceLibraryCode/modules/juce_core/time/juce_Time.h b/src/juce/JuceLibraryCode/modules/juce_core/time/juce_Time.h deleted file mode 100644 index a56c421b..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/time/juce_Time.h +++ /dev/null @@ -1,403 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_TIME_JUCEHEADER__ -#define __JUCE_TIME_JUCEHEADER__ - -#include "juce_RelativeTime.h" - - -//============================================================================== -/** - 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+= (const RelativeTime& delta); - /** Subtracts a RelativeTime from this time. */ - Time& operator-= (const RelativeTime& delta); - - //============================================================================== - /** 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; - - -private: - //============================================================================== - int64 millisSinceEpoch; -}; - -//============================================================================== -/** Adds a RelativeTime to a Time. */ -JUCE_API Time operator+ (const Time& time, const RelativeTime& delta); -/** Adds a RelativeTime to a Time. */ -JUCE_API Time operator+ (const RelativeTime& delta, const Time& time); - -/** Subtracts a RelativeTime from a Time. */ -JUCE_API Time operator- (const Time& time, const RelativeTime& delta); -/** Returns the relative time difference between two times. */ -JUCE_API const RelativeTime operator- (const Time& time1, const Time& time2); - -/** Compares two Time objects. */ -JUCE_API bool operator== (const Time& time1, const Time& time2); -/** Compares two Time objects. */ -JUCE_API bool operator!= (const Time& time1, const Time& time2); -/** Compares two Time objects. */ -JUCE_API bool operator< (const Time& time1, const Time& time2); -/** Compares two Time objects. */ -JUCE_API bool operator<= (const Time& time1, const Time& time2); -/** Compares two Time objects. */ -JUCE_API bool operator> (const Time& time1, const Time& time2); -/** Compares two Time objects. */ -JUCE_API bool operator>= (const Time& time1, const Time& time2); - - -#endif // __JUCE_TIME_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/unit_tests/juce_UnitTest.cpp b/src/juce/JuceLibraryCode/modules/juce_core/unit_tests/juce_UnitTest.cpp deleted file mode 100644 index d44467da..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/unit_tests/juce_UnitTest.cpp +++ /dev/null @@ -1,234 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -UnitTest::UnitTest (const String& name_) - : name (name_), runner (nullptr) -{ - getAllTests().add (this); -} - -UnitTest::~UnitTest() -{ - getAllTests().removeValue (this); -} - -Array& UnitTest::getAllTests() -{ - static Array tests; - return tests; -} - -void UnitTest::initialise() {} -void UnitTest::shutdown() {} - -void UnitTest::performTest (UnitTestRunner* const runner_) -{ - jassert (runner_ != nullptr); - runner = runner_; - - initialise(); - runTest(); - shutdown(); -} - -void UnitTest::logMessage (const String& message) -{ - runner->logMessage (message); -} - -void UnitTest::beginTest (const String& testName) -{ - runner->beginNewTest (this, testName); -} - -void UnitTest::expect (const bool result, const String& failureMessage) -{ - if (result) - runner->addPass(); - else - runner->addFail (failureMessage); -} - -//============================================================================== -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) -{ - results.clear(); - resultsUpdated(); - - 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() -{ - runTests (UnitTest::getAllTests()); -} - -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/src/juce/JuceLibraryCode/modules/juce_core/unit_tests/juce_UnitTest.h b/src/juce/JuceLibraryCode/modules/juce_core/unit_tests/juce_UnitTest.h deleted file mode 100644 index 4bced4dc..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/unit_tests/juce_UnitTest.h +++ /dev/null @@ -1,287 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_UNITTEST_JUCEHEADER__ -#define __JUCE_UNITTEST_JUCEHEADER__ - -#include "../text/juce_StringArray.h" -#include "../containers/juce_OwnedArray.h" -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); - -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(). - */ - void runTests (const Array& tests); - - /** Runs all the UnitTest objects that currently exist. - This calls runTests() for all the objects listed in UnitTest::getAllTests(). - */ - void runAllTests(); - - /** 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; - - void beginNewTest (UnitTest* test, const String& subCategory); - void endTest(); - - void addPass(); - void addFail (const String& failureMessage); - - JUCE_DECLARE_NON_COPYABLE (UnitTestRunner); -}; - - -#endif // __JUCE_UNITTEST_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/xml/juce_XmlDocument.cpp b/src/juce/JuceLibraryCode/modules/juce_core/xml/juce_XmlDocument.cpp deleted file mode 100644 index 645d8360..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/xml/juce_XmlDocument.cpp +++ /dev/null @@ -1,852 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -XmlDocument::XmlDocument (const String& documentText) - : originalText (documentText), - input (nullptr), - ignoreEmptyTextElements (true) -{ -} - -XmlDocument::XmlDocument (const File& file) - : input (nullptr), - 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); - }*/ -} - -XmlElement* XmlDocument::getDocumentElement (const bool onlyReadOuterDocumentElement) -{ - String textToParse (originalText); - - if (textToParse.isEmpty() && inputSource != nullptr) - { - ScopedPointer in (inputSource->createInputStream()); - - if (in != nullptr) - { - MemoryOutputStream data; - data.writeFromInputStream (*in, onlyReadOuterDocumentElement ? 8192 : -1); - textToParse = data.toString(); - - if (! onlyReadOuterDocumentElement) - originalText = textToParse; - } - } - - input = textToParse.getCharPointer(); - lastError = String::empty; - errorOccurred = false; - outOfData = false; - needToLoadDTD = true; - - if (textToParse.isEmpty()) - { - lastError = "not enough input"; - } - else - { - skipHeader(); - - if (input.getAddress() != nullptr) - { - ScopedPointer result (readNextElement (! onlyReadOuterDocumentElement)); - - if (! errorOccurred) - return result.release(); - } - else - { - lastError = "incorrect xml header"; - } - } - - return nullptr; -} - -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; -} - -int XmlDocument::findNextTokenLength() noexcept -{ - int len = 0; - juce_wchar c = *input; - - while (XmlIdentifierChars::isIdentifierChar (c)) - c = input [++len]; - - return len; -} - -void XmlDocument::skipHeader() -{ - const int headerStart = input.indexOf (CharPointer_UTF8 ("= 0) - { - const int headerEnd = (input + headerStart).indexOf (CharPointer_UTF8 ("?>")); - if (headerEnd < 0) - return; - - #if JUCE_DEBUG - const String header (input + headerStart, (size_t) (headerEnd - headerStart)); - const String encoding (header.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(); - - const int docTypeIndex = input.indexOf (CharPointer_UTF8 (" 0) - { - const juce_wchar c = readNextChar(); - - if (outOfData) - return; - - if (c == '<') - ++n; - else if (c == '>') - --n; - } - - dtdText = String (docType, (size_t) (input.getAddress() - (docType.getAddress() + 1))).trim(); -} - -void XmlDocument::skipNextWhiteSpace() -{ - for (;;) - { - juce_wchar c = *input; - - while (CharacterFunctions::isWhitespace (c)) - c = *++input; - - if (c == 0) - { - outOfData = true; - break; - } - else if (c == '<') - { - if (input[1] == '!' - && input[2] == '-' - && input[3] == '-') - { - input += 4; - const int closeComment = input.indexOf (CharPointer_UTF8 ("-->")); - - if (closeComment < 0) - { - outOfData = true; - break; - } - - input += closeComment + 3; - continue; - } - else if (input[1] == '?') - { - input += 2; - const int closeBracket = input.indexOf (CharPointer_UTF8 ("?>")); - - 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); - size_t numChars = 0; - - for (;;) - { - const juce_wchar character = *input; - - if (character == quote) - { - result.appendCharPointer (start, numChars); - ++input; - return; - } - else if (character == '&') - { - result.appendCharPointer (start, numChars); - break; - } - else if (character == 0) - { - outOfData = true; - setLastError ("unmatched quotes", false); - break; - } - - ++input; - ++numChars; - } - } - } -} - -XmlElement* XmlDocument::readNextElement (const bool alsoParseSubElements) -{ - XmlElement* node = nullptr; - - skipNextWhiteSpace(); - if (outOfData) - return nullptr; - - const int openBracket = input.indexOf ((juce_wchar) '<'); - - if (openBracket >= 0) - { - input += openBracket + 1; - int tagLen = findNextTokenLength(); - - if (tagLen == 0) - { - // no tag name - but allow for a gap after the '<' before giving an error - skipNextWhiteSpace(); - tagLen = findNextTokenLength(); - - if (tagLen == 0) - { - setLastError ("tag name missing", false); - return node; - } - } - - node = new XmlElement (String (input, (size_t) tagLen)); - input += tagLen; - 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)) - { - const int attNameLen = findNextTokenLength(); - - if (attNameLen > 0) - { - const String::CharPointerType attNameStart (input); - input += attNameLen; - - skipNextWhiteSpace(); - - if (readNextChar() == '=') - { - skipNextWhiteSpace(); - - const juce_wchar nextChar = *input; - - if (nextChar == '"' || nextChar == '\'') - { - XmlElement::XmlAttributeNode* const newAtt - = new XmlElement::XmlAttributeNode (String (attNameStart, (size_t) attNameLen), - String::empty); - - readQuotedString (newAtt->value); - attributeAppender.append (newAtt); - continue; - } - } - } - } - 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 == '<') - { - if (input[1] == '/') - { - // our close tag.. - const int closeTag = input.indexOf ((juce_wchar) '>'); - - if (closeTag >= 0) - input += closeTag + 1; - - break; - } - else if (input[1] == '!' - && input[2] == '[' - && input[3] == 'C' - && input[4] == 'D' - && input[5] == 'A' - && input[6] == 'T' - && input[7] == 'A' - && input[8] == '[') - { - input += 9; - const String::CharPointerType inputStart (input); - - size_t len = 0; - - for (;;) - { - if (*input == 0) - { - setLastError ("unterminated CDATA section", false); - outOfData = true; - break; - } - else if (input[0] == ']' - && input[1] == ']' - && input[2] == '>') - { - input += 3; - break; - } - - ++input; - ++len; - } - - childAppender.append (XmlElement::createTextElement (String (inputStart, len))); - } - else - { - // this is some other element, so parse and add it.. - XmlElement* const n = readNextElement (true); - - if (n != nullptr) - childAppender.append (n); - else - break; - } - } - else // must be a character block - { - input = preWhitespaceInput; // roll back to include the leading whitespace - String textElementContent; - - for (;;) - { - const juce_wchar c = *input; - - if (c == '<') - 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; - - for (;;) - { - XmlElement* const n = readNextElement (true); - - if (n == nullptr) - break; - - childAppender.append (n); - } - - input = oldInput; - outOfData = oldOutOfData; - } - else - { - textElementContent += entity; - } - } - else - { - const String::CharPointerType start (input); - size_t len = 0; - - for (;;) - { - const juce_wchar nextChar = *input; - - if (nextChar == '<' || nextChar == '&') - { - break; - } - else if (nextChar == 0) - { - setLastError ("unmatched tags", false); - outOfData = true; - return; - } - - ++input; - ++len; - } - - textElementContent.appendCharPointer (start, len); - } - } - - if ((! ignoreEmptyTextElements) || textElementContent.containsNonWhitespaceChars()) - { - childAppender.append (XmlElement::createTextElement (textElementContent)); - } - } - } -} - -void XmlDocument::readEntity (String& result) -{ - // skip over the ampersand - ++input; - - if (input.compareIgnoreCaseUpTo (CharPointer_UTF8 ("amp;"), 4) == 0) - { - input += 4; - result += '&'; - } - else if (input.compareIgnoreCaseUpTo (CharPointer_UTF8 ("quot;"), 5) == 0) - { - input += 5; - result += '"'; - } - else if (input.compareIgnoreCaseUpTo (CharPointer_UTF8 ("apos;"), 5) == 0) - { - input += 5; - result += '\''; - } - else if (input.compareIgnoreCaseUpTo (CharPointer_UTF8 ("lt;"), 3) == 0) - { - input += 3; - result += '<'; - } - else if (input.compareIgnoreCaseUpTo (CharPointer_UTF8 ("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 (">")); - else - return ent.trim().unquoted(); - } - } - - return entity; -} diff --git a/src/juce/JuceLibraryCode/modules/juce_core/xml/juce_XmlDocument.h b/src/juce/JuceLibraryCode/modules/juce_core/xml/juce_XmlDocument.h deleted file mode 100644 index 9af494d1..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/xml/juce_XmlDocument.h +++ /dev/null @@ -1,183 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_XMLDOCUMENT_JUCEHEADER__ -#define __JUCE_XMLDOCUMENT_JUCEHEADER__ - -#include "juce_XmlElement.h" -#include "../text/juce_StringArray.h" -#include "../files/juce_File.h" -#include "../memory/juce_ScopedPointer.h" -class InputSource; - - -//============================================================================== -/** - 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")); - XmlElement* 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 - XmlElement* 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 0 (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; - - void setLastError (const String& desc, bool carryOn); - void skipHeader(); - void skipNextWhiteSpace(); - juce_wchar readNextChar() noexcept; - XmlElement* readNextElement (bool alsoParseSubElements); - void readChildElements (XmlElement* parent); - int findNextTokenLength() noexcept; - void readQuotedString (String& result); - void readEntity (String& result); - - String getFileContents (const String& filename) const; - String expandEntity (const String& entity); - String expandExternalEntity (const String& entity); - String getParameterEntity (const String& entity); - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (XmlDocument); -}; - - -#endif // __JUCE_XMLDOCUMENT_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/xml/juce_XmlElement.cpp b/src/juce/JuceLibraryCode/modules/juce_core/xml/juce_XmlElement.cpp deleted file mode 100644 index 9ccaac26..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/xml/juce_XmlElement.cpp +++ /dev/null @@ -1,840 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -XmlElement::XmlAttributeNode::XmlAttributeNode (const XmlAttributeNode& other) noexcept - : name (other.name), - value (other.value) -{ -} - -XmlElement::XmlAttributeNode::XmlAttributeNode (const String& name_, const String& value_) noexcept - : name (name_), - value (value_) -{ - #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 -} - -inline bool XmlElement::XmlAttributeNode::hasName (const String& nameToMatch) const noexcept -{ - return name.equalsIgnoreCase (nameToMatch); -} - -//============================================================================== -XmlElement::XmlElement (const String& tagName_) noexcept - : tagName (tagName_) -{ - // the tag name mustn't be empty, or it'll look like a text element! - jassert (tagName_.containsNonWhitespaceChars()) - - // The tag can't contain spaces or other characters that would create invalid XML! - jassert (! tagName_.containsAnyOf (" <>/&")); -} - -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 int numSpaces) - { - out.writeRepeatedByte (' ', numSpaces); - } -} - -void XmlElement::writeElementAsText (OutputStream& outputStream, - const int indentationLevel, - const int lineWrapLength) const -{ - using namespace XmlOutputFunctions; - - if (indentationLevel >= 0) - writeSpaces (outputStream, indentationLevel); - - if (! isTextElement()) - { - outputStream.writeByte ('<'); - outputStream << tagName; - - { - const int attIndent = 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, indentationLevel); - } - - outputStream.write ("'); - } - else - { - outputStream.write ("/>", 2); - } - } - else - { - escapeIllegalXmlChars (outputStream, getText(), false); - } -} - -String XmlElement::createDocument (const String& dtdToUse, - const bool allOnOneLine, - const bool includeXmlHeader, - const String& encodingType, - const int lineWrapLength) const -{ - MemoryOutputStream mem (2048); - writeToStream (mem, dtdToUse, allOnOneLine, includeXmlHeader, encodingType, lineWrapLength); - - return mem.toUTF8(); -} - -void XmlElement::writeToStream (OutputStream& output, - const String& dtdToUse, - const bool allOnOneLine, - const bool includeXmlHeader, - const String& 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, - const String& dtdToUse, - const String& encodingType, - const int lineWrapLength) const -{ - if (file.hasWriteAccess()) - { - TemporaryFile tempFile (file); - ScopedPointer out (tempFile.getFile().createOutputStream()); - - if (out != nullptr) - { - writeToStream (*out, dtdToUse, false, true, encodingType, lineWrapLength); - out = nullptr; - - return tempFile.overwriteTargetFileWithTemporary(); - } - } - - return false; -} - -//============================================================================== -bool XmlElement::hasTagName (const String& tagNameWanted) const noexcept -{ - #if JUCE_DEBUG - // if debugging, check that the case is actually the same, because - // valid xml is case-sensitive, and although this lets it pass, it's - // better not to.. - if (tagName.equalsIgnoreCase (tagNameWanted)) - { - jassert (tagName == tagNameWanted); - return true; - } - else - { - return false; - } - #else - return tagName.equalsIgnoreCase (tagNameWanted); - #endif -} - -XmlElement* XmlElement::getNextElementWithTagName (const String& 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 -{ - const XmlAttributeNode* const att = attributes [index]; - return att != nullptr ? att->name : String::empty; -} - -const String& XmlElement::getAttributeValue (const int index) const noexcept -{ - const XmlAttributeNode* const att = attributes [index]; - return att != nullptr ? att->value : String::empty; -} - -bool XmlElement::hasAttribute (const String& attributeName) const noexcept -{ - for (const XmlAttributeNode* att = attributes; att != nullptr; att = att->nextListItem) - if (att->hasName (attributeName)) - return true; - - return false; -} - -//============================================================================== -const String& XmlElement::getStringAttribute (const String& attributeName) const noexcept -{ - for (const XmlAttributeNode* att = attributes; att != nullptr; att = att->nextListItem) - if (att->hasName (attributeName)) - return att->value; - - return String::empty; -} - -String XmlElement::getStringAttribute (const String& attributeName, const String& defaultReturnValue) const -{ - for (const XmlAttributeNode* att = attributes; att != nullptr; att = att->nextListItem) - if (att->hasName (attributeName)) - return att->value; - - return defaultReturnValue; -} - -int XmlElement::getIntAttribute (const String& attributeName, const int defaultReturnValue) const -{ - for (const XmlAttributeNode* att = attributes; att != nullptr; att = att->nextListItem) - if (att->hasName (attributeName)) - return att->value.getIntValue(); - - return defaultReturnValue; -} - -double XmlElement::getDoubleAttribute (const String& attributeName, const double defaultReturnValue) const -{ - for (const XmlAttributeNode* att = attributes; att != nullptr; att = att->nextListItem) - if (att->hasName (attributeName)) - return att->value.getDoubleValue(); - - return defaultReturnValue; -} - -bool XmlElement::getBoolAttribute (const String& attributeName, const bool defaultReturnValue) const -{ - for (const XmlAttributeNode* att = attributes; att != nullptr; att = att->nextListItem) - { - if (att->hasName (attributeName)) - { - juce_wchar firstChar = att->value[0]; - - if (CharacterFunctions::isWhitespace (firstChar)) - firstChar = att->value.trimStart() [0]; - - return firstChar == '1' - || firstChar == 't' - || firstChar == 'y' - || firstChar == 'T' - || firstChar == 'Y'; - } - } - - return defaultReturnValue; -} - -bool XmlElement::compareAttribute (const String& attributeName, - const String& stringToCompareAgainst, - const bool ignoreCase) const noexcept -{ - for (const XmlAttributeNode* att = attributes; att != nullptr; att = att->nextListItem) - if (att->hasName (attributeName)) - return ignoreCase ? att->value.equalsIgnoreCase (stringToCompareAgainst) - : att->value == stringToCompareAgainst; - - return false; -} - -//============================================================================== -void XmlElement::setAttribute (const String& attributeName, const String& value) -{ - if (attributes == nullptr) - { - attributes = new XmlAttributeNode (attributeName, value); - } - else - { - XmlAttributeNode* att = attributes; - - for (;;) - { - if (att->hasName (attributeName)) - { - att->value = value; - break; - } - else if (att->nextListItem == nullptr) - { - att->nextListItem = new XmlAttributeNode (attributeName, value); - break; - } - - att = att->nextListItem; - } - } -} - -void XmlElement::setAttribute (const String& attributeName, const int number) -{ - setAttribute (attributeName, String (number)); -} - -void XmlElement::setAttribute (const String& attributeName, const double number) -{ - setAttribute (attributeName, String (number)); -} - -void XmlElement::removeAttribute (const String& attributeName) noexcept -{ - LinkedListPointer* att = &attributes; - - while (att->get() != nullptr) - { - if (att->get()->hasName (attributeName)) - { - delete att->removeNext(); - break; - } - - att = &(att->get()->nextListItem); - } -} - -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 (const String& childName) const noexcept -{ - for (XmlElement* child = firstChildElement; child != nullptr; child = child->nextListItem) - if (child->hasTagName (childName)) - return child; - - return nullptr; -} - -void XmlElement::addChildElement (XmlElement* const newNode) noexcept -{ - if (newNode != nullptr) - firstChildElement.append (newNode); -} - -void XmlElement::insertChildElement (XmlElement* const newNode, - int indexToInsertAt) noexcept -{ - if (newNode != nullptr) - { - removeChildElement (newNode, false); - firstChildElement.insertAtIndex (indexToInsertAt, newNode); - } -} - -XmlElement* XmlElement::createNewChildElement (const String& childTagName) -{ - XmlElement* const newElement = new XmlElement (childTagName); - addChildElement (newElement); - return newElement; -} - -bool XmlElement::replaceChildElement (XmlElement* const currentChildElement, - XmlElement* const newNode) noexcept -{ - if (newNode != nullptr) - { - LinkedListPointer* const p = firstChildElement.findPointerTo (currentChildElement); - - if (p != nullptr) - { - 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 0, 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 (const String& name) noexcept -{ - XmlElement* child = firstChildElement; - - while (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; - - XmlElement* const found = child->findParentElementOf (elementToLookFor); - - if (found != nullptr) - 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(); - - MemoryOutputStream mem (1024); - - for (const XmlElement* child = firstChildElement; child != nullptr; child = child->nextListItem) - mem << child->getAllSubText(); - - return mem.toString(); -} - -String XmlElement::getChildElementAllSubText (const String& childTagName, - const String& defaultReturnValue) const -{ - const XmlElement* const child = getChildByName (childTagName); - - if (child != nullptr) - 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 -{ - XmlElement* child = firstChildElement; - - while (child != nullptr) - { - XmlElement* const next = child->nextListItem; - - if (child->isTextElement()) - removeChildElement (child, true); - - child = next; - } -} diff --git a/src/juce/JuceLibraryCode/modules/juce_core/xml/juce_XmlElement.h b/src/juce/JuceLibraryCode/modules/juce_core/xml/juce_XmlElement.h deleted file mode 100644 index 2d79ce65..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/xml/juce_XmlElement.h +++ /dev/null @@ -1,729 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_XMLELEMENT_JUCEHEADER__ -#define __JUCE_XMLELEMENT_JUCEHEADER__ - -#include "../text/juce_String.h" -#include "../streams/juce_OutputStream.h" -#include "../files/juce_File.h" -#include "../containers/juce_LinkedListPointer.h" - - -//============================================================================== -/** 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) noexcept; - - /** Creates a (deep) copy of another element. */ - XmlElement (const XmlElement& other); - - /** Creates a (deep) copy of another element. */ - XmlElement& operator= (const XmlElement& other); - - #if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS - XmlElement (XmlElement&& other) noexcept; - XmlElement& operator= (XmlElement&& other) noexcept; - #endif - - /** Deleting an XmlElement will also delete all 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 - */ - inline const String& getTagName() const noexcept { return tagName; } - - /** Tests whether this element has a particular tag name. - - @param possibleTagName the tag name you're comparing it with - - @see getTagName - */ - bool hasTagName (const String& possibleTagName) const noexcept; - - //============================================================================== - /** 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 (const String& attributeName) const noexcept; - - /** Returns the value of a named attribute. - - @param attributeName the name of the attribute to look up - */ - const String& getStringAttribute (const String& 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 (const String& 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 (const String& attributeName, - const String& 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 (const String& 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 (const String& 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 (const String& 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 String& 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 String& 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 String& attributeName, - double newValue); - - /** Removes a named attribute from the element. - - @param attributeName the name of the attribute to remove - @see removeAllAttributes - */ - void removeAttribute (const String& 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 (const String& 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 0 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 0 if none is found - @see getNextElement, isTextElement, getChildElement - */ - XmlElement* getChildByName (const String& tagNameToLookFor) 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. - - @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 newChildNode 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* newChildNode, - int indexToInsertAt) 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 (const String& 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 (const String& 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 to find one that contains the specified - child element. - */ - XmlElement* findParentElementOf (const XmlElement* elementToLookFor) 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 (const String& 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 String& name, const String& value) noexcept; - - LinkedListPointer nextListItem; - String name, value; - - bool hasName (const String&) const noexcept; - - private: - XmlAttributeNode& operator= (const XmlAttributeNode&); - }; - - friend class XmlDocument; - friend class LinkedListPointer ; - friend class LinkedListPointer ; - friend class LinkedListPointer ::Appender; - - 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; - - JUCE_LEAK_DETECTOR (XmlElement); -}; - - -#endif // __JUCE_XMLELEMENT_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/zip/juce_GZIPCompressorOutputStream.cpp b/src/juce/JuceLibraryCode/modules/juce_core/zip/juce_GZIPCompressorOutputStream.cpp deleted file mode 100644 index f5ff68be..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/zip/juce_GZIPCompressorOutputStream.cpp +++ /dev/null @@ -1,209 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -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, int dataSize, OutputStream& destStream) - { - // 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, destStream, Z_NO_FLUSH)) - return false; - - return true; - } - - void finish (OutputStream& destStream) - { - const uint8* data = nullptr; - int dataSize = 0; - - while (! finished) - doNextBlock (data, dataSize, destStream, 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, int& dataSize, OutputStream& destStream, 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 = (int) stream.avail_in; - const int bytesDone = ((int) sizeof (buffer)) - (int) stream.avail_out; - return bytesDone <= 0 || destStream.write (buffer, bytesDone); - } - - default: - break; - } - } - - return false; - } - - JUCE_DECLARE_NON_COPYABLE (GZIPCompressorHelper); -}; - -//============================================================================== -GZIPCompressorOutputStream::GZIPCompressorOutputStream (OutputStream* const destStream_, - const int compressionLevel, - const bool deleteDestStream, - const int windowBits) - : destStream (destStream_, deleteDestStream), - helper (new GZIPCompressorHelper (compressionLevel, windowBits)) -{ - jassert (destStream_ != nullptr); -} - -GZIPCompressorOutputStream::~GZIPCompressorOutputStream() -{ - flush(); -} - -void GZIPCompressorOutputStream::flush() -{ - helper->finish (*destStream); - destStream->flush(); -} - -bool GZIPCompressorOutputStream::write (const void* destBuffer, int howMany) -{ - jassert (destBuffer != nullptr && 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; - - 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 (rng.nextInt (2000) + 1); - - for (int k = (int) data.getSize(); --k >= 0;) - data[k] = (char) rng.nextInt (255); - - original.write (data.getData(), (int) data.getSize()); - zipper .write (data.getData(), (int) data.getSize()); - } - } - - { - 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/src/juce/JuceLibraryCode/modules/juce_core/zip/juce_GZIPCompressorOutputStream.h b/src/juce/JuceLibraryCode/modules/juce_core/zip/juce_GZIPCompressorOutputStream.h deleted file mode 100644 index 9ac10b06..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/zip/juce_GZIPCompressorOutputStream.h +++ /dev/null @@ -1,102 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_GZIPCOMPRESSOROUTPUTSTREAM_JUCEHEADER__ -#define __JUCE_GZIPCOMPRESSOROUTPUTSTREAM_JUCEHEADER__ - -#include "../streams/juce_OutputStream.h" -#include "../memory/juce_OptionalScopedPointer.h" -#include "../memory/juce_HeapBlock.h" - - -//============================================================================== -/** - 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(); - bool setPosition (int64 newPosition); - bool write (const void* destBuffer, int howMany); - - /** These are preset values that can be used for the constructor's windowBits paramter. - 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 class ScopedPointer ; - ScopedPointer helper; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (GZIPCompressorOutputStream); -}; - -#endif // __JUCE_GZIPCOMPRESSOROUTPUTSTREAM_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/zip/juce_GZIPDecompressorInputStream.cpp b/src/juce/JuceLibraryCode/modules/juce_core/zip/juce_GZIPDecompressorInputStream.cpp deleted file mode 100644 index ed4a7bbd..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/zip/juce_GZIPDecompressorInputStream.cpp +++ /dev/null @@ -1,275 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#if JUCE_MSVC - #pragma warning (push) - #pragma warning (disable: 4309 4305 4365) -#endif - -namespace zlibNamespace -{ - #if JUCE_INCLUDE_ZLIB_CODE - #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 - #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 noWrap) - : finished (true), - needsDictionary (false), - error (true), - streamIsValid (false), - data (nullptr), - dataSize (0) - { - using namespace zlibNamespace; - zerostruct (stream); - streamIsValid = (inflateInit2 (&stream, noWrap ? -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 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 sourceStream_, - const bool deleteSourceWhenDestroyed, - const bool noWrap_, - const int64 uncompressedStreamLength_) - : sourceStream (sourceStream_, deleteSourceWhenDestroyed), - uncompressedStreamLength (uncompressedStreamLength_), - noWrap (noWrap_), - isEof (false), - activeBufferSize (0), - originalSourcePos (sourceStream_->getPosition()), - currentPos (0), - buffer ((size_t) GZIPDecompressHelper::gzipDecompBufferSize), - helper (new GZIPDecompressHelper (noWrap_)) -{ -} - -GZIPDecompressorInputStream::GZIPDecompressorInputStream (InputStream& sourceStream_) - : sourceStream (&sourceStream_, false), - uncompressedStreamLength (-1), - noWrap (false), - isEof (false), - activeBufferSize (0), - originalSourcePos (sourceStream_.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, 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; -} - -// (This is used as a way for the zip file code to use the crc32 function without including zlib) -unsigned long juce_crc32 (unsigned long, const unsigned char*, unsigned); -unsigned long juce_crc32 (unsigned long crc, const unsigned char* buf, unsigned len) -{ - return zlibNamespace::crc32 (crc, buf, len); -} diff --git a/src/juce/JuceLibraryCode/modules/juce_core/zip/juce_GZIPDecompressorInputStream.h b/src/juce/JuceLibraryCode/modules/juce_core/zip/juce_GZIPDecompressorInputStream.h deleted file mode 100644 index f0be470b..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/zip/juce_GZIPDecompressorInputStream.h +++ /dev/null @@ -1,99 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_GZIPDECOMPRESSORINPUTSTREAM_JUCEHEADER__ -#define __JUCE_GZIPDECOMPRESSORINPUTSTREAM_JUCEHEADER__ - -#include "../streams/juce_InputStream.h" -#include "../memory/juce_OptionalScopedPointer.h" -#include "../memory/juce_HeapBlock.h" - - -//============================================================================== -/** - 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(); - bool setPosition (int64 pos); - int64 getTotalLength(); - bool isExhausted(); - int read (void* destBuffer, int maxBytesToRead); - - - //============================================================================== -private: - OptionalScopedPointer sourceStream; - const int64 uncompressedStreamLength; - const bool noWrap; - bool isEof; - int activeBufferSize; - int64 originalSourcePos, currentPos; - HeapBlock buffer; - - class GZIPDecompressHelper; - friend class ScopedPointer ; - ScopedPointer helper; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (GZIPDecompressorInputStream); -}; - -#endif // __JUCE_GZIPDECOMPRESSORINPUTSTREAM_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/zip/juce_ZipFile.cpp b/src/juce/JuceLibraryCode/modules/juce_core/zip/juce_ZipFile.cpp deleted file mode 100644 index 8affdc69..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/zip/juce_ZipFile.cpp +++ /dev/null @@ -1,578 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -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& file_, ZipFile::ZipEntryHolder& zei) - : file (file_), - zipEntryHolder (zei), - pos (0), - headerSize (0), - inputStream (file_.inputStream) - { - if (file_.inputSource != nullptr) - { - inputStream = streamToDelete = file.inputSource->createInputStream(); - } - else - { - #if JUCE_DEBUG - file_.streamCounter.numOpenStreams++; - #endif - } - - char buffer [30]; - - if (inputStream != nullptr - && inputStream->setPosition (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 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 + zipEntryHolder.streamOffset + headerSize); - num = inputStream->read (buffer, howMany); - } - else - { - inputStream->setPosition (pos + 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 inputSource_) - : inputStream (nullptr), - inputSource (inputSource_) -{ - 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 -{ - ZipEntryHolder* const zei = entries [index]; - return zei != nullptr ? &(zei->entry) : 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) -{ - ZipEntryHolder* const zei = entries[index]; - InputStream* stream = nullptr; - - if (zei != nullptr) - { - stream = new ZipInputStream (*this, *zei); - - if (zei->compressed) - { - stream = new GZIPDecompressorInputStream (stream, true, true, - zei->entry.uncompressedSize); - - // (much faster to unzip in big blocks using a buffer..) - stream = new BufferedInputStream (stream, 32768, true); - } - } - - return stream; -} - -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) - { - 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); - - const File targetFile (targetDirectory.getChildFile (zei->entry.filename)); - - if (zei->entry.filename.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(); -} - - -//============================================================================= -extern unsigned long juce_crc32 (unsigned long crc, const unsigned char* buf, unsigned len); - -class ZipFile::Builder::Item -{ -public: - Item (const File& file_, const int compressionLevel_, const String& storedPathName_) - : file (file_), - storedPathname (storedPathName_.isEmpty() ? file_.getFileName() : storedPathName_), - compressionLevel (compressionLevel_), - compressedSize (0), - headerStart (0) - { - } - - bool writeData (OutputStream& target, const int64 overallStartPosition) - { - MemoryOutputStream compressedData; - - 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; - String storedPathname; - int compressionLevel, compressedSize, headerStart; - unsigned long checksum; - - void writeTimeAndDate (OutputStream& target) const - { - const Time t (file.getLastModificationTime()); - 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) - { - checksum = 0; - FileInputStream input (file); - - if (input.failedToOpen()) - return false; - - const int bufferSize = 2048; - HeapBlock buffer (bufferSize); - - while (! input.isExhausted()) - { - const int bytesRead = input.read (buffer, bufferSize); - - if (bytesRead < 0) - return false; - - checksum = juce_crc32 (checksum, buffer, (unsigned int) bytesRead); - target.write (buffer, bytesRead); - } - - return true; - } - - void writeFlagsAndSizes (OutputStream& target) const - { - target.writeShort (10); // version needed - target.writeShort (0); // flags - target.writeShort (compressionLevel > 0 ? (short) 8 : (short) 0); - writeTimeAndDate (target); - target.writeInt ((int) checksum); - target.writeInt (compressedSize); - target.writeInt ((int) file.getSize()); - 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& fileToAdd, const int compressionLevel, const String& storedPathName) -{ - items.add (new Item (fileToAdd, compressionLevel, storedPathName)); -} - -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/src/juce/JuceLibraryCode/modules/juce_core/zip/juce_ZipFile.h b/src/juce/JuceLibraryCode/modules/juce_core/zip/juce_ZipFile.h deleted file mode 100644 index af65a2ea..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/zip/juce_ZipFile.h +++ /dev/null @@ -1,246 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_ZIPFILE_JUCEHEADER__ -#define __JUCE_ZIPFILE_JUCEHEADER__ - -#include "../files/juce_File.h" -#include "../streams/juce_InputSource.h" -#include "../threads/juce_CriticalSection.h" -#include "../containers/juce_OwnedArray.h" - - -//============================================================================== -/** - 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 (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); - - /** 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 class OwnedArray; - 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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_core/zip/zlib/README b/src/juce/JuceLibraryCode/modules/juce_core/zip/zlib/README deleted file mode 100644 index 758cc500..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_core/zip/zlib/adler32.c b/src/juce/JuceLibraryCode/modules/juce_core/zip/zlib/adler32.c deleted file mode 100644 index bf5cbd20..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_core/zip/zlib/compress.c b/src/juce/JuceLibraryCode/modules/juce_core/zip/zlib/compress.c deleted file mode 100644 index 05c49c55..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_core/zip/zlib/crc32.c b/src/juce/JuceLibraryCode/modules/juce_core/zip/zlib/crc32.c deleted file mode 100644 index 049276db..00000000 --- a/src/juce/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 register 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-register method of multiplying and - taking the remainder. The register is initialized to zero, and for each - incoming bit, x^32 is added mod p to the register if the bit is a one (where - x^32 mod p is p+x^32 = x^26+...+1), and the register 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 register 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 = 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) -{ - register u4 c; - register const u4 FAR *buf4; - - c = (u4)crc; - c = ~c; - while (len && ((ptrdiff_t)buf & 3)) { - c = 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 = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8); - } while (--len); - c = ~c; - return (unsigned long)c; -} - -/* ========================================================================= */ -#define DOBIG4 c ^= *++buf4; \ - c = 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) -{ - register u4 c; - register const u4 FAR *buf4; - - c = REV((u4)crc); - c = ~c; - while (len && ((ptrdiff_t)buf & 3)) { - c = 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 = crc_table[4][(c >> 24) ^ *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/src/juce/JuceLibraryCode/modules/juce_core/zip/zlib/crc32.h b/src/juce/JuceLibraryCode/modules/juce_core/zip/zlib/crc32.h deleted file mode 100644 index 5de49bc9..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_core/zip/zlib/deflate.c b/src/juce/JuceLibraryCode/modules/juce_core/zip/zlib/deflate.c deleted file mode 100644 index a31971a7..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_core/zip/zlib/deflate.c +++ /dev/null @@ -1,1678 +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); - } - if (hash_head) hash_head = 0; /* 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 */ - register Bytef *scan = s->window + s->strstart; /* current string */ - register Bytef *match; /* matched string */ - register 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. - */ - register Bytef *strend = s->window + s->strstart + MAX_MATCH - 1; - register ush scan_start = *(ushf*)scan; - register ush scan_end = *(ushf*)(scan+best_len-1); -#else - register Bytef *strend = s->window + s->strstart + MAX_MATCH; - register Byte scan_end1 = scan[best_len-1]; - register 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) -{ - register Bytef *scan = s->window + s->strstart; /* current string */ - register Bytef *match; /* matched string */ - register int len; /* length of current match */ - register 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) -{ - register unsigned n, m; - register 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/src/juce/JuceLibraryCode/modules/juce_core/zip/zlib/deflate.h b/src/juce/JuceLibraryCode/modules/juce_core/zip/zlib/deflate.h deleted file mode 100644 index a3bae5f1..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_core/zip/zlib/infback.c b/src/juce/JuceLibraryCode/modules/juce_core/zip/zlib/infback.c deleted file mode 100644 index c259d01f..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_core/zip/zlib/inffast.c b/src/juce/JuceLibraryCode/modules/juce_core/zip/zlib/inffast.c deleted file mode 100644 index 6ac383d4..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_core/zip/zlib/inffast.h b/src/juce/JuceLibraryCode/modules/juce_core/zip/zlib/inffast.h deleted file mode 100644 index 614fa787..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_core/zip/zlib/inffixed.h b/src/juce/JuceLibraryCode/modules/juce_core/zip/zlib/inffixed.h deleted file mode 100644 index 423d5c5b..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_core/zip/zlib/inflate.c b/src/juce/JuceLibraryCode/modules/juce_core/zip/zlib/inflate.c deleted file mode 100644 index f70c52ba..00000000 --- a/src/juce/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 &= (1L << 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/src/juce/JuceLibraryCode/modules/juce_core/zip/zlib/inflate.h b/src/juce/JuceLibraryCode/modules/juce_core/zip/zlib/inflate.h deleted file mode 100644 index 31b1279c..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_core/zip/zlib/inftrees.c b/src/juce/JuceLibraryCode/modules/juce_core/zip/zlib/inftrees.c deleted file mode 100644 index dfc0aa73..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_core/zip/zlib/inftrees.h b/src/juce/JuceLibraryCode/modules/juce_core/zip/zlib/inftrees.h deleted file mode 100644 index ea64af09..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_core/zip/zlib/trees.c b/src/juce/JuceLibraryCode/modules/juce_core/zip/zlib/trees.c deleted file mode 100644 index 91ed7660..00000000 --- a/src/juce/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 += 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) -{ - register 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/src/juce/JuceLibraryCode/modules/juce_core/zip/zlib/trees.h b/src/juce/JuceLibraryCode/modules/juce_core/zip/zlib/trees.h deleted file mode 100644 index 5ac45a72..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_core/zip/zlib/uncompr.c b/src/juce/JuceLibraryCode/modules/juce_core/zip/zlib/uncompr.c deleted file mode 100644 index 839602f4..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_core/zip/zlib/zconf.h b/src/juce/JuceLibraryCode/modules/juce_core/zip/zlib/zconf.h deleted file mode 100644 index f1e9e870..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_core/zip/zlib/zconf.in.h b/src/juce/JuceLibraryCode/modules/juce_core/zip/zlib/zconf.in.h deleted file mode 100644 index 018173ab..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_core/zip/zlib/zlib.h b/src/juce/JuceLibraryCode/modules/juce_core/zip/zlib/zlib.h deleted file mode 100644 index bdf8af7d..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_core/zip/zlib/zutil.c b/src/juce/JuceLibraryCode/modules/juce_core/zip/zlib/zutil.c deleted file mode 100644 index 630305ca..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_core/zip/zlib/zutil.h b/src/juce/JuceLibraryCode/modules/juce_core/zip/zlib/zutil.h deleted file mode 100644 index 39398587..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_data_structures/app_properties/juce_ApplicationProperties.cpp b/src/juce/JuceLibraryCode/modules/juce_data_structures/app_properties/juce_ApplicationProperties.cpp deleted file mode 100644 index 70798024..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_data_structures/app_properties/juce_ApplicationProperties.cpp +++ /dev/null @@ -1,103 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce 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/src/juce/JuceLibraryCode/modules/juce_data_structures/app_properties/juce_ApplicationProperties.h b/src/juce/JuceLibraryCode/modules/juce_data_structures/app_properties/juce_ApplicationProperties.h deleted file mode 100644 index 97aa1448..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_data_structures/app_properties/juce_ApplicationProperties.h +++ /dev/null @@ -1,130 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_APPLICATIONPROPERTIES_JUCEHEADER__ -#define __JUCE_APPLICATIONPROPERTIES_JUCEHEADER__ - -#include "juce_PropertiesFile.h" - -//============================================================================== -/** - 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. It also has a few handy - methods like testWriteAccess() to check that the files can be saved. - - 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 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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_data_structures/app_properties/juce_PropertiesFile.cpp b/src/juce/JuceLibraryCode/modules/juce_data_structures/app_properties/juce_PropertiesFile.cpp deleted file mode 100644 index e51eaf97..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_data_structures/app_properties/juce_PropertiesFile.cpp +++ /dev/null @@ -1,339 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce 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), - 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 != "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". - - 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 ((commonToAllUsers ? "/var/" : "~/") - + (folderName.isNotEmpty() ? folderName - : ("." + applicationName))); - - #elif JUCE_WINDOWS - File dir (File::getSpecialLocation (commonToAllUsers ? File::commonApplicationDataDirectory - : File::userApplicationDataDirectory)); - - if (dir == File::nonexistent) - return File::nonexistent; - - dir = dir.getChildFile (folderName.isNotEmpty() ? folderName - : applicationName); - #endif - - return dir.getChildFile (applicationName) - .withFileExtension (filenameSuffix); -} - - -//============================================================================== -PropertiesFile::PropertiesFile (const File& file_, const Options& options_) - : PropertySet (options_.ignoreCaseOfKeyNames), - file (file_), options (options_), - loadedOk (false), needsWriting (false) -{ - initialise(); -} - -PropertiesFile::PropertiesFile (const Options& options_) - : PropertySet (options_.ignoreCaseOfKeyNames), - file (options_.getDefaultFile()), options (options_), - loadedOk (false), needsWriting (false) -{ - initialise(); -} - -void PropertiesFile::initialise() -{ - // You need to correctly specify just one storage format for the file - ProcessScopedLock pl (createProcessLock()); - - if (pl != nullptr && ! pl->isLocked()) - return; // locking failure.. - - ScopedPointer fileStream (file.createInputStream()); - - if (fileStream != nullptr) - { - int magicNumber = fileStream->readInt(); - - if (magicNumber == PropertyFileConstants::magicNumberCompressed) - { - fileStream = new GZIPDecompressorInputStream (new SubregionStream (fileStream.release(), 4, -1, true), true); - magicNumber = PropertyFileConstants::magicNumber; - } - - if (magicNumber == PropertyFileConstants::magicNumber) - { - loadedOk = true; - BufferedInputStream in (fileStream.release(), 2048, true); - - 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); - } - } - else - { - // Not a binary props file - let's see if it's XML.. - fileStream = nullptr; - - XmlDocument parser (file); - ScopedPointer doc (parser.getDocumentElement (true)); - - if (doc != nullptr && doc->hasTagName (PropertyFileConstants::fileTag)) - { - doc = parser.getDocumentElement(); - - if (doc != nullptr) - { - loadedOk = true; - - forEachXmlChildElementWithTagName (*doc, e, PropertyFileConstants::valueTag) - { - const String name (e->getStringAttribute (PropertyFileConstants::nameAttribute)); - - if (name.isNotEmpty()) - { - getAllProperties().set (name, - e->getFirstChildElement() != nullptr - ? e->getFirstChildElement()->createDocument (String::empty, true) - : e->getStringAttribute (PropertyFileConstants::valueAttribute)); - } - } - } - else - { - // 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. - } - } - } - } - else - { - loadedOk = ! file.exists(); - } -} - -PropertiesFile::~PropertiesFile() -{ - if (! saveIfNeeded()) - jassertfalse; -} - -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 (file == File::nonexistent - || file.isDirectory() - || ! file.getParentDirectory().createDirectory()) - return false; - - if (options.storageFormat == storeAsXML) - { - XmlElement doc (PropertyFileConstants::fileTag); - - for (int i = 0; i < getAllProperties().size(); ++i) - { - XmlElement* const e = doc.createNewChildElement (PropertyFileConstants::valueTag); - e->setAttribute (PropertyFileConstants::nameAttribute, getAllProperties().getAllKeys() [i]); - - // if the value seems to contain xml, store it as such.. - XmlElement* const childElement = XmlDocument::parse (getAllProperties().getAllValues() [i]); - - if (childElement != nullptr) - e->addChildElement (childElement); - else - e->setAttribute (PropertyFileConstants::valueAttribute, - getAllProperties().getAllValues() [i]); - } - - ProcessScopedLock pl (createProcessLock()); - - if (pl != nullptr && ! pl->isLocked()) - return false; // locking failure.. - - if (doc.writeToFile (file, String::empty)) - { - needsWriting = false; - return true; - } - } - else - { - 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 int numProperties = getAllProperties().size(); - - out->writeInt (numProperties); - - for (int i = 0; i < numProperties; ++i) - { - out->writeString (getAllProperties().getAllKeys() [i]); - out->writeString (getAllProperties().getAllValues() [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/src/juce/JuceLibraryCode/modules/juce_data_structures/app_properties/juce_PropertiesFile.h b/src/juce/JuceLibraryCode/modules/juce_data_structures/app_properties/juce_PropertiesFile.h deleted file mode 100644 index 8df6ecde..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_data_structures/app_properties/juce_PropertiesFile.h +++ /dev/null @@ -1,237 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_PROPERTIESFILE_JUCEHEADER__ -#define __JUCE_PROPERTIESFILE_JUCEHEADER__ - - -//============================================================================== -/** 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 memebers 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". - - 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 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); - - //============================================================================== - /** Returns the file that's being used. */ - File getFile() const { 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(); - void initialise(); - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (PropertiesFile); -}; - -#endif // __JUCE_PROPERTIESFILE_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_data_structures/juce_data_structures.cpp b/src/juce/JuceLibraryCode/modules/juce_data_structures/juce_data_structures.cpp deleted file mode 100644 index f59335ee..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_data_structures/juce_data_structures.cpp +++ /dev/null @@ -1,52 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#if defined (__JUCE_DATA_STRUCTURES_JUCEHEADER__) && ! 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 -{ - -// START_AUTOINCLUDE values/*.cpp, undomanager/*.cpp, app_properties/*.cpp -#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" -// END_AUTOINCLUDE - -} diff --git a/src/juce/JuceLibraryCode/modules/juce_data_structures/juce_data_structures.h b/src/juce/JuceLibraryCode/modules/juce_data_structures/juce_data_structures.h deleted file mode 100644 index 7ee82334..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_data_structures/juce_data_structures.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_DATA_STRUCTURES_JUCEHEADER__ -#define __JUCE_DATA_STRUCTURES_JUCEHEADER__ - -//============================================================================= -#include "../juce_events/juce_events.h" - -namespace juce -{ - -// START_AUTOINCLUDE values, undomanager, app_properties -#ifndef __JUCE_VALUE_JUCEHEADER__ - #include "values/juce_Value.h" -#endif -#ifndef __JUCE_VALUETREE_JUCEHEADER__ - #include "values/juce_ValueTree.h" -#endif -#ifndef __JUCE_UNDOABLEACTION_JUCEHEADER__ - #include "undomanager/juce_UndoableAction.h" -#endif -#ifndef __JUCE_UNDOMANAGER_JUCEHEADER__ - #include "undomanager/juce_UndoManager.h" -#endif -#ifndef __JUCE_APPLICATIONPROPERTIES_JUCEHEADER__ - #include "app_properties/juce_ApplicationProperties.h" -#endif -#ifndef __JUCE_PROPERTIESFILE_JUCEHEADER__ - #include "app_properties/juce_PropertiesFile.h" -#endif -// END_AUTOINCLUDE - -} - -#endif // __JUCE_DATA_STRUCTURES_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_data_structures/juce_data_structures.mm b/src/juce/JuceLibraryCode/modules/juce_data_structures/juce_data_structures.mm deleted file mode 100644 index 0e3fd0e9..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_data_structures/juce_data_structures.mm +++ /dev/null @@ -1,26 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#include "juce_data_structures.cpp" diff --git a/src/juce/JuceLibraryCode/modules/juce_data_structures/juce_module_info b/src/juce/JuceLibraryCode/modules/juce_data_structures/juce_module_info deleted file mode 100644 index e11e9310..00000000 --- a/src/juce/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": "2.0.21", - "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/src/juce/JuceLibraryCode/modules/juce_data_structures/undomanager/juce_UndoManager.cpp b/src/juce/JuceLibraryCode/modules/juce_data_structures/undomanager/juce_UndoManager.cpp deleted file mode 100644 index 59fee384..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_data_structures/undomanager/juce_UndoManager.cpp +++ /dev/null @@ -1,273 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -UndoManager::UndoManager (const int maxNumberOfUnitsToKeep, - const int minimumTransactions) - : totalUnitsStored (0), - nextIndex (0), - newTransaction (true), - reentrancyCheck (false) -{ - setMaxNumberOfStoredUnits (maxNumberOfUnitsToKeep, - minimumTransactions); -} - -UndoManager::~UndoManager() -{ - clearUndoHistory(); -} - -//============================================================================== -void UndoManager::clearUndoHistory() -{ - transactions.clear(); - transactionNames.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 command_, const String& actionName) -{ - if (command_ != nullptr) - { - ScopedPointer command (command_); - - if (actionName.isNotEmpty()) - currentTransactionName = actionName; - - if (reentrancyCheck) - { - jassertfalse; // don't call perform() recursively from the UndoableAction::perform() or - // undo() methods, or else these actions won't actually get done. - - return false; - } - else if (command->perform()) - { - OwnedArray* commandSet = transactions [nextIndex - 1]; - - if (commandSet != nullptr && ! newTransaction) - { - UndoableAction* lastAction = commandSet->getLast(); - - if (lastAction != nullptr) - { - UndoableAction* coalescedAction = lastAction->createCoalescedAction (command); - - if (coalescedAction != nullptr) - { - command = coalescedAction; - totalUnitsStored -= lastAction->getSizeInUnits(); - commandSet->removeLast(); - } - } - } - else - { - commandSet = new OwnedArray(); - transactions.insert (nextIndex, commandSet); - transactionNames.insert (nextIndex, currentTransactionName); - ++nextIndex; - } - - totalUnitsStored += command->getSizeInUnits(); - commandSet->add (command.release()); - newTransaction = false; - - while (nextIndex < transactions.size()) - { - const OwnedArray * const lastSet = transactions.getLast(); - - for (int i = lastSet->size(); --i >= 0;) - totalUnitsStored -= lastSet->getUnchecked (i)->getSizeInUnits(); - - transactions.removeLast(); - transactionNames.remove (transactionNames.size() - 1); - } - - while (nextIndex > 0 - && totalUnitsStored > maxNumUnitsToKeep - && transactions.size() > minimumTransactionsToKeep) - { - const OwnedArray * const firstSet = transactions.getFirst(); - - for (int i = firstSet->size(); --i >= 0;) - totalUnitsStored -= firstSet->getUnchecked (i)->getSizeInUnits(); - - jassert (totalUnitsStored >= 0); // something fishy going on if this fails! - - transactions.remove (0); - transactionNames.remove (0); - --nextIndex; - } - - sendChangeMessage(); - - return true; - } - } - - return false; -} - -void UndoManager::beginNewTransaction (const String& actionName) -{ - newTransaction = true; - currentTransactionName = actionName; -} - -void UndoManager::setCurrentTransactionName (const String& newName) -{ - currentTransactionName = newName; -} - -//============================================================================== -bool UndoManager::canUndo() const -{ - return nextIndex > 0; -} - -bool UndoManager::canRedo() const -{ - return nextIndex < transactions.size(); -} - -String UndoManager::getUndoDescription() const -{ - return transactionNames [nextIndex - 1]; -} - -String UndoManager::getRedoDescription() const -{ - return transactionNames [nextIndex]; -} - -bool UndoManager::undo() -{ - const OwnedArray* const commandSet = transactions [nextIndex - 1]; - - if (commandSet == nullptr) - return false; - - bool failed = false; - - { - const ScopedValueSetter setter (reentrancyCheck, true); - - for (int i = commandSet->size(); --i >= 0;) - { - if (! commandSet->getUnchecked(i)->undo()) - { - jassertfalse; - failed = true; - break; - } - } - } - - if (failed) - clearUndoHistory(); - else - --nextIndex; - - beginNewTransaction(); - - sendChangeMessage(); - return true; -} - -bool UndoManager::redo() -{ - const OwnedArray* const commandSet = transactions [nextIndex]; - - if (commandSet == nullptr) - return false; - - bool failed = false; - - { - const ScopedValueSetter setter (reentrancyCheck, true); - - for (int i = 0; i < commandSet->size(); ++i) - { - if (! commandSet->getUnchecked(i)->perform()) - { - jassertfalse; - failed = true; - break; - } - } - } - - if (failed) - clearUndoHistory(); - else - ++nextIndex; - - beginNewTransaction(); - - sendChangeMessage(); - return true; -} - -bool UndoManager::undoCurrentTransactionOnly() -{ - return newTransaction ? false : undo(); -} - -void UndoManager::getActionsInCurrentTransaction (Array & actionsFound) const -{ - const OwnedArray * const commandSet = transactions [nextIndex - 1]; - - if (commandSet != nullptr && ! newTransaction) - { - for (int i = 0; i < commandSet->size(); ++i) - actionsFound.add (commandSet->getUnchecked(i)); - } -} - -int UndoManager::getNumActionsInCurrentTransaction() const -{ - const OwnedArray * const commandSet = transactions [nextIndex - 1]; - - if (commandSet != nullptr && ! newTransaction) - return commandSet->size(); - - return 0; -} diff --git a/src/juce/JuceLibraryCode/modules/juce_data_structures/undomanager/juce_UndoManager.h b/src/juce/JuceLibraryCode/modules/juce_data_structures/undomanager/juce_UndoManager.h deleted file mode 100644 index 9077551a..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_data_structures/undomanager/juce_UndoManager.h +++ /dev/null @@ -1,225 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_UNDOMANAGER_JUCEHEADER__ -#define __JUCE_UNDOMANAGER_JUCEHEADER__ - -#include "juce_UndoableAction.h" - - -//============================================================================== -/** - 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 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 = String::empty); - - /** 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 = String::empty); - - /** 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); - - //============================================================================== - /** Returns true if there's at least one action in the list to undo. - - @see getUndoDescription, undo, canRedo - */ - bool canUndo() const; - - /** Returns the description of the transaction that would be next to get undone. - - The description returned is the one that was passed into beginNewTransaction - before the set of actions was performed. - - @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 true if there's at least one action in the list to redo. - - @see getRedoDescription, redo, canUndo - */ - bool canRedo() const; - - /** Returns the description of the transaction that would be next to get redone. - - The description returned is the one that was passed into beginNewTransaction - before the set of actions was performed. - - @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: - //============================================================================== - OwnedArray > transactions; - StringArray transactionNames; - String currentTransactionName; - int totalUnitsStored, maxNumUnitsToKeep, minimumTransactionsToKeep, nextIndex; - bool newTransaction, reentrancyCheck; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (UndoManager); -}; - - -#endif // __JUCE_UNDOMANAGER_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_data_structures/undomanager/juce_UndoableAction.h b/src/juce/JuceLibraryCode/modules/juce_data_structures/undomanager/juce_UndoableAction.h deleted file mode 100644 index a3c731ae..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_data_structures/undomanager/juce_UndoableAction.h +++ /dev/null @@ -1,100 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_UNDOABLEACTION_JUCEHEADER__ -#define __JUCE_UNDOABLEACTION_JUCEHEADER__ - - -//============================================================================== -/** - 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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_data_structures/values/juce_Value.cpp b/src/juce/JuceLibraryCode/modules/juce_data_structures/values/juce_Value.cpp deleted file mode 100644 index acbc24c2..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_data_structures/values/juce_Value.cpp +++ /dev/null @@ -1,228 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -Value::ValueSource::ValueSource() -{ -} - -Value::ValueSource::~ValueSource() -{ -} - -void Value::ValueSource::sendChangeMessage (const bool synchronous) -{ - if (synchronous) - { - // (hold a local reference to this object in case it's freed during the callbacks) - const ReferenceCountedObjectPtr localRef (this); - - for (int i = valuesWithListeners.size(); --i >= 0;) - { - Value* const v = valuesWithListeners[i]; - - if (v != nullptr) - v->callListeners(); - } - } - else - { - if (valuesWithListeners.size() > 0) - triggerAsyncUpdate(); - } -} - -void Value::ValueSource::handleAsyncUpdate() -{ - sendChangeMessage (true); -} - -//============================================================================== -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 (SimpleValueSource); -}; - - -//============================================================================== -Value::Value() - : value (new SimpleValueSource()) -{ -} - -Value::Value (ValueSource* const value_) - : value (value_) -{ - jassert (value_ != nullptr); -} - -Value::Value (const var& initialValue) - : value (new SimpleValueSource (initialValue)) -{ -} - -Value::Value (const Value& other) - : value (other.value) -{ -} - -Value& Value::operator= (const Value& other) -{ - value = other.value; - return *this; -} - -#if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS -Value::Value (Value&& other) noexcept - : value (static_cast &&> (other.value)) -{ -} - -Value& Value::operator= (Value&& other) noexcept -{ - value = static_cast &&> (other.value); - return *this; -} -#endif - -Value::~Value() -{ - if (listeners.size() > 0) - 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() -{ - 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/src/juce/JuceLibraryCode/modules/juce_data_structures/values/juce_Value.h b/src/juce/JuceLibraryCode/modules/juce_data_structures/values/juce_Value.h deleted file mode 100644 index 6fcd5900..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_data_structures/values/juce_Value.h +++ /dev/null @@ -1,233 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_VALUE_JUCEHEADER__ -#define __JUCE_VALUE_JUCEHEADER__ - - -//============================================================================== -/** - 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 alternative to writing things like "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 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, 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 SingleThreadedReferenceCountedObject, - public 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; - - void handleAsyncUpdate(); - - 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(); - - // This is disallowed to avoid confusion about whether it should - // do a by-value or by-reference copy. - Value& operator= (const Value&); -}; - -/** 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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_data_structures/values/juce_ValueTree.cpp b/src/juce/JuceLibraryCode/modules/juce_data_structures/values/juce_ValueTree.cpp deleted file mode 100644 index 3afff8af..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_data_structures/values/juce_ValueTree.cpp +++ /dev/null @@ -1,1107 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -class ValueTree::SharedObject : public ReferenceCountedObject -{ -public: - typedef ReferenceCountedObjectPtr Ptr; - - explicit SharedObject (const Identifier& type_) noexcept - : type (type_), parent (nullptr) - { - } - - SharedObject (const SharedObject& other) - : 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(); - } - } - - void sendPropertyChangeMessage (ValueTree& tree, const Identifier& property) - { - for (int i = valueTreesWithListeners.size(); --i >= 0;) - { - ValueTree* const v = valueTreesWithListeners[i]; - if (v != nullptr) - v->listeners.call (&ValueTree::Listener::valueTreePropertyChanged, tree, property); - } - } - - void sendPropertyChangeMessage (const Identifier& property) - { - ValueTree tree (this); - - for (ValueTree::SharedObject* t = this; t != nullptr; t = t->parent) - t->sendPropertyChangeMessage (tree, property); - } - - void sendChildAddedMessage (ValueTree& tree, ValueTree& child) - { - for (int i = valueTreesWithListeners.size(); --i >= 0;) - { - ValueTree* const v = valueTreesWithListeners[i]; - if (v != nullptr) - v->listeners.call (&ValueTree::Listener::valueTreeChildAdded, tree, child); - } - } - - void sendChildAddedMessage (ValueTree child) - { - ValueTree tree (this); - - for (ValueTree::SharedObject* t = this; t != nullptr; t = t->parent) - t->sendChildAddedMessage (tree, child); - } - - void sendChildRemovedMessage (ValueTree& tree, ValueTree& child) - { - for (int i = valueTreesWithListeners.size(); --i >= 0;) - { - ValueTree* const v = valueTreesWithListeners[i]; - if (v != nullptr) - v->listeners.call (&ValueTree::Listener::valueTreeChildRemoved, tree, child); - } - } - - void sendChildRemovedMessage (ValueTree child) - { - ValueTree tree (this); - - for (ValueTree::SharedObject* t = this; t != nullptr; t = t->parent) - t->sendChildRemovedMessage (tree, child); - } - - void sendChildOrderChangedMessage (ValueTree& tree) - { - for (int i = valueTreesWithListeners.size(); --i >= 0;) - { - ValueTree* const v = valueTreesWithListeners[i]; - if (v != nullptr) - v->listeners.call (&ValueTree::Listener::valueTreeChildOrderChanged, tree); - } - } - - void sendChildOrderChangedMessage() - { - ValueTree tree (this); - - for (ValueTree::SharedObject* t = this; t != nullptr; t = t->parent) - t->sendChildOrderChangedMessage (tree); - } - - void sendParentChangeMessage() - { - ValueTree tree (this); - - for (int j = children.size(); --j >= 0;) - { - SharedObject* const child = children.getObjectPointer (j); - if (child != nullptr) - child->sendParentChangeMessage(); - } - - for (int i = valueTreesWithListeners.size(); --i >= 0;) - { - ValueTree* const v = valueTreesWithListeners[i]; - if (v != nullptr) - v->listeners.call (&ValueTree::Listener::valueTreeParentChanged, tree); - } - } - - const var& getProperty (const Identifier& name) const noexcept - { - return properties [name]; - } - - var getProperty (const Identifier& name, const var& defaultReturnValue) const - { - return properties.getWithDefault (name, defaultReturnValue); - } - - void setProperty (const Identifier& name, const var& newValue, UndoManager* const undoManager) - { - if (undoManager == nullptr) - { - if (properties.set (name, newValue)) - sendPropertyChangeMessage (name); - } - else - { - const var* const existingValue = properties.getVarPointer (name); - - if (existingValue != nullptr) - { - if (*existingValue != newValue) - undoManager->perform (new SetPropertyAction (this, name, newValue, *existingValue, false, false)); - } - else - { - undoManager->perform (new SetPropertyAction (this, name, newValue, var::null, 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::null, 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::null, - properties.getValueAt(i), false, true)); - } - } - - 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::invalid; - } - - 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->getProperty (propertyName) == propertyValue) - return ValueTree (s); - } - - return ValueTree::invalid; - } - - bool isAChildOf (const SharedObject* const possibleParent) const noexcept - { - const SharedObject* p = parent; - - while (p != nullptr) - { - if (p == possibleParent) - return true; - - p = p->parent; - } - - 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 (index < 0) - 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) - { - const Ptr child (children.getObjectPointer (childIndex)); - - if (child != nullptr) - { - 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.toString()); - properties.copyToXmlAttributes (*xml); - - for (int i = 0; i < children.size(); ++i) - xml->addChildElement (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::empty); - output.writeCompressedInt (0); - output.writeCompressedInt (0); - } - } - - //============================================================================== - class SetPropertyAction : public UndoableAction - { - public: - SetPropertyAction (SharedObject* const target_, const Identifier& name_, - const var& newValue_, const var& oldValue_, - const bool isAddingNewProperty_, const bool isDeletingProperty_) - : target (target_), name (name_), newValue (newValue_), oldValue (oldValue_), - isAddingNewProperty (isAddingNewProperty_), isDeletingProperty (isDeletingProperty_) - { - } - - 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)) - { - SetPropertyAction* const next = dynamic_cast (nextAction); - - if (next != nullptr && 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* target_, const int childIndex_, SharedObject* newChild_) - : target (target_), - child (newChild_ != nullptr ? newChild_ : target_->children.getObjectPointer (childIndex_)), - childIndex (childIndex_), - 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* const parent_, const int startIndex_, const int endIndex_) noexcept - : parent (parent_), startIndex (startIndex_), endIndex (endIndex_) - { - } - - 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) - { - MoveChildAction* next = dynamic_cast (nextAction); - - if (next != nullptr && 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 (const Identifier& type_) - : object (new ValueTree::SharedObject (type_)) -{ - jassert (type_.toString().isNotEmpty()); // All objects should be given a sensible type name! -} - -ValueTree::ValueTree (SharedObject* const object_) - : object (object_) -{ -} - -ValueTree::ValueTree (const ValueTree& other) - : object (other.object) -{ -} - -ValueTree& ValueTree::operator= (const ValueTree& other) -{ - if (listeners.size() > 0) - { - if (object != nullptr) - object->valueTreesWithListeners.removeValue (this); - - if (other.object != nullptr) - other.object->valueTreesWithListeners.add (this); - } - - object = other.object; - return *this; -} - -#if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS -ValueTree::ValueTree (ValueTree&& other) noexcept - : object (static_cast (other.object)) -{ -} - -ValueTree& ValueTree::operator= (ValueTree&& other) noexcept -{ - object = static_cast (other.object); - return *this; -} -#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.getObject())); -} - -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->getProperty (name); -} - -const var& ValueTree::getProperty (const Identifier& name) const -{ - return object == nullptr ? var::null : object->getProperty (name); -} - -var ValueTree::getProperty (const Identifier& name, const var& defaultReturnValue) const -{ - return object == nullptr ? defaultReturnValue - : object->getProperty (name, defaultReturnValue); -} - -ValueTree& ValueTree::setProperty (const Identifier& name, const var& newValue, - UndoManager* const undoManager) -{ - jassert (name.toString().isNotEmpty()); - - 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); -} - -//============================================================================== -class ValueTreePropertyValueSource : public Value::ValueSource, - public ValueTree::Listener -{ -public: - ValueTreePropertyValueSource (const ValueTree& tree_, const Identifier& property_, - UndoManager* const undoManager_) - : tree (tree_), property (property_), undoManager (undoManager_) - { - tree.addListener (this); - } - - ~ValueTreePropertyValueSource() - { - tree.removeListener (this); - } - - var getValue() const { return tree [property]; } - void setValue (const var& newValue) { tree.setProperty (property, newValue, undoManager); } - - void valueTreePropertyChanged (ValueTree& treeWhosePropertyHasChanged, - const Identifier& changedProperty) - { - if (tree == treeWhosePropertyHasChanged && property == changedProperty) - sendChangeMessage (false); - } - - void valueTreeChildAdded (ValueTree&, ValueTree&) {} - void valueTreeChildRemoved (ValueTree&, ValueTree&) {} - void valueTreeChildOrderChanged (ValueTree&) {} - void valueTreeParentChanged (ValueTree&) {} - -private: - ValueTree tree; - const Identifier property; - UndoManager* const undoManager; - - JUCE_DECLARE_NON_COPYABLE (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::invalid; -} - -ValueTree ValueTree::getOrCreateChildWithName (const Identifier& type, UndoManager* undoManager) -{ - return object != nullptr ? object->getOrCreateChildWithName (type, undoManager) : ValueTree::invalid; -} - -ValueTree ValueTree::getChildWithProperty (const Identifier& propertyName, const var& propertyValue) const -{ - return object != nullptr ? object->getChildWithProperty (propertyName, propertyValue) : ValueTree::invalid; -} - -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) -{ - 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.size() == 0 && object != nullptr) - object->valueTreesWithListeners.add (this); - - listeners.add (listener); - } -} - -void ValueTree::removeListener (Listener* listener) -{ - listeners.remove (listener); - - if (listeners.size() == 0 && 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) -{ - ValueTree v (xml.getTagName()); - v.object->properties.setFromXmlAttributes (xml); - - forEachXmlChildElement (xml, e) - v.addChild (fromXml (*e), -1, nullptr); - - return v; -} - -//============================================================================== -void ValueTree::writeToStream (OutputStream& output) -{ - SharedObject::writeObjectToStream (output, object); -} - -ValueTree ValueTree::readFromStream (InputStream& input) -{ - const String type (input.readString()); - - if (type.isEmpty()) - return ValueTree::invalid; - - ValueTree v (type); - - const int numProps = input.readCompressedInt(); - - if (numProps < 0) - { - jassertfalse; // trying to read corrupted data! - return v; - } - - int i; - for (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(); - - for (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); -} - -//============================================================================== -#if JUCE_UNIT_TESTS - -class ValueTreeTests : public UnitTest -{ -public: - ValueTreeTests() : UnitTest ("ValueTrees") {} - - static String createRandomIdentifier() - { - char buffer[50] = { 0 }; - const char chars[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-:"; - Random r; - - 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() - { - juce_wchar buffer[50] = { 0 }; - Random r; - - 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()); - - for (int i = r.nextInt (10); --i >= 0;) - { - switch (r.nextInt (5)) - { - case 0: v.setProperty (createRandomIdentifier(), createRandomWideCharString(), undoManager); break; - case 1: v.setProperty (createRandomIdentifier(), r.nextInt(), undoManager); break; - case 2: if (depth < 5) v.addChild (createRandomTree (undoManager, depth + 1), r.nextInt (v.getNumChildren() + 1), undoManager); break; - case 3: v.setProperty (createRandomIdentifier(), r.nextBool(), undoManager); break; - case 4: v.setProperty (createRandomIdentifier(), r.nextDouble(), undoManager); break; - default: break; - } - } - - return v; - } - - void runTest() - { - beginTest ("ValueTree"); - - for (int i = 10; --i >= 0;) - { - MemoryOutputStream mo; - ValueTree v1 (createRandomTree (nullptr, 0)); - 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/src/juce/JuceLibraryCode/modules/juce_data_structures/values/juce_ValueTree.h b/src/juce/JuceLibraryCode/modules/juce_data_structures/values/juce_ValueTree.h deleted file mode 100644 index d818c715..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_data_structures/values/juce_ValueTree.h +++ /dev/null @@ -1,511 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_VALUETREE_JUCEHEADER__ -#define __JUCE_VALUETREE_JUCEHEADER__ - -#include "juce_Value.h" -#include "../undomanager/juce_UndoManager.h" - - -//============================================================================== -/** - 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 (const Identifier& type); - - /** Creates a reference to another ValueTree. */ - ValueTree (const ValueTree& other); - - /** Makes this object reference another node. */ - ValueTree& operator= (const ValueTree& other); - - #if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS - ValueTree (ValueTree&& other) noexcept; - ValueTree& operator= (ValueTree&& other) 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& other) 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& other) 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& other) 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); - - //============================================================================== - /** 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 0. Otherwise, the XML that is produced can - be used to recreate a similar node by calling fromXml() - @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); - - //============================================================================== - /** 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); - - /** 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; - }; - - /** 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; - -private: - //============================================================================== - class SharedObject; - friend class SharedObject; - - ReferenceCountedObjectPtr object; - ListenerList listeners; - - template - struct ComparatorAdapter - { - ComparatorAdapter (ElementComparator& comparator_) noexcept : comparator (comparator_) {} - - 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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_events/broadcasters/juce_ActionBroadcaster.cpp b/src/juce/JuceLibraryCode/modules/juce_events/broadcasters/juce_ActionBroadcaster.cpp deleted file mode 100644 index 7b874c8c..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_events/broadcasters/juce_ActionBroadcaster.cpp +++ /dev/null @@ -1,94 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -class ActionBroadcaster::ActionMessage : public MessageManager::MessageBase -{ -public: - ActionMessage (const ActionBroadcaster* const broadcaster_, - const String& messageText, - ActionListener* const listener_) noexcept - : broadcaster (const_cast (broadcaster_)), - message (messageText), - listener (listener_) - {} - - void messageCallback() - { - const ActionBroadcaster* const b = broadcaster; - - if (b != nullptr && 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/src/juce/JuceLibraryCode/modules/juce_events/broadcasters/juce_ActionBroadcaster.h b/src/juce/JuceLibraryCode/modules/juce_events/broadcasters/juce_ActionBroadcaster.h deleted file mode 100644 index 01248a86..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_events/broadcasters/juce_ActionBroadcaster.h +++ /dev/null @@ -1,86 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_ACTIONBROADCASTER_JUCEHEADER__ -#define __JUCE_ACTIONBROADCASTER_JUCEHEADER__ - -#include "juce_ActionListener.h" - - -//============================================================================== -/** 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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_events/broadcasters/juce_ActionListener.h b/src/juce/JuceLibraryCode/modules/juce_events/broadcasters/juce_ActionListener.h deleted file mode 100644 index 364c415e..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_events/broadcasters/juce_ActionListener.h +++ /dev/null @@ -1,54 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_ACTIONLISTENER_JUCEHEADER__ -#define __JUCE_ACTIONLISTENER_JUCEHEADER__ - - -//============================================================================== -/** - Receives callbacks to indicate that some kind of event has occurred. - - Used by various classes, e.g. buttons when they are pressed, to tell listeners - about something that's happened. - - @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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_events/broadcasters/juce_AsyncUpdater.cpp b/src/juce/JuceLibraryCode/modules/juce_events/broadcasters/juce_AsyncUpdater.cpp deleted file mode 100644 index b7b8012a..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_events/broadcasters/juce_AsyncUpdater.cpp +++ /dev/null @@ -1,88 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -class AsyncUpdater::AsyncUpdaterMessage : public CallbackMessage -{ -public: - AsyncUpdaterMessage (AsyncUpdater& owner_) - : owner (owner_) - { - } - - void messageCallback() - { - if (shouldDeliver.compareAndSetBool (0, 1)) - owner.handleAsyncUpdate(); - } - - Atomic shouldDeliver; - -private: - AsyncUpdater& owner; - - JUCE_DECLARE_NON_COPYABLE (AsyncUpdaterMessage); -}; - -//============================================================================== -AsyncUpdater::AsyncUpdater() -{ - message = 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()); - - message->shouldDeliver.set (0); -} - -void AsyncUpdater::triggerAsyncUpdate() -{ - if (message->shouldDeliver.compareAndSetBool (1, 0)) - message->post(); -} - -void AsyncUpdater::cancelPendingUpdate() noexcept -{ - message->shouldDeliver.set (0); -} - -void AsyncUpdater::handleUpdateNowIfNeeded() -{ - // This can only be called by the event thread. - jassert (MessageManager::getInstance()->currentThreadHasLockedMessageManager()); - - if (message->shouldDeliver.exchange (0) != 0) - handleAsyncUpdate(); -} - -bool AsyncUpdater::isUpdatePending() const noexcept -{ - return message->shouldDeliver.value != 0; -} diff --git a/src/juce/JuceLibraryCode/modules/juce_events/broadcasters/juce_AsyncUpdater.h b/src/juce/JuceLibraryCode/modules/juce_events/broadcasters/juce_AsyncUpdater.h deleted file mode 100644 index 236e85bf..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_events/broadcasters/juce_AsyncUpdater.h +++ /dev/null @@ -1,111 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_ASYNCUPDATER_JUCEHEADER__ -#define __JUCE_ASYNCUPDATER_JUCEHEADER__ - - -//============================================================================== -/** - 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 it finishes, so there's - no guarantee that the callback isn't still running when you return from - */ - 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 message; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AsyncUpdater); -}; - - -#endif // __JUCE_ASYNCUPDATER_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_events/broadcasters/juce_ChangeBroadcaster.cpp b/src/juce/JuceLibraryCode/modules/juce_events/broadcasters/juce_ChangeBroadcaster.cpp deleted file mode 100644 index 7c9a8db8..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_events/broadcasters/juce_ChangeBroadcaster.cpp +++ /dev/null @@ -1,97 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce 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/src/juce/JuceLibraryCode/modules/juce_events/broadcasters/juce_ChangeBroadcaster.h b/src/juce/JuceLibraryCode/modules/juce_events/broadcasters/juce_ChangeBroadcaster.h deleted file mode 100644 index b554efe1..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_events/broadcasters/juce_ChangeBroadcaster.h +++ /dev/null @@ -1,110 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_CHANGEBROADCASTER_JUCEHEADER__ -#define __JUCE_CHANGEBROADCASTER_JUCEHEADER__ - -#include "juce_ChangeListener.h" -#include "juce_ListenerList.h" -#include "juce_AsyncUpdater.h" - - -//============================================================================== -/** - 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(); - - ChangeBroadcaster* owner; - }; - - friend class ChangeBroadcasterCallback; - ChangeBroadcasterCallback callback; - ListenerList changeListeners; - - void callListeners(); - - JUCE_DECLARE_NON_COPYABLE (ChangeBroadcaster); -}; - - -#endif // __JUCE_CHANGEBROADCASTER_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_events/broadcasters/juce_ChangeListener.h b/src/juce/JuceLibraryCode/modules/juce_events/broadcasters/juce_ChangeListener.h deleted file mode 100644 index 620e06ba..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_events/broadcasters/juce_ChangeListener.h +++ /dev/null @@ -1,65 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_CHANGELISTENER_JUCEHEADER__ -#define __JUCE_CHANGELISTENER_JUCEHEADER__ - -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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_events/broadcasters/juce_ListenerList.h b/src/juce/JuceLibraryCode/modules/juce_events/broadcasters/juce_ListenerList.h deleted file mode 100644 index a290d834..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_events/broadcasters/juce_ListenerList.h +++ /dev/null @@ -1,339 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_LISTENERLIST_JUCEHEADER__ -#define __JUCE_LISTENERLIST_JUCEHEADER__ - - -//============================================================================== -/** - 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.removeValue (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); - } - - - //============================================================================== - /** 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& list_) noexcept - : list (list_), index (list_.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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_events/interprocess/juce_InterprocessConnection.cpp b/src/juce/JuceLibraryCode/modules/juce_events/interprocess/juce_InterprocessConnection.cpp deleted file mode 100644 index fb8c9c31..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_events/interprocess/juce_InterprocessConnection.cpp +++ /dev/null @@ -1,368 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -InterprocessConnection::InterprocessConnection (const bool callbacksOnMessageThread, - const uint32 magicMessageHeaderNumber) - : Thread ("Juce IPC connection"), - callbackConnectionState (false), - useMessageThread (callbacksOnMessageThread), - magicMessageHeader (magicMessageHeaderNumber), - pipeReceiveMessageTimeout (-1) -{ -} - -InterprocessConnection::~InterprocessConnection() -{ - callbackConnectionState = false; - disconnect(); - masterReference.clear(); -} - - -//============================================================================== -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(); - startThread(); - return true; - } - else - { - socket = nullptr; - return false; - } -} - -bool InterprocessConnection::connectToPipe (const String& pipeName, - const int pipeReceiveMessageTimeoutMs) -{ - disconnect(); - - ScopedPointer newPipe (new NamedPipe()); - - if (newPipe->openExisting (pipeName)) - { - const ScopedLock sl (pipeAndSocketLock); - pipeReceiveMessageTimeout = pipeReceiveMessageTimeoutMs; - initialiseWithPipe (newPipe.release()); - return true; - } - - return false; -} - -bool InterprocessConnection::createPipe (const String& pipeName, - const int pipeReceiveMessageTimeoutMs) -{ - disconnect(); - - ScopedPointer newPipe (new NamedPipe()); - - if (newPipe->createNewPipe (pipeName)) - { - const ScopedLock sl (pipeAndSocketLock); - pipeReceiveMessageTimeout = pipeReceiveMessageTimeoutMs; - initialiseWithPipe (newPipe.release()); - return true; - } - - return false; -} - -void InterprocessConnection::disconnect() -{ - if (socket != nullptr) - socket->close(); - - if (pipe != nullptr) - pipe->close(); - - stopThread (4000); - - { - const ScopedLock sl (pipeAndSocketLock); - socket = nullptr; - pipe = nullptr; - } - - connectionLostInt(); -} - -bool InterprocessConnection::isConnected() const -{ - const ScopedLock sl (pipeAndSocketLock); - - return ((socket != nullptr && socket->isConnected()) - || (pipe != nullptr && pipe->isOpen())) - && isThreadRunning(); -} - -String InterprocessConnection::getConnectedHostName() const -{ - if (pipe != nullptr) - { - return "localhost"; - } - else if (socket != nullptr) - { - if (! socket->isLocal()) - return socket->getHostName(); - - return "localhost"; - } - - return String::empty; -} - -//============================================================================== -bool InterprocessConnection::sendMessage (const MemoryBlock& message) -{ - uint32 messageHeader[2]; - messageHeader [0] = ByteOrder::swapIfBigEndian (magicMessageHeader); - messageHeader [1] = 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()); - - int bytesWritten = 0; - - const ScopedLock sl (pipeAndSocketLock); - - if (socket != nullptr) - bytesWritten = socket->write (messageData.getData(), (int) messageData.getSize()); - else if (pipe != nullptr) - bytesWritten = pipe->write (messageData.getData(), (int) messageData.getSize()); - - return bytesWritten == (int) messageData.getSize(); -} - -//============================================================================== -void InterprocessConnection::initialiseWithSocket (StreamingSocket* const socket_) -{ - jassert (socket == 0); - socket = socket_; - connectionMadeInt(); - startThread(); -} - -void InterprocessConnection::initialiseWithPipe (NamedPipe* const pipe_) -{ - jassert (pipe == 0); - pipe = pipe_; - connectionMadeInt(); - startThread(); -} - -//============================================================================== -struct ConnectionStateMessage : public MessageManager::MessageBase -{ - ConnectionStateMessage (InterprocessConnection* owner_, bool connectionMade_) noexcept - : owner (owner_), connectionMade (connectionMade_) - {} - - void messageCallback() - { - InterprocessConnection* const ipc = owner; - if (ipc != nullptr) - { - if (connectionMade) - ipc->connectionMade(); - else - ipc->connectionLost(); - } - } - - WeakReference owner; - bool connectionMade; -}; - -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* owner_, const MemoryBlock& data_) - : owner (owner_), data (data_) - {} - - void messageCallback() - { - InterprocessConnection* const ipc = owner; - if (ipc != nullptr) - 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() -{ - const int maximumMessageSize = 1024 * 1024 * 10; // sanity check - - uint32 messageHeader[2]; - const int bytes = socket != nullptr ? socket->read (messageHeader, sizeof (messageHeader), true) - : pipe ->read (messageHeader, sizeof (messageHeader), pipeReceiveMessageTimeout); - - if (bytes == sizeof (messageHeader) - && ByteOrder::swapIfBigEndian (messageHeader[0]) == magicMessageHeader) - { - int bytesInMessage = (int) ByteOrder::swapIfBigEndian (messageHeader[1]); - - if (bytesInMessage > 0 && bytesInMessage < maximumMessageSize) - { - MemoryBlock messageData ((size_t) bytesInMessage, true); - int bytesRead = 0; - - while (bytesInMessage > 0) - { - if (threadShouldExit()) - return false; - - const int numThisTime = jmin (bytesInMessage, 65536); - const int bytesIn = socket != nullptr ? socket->read (static_cast (messageData.getData()) + bytesRead, numThisTime, true) - : pipe ->read (static_cast (messageData.getData()) + bytesRead, numThisTime, pipeReceiveMessageTimeout); - - if (bytesIn <= 0) - break; - - bytesRead += bytesIn; - bytesInMessage -= bytesIn; - } - - if (bytesRead >= 0) - deliverDataInt (messageData); - } - } - else if (bytes < 0) - { - { - const ScopedLock sl (pipeAndSocketLock); - socket = nullptr; - } - - connectionLostInt(); - return false; - } - - return true; -} - -void InterprocessConnection::run() -{ - while (! threadShouldExit()) - { - if (socket != nullptr) - { - const int ready = socket->waitUntilReady (true, 0); - - if (ready < 0) - { - { - const ScopedLock sl (pipeAndSocketLock); - socket = nullptr; - } - - connectionLostInt(); - break; - } - else if (ready > 0) - { - if (! readNextMessageInt()) - break; - } - else - { - Thread::sleep (2); - } - } - else if (pipe != nullptr) - { - if (! pipe->isOpen()) - { - { - const ScopedLock sl (pipeAndSocketLock); - pipe = nullptr; - } - - connectionLostInt(); - break; - } - else - { - if (! readNextMessageInt()) - break; - } - } - else - { - break; - } - } -} diff --git a/src/juce/JuceLibraryCode/modules/juce_events/interprocess/juce_InterprocessConnection.h b/src/juce/JuceLibraryCode/modules/juce_events/interprocess/juce_InterprocessConnection.h deleted file mode 100644 index 63794c8e..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_events/interprocess/juce_InterprocessConnection.h +++ /dev/null @@ -1,204 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_INTERPROCESSCONNECTION_JUCEHEADER__ -#define __JUCE_INTERPROCESSCONNECTION_JUCEHEADER__ - -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 Thread -{ -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. */ - ~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. - - You can optionally specify a timeout length to be passed to the NamedPipe::read() method. - - @returns true if it connects successfully. - @see createPipe, NamedPipe - */ - bool connectToPipe (const String& pipeName, - int pipeReceiveMessageTimeoutMs = -1); - - /** 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. - - You can optionally specify a timeout length to be passed to the NamedPipe::read() method. - - If another process is already using this pipe, this will fail and return false. - */ - bool createPipe (const String& pipeName, - int pipeReceiveMessageTimeoutMs = -1); - - /** 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 null if it uses a pipe). */ - StreamingSocket* getSocket() const noexcept { return socket; } - - /** Returns the pipe that this connection is using (or null 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 will return an empty string if the other machine isn't known for - some reason. - */ - 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 connectionMadeInt(); - void connectionLostInt(); - void deliverDataInt (const MemoryBlock&); - bool readNextMessageInt(); - void run(); - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (InterprocessConnection); -}; - -#endif // __JUCE_INTERPROCESSCONNECTION_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_events/interprocess/juce_InterprocessConnectionServer.cpp b/src/juce/JuceLibraryCode/modules/juce_events/interprocess/juce_InterprocessConnectionServer.cpp deleted file mode 100644 index b7c9971e..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_events/interprocess/juce_InterprocessConnectionServer.cpp +++ /dev/null @@ -1,78 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce 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) - { - InterprocessConnection* newConnection = createConnectionObject(); - - if (newConnection != nullptr) - newConnection->initialiseWithSocket (clientSocket.release()); - } - } -} diff --git a/src/juce/JuceLibraryCode/modules/juce_events/interprocess/juce_InterprocessConnectionServer.h b/src/juce/JuceLibraryCode/modules/juce_events/interprocess/juce_InterprocessConnectionServer.h deleted file mode 100644 index d126f685..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_events/interprocess/juce_InterprocessConnectionServer.h +++ /dev/null @@ -1,96 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_INTERPROCESSCONNECTIONSERVER_JUCEHEADER__ -#define __JUCE_INTERPROCESSCONNECTIONSERVER_JUCEHEADER__ - -#include "juce_InterprocessConnection.h" - - -//============================================================================== -/** - 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(); - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (InterprocessConnectionServer); -}; - - -#endif // __JUCE_INTERPROCESSCONNECTIONSERVER_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_events/juce_events.cpp b/src/juce/JuceLibraryCode/modules/juce_events/juce_events.cpp deleted file mode 100644 index de42626a..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_events/juce_events.cpp +++ /dev/null @@ -1,107 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#if defined (__JUCE_EVENTS_JUCEHEADER__) && ! 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 - -//============================================================================== -namespace juce -{ - -// START_AUTOINCLUDE messages/*.cpp, broadcasters/*.cpp, -// timers/*.cpp, interprocess/*.cpp -#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" -// END_AUTOINCLUDE - -//============================================================================== -#if JUCE_MAC - #include "../juce_core/native/juce_osx_ObjCHelpers.h" - #include "../juce_core/native/juce_mac_ObjCSuffix.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/src/juce/JuceLibraryCode/modules/juce_events/juce_events.h b/src/juce/JuceLibraryCode/modules/juce_events/juce_events.h deleted file mode 100644 index 778ccf22..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_events/juce_events.h +++ /dev/null @@ -1,92 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_EVENTS_JUCEHEADER__ -#define __JUCE_EVENTS_JUCEHEADER__ - -//============================================================================= -#include "../juce_core/juce_core.h" - -namespace juce -{ - -// START_AUTOINCLUDE messages, broadcasters, timers, -// interprocess, native/juce_ScopedXLock* -#ifndef __JUCE_APPLICATIONBASE_JUCEHEADER__ - #include "messages/juce_ApplicationBase.h" -#endif -#ifndef __JUCE_CALLBACKMESSAGE_JUCEHEADER__ - #include "messages/juce_CallbackMessage.h" -#endif -#ifndef __JUCE_DELETEDATSHUTDOWN_JUCEHEADER__ - #include "messages/juce_DeletedAtShutdown.h" -#endif -#ifndef __JUCE_MESSAGE_JUCEHEADER__ - #include "messages/juce_Message.h" -#endif -#ifndef __JUCE_MESSAGELISTENER_JUCEHEADER__ - #include "messages/juce_MessageListener.h" -#endif -#ifndef __JUCE_MESSAGEMANAGER_JUCEHEADER__ - #include "messages/juce_MessageManager.h" -#endif -#ifndef __JUCE_ACTIONBROADCASTER_JUCEHEADER__ - #include "broadcasters/juce_ActionBroadcaster.h" -#endif -#ifndef __JUCE_ACTIONLISTENER_JUCEHEADER__ - #include "broadcasters/juce_ActionListener.h" -#endif -#ifndef __JUCE_ASYNCUPDATER_JUCEHEADER__ - #include "broadcasters/juce_AsyncUpdater.h" -#endif -#ifndef __JUCE_CHANGEBROADCASTER_JUCEHEADER__ - #include "broadcasters/juce_ChangeBroadcaster.h" -#endif -#ifndef __JUCE_CHANGELISTENER_JUCEHEADER__ - #include "broadcasters/juce_ChangeListener.h" -#endif -#ifndef __JUCE_LISTENERLIST_JUCEHEADER__ - #include "broadcasters/juce_ListenerList.h" -#endif -#ifndef __JUCE_MULTITIMER_JUCEHEADER__ - #include "timers/juce_MultiTimer.h" -#endif -#ifndef __JUCE_TIMER_JUCEHEADER__ - #include "timers/juce_Timer.h" -#endif -#ifndef __JUCE_INTERPROCESSCONNECTION_JUCEHEADER__ - #include "interprocess/juce_InterprocessConnection.h" -#endif -#ifndef __JUCE_INTERPROCESSCONNECTIONSERVER_JUCEHEADER__ - #include "interprocess/juce_InterprocessConnectionServer.h" -#endif -#ifndef __JUCE_SCOPEDXLOCK_JUCEHEADER__ - #include "native/juce_ScopedXLock.h" -#endif -// END_AUTOINCLUDE - -} - -#endif // __JUCE_EVENTS_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_events/juce_events.mm b/src/juce/JuceLibraryCode/modules/juce_events/juce_events.mm deleted file mode 100644 index 37db5496..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_events/juce_events.mm +++ /dev/null @@ -1,26 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#include "juce_events.cpp" diff --git a/src/juce/JuceLibraryCode/modules/juce_events/juce_module_info b/src/juce/JuceLibraryCode/modules/juce_events/juce_module_info deleted file mode 100644 index 2557a955..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_events/juce_module_info +++ /dev/null @@ -1,21 +0,0 @@ -{ - "id": "juce_events", - "name": "JUCE message and event handling classes", - "version": "2.0.21", - "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/*" ] -} diff --git a/src/juce/JuceLibraryCode/modules/juce_events/messages/juce_ApplicationBase.cpp b/src/juce/JuceLibraryCode/modules/juce_events/messages/juce_ApplicationBase.cpp deleted file mode 100644 index 045e604c..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_events/messages/juce_ApplicationBase.cpp +++ /dev/null @@ -1,55 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -JUCEApplicationBase::CreateInstanceFunction JUCEApplicationBase::createInstance = 0; -JUCEApplicationBase* JUCEApplicationBase::appInstance = nullptr; - -JUCEApplicationBase::JUCEApplicationBase() -{ - jassert (isStandaloneApp() && appInstance == nullptr); - appInstance = this; -} - -JUCEApplicationBase::~JUCEApplicationBase() -{ - jassert (appInstance == this); - appInstance = nullptr; -} - -// 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(); -} diff --git a/src/juce/JuceLibraryCode/modules/juce_events/messages/juce_ApplicationBase.h b/src/juce/JuceLibraryCode/modules/juce_events/messages/juce_ApplicationBase.h deleted file mode 100644 index aa8fe110..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_events/messages/juce_ApplicationBase.h +++ /dev/null @@ -1,163 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_APPLICATIONBASE_JUCEHEADER__ -#define __JUCE_APPLICATIONBASE_JUCEHEADER__ - - -//============================================================================== -/** - Abstract base class for application classes. - - This class shouldn't be used directly - you'll normally use JUCEApplication as - the base for your app, and that inherits from this, adding some more functionality - to it. - - @see JUCEApplication -*/ -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. - An application must implement this to name itself. - */ - 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. - @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; - - /** 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; - - //============================================================================== - /** Returns true if this executable is running as an app (as opposed to being a plugin - or other kind of shared library. */ - static inline bool isStandaloneApp() noexcept { return createInstance != nullptr; } - - //============================================================================== - #ifndef DOXYGEN - static void appWillTerminateByForce(); - typedef JUCEApplicationBase* (*CreateInstanceFunction)(); - static CreateInstanceFunction createInstance; - -protected: - virtual int shutdownApp() = 0; - #endif - -private: - //============================================================================== - static JUCEApplicationBase* appInstance; - - JUCE_DECLARE_NON_COPYABLE (JUCEApplicationBase); -}; - - -#endif // __JUCE_APPLICATIONBASE_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_events/messages/juce_CallbackMessage.h b/src/juce/JuceLibraryCode/modules/juce_events/messages/juce_CallbackMessage.h deleted file mode 100644 index bd77ea0d..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_events/messages/juce_CallbackMessage.h +++ /dev/null @@ -1,76 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_CALLBACKMESSAGE_JUCEHEADER__ -#define __JUCE_CALLBACKMESSAGE_JUCEHEADER__ - -#include "juce_MessageManager.h" - - -//============================================================================== -/** - 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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_events/messages/juce_DeletedAtShutdown.cpp b/src/juce/JuceLibraryCode/modules/juce_events/messages/juce_DeletedAtShutdown.cpp deleted file mode 100644 index 2d0c42eb..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_events/messages/juce_DeletedAtShutdown.cpp +++ /dev/null @@ -1,80 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -static SpinLock deletedAtShutdownLock; - -DeletedAtShutdown::DeletedAtShutdown() -{ - const SpinLock::ScopedLockType sl (deletedAtShutdownLock); - getObjects().add (this); -} - -DeletedAtShutdown::~DeletedAtShutdown() -{ - const SpinLock::ScopedLockType sl (deletedAtShutdownLock); - getObjects().removeValue (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/src/juce/JuceLibraryCode/modules/juce_events/messages/juce_DeletedAtShutdown.h b/src/juce/JuceLibraryCode/modules/juce_events/messages/juce_DeletedAtShutdown.h deleted file mode 100644 index bf5ea0cf..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_events/messages/juce_DeletedAtShutdown.h +++ /dev/null @@ -1,69 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_DELETEDATSHUTDOWN_JUCEHEADER__ -#define __JUCE_DELETEDATSHUTDOWN_JUCEHEADER__ - - -//============================================================================== -/** - Classes derived from this will be automatically deleted when the application exits. - - After JUCEApplication::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 JUCEApplication class. - */ - static void deleteAll(); - -private: - static Array & getObjects(); - - JUCE_DECLARE_NON_COPYABLE (DeletedAtShutdown); -}; - -#endif // __JUCE_DELETEDATSHUTDOWN_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_events/messages/juce_Message.h b/src/juce/JuceLibraryCode/modules/juce_events/messages/juce_Message.h deleted file mode 100644 index 0946f4ab..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_events/messages/juce_Message.h +++ /dev/null @@ -1,66 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_MESSAGE_JUCEHEADER__ -#define __JUCE_MESSAGE_JUCEHEADER__ - -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(); - - // 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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_events/messages/juce_MessageListener.cpp b/src/juce/JuceLibraryCode/modules/juce_events/messages/juce_MessageListener.cpp deleted file mode 100644 index 5c21e42c..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_events/messages/juce_MessageListener.cpp +++ /dev/null @@ -1,51 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -Message::Message() noexcept {} -Message::~Message() {} - -void Message::messageCallback() -{ - MessageListener* const r = recipient; - if (r != nullptr) - 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/src/juce/JuceLibraryCode/modules/juce_events/messages/juce_MessageListener.h b/src/juce/JuceLibraryCode/modules/juce_events/messages/juce_MessageListener.h deleted file mode 100644 index abd1ae05..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_events/messages/juce_MessageListener.h +++ /dev/null @@ -1,75 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_MESSAGELISTENER_JUCEHEADER__ -#define __JUCE_MESSAGELISTENER_JUCEHEADER__ - -#include "juce_MessageManager.h" - - -//============================================================================== -/** - 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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_events/messages/juce_MessageManager.cpp b/src/juce/JuceLibraryCode/modules/juce_events/messages/juce_MessageManager.cpp deleted file mode 100644 index 74c41637..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_events/messages/juce_MessageManager.cpp +++ /dev/null @@ -1,339 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -class MessageManager::QuitMessage : public MessageManager::MessageBase -{ -public: - QuitMessage() {} - - void messageCallback() - { - MessageManager* const mm = MessageManager::instance; - if (mm != nullptr) - mm->quitMessageReceived = true; - } - - JUCE_DECLARE_NON_COPYABLE (QuitMessage); -}; - -//============================================================================== -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; -} - -inline MessageManager* MessageManager::getInstanceWithoutCreating() noexcept -{ - return instance; -} - -void MessageManager::deleteInstance() -{ - deleteAndZero (instance); -} - -//============================================================================== -void 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) -} - -//============================================================================== -#if JUCE_MODAL_LOOPS_PERMITTED && ! (JUCE_MAC || JUCE_IOS) -void MessageManager::runDispatchLoop() -{ - jassert (isThisTheMessageThread()); // must only be called by the message thread - - runDispatchLoopUntil (-1); -} - -void MessageManager::stopDispatchLoop() -{ - (new QuitMessage())->post(); - quitMessagePosted = true; -} - -bool MessageManager::runDispatchLoopUntil (int millisecondsToRunFor) -{ - jassert (isThisTheMessageThread()); // must only be called by the message thread - - const int64 endTime = Time::currentTimeMillis() + millisecondsToRunFor; - - while ((millisecondsToRunFor < 0 || endTime > Time::currentTimeMillis()) - && ! quitMessageReceived) - { - JUCE_TRY - { - if (! dispatchNextMessageOnSystemQueue (millisecondsToRunFor >= 0)) - { - const int msToWait = (int) (endTime - Time::currentTimeMillis()); - - if (msToWait > 0) - Thread::sleep (jmin (5, msToWait)); - } - } - JUCE_CATCH_EXCEPTION - } - - return ! quitMessageReceived; -} - -#endif - -//============================================================================== -class AsyncFunctionCallback : public MessageManager::MessageBase -{ -public: - AsyncFunctionCallback (MessageCallbackFunction* const f, void* const param) - : result (nullptr), func (f), parameter (param) - {} - - void messageCallback() - { - 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)); - message->post(); - message->finished.wait(); - return message->result; -} - -//============================================================================== -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() - { - 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(); - blockingMessage->post(); - - 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(); -} diff --git a/src/juce/JuceLibraryCode/modules/juce_events/messages/juce_MessageManager.h b/src/juce/JuceLibraryCode/modules/juce_events/messages/juce_MessageManager.h deleted file mode 100644 index b66e8bd6..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_events/messages/juce_MessageManager.h +++ /dev/null @@ -1,329 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_MESSAGEMANAGER_JUCEHEADER__ -#define __JUCE_MESSAGEMANAGER_JUCEHEADER__ - -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 -*/ -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 - /** 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 - - //============================================================================== - /** 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 currenltly 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; - void 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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_events/native/juce_ScopedXLock.h b/src/juce/JuceLibraryCode/modules/juce_events/native/juce_ScopedXLock.h deleted file mode 100644 index 6df27e31..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_events/native/juce_ScopedXLock.h +++ /dev/null @@ -1,51 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_SCOPEDXLOCK_JUCEHEADER__ -#define __JUCE_SCOPEDXLOCK_JUCEHEADER__ - - -//============================================================================== -#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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_events/native/juce_android_Messaging.cpp b/src/juce/JuceLibraryCode/modules/juce_events/native/juce_android_Messaging.cpp deleted file mode 100644 index b370e1ed..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_events/native/juce_android_Messaging.cpp +++ /dev/null @@ -1,80 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce 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, (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() - { - android.activity.callVoidMethod (JuceAppActivity.finish); - } - }; - - (new QuitCallback())->post(); - quitMessagePosted = true; -} diff --git a/src/juce/JuceLibraryCode/modules/juce_events/native/juce_ios_MessageManager.mm b/src/juce/JuceLibraryCode/modules/juce_events/native/juce_ios_MessageManager.mm deleted file mode 100644 index a6476aba..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_events/native/juce_ios_MessageManager.mm +++ /dev/null @@ -1,84 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce 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); // iPhone apps get no mercy.. -} - -bool MessageManager::runDispatchLoopUntil (int millisecondsToRunFor) -{ - JUCE_AUTORELEASEPOOL - jassert (isThisTheMessageThread()); // must only be called by the message thread - - uint32 endTime = Time::getMillisecondCounter() + millisecondsToRunFor; - NSDate* endDate = [NSDate dateWithTimeIntervalSinceNow: millisecondsToRunFor * 0.001]; - - while (! quitMessagePosted) - { - JUCE_AUTORELEASEPOOL - - [[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode - beforeDate: endDate]; - - if (millisecondsToRunFor >= 0 && Time::getMillisecondCounter() >= endTime) - 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&) -{ -} diff --git a/src/juce/JuceLibraryCode/modules/juce_events/native/juce_linux_Messaging.cpp b/src/juce/JuceLibraryCode/modules/juce_events/native/juce_linux_Messaging.cpp deleted file mode 100644 index fccc3598..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_events/native/juce_linux_Messaging.cpp +++ /dev/null @@ -1,396 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce 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 - -extern void juce_windowMessageReceive (XEvent* event); // Defined in Windowing.cpp -extern void juce_handleSelectionRequest (XSelectionRequestEvent &evt); // Defined in Clipboard.cpp - -//============================================================================== -ScopedXLock::ScopedXLock() { XLockDisplay (display); } -ScopedXLock::~ScopedXLock() { 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(); - else - return dispatchNextInternalMessage() || dispatchNextXEvent(); - } - - // Wait for an event (either XEvent, or an internal Message) - bool sleepUntilEvent (const int timeoutMs) - { - if (! isEmpty()) - return true; - - if (display != 0) - { - 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 != 0) - { - 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 == 0) - return false; - - XEvent evt; - - { - ScopedXLock xlock; - if (! XPending (display)) - return false; - - XNextEvent (display, &evt); - } - - if (evt.type == SelectionRequest && evt.xany.window == juce_messageWindowHandle) - juce_handleSelectionRequest (evt.xselectionrequest); - else if (evt.xany.window != juce_messageWindowHandle) - juce_windowMessageReceive (&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() - { - const MessageManager::MessageBase::Ptr msg (popNextMessage()); - - if (msg == nullptr) - return false; - - JUCE_TRY - { - msg->messageCallback(); - } - JUCE_CATCH_EXCEPTION - - return true; - } -}; - -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* 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 != 0) // 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 != 0 && ! 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/src/juce/JuceLibraryCode/modules/juce_events/native/juce_mac_MessageManager.mm b/src/juce/JuceLibraryCode/modules/juce_events/native/juce_mac_MessageManager.mm deleted file mode 100644 index 92219c0a..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_events/native/juce_mac_MessageManager.mm +++ /dev/null @@ -1,379 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -typedef void (*AppFocusChangeCallback)(); -AppFocusChangeCallback appFocusChangeCallback = nullptr; - -typedef bool (*CheckEventBlockedByModalComps) (NSEvent*); -CheckEventBlockedByModalComps isEventBlockedByModalComps = nullptr; - -//============================================================================== -/* When you use multiple DLLs which share similarly-named obj-c classes - like - for example having more than one juce plugin loaded into a host, then when a - method is called, the actual code that runs might actually be in a different module - than the one you expect... So any calls to library functions or statics that are - made inside obj-c methods will probably end up getting executed in a different DLL's - memory space. Not a great thing to happen - this obviously leads to bizarre crashes. - - To work around this insanity, I'm only allowing obj-c methods to make calls to - virtual methods of an object that's known to live inside the right module's space. -*/ -class AppDelegateRedirector -{ -public: - AppDelegateRedirector() {} - virtual ~AppDelegateRedirector() {} - - virtual NSApplicationTerminateReply shouldTerminate() - { - if (JUCEApplicationBase::getInstance() != nullptr) - { - JUCEApplicationBase::getInstance()->systemRequestedQuit(); - - if (! MessageManager::getInstance()->hasStopMessageBeenSent()) - return NSTerminateCancel; - } - - return NSTerminateNow; - } - - virtual void willTerminate() - { - JUCEApplicationBase::appWillTerminateByForce(); - } - - virtual BOOL openFile (NSString* filename) - { - if (JUCEApplicationBase::getInstance() != nullptr) - { - JUCEApplicationBase::getInstance()->anotherInstanceStarted (quotedIfContainsSpaces (filename)); - return YES; - } - - return NO; - } - - virtual void openFiles (NSArray* filenames) - { - StringArray files; - for (unsigned int i = 0; i < [filenames count]; ++i) - files.add (quotedIfContainsSpaces ((NSString*) [filenames objectAtIndex: i])); - - if (files.size() > 0 && JUCEApplicationBase::getInstance() != nullptr) - JUCEApplicationBase::getInstance()->anotherInstanceStarted (files.joinIntoString (" ")); - } - - virtual void focusChanged() - { - if (appFocusChangeCallback != nullptr) - (*appFocusChangeCallback)(); - } - - virtual void deleteSelf() - { - delete this; - } - - void postMessage (MessageManager::MessageBase* const m) - { - messageQueue.post (m); - } - - static NSString* getBroacastEventName() - { - return juceStringToNS ("juce_" + String::toHexString (File::getSpecialLocation (File::currentExecutableFile).hashCode64())); - } - -private: - CFRunLoopRef runLoop; - CFRunLoopSourceRef runLoopSource; - MessageQueue messageQueue; - - static String quotedIfContainsSpaces (NSString* file) - { - String s (nsStringToJuce (file)); - if (s.containsChar (' ')) - s = s.quoted ('"'); - - return s; - } -}; - - -} // (juce namespace) - -using namespace juce; - -#define JuceAppDelegate MakeObjCClassName(JuceAppDelegate) - -//============================================================================== -@interface JuceAppDelegate : NSObject -{ -@public - AppDelegateRedirector* redirector; -} - -- (JuceAppDelegate*) init; -- (void) dealloc; -- (void) unregisterObservers; -- (BOOL) application: (NSApplication*) theApplication openFile: (NSString*) filename; -- (void) application: (NSApplication*) sender openFiles: (NSArray*) filenames; -- (NSApplicationTerminateReply) applicationShouldTerminate: (NSApplication*) app; -- (void) applicationWillTerminate: (NSNotification*) aNotification; -- (void) applicationDidBecomeActive: (NSNotification*) aNotification; -- (void) applicationDidResignActive: (NSNotification*) aNotification; -- (void) applicationWillUnhide: (NSNotification*) aNotification; -- (void) broadcastMessageCallback: (NSNotification*) info; -- (void) dummyMethod; -@end - -@implementation JuceAppDelegate - -- (JuceAppDelegate*) init -{ - [super init]; - - redirector = new AppDelegateRedirector(); - - if (JUCEApplicationBase::isStandaloneApp()) - { - [NSApp setDelegate: self]; - - [[NSDistributedNotificationCenter defaultCenter] addObserver: self - selector: @selector (broadcastMessageCallback:) - name: AppDelegateRedirector::getBroacastEventName() - object: nil]; - } - else - { - NSNotificationCenter* center = [NSNotificationCenter defaultCenter]; - - [center addObserver: self selector: @selector (applicationDidResignActive:) - name: NSApplicationDidResignActiveNotification object: NSApp]; - - [center addObserver: self selector: @selector (applicationDidBecomeActive:) - name: NSApplicationDidBecomeActiveNotification object: NSApp]; - - [center addObserver: self selector: @selector (applicationWillUnhide:) - name: NSApplicationWillUnhideNotification object: NSApp]; - } - - return self; -} - -- (void) dealloc -{ - redirector->deleteSelf(); - [super dealloc]; -} - -- (void) unregisterObservers -{ - [[NSRunLoop currentRunLoop] cancelPerformSelectorsWithTarget: self]; - [[NSNotificationCenter defaultCenter] removeObserver: self]; - - if (JUCEApplicationBase::isStandaloneApp()) - { - [NSApp setDelegate: nil]; - - [[NSDistributedNotificationCenter defaultCenter] removeObserver: self - name: AppDelegateRedirector::getBroacastEventName() - object: nil]; - } -} - -- (NSApplicationTerminateReply) applicationShouldTerminate: (NSApplication*) app -{ - (void) app; - return redirector->shouldTerminate(); -} - -- (void) applicationWillTerminate: (NSNotification*) aNotification -{ - (void) aNotification; - redirector->willTerminate(); -} - -- (BOOL) application: (NSApplication*) app openFile: (NSString*) filename -{ - (void) app; - return redirector->openFile (filename); -} - -- (void) application: (NSApplication*) sender openFiles: (NSArray*) filenames -{ - (void) sender; - return redirector->openFiles (filenames); -} - -- (void) applicationDidBecomeActive: (NSNotification*) notification -{ - (void) notification; - redirector->focusChanged(); -} - -- (void) applicationDidResignActive: (NSNotification*) notification -{ - (void) notification; - redirector->focusChanged(); -} - -- (void) applicationWillUnhide: (NSNotification*) notification -{ - (void) notification; - redirector->focusChanged(); -} - -- (void) broadcastMessageCallback: (NSNotification*) n -{ - NSDictionary* dict = (NSDictionary*) [n userInfo]; - const String messageString (nsStringToJuce ((NSString*) [dict valueForKey: nsStringLiteral ("message")])); - MessageManager::getInstance()->deliverBroadcastMessage (messageString); -} - -- (void) dummyMethod {} // (used as a way of running a dummy thread) - -@end - -//============================================================================== -namespace juce -{ - -static JuceAppDelegate* juceAppDelegate = nil; - -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_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 - } -} - -void MessageManager::stopDispatchLoop() -{ - quitMessagePosted = true; - [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]; -} - -#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]; -} - -void MessageManager::doPlatformSpecificInitialisation() -{ - if (juceAppDelegate == nil) - juceAppDelegate = [[JuceAppDelegate alloc] init]; - - #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: juceAppDelegate - withObject: nil]; - #endif -} - -void MessageManager::doPlatformSpecificShutdown() -{ - if (juceAppDelegate != nil) - { - [juceAppDelegate unregisterObservers]; - [juceAppDelegate release]; - juceAppDelegate = nil; - } -} - -bool MessageManager::postMessageToSystemQueue (MessageBase* message) -{ - juceAppDelegate->redirector->postMessage (message); - return true; -} - -void MessageManager::broadcastMessage (const String& message) -{ - NSDictionary* info = [NSDictionary dictionaryWithObject: juceStringToNS (message) - forKey: nsStringLiteral ("message")]; - - [[NSDistributedNotificationCenter defaultCenter] postNotificationName: AppDelegateRedirector::getBroacastEventName() - object: nil - userInfo: info]; -} diff --git a/src/juce/JuceLibraryCode/modules/juce_events/native/juce_osx_MessageQueue.h b/src/juce/JuceLibraryCode/modules/juce_events/native/juce_osx_MessageQueue.h deleted file mode 100644 index d478424d..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_events/native/juce_osx_MessageQueue.h +++ /dev/null @@ -1,103 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_OSX_MESSAGEQUEUE_JUCEHEADER__ -#define __JUCE_OSX_MESSAGEQUEUE_JUCEHEADER__ - -//============================================================================== -/* 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 = { 0 }; - 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; - CriticalSection lock; - 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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_events/native/juce_win32_HiddenMessageWindow.h b/src/juce/JuceLibraryCode/modules/juce_events/native/juce_win32_HiddenMessageWindow.h deleted file mode 100644 index b0b634fd..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_events/native/juce_win32_HiddenMessageWindow.h +++ /dev/null @@ -1,132 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_WIN32_HIDDENMESSAGEWINDOW_JUCEHEADER__ -#define __JUCE_WIN32_HIDDENMESSAGEWINDOW_JUCEHEADER__ - -//============================================================================== -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) 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() {} - -protected: - virtual void systemDeviceChanged() = 0; - -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*/)) - { - // 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. - ((DeviceChangeDetector*) GetWindowLongPtr (h, GWLP_USERDATA))->startTimer (500); - } - - return DefWindowProc (h, message, wParam, lParam); - } - - void timerCallback() - { - systemDeviceChanged(); - } -}; - -#endif // __JUCE_WIN32_HIDDENMESSAGEWINDOW_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_events/native/juce_win32_Messaging.cpp b/src/juce/JuceLibraryCode/modules/juce_events/native/juce_win32_Messaging.cpp deleted file mode 100644 index 2e8ecb73..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_events/native/juce_win32_Messaging.cpp +++ /dev/null @@ -1,192 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce 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 - { - 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 0; - } - else if (message == broadcastId) - { - const ScopedPointer messageString ((String*) lParam); - MessageManager::getInstance()->deliverBroadcastMessage (*messageString); - return 0; - } - else 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 0; - } - } - } - - return DefWindowProc (h, message, wParam, lParam); - } - - 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, 0)) - 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) - { - JUCEApplicationBase* const app = JUCEApplicationBase::getInstance(); - if (app != nullptr) - 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]; // no need to read longer strings than this - GetWindowText (hwnd, windowName, 64); - windowName [63] = 0; - - 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(); -} diff --git a/src/juce/JuceLibraryCode/modules/juce_events/timers/juce_MultiTimer.cpp b/src/juce/JuceLibraryCode/modules/juce_events/timers/juce_MultiTimer.cpp deleted file mode 100644 index 753d5606..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_events/timers/juce_MultiTimer.cpp +++ /dev/null @@ -1,121 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -class MultiTimer::MultiTimerCallback : public Timer -{ -public: - MultiTimerCallback (const int timerId_, MultiTimer& owner_) - : timerId (timerId_), - owner (owner_) - { - } - - void timerCallback() - { - owner.timerCallback (timerId); - } - - const int timerId; - -private: - MultiTimer& owner; -}; - -//============================================================================== -MultiTimer::MultiTimer() noexcept -{ -} - -MultiTimer::MultiTimer (const MultiTimer&) noexcept -{ -} - -MultiTimer::~MultiTimer() -{ - const SpinLock::ScopedLockType sl (timerListLock); - timers.clear(); -} - -//============================================================================== -void MultiTimer::startTimer (const int timerId, const int intervalInMilliseconds) noexcept -{ - const SpinLock::ScopedLockType sl (timerListLock); - - for (int i = timers.size(); --i >= 0;) - { - MultiTimerCallback* const t = timers.getUnchecked(i); - - if (t->timerId == timerId) - { - t->startTimer (intervalInMilliseconds); - return; - } - } - - MultiTimerCallback* const newTimer = new MultiTimerCallback (timerId, *this); - timers.add (newTimer); - newTimer->startTimer (intervalInMilliseconds); -} - -void MultiTimer::stopTimer (const int timerId) noexcept -{ - const SpinLock::ScopedLockType sl (timerListLock); - - for (int i = timers.size(); --i >= 0;) - { - MultiTimerCallback* const t = timers.getUnchecked(i); - - if (t->timerId == timerId) - t->stopTimer(); - } -} - -bool MultiTimer::isTimerRunning (const int timerId) const noexcept -{ - const SpinLock::ScopedLockType sl (timerListLock); - - for (int i = timers.size(); --i >= 0;) - { - const MultiTimerCallback* const t = timers.getUnchecked(i); - if (t->timerId == timerId) - return t->isTimerRunning(); - } - - return false; -} - -int MultiTimer::getTimerInterval (const int timerId) const noexcept -{ - const SpinLock::ScopedLockType sl (timerListLock); - - for (int i = timers.size(); --i >= 0;) - { - const MultiTimerCallback* const t = timers.getUnchecked(i); - if (t->timerId == timerId) - return t->getTimerInterval(); - } - - return 0; -} diff --git a/src/juce/JuceLibraryCode/modules/juce_events/timers/juce_MultiTimer.h b/src/juce/JuceLibraryCode/modules/juce_events/timers/juce_MultiTimer.h deleted file mode 100644 index 79073187..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_events/timers/juce_MultiTimer.h +++ /dev/null @@ -1,130 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_MULTITIMER_JUCEHEADER__ -#define __JUCE_MULTITIMER_JUCEHEADER__ - -#include "juce_Timer.h" - -//============================================================================== -/** - 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& other) 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 it's no timer - is running for the ID number specified. - */ - int getTimerInterval (int timerId) const noexcept; - - - //============================================================================== -private: - class MultiTimerCallback; - SpinLock timerListLock; - OwnedArray timers; - - MultiTimer& operator= (const MultiTimer&); -}; - -#endif // __JUCE_MULTITIMER_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_events/timers/juce_Timer.cpp b/src/juce/JuceLibraryCode/modules/juce_events/timers/juce_Timer.cpp deleted file mode 100644 index 1c99c75b..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_events/timers/juce_Timer.cpp +++ /dev/null @@ -1,386 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce 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() - { - 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 + 2000; - - while (callbackNeeded.get() != 0) - { - wait (4); - - if (threadShouldExit()) - return; - - if (Time::getMillisecondCounter() > messageDeliveryTimeout) - 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() - { - if (instance != nullptr) - instance->callTimers(); - } - }; - - //============================================================================== - void addTimer (Timer* const t) noexcept - { - #if JUCE_DEBUG - Timer* tt = firstTimer; - - while (tt != nullptr) - { - // 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 (tt != t); - - tt = tt->next; - } - - jassert (t->previous == nullptr && t->next == nullptr); - #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 - Timer* tt = firstTimer; - bool found = false; - - while (tt != nullptr) - { - if (tt == t) - { - found = true; - break; - } - - tt = tt->next; - } - - // 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 (found); - #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() - { - startThread (7); - } - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (TimerThread); -}; - -Timer::TimerThread* Timer::TimerThread::instance = nullptr; -Timer::TimerThread::LockType Timer::TimerThread::lock; - -//============================================================================== -#if JUCE_DEBUG -static SortedSet activeTimers; -#endif - -Timer::Timer() noexcept - : countdownMs (0), - periodMs (0), - previous (nullptr), - next (nullptr) -{ - #if JUCE_DEBUG - const TimerThread::LockType::ScopedLockType sl (TimerThread::lock); - activeTimers.add (this); - #endif -} - -Timer::Timer (const Timer&) noexcept - : countdownMs (0), - periodMs (0), - previous (nullptr), - next (nullptr) -{ - #if JUCE_DEBUG - const TimerThread::LockType::ScopedLockType sl (TimerThread::lock); - activeTimers.add (this); - #endif -} - -Timer::~Timer() -{ - stopTimer(); - - #if JUCE_DEBUG - activeTimers.removeValue (this); - #endif -} - -void Timer::startTimer (const int interval) noexcept -{ - const TimerThread::LockType::ScopedLockType sl (TimerThread::lock); - - #if JUCE_DEBUG - // this isn't a valid object! Your timer might be a dangling pointer or something.. - jassert (activeTimers.contains (this)); - #endif - - if (periodMs == 0) - { - countdownMs = interval; - periodMs = jmax (1, interval); - TimerThread::add (this); - } - else - { - TimerThread::resetCounter (this, interval); - } -} - -void Timer::stopTimer() noexcept -{ - const TimerThread::LockType::ScopedLockType sl (TimerThread::lock); - - #if JUCE_DEBUG - // this isn't a valid object! Your timer might be a dangling pointer or something.. - jassert (activeTimers.contains (this)); - #endif - - if (periodMs > 0) - { - TimerThread::remove (this); - periodMs = 0; - } -} - -void JUCE_CALLTYPE Timer::callPendingTimersSynchronously() -{ - if (TimerThread::instance != nullptr) - TimerThread::instance->callTimersSynchronously(); -} diff --git a/src/juce/JuceLibraryCode/modules/juce_events/timers/juce_Timer.h b/src/juce/JuceLibraryCode/modules/juce_events/timers/juce_Timer.h deleted file mode 100644 index cde616b2..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_events/timers/juce_Timer.h +++ /dev/null @@ -1,135 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_TIMER_JUCEHEADER__ -#define __JUCE_TIMER_JUCEHEADER__ - - -//============================================================================== -/** - 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 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; - - /** 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; - - //============================================================================== - /** Checks if the timer has been started. - - @returns true if the timer is 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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_graphics/colour/juce_Colour.cpp b/src/juce/JuceLibraryCode/modules/juce_graphics/colour/juce_Colour.cpp deleted file mode 100644 index b496250a..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/colour/juce_Colour.cpp +++ /dev/null @@ -1,405 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -namespace ColourHelpers -{ - static uint8 floatToUInt8 (const float n) noexcept - { - return n <= 0.0f ? 0 : (n >= 1.0f ? 255 : (uint8) (n * 255.0f)); - } - - // This is an adjusted brightness value, based on the way the human - // eye responds to different colour channels.. - static float getPerceivedBrightness (float r, float g, float b) noexcept - { - return std::sqrt (r * r * 0.241f - + g * g * 0.691f - + b * b * 0.068f); - } -} - -//============================================================================== -struct HSB -{ - HSB (const 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 (const 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); - else return PixelARGB (alpha, intV, x, (uint8) roundToInt (v * (1.0f - s * f))); - } - - float hue, saturation, brightness; -}; - -//============================================================================== -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 argb_) noexcept - : argb (argb_) -{ -} - -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 (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 (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 (const 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 (const 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 HSB hsb (*this); - h = hsb.hue; - s = hsb.saturation; - v = hsb.brightness; -} - -float Colour::getHue() const noexcept { return HSB (*this).hue; } -float Colour::getSaturation() const noexcept { return HSB (*this).saturation; } -float Colour::getBrightness() const noexcept { return HSB (*this).brightness; } - -Colour Colour::withHue (float h) const noexcept { HSB hsb (*this); hsb.hue = h; return hsb.toColour (*this); } -Colour Colour::withSaturation (float s) const noexcept { HSB hsb (*this); hsb.saturation = s; return hsb.toColour (*this); } -Colour Colour::withBrightness (float v) const noexcept { HSB hsb (*this); hsb.brightness = v; return hsb.toColour (*this); } - -//============================================================================== -Colour Colour::withRotatedHue (const float amountToRotate) const noexcept -{ - HSB hsb (*this); - hsb.hue += amountToRotate; - return hsb.toColour (*this); -} - -Colour Colour::withMultipliedSaturation (const float amount) const noexcept -{ - HSB hsb (*this); - hsb.saturation = jmin (1.0f, hsb.saturation * amount); - return hsb.toColour (*this); -} - -Colour Colour::withMultipliedBrightness (const float amount) const noexcept -{ - 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 ((ColourHelpers::getPerceivedBrightness (getFloatRed(), getFloatGreen(), getFloatBlue()) >= 0.5f - ? Colours::black - : Colours::white).withAlpha (amount)); -} - -Colour Colour::contrasting (const Colour& colour1, - const Colour& colour2) noexcept -{ - const float b1 = colour1.getBrightness(); - const float b2 = colour2.getBrightness(); - 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 (const String& encodedColourString) -{ - return Colour ((uint32) encodedColourString.getHexValue32()); -} - -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/src/juce/JuceLibraryCode/modules/juce_graphics/colour/juce_Colour.h b/src/juce/JuceLibraryCode/modules/juce_graphics/colour/juce_Colour.h deleted file mode 100644 index a0251ddf..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/colour/juce_Colour.h +++ /dev/null @@ -1,363 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_COLOUR_JUCEHEADER__ -#define __JUCE_COLOUR_JUCEHEADER__ - -#include "../colour/juce_PixelFormats.h" - - -//============================================================================== -/** - 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 (const 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 (const 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 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 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 (const Colour& colour1, - const 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 (const String& 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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_graphics/colour/juce_ColourGradient.cpp b/src/juce/JuceLibraryCode/modules/juce_graphics/colour/juce_ColourGradient.cpp deleted file mode 100644 index 9a2ba694..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/colour/juce_ColourGradient.cpp +++ /dev/null @@ -1,221 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce 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 (const Colour& colour1, const float x1_, const float y1_, - const 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, const 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, const 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 co-ordinates? - 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 co-ordinates? - 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/src/juce/JuceLibraryCode/modules/juce_graphics/colour/juce_ColourGradient.h b/src/juce/JuceLibraryCode/modules/juce_graphics/colour/juce_ColourGradient.h deleted file mode 100644 index dd4caca7..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/colour/juce_ColourGradient.h +++ /dev/null @@ -1,185 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_COLOURGRADIENT_JUCEHEADER__ -#define __JUCE_COLOURGRADIENT_JUCEHEADER__ - -#include "juce_Colour.h" -#include "../geometry/juce_Point.h" - - -//============================================================================== -/** - 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 (const Colour& colour1, float x1, float y1, - const 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, - const 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, const 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& other) const noexcept; - bool operator!= (const ColourGradient& other) const noexcept; - - -private: - //============================================================================== - struct ColourPoint - { - ColourPoint() noexcept {} - - ColourPoint (const double position_, const Colour& colour_) noexcept - : position (position_), colour (colour_) - {} - - bool operator== (const ColourPoint& other) const noexcept; - bool operator!= (const ColourPoint& other) const noexcept; - - double position; - Colour colour; - }; - - Array colours; - - JUCE_LEAK_DETECTOR (ColourGradient); -}; - - -#endif // __JUCE_COLOURGRADIENT_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_graphics/colour/juce_Colours.cpp b/src/juce/JuceLibraryCode/modules/juce_graphics/colour/juce_Colours.cpp deleted file mode 100644 index 65d4c36d..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/colour/juce_Colours.cpp +++ /dev/null @@ -1,321 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce 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, - const 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/src/juce/JuceLibraryCode/modules/juce_graphics/colour/juce_Colours.h b/src/juce/JuceLibraryCode/modules/juce_graphics/colour/juce_Colours.h deleted file mode 100644 index 5f3ee815..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/colour/juce_Colours.h +++ /dev/null @@ -1,110 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_COLOURS_JUCEHEADER__ -#define __JUCE_COLOURS_JUCEHEADER__ - -#include "juce_Colour.h" - - -//============================================================================== -/** - 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, - const 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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_graphics/colour/juce_FillType.cpp b/src/juce/JuceLibraryCode/modules/juce_graphics/colour/juce_FillType.cpp deleted file mode 100644 index 9e2806ca..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/colour/juce_FillType.cpp +++ /dev/null @@ -1,149 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -FillType::FillType() noexcept - : colour (0xff000000) -{ -} - -FillType::FillType (const Colour& colour_) noexcept - : colour (colour_) -{ -} - -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 (const 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/src/juce/JuceLibraryCode/modules/juce_graphics/colour/juce_FillType.h b/src/juce/JuceLibraryCode/modules/juce_graphics/colour/juce_FillType.h deleted file mode 100644 index 3e5bef48..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/colour/juce_FillType.h +++ /dev/null @@ -1,153 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_FILLTYPE_JUCEHEADER__ -#define __JUCE_FILLTYPE_JUCEHEADER__ - -#include "../colour/juce_ColourGradient.h" -#include "../images/juce_Image.h" - - -//============================================================================== -/** - 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 (const 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& other); - - /** Makes a copy of another FillType. */ - FillType& operator= (const FillType& other); - - #if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS - FillType (FillType&& other) noexcept; - FillType& operator= (FillType&& other) 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 (const 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& other) const; - bool operator!= (const FillType& other) const; - -private: - JUCE_LEAK_DETECTOR (FillType); -}; - - -#endif // __JUCE_FILLTYPE_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_graphics/colour/juce_PixelFormats.h b/src/juce/JuceLibraryCode/modules/juce_graphics/colour/juce_PixelFormats.h deleted file mode 100644 index 6cf54d89..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/colour/juce_PixelFormats.h +++ /dev/null @@ -1,592 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_PIXELFORMATS_JUCEHEADER__ -#define __JUCE_PIXELFORMATS_JUCEHEADER__ - - -//============================================================================== -#ifndef DOXYGEN - #if JUCE_MSVC - #pragma pack (push, 1) - #define PACKED - #elif JUCE_GCC - #define PACKED __attribute__((packed)) - #else - #define PACKED - #endif -#endif - -class PixelRGB; -class PixelAlpha; - -//============================================================================== -/** - 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 argb_) noexcept - : argb (argb_) - { - } - - 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; } - - /** 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 - { - uint32 sargb = src.getARGB(); - const uint32 alpha = 0x100 - (sargb >> 24); - - sargb += 0x00ff00ff & ((getRB() * alpha) >> 8); - sargb += 0xff00ff00 & (getAG() * alpha); - - argb = sargb; - } - - /** 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 - { - ++extraAlpha; - - uint32 sargb = ((extraAlpha * src.getAG()) & 0xff00ff00) - | (((extraAlpha * src.getRB()) >> 8) & 0x00ff00ff); - - const uint32 alpha = 0x100 - (sargb >> 24); - - sargb += 0x00ff00ff & ((getRB() * alpha) >> 8); - sargb += 0xff00ff00 & (getAG() * alpha); - - argb = sargb; - } - - /** 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 : 8, r : 8, g : 8, b : 8; - #else - uint8 b, g, r, a; - #endif - } PACKED; - - union - { - uint32 argb; - Components components; - }; -} -#ifndef DOXYGEN - 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; } - - /** 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 - { - uint32 sargb = src.getARGB(); - const uint32 alpha = 0x100 - (sargb >> 24); - - sargb += 0x00ff00ff & ((getRB() * alpha) >> 8); - sargb += 0x0000ff00 & (g * alpha); - - r = (uint8) (sargb >> 16); - g = (uint8) (sargb >> 8); - b = (uint8) sargb; - } - - 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 - { - ++extraAlpha; - const uint32 srb = (extraAlpha * src.getRB()) >> 8; - const uint32 sag = extraAlpha * src.getAG(); - uint32 sargb = (sag & 0xff00ff00) | (srb & 0x00ff00ff); - - const uint32 alpha = 0x100 - (sargb >> 24); - - sargb += 0x00ff00ff & ((getRB() * alpha) >> 8); - sargb += 0x0000ff00 & (g * alpha); - - b = (uint8) sargb; - g = (uint8) (sargb >> 8); - r = (uint8) (sargb >> 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 r_, const uint8 g_, const uint8 b_) noexcept - { - r = r_; - g = g_; - b = b_; - } - - /** 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 - 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 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 : 8; -} -#ifndef DOXYGEN - PACKED -#endif -; - -#if JUCE_MSVC - #pragma pack (pop) -#endif - -#undef PACKED - -#endif // __JUCE_PIXELFORMATS_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_graphics/contexts/juce_GraphicsContext.cpp b/src/juce/JuceLibraryCode/modules/juce_graphics/contexts/juce_GraphicsContext.cpp deleted file mode 100644 index 5686e4ec..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/contexts/juce_GraphicsContext.cpp +++ /dev/null @@ -1,728 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -namespace -{ - template - bool areCoordsSensibleNumbers (Type x, Type y, Type w, Type h) - { - const int maxVal = 0x3fffffff; - - return (int) x >= -maxVal && (int) x <= maxVal - && (int) y >= -maxVal && (int) y <= maxVal - && (int) w >= -maxVal && (int) w <= maxVal - && (int) h >= -maxVal && (int) h <= maxVal; - } -} - -//============================================================================== -LowLevelGraphicsContext::LowLevelGraphicsContext() -{ -} - -LowLevelGraphicsContext::~LowLevelGraphicsContext() -{ -} - -//============================================================================== -Graphics::Graphics (const Image& imageToDrawOnto) - : context (imageToDrawOnto.createLowLevelContext()), - contextToDelete (context), - saveStatePending (false) -{ -} - -Graphics::Graphics (LowLevelGraphicsContext* const 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 (const int newOriginX, const int newOriginY) -{ - saveStateIfPending(); - context->setOrigin (newOriginX, newOriginY); -} - -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 (const 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, const int newFontStyleFlags) -{ - saveStateIfPending(); - Font f (context->getFont()); - f.setSizeAndStyle (newFontHeight, newFontStyleFlags, 1.0f, 0); - context->setFont (f); -} - -Font Graphics::getCurrentFont() const -{ - return context->getFont(); -} - -//============================================================================== -void Graphics::drawSingleLineText (const String& text, const int startX, const int baselineY, - const Justification& justification) const -{ - if (text.isNotEmpty() - && startX < context->getClipBounds().getRight()) - { - GlyphArrangement arr; - arr.addLineOfText (context->getFont(), text, (float) startX, (float) baselineY); - - // 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::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::drawTextAsPath (const String& text, const AffineTransform& transform) const -{ - if (text.isNotEmpty()) - { - GlyphArrangement arr; - arr.addLineOfText (context->getFont(), text, 0.0f, 0.0f); - arr.draw (*this, transform); - } -} - -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 int x, const int y, const int width, const int height, - const Justification& justificationType, - const bool useEllipsesIfTooBig) const -{ - if (text.isNotEmpty() && context->clipRegionIntersects (Rectangle (x, y, width, height))) - { - GlyphArrangement arr; - - arr.addCurtailedLineOfText (context->getFont(), text, - 0.0f, 0.0f, (float) width, - useEllipsesIfTooBig); - - arr.justifyGlyphs (0, arr.getNumGlyphs(), - (float) x, (float) y, (float) width, (float) height, - justificationType); - arr.draw (*this); - } -} - -void Graphics::drawFittedText (const String& text, - const int x, const int y, const int width, const int height, - const Justification& justification, - const int maximumNumberOfLines, - const float minimumHorizontalScale) const -{ - if (text.isNotEmpty() - && width > 0 && height > 0 - && context->clipRegionIntersects (Rectangle (x, y, width, height))) - { - GlyphArrangement arr; - - arr.addFittedText (context->getFont(), text, - (float) x, (float) y, (float) width, (float) height, - justification, - maximumNumberOfLines, - minimumHorizontalScale); - - arr.draw (*this); - } -} - -//============================================================================== -void Graphics::fillRect (int x, int y, int width, int height) const -{ - // passing in a silly number can cause maths problems in rendering! - jassert (areCoordsSensibleNumbers (x, y, width, height)); - - context->fillRect (Rectangle (x, y, width, height), false); -} - -void Graphics::fillRect (const Rectangle& r) const -{ - context->fillRect (r, false); -} - -void Graphics::fillRect (const float x, const float y, const float width, const float height) const -{ - // passing in a silly number can cause maths problems in rendering! - jassert (areCoordsSensibleNumbers (x, y, width, height)); - - Path p; - p.addRectangle (x, y, width, height); - fillPath (p); -} - -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 (const 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->getScaleFactor()); - fillPath (stroke); -} - -//============================================================================== -void Graphics::drawRect (const int x, const int y, const int width, const int height, - const int lineThickness) const -{ - // passing in a silly number can cause maths problems in rendering! - jassert (areCoordsSensibleNumbers (x, y, width, height)); - - context->fillRect (Rectangle (x, y, width, lineThickness), false); - context->fillRect (Rectangle (x, y + lineThickness, lineThickness, height - lineThickness * 2), false); - context->fillRect (Rectangle (x + width - lineThickness, y + lineThickness, lineThickness, height - lineThickness * 2), false); - context->fillRect (Rectangle (x, y + height - lineThickness, width, lineThickness), false); -} - -void Graphics::drawRect (const float x, const float y, const float width, const float height, const float lineThickness) const -{ - // passing in a silly number can cause maths problems in rendering! - jassert (areCoordsSensibleNumbers (x, y, width, height)); - - Path p; - p.addRectangle (x, y, width, lineThickness); - p.addRectangle (x, y + lineThickness, lineThickness, height - lineThickness * 2.0f); - p.addRectangle (x + width - lineThickness, y + lineThickness, lineThickness, height - lineThickness * 2.0f); - p.addRectangle (x, y + height - lineThickness, width, lineThickness); - fillPath (p); -} - -void Graphics::drawRect (const Rectangle& r, const int lineThickness) const -{ - drawRect (r.getX(), r.getY(), r.getWidth(), r.getHeight(), lineThickness); -} - -void Graphics::drawBevel (const int x, const int y, const int width, const int height, - const int bevelThickness, const Colour& topLeftColour, const Colour& bottomRightColour, - const bool useGradient, const bool sharpEdgeOnOutside) const -{ - // passing in a silly number can cause maths problems in rendering! - jassert (areCoordsSensibleNumbers (x, y, width, height)); - - if (clipRegionIntersects (Rectangle (x, y, width, height))) - { - context->saveState(); - - for (int i = bevelThickness; --i >= 0;) - { - const float op = useGradient ? (sharpEdgeOnOutside ? bevelThickness - i : i) / (float) bevelThickness - : 1.0f; - - context->setFill (topLeftColour.withMultipliedAlpha (op)); - context->fillRect (Rectangle (x + i, y + i, width - i * 2, 1), false); - context->setFill (topLeftColour.withMultipliedAlpha (op * 0.75f)); - context->fillRect (Rectangle (x + i, y + i + 1, 1, height - i * 2 - 2), false); - context->setFill (bottomRightColour.withMultipliedAlpha (op)); - context->fillRect (Rectangle (x + i, y + height - i - 1, width - i * 2, 1), false); - context->setFill (bottomRightColour.withMultipliedAlpha (op * 0.75f)); - context->fillRect (Rectangle (x + width - i - 1, y + i + 1, 1, height - i * 2 - 2), false); - } - - context->restoreState(); - } -} - -//============================================================================== -void Graphics::fillEllipse (const float x, const float y, const float width, const float height) const -{ - // passing in a silly number can cause maths problems in rendering! - jassert (areCoordsSensibleNumbers (x, y, width, height)); - - Path p; - p.addEllipse (x, y, width, height); - fillPath (p); -} - -void Graphics::drawEllipse (const float x, const float y, const float width, const float height, - const float lineThickness) const -{ - // passing in a silly number can cause maths problems in rendering! - jassert (areCoordsSensibleNumbers (x, y, width, height)); - - Path p; - p.addEllipse (x, y, width, height); - strokePath (p, PathStrokeType (lineThickness)); -} - -void Graphics::fillRoundedRectangle (const float x, const float y, const float width, const float height, const float cornerSize) const -{ - // passing in a silly number can cause maths problems in rendering! - jassert (areCoordsSensibleNumbers (x, y, width, height)); - - Path p; - p.addRoundedRectangle (x, y, width, height, cornerSize); - fillPath (p); -} - -void Graphics::fillRoundedRectangle (const Rectangle& r, const float cornerSize) const -{ - fillRoundedRectangle (r.getX(), r.getY(), r.getWidth(), r.getHeight(), cornerSize); -} - -void Graphics::drawRoundedRectangle (const float x, const float y, const float width, const float height, - const float cornerSize, const float lineThickness) const -{ - // passing in a silly number can cause maths problems in rendering! - jassert (areCoordsSensibleNumbers (x, y, width, height)); - - Path p; - p.addRoundedRectangle (x, y, width, height, cornerSize); - strokePath (p, PathStrokeType (lineThickness)); -} - -void Graphics::drawRoundedRectangle (const Rectangle& r, const float cornerSize, const float lineThickness) const -{ - drawRoundedRectangle (r.getX(), r.getY(), r.getWidth(), r.getHeight(), cornerSize, lineThickness); -} - -void Graphics::drawArrow (const Line& line, const float lineThickness, const float arrowheadWidth, const 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, - const Colour& colour1, const 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 -{ - context->drawVerticalLine (x, top, bottom); -} - -void Graphics::drawHorizontalLine (const int y, float left, float right) const -{ - context->drawHorizontalLine (y, left, right); -} - -void Graphics::drawLine (const float x1, const float y1, const float x2, const float y2) const -{ - context->drawLine (Line (x1, y1, x2, y2)); -} - -void Graphics::drawLine (const Line& line) const -{ - context->drawLine (line); -} - -void Graphics::drawLine (const float x1, const float y1, const float x2, const float y2, const 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, - const int topLeftX, const int topLeftY, - const bool fillAlphaChannelWithCurrentBrush) const -{ - const int imageW = imageToDraw.getWidth(); - const int imageH = imageToDraw.getHeight(); - - drawImage (imageToDraw, - topLeftX, topLeftY, imageW, imageH, - 0, 0, imageW, imageH, - fillAlphaChannelWithCurrentBrush); -} - -void Graphics::drawImageWithin (const Image& imageToDraw, - const int destX, const int destY, - const int destW, const int destH, - const RectanglePlacement& placementWithinTarget, - const bool fillAlphaChannelWithCurrentBrush) const -{ - // passing in a silly number can cause maths problems in rendering! - jassert (areCoordsSensibleNumbers (destX, destY, destW, destH)); - - if (imageToDraw.isValid()) - { - const int imageW = imageToDraw.getWidth(); - const int imageH = imageToDraw.getHeight(); - - if (imageW > 0 && imageH > 0) - { - double newX = 0.0, newY = 0.0; - double newW = imageW; - double newH = imageH; - - placementWithinTarget.applyTo (newX, newY, newW, newH, - destX, destY, destW, destH); - - if (newW > 0 && newH > 0) - { - drawImage (imageToDraw, - roundToInt (newX), roundToInt (newY), - roundToInt (newW), roundToInt (newH), - 0, 0, imageW, imageH, - 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 -{ - // passing in a silly number can cause maths problems in rendering! - jassert (areCoordsSensibleNumbers (dx, dy, dw, dh)); - jassert (areCoordsSensibleNumbers (sx, sy, sw, sh)); - - if (imageToDraw.isValid() && context->clipRegionIntersects (Rectangle (dx, dy, dw, dh))) - { - drawImageTransformed (imageToDraw.getClippedImage (Rectangle (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/src/juce/JuceLibraryCode/modules/juce_graphics/contexts/juce_GraphicsContext.h b/src/juce/JuceLibraryCode/modules/juce_graphics/contexts/juce_GraphicsContext.h deleted file mode 100644 index b75db811..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/contexts/juce_GraphicsContext.h +++ /dev/null @@ -1,706 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_GRAPHICSCONTEXT_JUCEHEADER__ -#define __JUCE_GRAPHICSCONTEXT_JUCEHEADER__ - -#include "../fonts/juce_Font.h" -#include "../geometry/juce_Rectangle.h" -#include "../geometry/juce_PathStrokeType.h" -#include "../geometry/juce_Line.h" -#include "../colour/juce_Colours.h" -#include "../colour/juce_ColourGradient.h" -#include "../placement/juce_RectanglePlacement.h" -class LowLevelGraphicsContext; -class Image; -class FillType; -class RectangleList; - - -//============================================================================== -/** - 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 (const 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, drawTextAsPath, drawText, drawFittedText - */ - void setFont (const Font& newFont); - - /** Changes the size and style of the currently-selected font. - - This is a convenient shortcut that changes the context's current font to a - different size or style. The typeface won't be changed. - - @see Font - */ - void setFont (float newFontHeight, int fontStyleFlags = Font::plain); - - /** 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, - const 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; - - /** Renders a string of text as a vector path. - - This allows a string to be transformed with an arbitrary AffineTransform and - rendered using the current colour/brush. It's much slower than the normal text methods - but more accurate. - - @see setFont - */ - void drawTextAsPath (const String& text, - const AffineTransform& transform) 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, - const Justification& justificationType, - bool useEllipsesIfTooBig) 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, - const 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 (const 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 (const Colour& colourToUse) 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. */ - void fillRect (const Rectangle& rectangle) const; - - /** Fills a rectangle with the current colour or brush. - - This uses sub-pixel positioning so is slower than the fillRect method which - takes integer co-ordinates. - */ - void fillRect (float x, float y, float width, float height) 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, - const Colour& colour1, const Colour& colour2) const; - - /** Draws four lines to form 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 four lines to form 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 four lines to form 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; - - /** 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; - - /** Draws a 3D raised (or indented) bevel using two colours. - - The bevel is drawn inside the given rectangle, and greater bevel thicknesses - extend inwards. - - The top-left colour is used for the top- and left-hand edges of the - bevel; the bottom-right colour is used for the bottom- and right-hand - edges. - - If useGradient is true, then the bevel fades out to make it look more curved - and less angular. If sharpEdgeOnOutside is true, the outside of the bevel is - sharp, and it fades towards the centre; if sharpEdgeOnOutside is false, then - the centre edges are sharp and it fades towards the outside. - */ - void drawBevel (int x, int y, int width, int height, - int bevelThickness, - const Colour& topLeftColour = Colours::white, - const Colour& bottomRightColour = Colours::black, - bool useGradient = true, - bool sharpEdgeOnOutside = true) const; - - /** Draws a pixel using the current colour or brush. - */ - 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; - - /** 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 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 co-ordinates, 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, - const 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& g); - ~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 (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 uses a given low-level renderer. - For internal use only. - NB. The context will NOT be deleted by this object when it is deleted. - */ - Graphics (LowLevelGraphicsContext* internalContext) noexcept; - - /** @internal */ - LowLevelGraphicsContext* getInternalContext() const noexcept { return context; } - -private: - //============================================================================== - LowLevelGraphicsContext* const context; - ScopedPointer contextToDelete; - - bool saveStatePending; - void saveStateIfPending(); - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Graphics); -}; - - -#endif // __JUCE_GRAPHICSCONTEXT_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsContext.h b/src/juce/JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsContext.h deleted file mode 100644 index 3aace563..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsContext.h +++ /dev/null @@ -1,110 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_LOWLEVELGRAPHICSCONTEXT_JUCEHEADER__ -#define __JUCE_LOWLEVELGRAPHICSCONTEXT_JUCEHEADER__ - -#include "../images/juce_Image.h" -#include "../geometry/juce_Path.h" -#include "../geometry/juce_RectangleList.h" -#include "../colour/juce_ColourGradient.h" -#include "../colour/juce_FillType.h" -class AttributedString; - -//============================================================================== -/** - 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 co-ords are relative to the current origin, and indicate the new position - of (0, 0). - */ - virtual void setOrigin (int x, int y) = 0; - virtual void addTransform (const AffineTransform& transform) = 0; - virtual float getScaleFactor() = 0; - - virtual bool clipToRectangle (const Rectangle& r) = 0; - virtual bool clipToRectangleList (const RectangleList& clipRegion) = 0; - virtual void excludeClipRectangle (const Rectangle& r) = 0; - virtual void clipToPath (const Path& path, const AffineTransform& transform) = 0; - virtual void clipToImageAlpha (const Image& sourceImage, const AffineTransform& transform) = 0; - - virtual bool clipRegionIntersects (const Rectangle& r) = 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& fillType) = 0; - virtual void setOpacity (float newOpacity) = 0; - virtual void setInterpolationQuality (Graphics::ResamplingQuality quality) = 0; - - //============================================================================== - virtual void fillRect (const Rectangle& r, bool replaceExistingContents) = 0; - virtual void fillPath (const Path& path, const AffineTransform& transform) = 0; - - virtual void drawImage (const Image& sourceImage, const AffineTransform& transform) = 0; - - virtual void drawLine (const Line & line) = 0; - virtual void drawVerticalLine (int x, float top, float bottom) = 0; - virtual void drawHorizontalLine (int y, float left, float right) = 0; - - virtual void setFont (const Font& newFont) = 0; - virtual const Font& getFont() = 0; - virtual void drawGlyph (int glyphNumber, const AffineTransform& transform) = 0; - virtual bool drawTextLayout (const AttributedString&, const Rectangle&) { return false; } -}; - - -#endif // __JUCE_LOWLEVELGRAPHICSCONTEXT_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.cpp b/src/juce/JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.cpp deleted file mode 100644 index faec1c8a..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.cpp +++ /dev/null @@ -1,542 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce 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 (int x, int y) -{ - if (x != 0 || y != 0) - { - stateStack.getLast()->xOffset += x; - stateStack.getLast()->yOffset += y; - needToClip = true; - } -} - -void LowLevelGraphicsPostScriptRenderer::addTransform (const AffineTransform& /*transform*/) -{ - //xxx - jassertfalse; -} - -float LowLevelGraphicsPostScriptRenderer::getScaleFactor() -{ - jassertfalse; //xxx - 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 (RectangleList::Iterator i (stateStack.getLast()->clip); i.next();) - { - if (++itemsOnLine == 6) - { - itemsOnLine = 0; - out << '\n'; - } - - const Rectangle& r = *i.getRectangle(); - - out << r.getX() << ' ' << -r.getY() << ' ' - << r.getWidth() << ' ' << -r.getHeight() << " pr "; - } - - out << "endclip\n"; - } -} - -void LowLevelGraphicsPostScriptRenderer::writeColour (const 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*/) -{ - if (stateStack.getLast()->fillType.isColour()) - { - writeClip(); - writeColour (stateStack.getLast()->fillType.colour); - - Rectangle r2 (r.translated (stateStack.getLast()->xOffset, 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::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 (RectangleList::Iterator i (imageClip); i.next();) - { - if (++itemsOnLine == 6) - { - out << '\n'; - itemsOnLine = 0; - } - - const Rectangle& r = *i.getRectangle(); - - out << r.getX() << ' ' << r.getY() << ' ' << r.getWidth() << ' ' << r.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::drawVerticalLine (const int x, float top, float bottom) -{ - drawLine (Line ((float) x, top, (float) x, bottom)); -} - -void LowLevelGraphicsPostScriptRenderer::drawHorizontalLine (const int y, float left, float right) -{ - drawLine (Line (left, (float) y, right, (float) y)); -} - -//============================================================================== -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/src/juce/JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.h b/src/juce/JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.h deleted file mode 100644 index 0f019386..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.h +++ /dev/null @@ -1,127 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_LOWLEVELGRAPHICSPOSTSCRIPTRENDERER_JUCEHEADER__ -#define __JUCE_LOWLEVELGRAPHICSPOSTSCRIPTRENDERER_JUCEHEADER__ - -#include "juce_LowLevelGraphicsContext.h" - - -//============================================================================== -/** - 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; - void setOrigin (int x, int y); - void addTransform (const AffineTransform& transform); - float getScaleFactor(); - - bool clipToRectangle (const Rectangle& r); - bool clipToRectangleList (const RectangleList& clipRegion); - void excludeClipRectangle (const Rectangle& r); - void clipToPath (const Path& path, const AffineTransform& transform); - void clipToImageAlpha (const Image& sourceImage, const AffineTransform& transform); - - void saveState(); - void restoreState(); - - void beginTransparencyLayer (float opacity); - void endTransparencyLayer(); - - bool clipRegionIntersects (const Rectangle& r); - Rectangle getClipBounds() const; - bool isClipEmpty() const; - - //============================================================================== - void setFill (const FillType& fillType); - void setOpacity (float opacity); - void setInterpolationQuality (Graphics::ResamplingQuality quality); - - //============================================================================== - void fillRect (const Rectangle& r, bool replaceExistingContents); - void fillPath (const Path& path, const AffineTransform& transform); - - void drawImage (const Image& sourceImage, const AffineTransform& transform); - - void drawLine (const Line & line); - - void drawVerticalLine (int x, float top, float bottom); - void drawHorizontalLine (int x, float top, float bottom); - - //============================================================================== - const Font& getFont(); - void setFont (const Font& newFont); - void drawGlyph (int glyphNumber, const AffineTransform& transform); - -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 (const Colour& colour); - void writePath (const Path& path) const; - void writeXY (float x, float y) const; - void writeTransform (const AffineTransform& trans) const; - void writeImage (const Image& im, int sx, int sy, int maxW, int maxH) const; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (LowLevelGraphicsPostScriptRenderer); -}; - - - -#endif // __JUCE_LOWLEVELGRAPHICSPOSTSCRIPTRENDERER_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.cpp b/src/juce/JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.cpp deleted file mode 100644 index f540222f..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.cpp +++ /dev/null @@ -1,2237 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#if JUCE_MSVC - #pragma warning (push) - #pragma warning (disable: 4127) // "expression is constant" warning - - #if JUCE_DEBUG - #pragma optimize ("t", on) // optimise just this file, to avoid sluggish graphics when debugging - #pragma warning (disable: 4714) // warning about forcedinline methods not being inlined - #endif -#endif - -namespace SoftwareRendererClasses -{ - -//============================================================================== -template -class SolidColourEdgeTableRenderer -{ -public: - SolidColourEdgeTableRenderer (const Image::BitmapData& data_, const PixelARGB& colour) - : data (data_), - sourceColour (colour) - { - if (sizeof (PixelType) == 3) - { - 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); - } - } - - forcedinline void setEdgeTableYPos (const int y) noexcept - { - linePixels = (PixelType*) data.getLinePointer (y); - } - - forcedinline void handleEdgeTablePixel (const int x, const int alphaLevel) const noexcept - { - if (replaceExisting) - linePixels[x].set (sourceColour); - else - linePixels[x].blend (sourceColour, (uint32) alphaLevel); - } - - forcedinline void handleEdgeTablePixelFull (const int x) const noexcept - { - if (replaceExisting) - linePixels[x].set (sourceColour); - else - linePixels[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 = linePixels + 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 = linePixels + x; - - if (replaceExisting || sourceColour.getAlpha() >= 0xff) - replaceLine (dest, sourceColour, width); - else - blendLine (dest, sourceColour, width); - } - -private: - const Image::BitmapData& data; - PixelType* linePixels; - PixelARGB sourceColour; - PixelRGB filler [4]; - bool areRGBComponentsEqual; - - inline void blendLine (PixelType* dest, const PixelARGB& colour, int width) const noexcept - { - do - { - dest->blend (colour); - ++dest; - } while (--width > 0); - } - - forcedinline void replaceLine (PixelRGB* dest, const PixelARGB& colour, int width) const noexcept - { - 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; - } - } - } - - forcedinline void replaceLine (PixelAlpha* const dest, const PixelARGB& colour, int const width) const noexcept - { - memset (dest, colour.getAlpha(), (size_t) width); - } - - forcedinline void replaceLine (PixelARGB* dest, const PixelARGB& colour, int width) const noexcept - { - do - { - dest->set (colour); - ++dest; - - } while (--width > 0); - } - - JUCE_DECLARE_NON_COPYABLE (SolidColourEdgeTableRenderer); -}; - -//============================================================================== -class LinearGradientPixelGenerator -{ -public: - LinearGradientPixelGenerator (const ColourGradient& gradient, const AffineTransform& transform, - const PixelARGB* const lookupTable_, const int numEntries_) - : lookupTable (lookupTable_), - numEntries (numEntries_) - { - jassert (numEntries_ >= 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 (LinearGradientPixelGenerator); -}; - -//============================================================================== -class RadialGradientPixelGenerator -{ -public: - RadialGradientPixelGenerator (const ColourGradient& gradient, const AffineTransform&, - const PixelARGB* const lookupTable_, const int numEntries_) - : lookupTable (lookupTable_), - numEntries (numEntries_), - gx1 (gradient.point1.x), - gy1 (gradient.point1.y) - { - jassert (numEntries_ >= 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 (RadialGradientPixelGenerator); -}; - -//============================================================================== -class TransformedRadialGradientPixelGenerator : public RadialGradientPixelGenerator -{ -public: - TransformedRadialGradientPixelGenerator (const ColourGradient& gradient, const AffineTransform& transform, - const PixelARGB* const lookupTable_, const int numEntries_) - : RadialGradientPixelGenerator (gradient, transform, lookupTable_, numEntries_), - 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]; - else - return lookupTable [jmin (numEntries, roundToInt (std::sqrt (x) * invScale))]; - } - -private: - double tM10, tM00, lineYM01, lineYM11; - const AffineTransform inverseTransform; - - JUCE_DECLARE_NON_COPYABLE (TransformedRadialGradientPixelGenerator); -}; - -//============================================================================== -template -class GradientEdgeTableRenderer : public GradientType -{ -public: - GradientEdgeTableRenderer (const Image::BitmapData& destData_, const ColourGradient& gradient, const AffineTransform& transform, - const PixelARGB* const lookupTable_, const int numEntries_) - : GradientType (gradient, transform, lookupTable_, numEntries_ - 1), - destData (destData_) - { - } - - 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 - { - linePixels[x].blend (GradientType::getPixel (x), (uint32) alphaLevel); - } - - forcedinline void handleEdgeTablePixelFull (const int x) const noexcept - { - linePixels[x].blend (GradientType::getPixel (x)); - } - - void handleEdgeTableLine (int x, int width, const int alphaLevel) const noexcept - { - PixelType* dest = linePixels + x; - - if (alphaLevel < 0xff) - { - do - { - (dest++)->blend (GradientType::getPixel (x++), (uint32) alphaLevel); - } while (--width > 0); - } - else - { - do - { - (dest++)->blend (GradientType::getPixel (x++)); - } while (--width > 0); - } - } - - void handleEdgeTableLineFull (int x, int width) const noexcept - { - PixelType* dest = linePixels + x; - - do - { - (dest++)->blend (GradientType::getPixel (x++)); - } while (--width > 0); - } - -private: - const Image::BitmapData& destData; - PixelType* linePixels; - - JUCE_DECLARE_NON_COPYABLE (GradientEdgeTableRenderer); -}; - -//============================================================================== -template -class ImageFillEdgeTableRenderer -{ -public: - ImageFillEdgeTableRenderer (const Image::BitmapData& destData_, - const Image::BitmapData& srcData_, - const int extraAlpha_, - const int x, const int y) - : destData (destData_), - srcData (srcData_), - extraAlpha (extraAlpha_ + 1), - xOffset (repeatPattern ? negativeAwareModulo (x, srcData_.width) - srcData_.width : x), - yOffset (repeatPattern ? negativeAwareModulo (y, srcData_.height) - srcData_.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; - - linePixels[x].blend (sourceLineStart [repeatPattern ? ((x - xOffset) % srcData.width) : (x - xOffset)], (uint32) alphaLevel); - } - - forcedinline void handleEdgeTablePixelFull (const int x) const noexcept - { - linePixels[x].blend (sourceLineStart [repeatPattern ? ((x - xOffset) % srcData.width) : (x - xOffset)], (uint32) extraAlpha); - } - - void handleEdgeTableLine (int x, int width, int alphaLevel) const noexcept - { - DestPixelType* dest = linePixels + x; - alphaLevel = (alphaLevel * extraAlpha) >> 8; - x -= xOffset; - - jassert (repeatPattern || (x >= 0 && x + width <= srcData.width)); - - if (alphaLevel < 0xfe) - { - do - { - dest++ ->blend (sourceLineStart [repeatPattern ? (x++ % srcData.width) : x++], (uint32) alphaLevel); - } while (--width > 0); - } - else - { - if (repeatPattern) - { - do - { - dest++ ->blend (sourceLineStart [x++ % srcData.width]); - } while (--width > 0); - } - else - { - copyRow (dest, sourceLineStart + x, width); - } - } - } - - void handleEdgeTableLineFull (int x, int width) const noexcept - { - DestPixelType* dest = linePixels + x; - x -= xOffset; - - jassert (repeatPattern || (x >= 0 && x + width <= srcData.width)); - - if (extraAlpha < 0xfe) - { - do - { - dest++ ->blend (sourceLineStart [repeatPattern ? (x++ % srcData.width) : x++], (uint32) extraAlpha); - } while (--width > 0); - } - else - { - if (repeatPattern) - { - do - { - dest++ ->blend (sourceLineStart [x++ % srcData.width]); - } while (--width > 0); - } - else - { - copyRow (dest, sourceLineStart + 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; - - template - static forcedinline void copyRow (PixelType1* dest, PixelType2* src, int width) noexcept - { - do - { - dest++ ->blend (*src++); - } while (--width > 0); - } - - static forcedinline void copyRow (PixelRGB* dest, PixelRGB* src, int width) noexcept - { - memcpy (dest, src, sizeof (PixelRGB) * (size_t) width); - } - - JUCE_DECLARE_NON_COPYABLE (ImageFillEdgeTableRenderer); -}; - -//============================================================================== -template -class TransformedImageFillEdgeTableRenderer -{ -public: - TransformedImageFillEdgeTableRenderer (const Image::BitmapData& destData_, - const Image::BitmapData& srcData_, - const AffineTransform& transform, - const int extraAlpha_, - const bool betterQuality_) - : interpolator (transform, - betterQuality_ ? 0.5f : 0.0f, - betterQuality_ ? -128 : 0), - destData (destData_), - srcData (srcData_), - extraAlpha (extraAlpha_ + 1), - betterQuality (betterQuality_), - maxX (srcData_.width - 1), - maxY (srcData_.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); - - linePixels[x].blend (p, (uint32) (alphaLevel * extraAlpha) >> 8); - } - - forcedinline void handleEdgeTablePixelFull (const int x) noexcept - { - SrcPixelType p; - generate (&p, x, 1); - - linePixels[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 = linePixels + x; - alphaLevel *= extraAlpha; - alphaLevel >>= 8; - - if (alphaLevel < 0xfe) - { - do - { - dest++ ->blend (*span++, (uint32) alphaLevel); - } while (--width > 0); - } - else - { - do - { - dest++ ->blend (*span++); - } while (--width > 0); - } - } - - 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: - //============================================================================== - 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 (betterQuality) - { - 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; - } - else - { - // At a top or bottom edge.. - if (! repeatPattern) - { - 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)) - { - // At a left or right hand edge.. - if (! repeatPattern) - { - 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]; - - weight = (uint32) (subPixelX * (256 - subPixelY)); - c[0] += weight * src[4]; - c[1] += weight * src[5]; - c[2] += weight * src[6]; - c[3] += weight * src[7]; - - src += this->srcData.lineStride; - - 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]; - - weight = (uint32) (subPixelX * subPixelY); - c[0] += weight * src[4]; - c[1] += weight * src[5]; - c[2] += weight * src[6]; - c[3] += weight * src[7]; - - 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]; - - weight = subPixelX; - c[0] += weight * src[4]; - c[1] += weight * src[5]; - c[2] += weight * src[6]; - c[3] += weight * src[7]; - - 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]; - - weight = subPixelX * (256 - subPixelY); - c[0] += weight * src[3]; - c[1] += weight * src[4]; - c[2] += weight * src[5]; - - src += this->srcData.lineStride; - - weight = (256 - subPixelX) * subPixelY; - c[0] += weight * src[0]; - c[1] += weight * src[1]; - c[2] += weight * src[2]; - - weight = subPixelX * subPixelY; - c[0] += weight * src[3]; - c[1] += weight * src[4]; - c[2] += weight * src[5]; - - 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]; - - c[0] += subPixelX * src[3]; - c[1] += subPixelX * src[4]; - c[2] += subPixelX * src[5]; - - 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)); - c += src[1] * (subPixelX * (256 - subPixelY)); - src += this->srcData.lineStride; - c += src[0] * ((256 - subPixelX) * subPixelY); - c += src[1] * (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); - c += src[1] * 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 pixelOffset_, const int pixelOffsetInt_) noexcept - : inverseTransform (transform.inverted()), - pixelOffset (pixelOffset_), pixelOffsetInt (pixelOffsetInt_) - {} - - void setStartOfLine (float x, float y, const int numPixels) noexcept - { - jassert (numPixels > 0); - - x += pixelOffset; - y += pixelOffset; - float x1 = x, y1 = y; - x += numPixels; - inverseTransform.transformPoints (x1, y1, x, y); - - xBresenham.set ((int) (x1 * 256.0f), (int) (x * 256.0f), numPixels, pixelOffsetInt); - yBresenham.set ((int) (y1 * 256.0f), (int) (y * 256.0f), numPixels, pixelOffsetInt); - } - - void next (int& x, int& y) noexcept - { - x = xBresenham.n; - xBresenham.stepToNext(); - y = yBresenham.n; - yBresenham.stepToNext(); - } - - private: - class BresenhamInterpolator - { - public: - BresenhamInterpolator() noexcept {} - - void set (const int n1, const int n2, const int numSteps_, const int pixelOffsetInt) noexcept - { - numSteps = numSteps_; - step = (n2 - n1) / numSteps; - remainder = modulo = (n2 - n1) % numSteps; - n = n1 + pixelOffsetInt; - - 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 bool betterQuality; - const int maxX, maxY; - int y; - DestPixelType* linePixels; - HeapBlock scratchBuffer; - size_t scratchSize; - - JUCE_DECLARE_NON_COPYABLE (TransformedImageFillEdgeTableRenderer); -}; - -//============================================================================== -class ClipRegionBase : public SingleThreadedReferenceCountedObject -{ -public: - ClipRegionBase() {} - virtual ~ClipRegionBase() {} - - typedef ReferenceCountedObjectPtr Ptr; - - virtual Ptr clone() const = 0; - virtual Ptr applyClipTo (const Ptr& target) const = 0; - - virtual Ptr clipToRectangle (const Rectangle& r) = 0; - virtual Ptr clipToRectangleList (const RectangleList& r) = 0; - virtual Ptr excludeClipRectangle (const Rectangle& r) = 0; - virtual Ptr clipToPath (const Path& p, const AffineTransform& transform) = 0; - virtual Ptr clipToEdgeTable (const EdgeTable& et) = 0; - virtual Ptr clipToImageAlpha (const Image& image, const AffineTransform& t, const bool betterQuality) = 0; - virtual void translate (const Point& delta) = 0; - - virtual bool clipRegionIntersects (const Rectangle& r) const = 0; - virtual Rectangle getClipBounds() const = 0; - - virtual void fillRectWithColour (Image::BitmapData& destData, const Rectangle& area, const PixelARGB& colour, bool replaceContents) const = 0; - virtual void fillRectWithColour (Image::BitmapData& destData, const Rectangle& area, const PixelARGB& colour) const = 0; - virtual void fillAllWithColour (Image::BitmapData& destData, const PixelARGB& colour, bool replaceContents) const = 0; - virtual void fillAllWithGradient (Image::BitmapData& destData, ColourGradient& gradient, const AffineTransform& transform, bool isIdentity) const = 0; - virtual void renderImageTransformed (const Image::BitmapData& destData, const Image::BitmapData& srcData, const int alpha, const AffineTransform& t, bool betterQuality, bool tiledFill) const = 0; - virtual void renderImageUntransformed (const Image::BitmapData& destData, const Image::BitmapData& srcData, const int alpha, int x, int y, bool tiledFill) const = 0; - -protected: - //============================================================================== - template - static void renderImageTransformedInternal (Iterator& iter, const Image::BitmapData& destData, const Image::BitmapData& srcData, - const int alpha, const AffineTransform& transform, bool betterQuality, bool tiledFill) - { - switch (destData.pixelFormat) - { - case Image::ARGB: - switch (srcData.pixelFormat) - { - case Image::ARGB: - if (tiledFill) { TransformedImageFillEdgeTableRenderer r (destData, srcData, transform, alpha, betterQuality); iter.iterate (r); } - else { TransformedImageFillEdgeTableRenderer r (destData, srcData, transform, alpha, betterQuality); iter.iterate (r); } - break; - case Image::RGB: - if (tiledFill) { TransformedImageFillEdgeTableRenderer r (destData, srcData, transform, alpha, betterQuality); iter.iterate (r); } - else { TransformedImageFillEdgeTableRenderer r (destData, srcData, transform, alpha, betterQuality); iter.iterate (r); } - break; - default: - if (tiledFill) { TransformedImageFillEdgeTableRenderer r (destData, srcData, transform, alpha, betterQuality); iter.iterate (r); } - else { TransformedImageFillEdgeTableRenderer r (destData, srcData, transform, alpha, betterQuality); iter.iterate (r); } - break; - } - break; - - case Image::RGB: - switch (srcData.pixelFormat) - { - case Image::ARGB: - if (tiledFill) { TransformedImageFillEdgeTableRenderer r (destData, srcData, transform, alpha, betterQuality); iter.iterate (r); } - else { TransformedImageFillEdgeTableRenderer r (destData, srcData, transform, alpha, betterQuality); iter.iterate (r); } - break; - case Image::RGB: - if (tiledFill) { TransformedImageFillEdgeTableRenderer r (destData, srcData, transform, alpha, betterQuality); iter.iterate (r); } - else { TransformedImageFillEdgeTableRenderer r (destData, srcData, transform, alpha, betterQuality); iter.iterate (r); } - break; - default: - if (tiledFill) { TransformedImageFillEdgeTableRenderer r (destData, srcData, transform, alpha, betterQuality); iter.iterate (r); } - else { TransformedImageFillEdgeTableRenderer r (destData, srcData, transform, alpha, betterQuality); iter.iterate (r); } - break; - } - break; - - default: - switch (srcData.pixelFormat) - { - case Image::ARGB: - if (tiledFill) { TransformedImageFillEdgeTableRenderer r (destData, srcData, transform, alpha, betterQuality); iter.iterate (r); } - else { TransformedImageFillEdgeTableRenderer r (destData, srcData, transform, alpha, betterQuality); iter.iterate (r); } - break; - case Image::RGB: - if (tiledFill) { TransformedImageFillEdgeTableRenderer r (destData, srcData, transform, alpha, betterQuality); iter.iterate (r); } - else { TransformedImageFillEdgeTableRenderer r (destData, srcData, transform, alpha, betterQuality); iter.iterate (r); } - break; - default: - if (tiledFill) { TransformedImageFillEdgeTableRenderer r (destData, srcData, transform, alpha, betterQuality); iter.iterate (r); } - else { TransformedImageFillEdgeTableRenderer r (destData, srcData, transform, alpha, betterQuality); iter.iterate (r); } - break; - } - break; - } - } - - template - static void renderImageUntransformedInternal (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) { ImageFillEdgeTableRenderer r (destData, srcData, alpha, x, y); iter.iterate (r); } - else { ImageFillEdgeTableRenderer r (destData, srcData, alpha, x, y); iter.iterate (r); } - break; - case Image::RGB: - if (tiledFill) { ImageFillEdgeTableRenderer r (destData, srcData, alpha, x, y); iter.iterate (r); } - else { ImageFillEdgeTableRenderer r (destData, srcData, alpha, x, y); iter.iterate (r); } - break; - default: - if (tiledFill) { ImageFillEdgeTableRenderer r (destData, srcData, alpha, x, y); iter.iterate (r); } - else { ImageFillEdgeTableRenderer r (destData, srcData, alpha, x, y); iter.iterate (r); } - break; - } - break; - - case Image::RGB: - switch (srcData.pixelFormat) - { - case Image::ARGB: - if (tiledFill) { ImageFillEdgeTableRenderer r (destData, srcData, alpha, x, y); iter.iterate (r); } - else { ImageFillEdgeTableRenderer r (destData, srcData, alpha, x, y); iter.iterate (r); } - break; - case Image::RGB: - if (tiledFill) { ImageFillEdgeTableRenderer r (destData, srcData, alpha, x, y); iter.iterate (r); } - else { ImageFillEdgeTableRenderer r (destData, srcData, alpha, x, y); iter.iterate (r); } - break; - default: - if (tiledFill) { ImageFillEdgeTableRenderer r (destData, srcData, alpha, x, y); iter.iterate (r); } - else { ImageFillEdgeTableRenderer r (destData, srcData, alpha, x, y); iter.iterate (r); } - break; - } - break; - - default: - switch (srcData.pixelFormat) - { - case Image::ARGB: - if (tiledFill) { ImageFillEdgeTableRenderer r (destData, srcData, alpha, x, y); iter.iterate (r); } - else { ImageFillEdgeTableRenderer r (destData, srcData, alpha, x, y); iter.iterate (r); } - break; - case Image::RGB: - if (tiledFill) { ImageFillEdgeTableRenderer r (destData, srcData, alpha, x, y); iter.iterate (r); } - else { ImageFillEdgeTableRenderer r (destData, srcData, alpha, x, y); iter.iterate (r); } - break; - default: - if (tiledFill) { ImageFillEdgeTableRenderer r (destData, srcData, alpha, x, y); iter.iterate (r); } - else { ImageFillEdgeTableRenderer r (destData, srcData, alpha, x, y); iter.iterate (r); } - break; - } - break; - } - } - - template - static void renderSolidFill (Iterator& iter, const Image::BitmapData& destData, const PixelARGB& fillColour, const bool replaceContents, DestPixelType*) - { - jassert (destData.pixelStride == sizeof (DestPixelType)); - if (replaceContents) - { - SolidColourEdgeTableRenderer r (destData, fillColour); - iter.iterate (r); - } - else - { - SolidColourEdgeTableRenderer r (destData, fillColour); - iter.iterate (r); - } - } - - template - static 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*) - { - jassert (destData.pixelStride == sizeof (DestPixelType)); - - if (g.isRadial) - { - if (isIdentity) - { - GradientEdgeTableRenderer renderer (destData, g, transform, lookupTable, numLookupEntries); - iter.iterate (renderer); - } - else - { - GradientEdgeTableRenderer renderer (destData, g, transform, lookupTable, numLookupEntries); - iter.iterate (renderer); - } - } - else - { - GradientEdgeTableRenderer renderer (destData, g, transform, lookupTable, numLookupEntries); - iter.iterate (renderer); - } - } -}; - -//============================================================================== -class ClipRegion_EdgeTable : public ClipRegionBase -{ -public: - ClipRegion_EdgeTable (const EdgeTable& e) : edgeTable (e) {} - ClipRegion_EdgeTable (const Rectangle& r) : edgeTable (r) {} - ClipRegion_EdgeTable (const Rectangle& r) : edgeTable (r) {} - ClipRegion_EdgeTable (const RectangleList& r) : edgeTable (r) {} - ClipRegion_EdgeTable (const Rectangle& bounds, const Path& p, const AffineTransform& t) : edgeTable (bounds, p, t) {} - ClipRegion_EdgeTable (const ClipRegion_EdgeTable& other) : edgeTable (other.edgeTable) {} - - Ptr clone() const - { - return new ClipRegion_EdgeTable (*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 (RectangleList::Iterator iter (inverse); iter.next();) - edgeTable.excludeRectangle (*iter.getRectangle()); - - 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 bool betterQuality) - { - 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 ((! betterQuality) || ((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 nullptr; - - { - 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, betterQuality, (PixelARGB*) 0); - else - transformedClipImage (srcData, transform, betterQuality, (PixelAlpha*) 0); - } - - return edgeTable.isEmpty() ? nullptr : this; - } - - void translate (const 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 (Image::BitmapData& destData, const Rectangle& area, const PixelARGB& colour, bool replaceContents) const - { - const Rectangle totalClip (edgeTable.getMaximumBounds()); - const Rectangle clipped (totalClip.getIntersection (area)); - - if (! clipped.isEmpty()) - { - ClipRegion_EdgeTable et (clipped); - et.edgeTable.clipToEdgeTable (edgeTable); - et.fillAllWithColour (destData, colour, replaceContents); - } - } - - void fillRectWithColour (Image::BitmapData& destData, const Rectangle& area, const PixelARGB& colour) const - { - const Rectangle totalClip (edgeTable.getMaximumBounds().toFloat()); - const Rectangle clipped (totalClip.getIntersection (area)); - - if (! clipped.isEmpty()) - { - ClipRegion_EdgeTable et (clipped); - et.edgeTable.clipToEdgeTable (edgeTable); - et.fillAllWithColour (destData, colour, false); - } - } - - void fillAllWithColour (Image::BitmapData& destData, const PixelARGB& colour, bool replaceContents) const - { - switch (destData.pixelFormat) - { - case Image::ARGB: renderSolidFill (edgeTable, destData, colour, replaceContents, (PixelARGB*) 0); break; - case Image::RGB: renderSolidFill (edgeTable, destData, colour, replaceContents, (PixelRGB*) 0); break; - default: renderSolidFill (edgeTable, destData, colour, replaceContents, (PixelAlpha*) 0); break; - } - } - - void fillAllWithGradient (Image::BitmapData& destData, ColourGradient& gradient, const AffineTransform& transform, bool isIdentity) const - { - HeapBlock lookupTable; - const int numLookupEntries = gradient.createLookupTable (transform, lookupTable); - jassert (numLookupEntries > 0); - - switch (destData.pixelFormat) - { - case Image::ARGB: renderGradient (edgeTable, destData, gradient, transform, lookupTable, numLookupEntries, isIdentity, (PixelARGB*) 0); break; - case Image::RGB: renderGradient (edgeTable, destData, gradient, transform, lookupTable, numLookupEntries, isIdentity, (PixelRGB*) 0); break; - default: renderGradient (edgeTable, destData, gradient, transform, lookupTable, numLookupEntries, isIdentity, (PixelAlpha*) 0); break; - } - } - - void renderImageTransformed (const Image::BitmapData& destData, const Image::BitmapData& srcData, const int alpha, const AffineTransform& transform, bool betterQuality, bool tiledFill) const - { - renderImageTransformedInternal (edgeTable, destData, srcData, alpha, transform, betterQuality, tiledFill); - } - - void renderImageUntransformed (const Image::BitmapData& destData, const Image::BitmapData& srcData, const int alpha, int x, int y, bool tiledFill) const - { - renderImageUntransformedInternal (edgeTable, destData, srcData, alpha, x, y, tiledFill); - } - - EdgeTable edgeTable; - -private: - //============================================================================== - template - void transformedClipImage (const Image::BitmapData& srcData, const AffineTransform& transform, const bool betterQuality, const SrcPixelType*) - { - TransformedImageFillEdgeTableRenderer renderer (srcData, srcData, transform, 255, betterQuality); - - 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); - - ImageFillEdgeTableRenderer renderer (srcData, srcData, 255, imageX, imageY); - - for (int y = 0; y < r.getHeight(); ++y) - renderer.clipEdgeTableLine (edgeTable, r.getX(), y + r.getY(), r.getWidth()); - } - - ClipRegion_EdgeTable& operator= (const ClipRegion_EdgeTable&); -}; - - -//============================================================================== -class ClipRegion_RectangleList : public ClipRegionBase -{ -public: - ClipRegion_RectangleList (const Rectangle& r) : clip (r) {} - ClipRegion_RectangleList (const RectangleList& r) : clip (r) {} - ClipRegion_RectangleList (const ClipRegion_RectangleList& other) : clip (other.clip) {} - - Ptr clone() const - { - return new ClipRegion_RectangleList (*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 bool betterQuality) - { - return toEdgeTable()->clipToImageAlpha (image, transform, betterQuality); - } - - void translate (const Point& delta) - { - clip.offsetAll (delta.x, delta.y); - } - - bool clipRegionIntersects (const Rectangle& r) const - { - return clip.intersects (r); - } - - Rectangle getClipBounds() const - { - return clip.getBounds(); - } - - void fillRectWithColour (Image::BitmapData& destData, const Rectangle& area, const PixelARGB& colour, bool replaceContents) const - { - SubRectangleIterator iter (clip, area); - - switch (destData.pixelFormat) - { - case Image::ARGB: renderSolidFill (iter, destData, colour, replaceContents, (PixelARGB*) 0); break; - case Image::RGB: renderSolidFill (iter, destData, colour, replaceContents, (PixelRGB*) 0); break; - default: renderSolidFill (iter, destData, colour, replaceContents, (PixelAlpha*) 0); break; - } - } - - void fillRectWithColour (Image::BitmapData& destData, const Rectangle& area, const PixelARGB& colour) const - { - SubRectangleIteratorFloat iter (clip, area); - - switch (destData.pixelFormat) - { - case Image::ARGB: renderSolidFill (iter, destData, colour, false, (PixelARGB*) 0); break; - case Image::RGB: renderSolidFill (iter, destData, colour, false, (PixelRGB*) 0); break; - default: renderSolidFill (iter, destData, colour, false, (PixelAlpha*) 0); break; - } - } - - void fillAllWithColour (Image::BitmapData& destData, const PixelARGB& colour, bool replaceContents) const - { - switch (destData.pixelFormat) - { - case Image::ARGB: renderSolidFill (*this, destData, colour, replaceContents, (PixelARGB*) 0); break; - case Image::RGB: renderSolidFill (*this, destData, colour, replaceContents, (PixelRGB*) 0); break; - default: renderSolidFill (*this, destData, colour, replaceContents, (PixelAlpha*) 0); break; - } - } - - void fillAllWithGradient (Image::BitmapData& destData, ColourGradient& gradient, const AffineTransform& transform, bool isIdentity) const - { - HeapBlock lookupTable; - const int numLookupEntries = gradient.createLookupTable (transform, lookupTable); - jassert (numLookupEntries > 0); - - switch (destData.pixelFormat) - { - case Image::ARGB: renderGradient (*this, destData, gradient, transform, lookupTable, numLookupEntries, isIdentity, (PixelARGB*) 0); break; - case Image::RGB: renderGradient (*this, destData, gradient, transform, lookupTable, numLookupEntries, isIdentity, (PixelRGB*) 0); break; - default: renderGradient (*this, destData, gradient, transform, lookupTable, numLookupEntries, isIdentity, (PixelAlpha*) 0); break; - } - } - - void renderImageTransformed (const Image::BitmapData& destData, const Image::BitmapData& srcData, const int alpha, const AffineTransform& transform, bool betterQuality, bool tiledFill) const - { - renderImageTransformedInternal (*this, destData, srcData, alpha, transform, betterQuality, tiledFill); - } - - void renderImageUntransformed (const Image::BitmapData& destData, const Image::BitmapData& srcData, const int alpha, int x, int y, bool tiledFill) const - { - renderImageUntransformedInternal (*this, destData, srcData, alpha, x, y, tiledFill); - } - - RectangleList clip; - - //============================================================================== - template - void iterate (Renderer& r) const noexcept - { - RectangleList::Iterator iter (clip); - - while (iter.next()) - { - const Rectangle rect (*iter.getRectangle()); - const int x = rect.getX(); - const int w = rect.getWidth(); - jassert (w > 0); - const int bottom = rect.getBottom(); - - for (int y = rect.getY(); y < bottom; ++y) - { - r.setEdgeTableYPos (y); - r.handleEdgeTableLineFull (x, w); - } - } - } - -private: - //============================================================================== - class SubRectangleIterator - { - public: - SubRectangleIterator (const RectangleList& clip_, const Rectangle& area_) - : clip (clip_), area (area_) - { - } - - template - void iterate (Renderer& r) const noexcept - { - RectangleList::Iterator iter (clip); - - while (iter.next()) - { - const Rectangle rect (iter.getRectangle()->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& clip_, const Rectangle& area_) noexcept - : clip (clip_), area (area_) - { - } - - template - void iterate (Renderer& r) const noexcept - { - const RenderingHelpers::FloatRectangleRasterisingInfo f (area); - RectangleList::Iterator iter (clip); - - while (iter.next()) - { - const int clipLeft = iter.getRectangle()->getX(); - const int clipRight = iter.getRectangle()->getRight(); - const int clipTop = iter.getRectangle()->getY(); - const int clipBottom = iter.getRectangle()->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); - }; - - inline Ptr toEdgeTable() const { return new ClipRegion_EdgeTable (clip); } - - ClipRegion_RectangleList& operator= (const ClipRegion_RectangleList&); -}; - -} - -//============================================================================== -class LowLevelGraphicsSoftwareRenderer::SavedState -{ -public: - SavedState (const Image& image_, const Rectangle& clip_) - : image (image_), clip (new SoftwareRendererClasses::ClipRegion_RectangleList (clip_)), - transform (0, 0), - interpolationQuality (Graphics::mediumResamplingQuality), - transparencyLayerAlpha (1.0f) - { - } - - SavedState (const Image& image_, const RectangleList& clip_, const int xOffset_, const int yOffset_) - : image (image_), clip (new SoftwareRendererClasses::ClipRegion_RectangleList (clip_)), - transform (xOffset_, yOffset_), - interpolationQuality (Graphics::mediumResamplingQuality), - transparencyLayerAlpha (1.0f) - { - } - - SavedState (const SavedState& other) - : image (other.image), clip (other.clip), transform (other.transform), - font (other.font), fillType (other.fillType), - interpolationQuality (other.interpolationQuality), - transparencyLayerAlpha (other.transparencyLayerAlpha) - { - } - - bool clipToRectangle (const Rectangle& r) - { - if (clip != nullptr) - { - if (transform.isOnlyTranslated) - { - cloneClipIfMultiplyReferenced(); - clip = clip->clipToRectangle (transform.translated (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.xOffset, transform.yOffset); - clip = clip->clipToRectangleList (offsetList); - } - else - { - clipToPath (r.toPath(), AffineTransform::identity); - } - } - - return clip != nullptr; - } - - bool excludeClipRectangle (const Rectangle& r) - { - if (clip != nullptr) - { - cloneClipIfMultiplyReferenced(); - - if (transform.isOnlyTranslated) - { - clip = clip->excludeClipRectangle (transform.translated (r)); - } - 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 != Graphics::lowResamplingQuality); - } - 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)); - else - return getClipBounds().intersects (r); - } - - return false; - } - - Rectangle getClipBounds() const - { - return clip != nullptr ? transform.deviceSpaceToUserSpace (clip->getClipBounds()) - : Rectangle(); - } - - SavedState* beginTransparencyLayer (float opacity) - { - SavedState* s = new SavedState (*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.getX(), -layerBounds.getY()); - - s->cloneClipIfMultiplyReferenced(); - s->clip->translate (-layerBounds.getPosition()); - } - - return s; - } - - void endTransparencyLayer (SavedState& finishedLayerState) - { - if (clip != nullptr) - { - const Rectangle layerBounds (clip->getClipBounds()); - - const ScopedPointer g (image.createLowLevelContext()); - g->setOpacity (finishedLayerState.transparencyLayerAlpha); - g->drawImage (finishedLayerState.image, AffineTransform::translation ((float) layerBounds.getX(), - (float) layerBounds.getY())); - } - } - - //============================================================================== - void fillRect (const Rectangle& r, const bool replaceContents) - { - if (clip != nullptr) - { - if (transform.isOnlyTranslated) - { - if (fillType.isColour()) - { - Image::BitmapData destData (image, Image::BitmapData::readWrite); - clip->fillRectWithColour (destData, transform.translated (r), fillType.colour.getPixelARGB(), replaceContents); - } - else - { - const Rectangle totalClip (clip->getClipBounds()); - const Rectangle clipped (totalClip.getIntersection (transform.translated (r))); - - if (! clipped.isEmpty()) - fillShape (new SoftwareRendererClasses::ClipRegion_RectangleList (clipped), false); - } - } - else - { - Path p; - p.addRectangle (r); - fillPath (p, AffineTransform::identity); - } - } - } - - void fillRect (const Rectangle& r) - { - if (clip != nullptr) - { - if (transform.isOnlyTranslated) - { - if (fillType.isColour()) - { - Image::BitmapData destData (image, Image::BitmapData::readWrite); - clip->fillRectWithColour (destData, transform.translated (r), fillType.colour.getPixelARGB()); - } - else - { - const Rectangle totalClip (clip->getClipBounds().toFloat()); - const Rectangle clipped (totalClip.getIntersection (transform.translated (r))); - - if (! clipped.isEmpty()) - fillShape (new SoftwareRendererClasses::ClipRegion_EdgeTable (clipped), false); - } - } - else - { - Path p; - p.addRectangle (r); - fillPath (p, AffineTransform::identity); - } - } - } - - void fillPath (const Path& path, const AffineTransform& t) - { - if (clip != nullptr) - fillShape (new SoftwareRendererClasses::ClipRegion_EdgeTable (clip->getClipBounds(), path, transform.getTransformWith (t)), false); - } - - void fillEdgeTable (const EdgeTable& edgeTable, const float x, const int y) - { - jassert (transform.isOnlyTranslated); - - if (clip != nullptr) - { - SoftwareRendererClasses::ClipRegion_EdgeTable* edgeTableClip = new SoftwareRendererClasses::ClipRegion_EdgeTable (edgeTable); - edgeTableClip->edgeTable.translate (x + transform.xOffset, - y + transform.yOffset); - fillShape (edgeTableClip, false); - } - } - - void drawGlyph (const Font& f, int glyphNumber, const AffineTransform& t) - { - if (clip != nullptr) - { - const ScopedPointer et (f.getTypeface()->getEdgeTableForGlyph (glyphNumber, transform.getTransformWith (t))); - - if (et != nullptr) - fillShape (new SoftwareRendererClasses::ClipRegion_EdgeTable (*et), false); - } - } - - void fillShape (SoftwareRendererClasses::ClipRegionBase::Ptr shapeToFill, const bool replaceContents) - { - jassert (clip != nullptr); - - shapeToFill = clip->applyClipTo (shapeToFill); - - if (shapeToFill != nullptr) - { - Image::BitmapData destData (image, Image::BitmapData::readWrite); - - 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 (destData, g2, t, isIdentity); - } - else if (fillType.isTiledImage()) - { - renderImage (fillType.image, fillType.transform, shapeToFill); - } - else - { - shapeToFill->fillAllWithColour (destData, fillType.colour.getPixelARGB(), replaceContents); - } - } - } - - //============================================================================== - void renderImage (const Image& sourceImage, const AffineTransform& trans, - const SoftwareRendererClasses::ClipRegionBase* const tiledFillClipRegion) - { - const AffineTransform t (transform.getTransformWith (trans)); - - const Image::BitmapData destData (image, Image::BitmapData::readWrite); - const Image::BitmapData srcData (sourceImage, Image::BitmapData::readOnly); - const int alpha = fillType.colour.getAlpha(); - const bool betterQuality = (interpolationQuality != Graphics::lowResamplingQuality); - - if (t.isOnlyTranslation()) - { - // 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 ((! betterQuality) || ((tx | ty) & 224) == 0) - { - tx = ((tx + 128) >> 8); - ty = ((ty + 128) >> 8); - - if (tiledFillClipRegion != nullptr) - { - tiledFillClipRegion->renderImageUntransformed (destData, srcData, alpha, tx, ty, true); - } - else - { - Rectangle area (tx, ty, sourceImage.getWidth(), sourceImage.getHeight()); - area = area.getIntersection (image.getBounds()); - - if (! area.isEmpty()) - { - SoftwareRendererClasses::ClipRegionBase::Ptr c (clip->applyClipTo (new SoftwareRendererClasses::ClipRegion_EdgeTable (area))); - - if (c != nullptr) - c->renderImageUntransformed (destData, srcData, alpha, tx, ty, false); - } - } - - return; - } - } - - if (t.isSingularity()) - return; - - if (tiledFillClipRegion != nullptr) - { - tiledFillClipRegion->renderImageTransformed (destData, srcData, alpha, t, betterQuality, true); - } - else - { - Path p; - p.addRectangle (sourceImage.getBounds()); - - SoftwareRendererClasses::ClipRegionBase::Ptr c (clip->clone()); - c = c->clipToPath (p, t); - - if (c != nullptr) - c->renderImageTransformed (destData, srcData, alpha, t, betterQuality, false); - } - } - - //============================================================================== - Image image; - SoftwareRendererClasses::ClipRegionBase::Ptr clip; - RenderingHelpers::TranslationOrTransform transform; - Font font; - FillType fillType; - Graphics::ResamplingQuality interpolationQuality; - -private: - float transparencyLayerAlpha; - - void cloneClipIfMultiplyReferenced() - { - if (clip->getReferenceCount() > 1) - clip = clip->clone(); - } - - SavedState& operator= (const SavedState&); -}; - - -//============================================================================== -LowLevelGraphicsSoftwareRenderer::LowLevelGraphicsSoftwareRenderer (const Image& image) - : savedState (new SavedState (image, image.getBounds())) -{ -} - -LowLevelGraphicsSoftwareRenderer::LowLevelGraphicsSoftwareRenderer (const Image& image, const Point& origin, - const RectangleList& initialClip) - : savedState (new SavedState (image, initialClip, origin.x, origin.y)) -{ -} - -LowLevelGraphicsSoftwareRenderer::~LowLevelGraphicsSoftwareRenderer() -{ -} - -bool LowLevelGraphicsSoftwareRenderer::isVectorDevice() const -{ - return false; -} - -//============================================================================== -void LowLevelGraphicsSoftwareRenderer::setOrigin (int x, int y) -{ - savedState->transform.setOrigin (x, y); -} - -void LowLevelGraphicsSoftwareRenderer::addTransform (const AffineTransform& transform) -{ - savedState->transform.addTransform (transform); -} - -float LowLevelGraphicsSoftwareRenderer::getScaleFactor() -{ - return savedState->transform.getScaleFactor(); -} - -bool LowLevelGraphicsSoftwareRenderer::clipToRectangle (const Rectangle& r) -{ - return savedState->clipToRectangle (r); -} - -bool LowLevelGraphicsSoftwareRenderer::clipToRectangleList (const RectangleList& clipRegion) -{ - return savedState->clipToRectangleList (clipRegion); -} - -void LowLevelGraphicsSoftwareRenderer::excludeClipRectangle (const Rectangle& r) -{ - savedState->excludeClipRectangle (r); -} - -void LowLevelGraphicsSoftwareRenderer::clipToPath (const Path& path, const AffineTransform& transform) -{ - savedState->clipToPath (path, transform); -} - -void LowLevelGraphicsSoftwareRenderer::clipToImageAlpha (const Image& sourceImage, const AffineTransform& transform) -{ - savedState->clipToImageAlpha (sourceImage, transform); -} - -bool LowLevelGraphicsSoftwareRenderer::clipRegionIntersects (const Rectangle& r) -{ - return savedState->clipRegionIntersects (r); -} - -Rectangle LowLevelGraphicsSoftwareRenderer::getClipBounds() const -{ - return savedState->getClipBounds(); -} - -bool LowLevelGraphicsSoftwareRenderer::isClipEmpty() const -{ - return savedState->clip == nullptr; -} - -//============================================================================== -void LowLevelGraphicsSoftwareRenderer::saveState() { savedState.save(); } -void LowLevelGraphicsSoftwareRenderer::restoreState() { savedState.restore(); } - -void LowLevelGraphicsSoftwareRenderer::beginTransparencyLayer (float opacity) { savedState.beginTransparencyLayer (opacity); } -void LowLevelGraphicsSoftwareRenderer::endTransparencyLayer() { savedState.endTransparencyLayer(); } - -//============================================================================== -void LowLevelGraphicsSoftwareRenderer::setFill (const FillType& fillType) -{ - savedState->fillType = fillType; -} - -void LowLevelGraphicsSoftwareRenderer::setOpacity (float newOpacity) -{ - savedState->fillType.setOpacity (newOpacity); -} - -void LowLevelGraphicsSoftwareRenderer::setInterpolationQuality (Graphics::ResamplingQuality quality) -{ - savedState->interpolationQuality = quality; -} - -//============================================================================== -void LowLevelGraphicsSoftwareRenderer::fillRect (const Rectangle& r, const bool replaceExistingContents) -{ - savedState->fillRect (r, replaceExistingContents); -} - -void LowLevelGraphicsSoftwareRenderer::fillPath (const Path& path, const AffineTransform& transform) -{ - savedState->fillPath (path, transform); -} - -void LowLevelGraphicsSoftwareRenderer::drawImage (const Image& sourceImage, const AffineTransform& transform) -{ - savedState->renderImage (sourceImage, transform, nullptr); -} - -void LowLevelGraphicsSoftwareRenderer::drawLine (const Line & line) -{ - Path p; - p.addLineSegment (line, 1.0f); - fillPath (p, AffineTransform::identity); -} - -void LowLevelGraphicsSoftwareRenderer::drawVerticalLine (const int x, float top, float bottom) -{ - if (bottom > top) - savedState->fillRect (Rectangle ((float) x, top, 1.0f, bottom - top)); -} - -void LowLevelGraphicsSoftwareRenderer::drawHorizontalLine (const int y, float left, float right) -{ - if (right > left) - savedState->fillRect (Rectangle (left, (float) y, right - left, 1.0f)); -} - -void LowLevelGraphicsSoftwareRenderer::drawGlyph (int glyphNumber, const AffineTransform& transform) -{ - Font& f = savedState->font; - - if (transform.isOnlyTranslation() && savedState->transform.isOnlyTranslated) - { - RenderingHelpers::GlyphCache , SavedState>::getInstance() - .drawGlyph (*savedState, f, glyphNumber, - transform.getTranslationX(), - transform.getTranslationY()); - } - else - { - const float fontHeight = f.getHeight(); - savedState->drawGlyph (f, glyphNumber, - AffineTransform::scale (fontHeight * f.getHorizontalScale(), fontHeight) - .followedBy (transform)); - } -} - -void LowLevelGraphicsSoftwareRenderer::setFont (const Font& newFont) { savedState->font = newFont; } -const Font& LowLevelGraphicsSoftwareRenderer::getFont() { return savedState->font; } - -#if JUCE_MSVC - #pragma warning (pop) - - #if JUCE_DEBUG - #pragma optimize ("", on) // resets optimisations to the project defaults - #endif -#endif diff --git a/src/juce/JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.h b/src/juce/JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.h deleted file mode 100644 index 94e004ae..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.h +++ /dev/null @@ -1,100 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_LOWLEVELGRAPHICSSOFTWARERENDERER_JUCEHEADER__ -#define __JUCE_LOWLEVELGRAPHICSSOFTWARERENDERER_JUCEHEADER__ - -#include "juce_LowLevelGraphicsContext.h" - -#ifndef DOXYGEN -#include "../native/juce_RenderingHelpers.h" -#endif - -//============================================================================== -/** - 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 LowLevelGraphicsContext -{ -public: - //============================================================================== - LowLevelGraphicsSoftwareRenderer (const Image& imageToRenderOn); - LowLevelGraphicsSoftwareRenderer (const Image& imageToRenderOn, const Point& origin, const RectangleList& initialClip); - ~LowLevelGraphicsSoftwareRenderer(); - - bool isVectorDevice() const; - void setOrigin (int x, int y); - void addTransform (const AffineTransform&); - float getScaleFactor(); - bool clipToRectangle (const Rectangle&); - bool clipToRectangleList (const RectangleList&); - void excludeClipRectangle (const Rectangle&); - void clipToPath (const Path&, const AffineTransform&); - void clipToImageAlpha (const Image&, const AffineTransform&); - bool clipRegionIntersects (const Rectangle&); - Rectangle getClipBounds() const; - bool isClipEmpty() const; - - void saveState(); - void restoreState(); - - void beginTransparencyLayer (float opacity); - void endTransparencyLayer(); - - void setFill (const FillType&); - void setOpacity (float opacity); - void setInterpolationQuality (Graphics::ResamplingQuality); - - void fillRect (const Rectangle&, bool replaceExistingContents); - void fillPath (const Path&, const AffineTransform&); - - void drawImage (const Image&, const AffineTransform&); - - void drawLine (const Line & line); - - void drawVerticalLine (int x, float top, float bottom); - void drawHorizontalLine (int x, float top, float bottom); - - void setFont (const Font&); - const Font& getFont(); - void drawGlyph (int glyphNumber, float x, float y); - void drawGlyph (int glyphNumber, const AffineTransform&); - - #ifndef DOXYGEN - class SavedState; - #endif - -protected: - RenderingHelpers::SavedStateStack savedState; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (LowLevelGraphicsSoftwareRenderer); -}; - - -#endif // __JUCE_LOWLEVELGRAPHICSSOFTWARERENDERER_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_graphics/effects/juce_DropShadowEffect.cpp b/src/juce/JuceLibraryCode/modules/juce_graphics/effects/juce_DropShadowEffect.cpp deleted file mode 100644 index 8a694036..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/effects/juce_DropShadowEffect.cpp +++ /dev/null @@ -1,107 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#if JUCE_MSVC && JUCE_DEBUG - #pragma optimize ("t", on) -#endif - -//============================================================================== -DropShadowEffect::DropShadowEffect() - : offsetX (0), - offsetY (0), - radius (4), - opacity (0.6f) -{ -} - -DropShadowEffect::~DropShadowEffect() -{ -} - -void DropShadowEffect::setShadowProperties (const float newRadius, - const float newOpacity, - const int newShadowOffsetX, - const int newShadowOffsetY) -{ - radius = jmax (1.1f, newRadius); - offsetX = newShadowOffsetX; - offsetY = newShadowOffsetY; - opacity = newOpacity; -} - -void DropShadowEffect::applyEffect (Image& image, Graphics& g, float alpha) -{ - const int w = image.getWidth(); - const int h = image.getHeight(); - - Image shadowImage (Image::SingleChannel, w, h, false); - - { - const Image::BitmapData srcData (image, Image::BitmapData::readOnly); - const Image::BitmapData destData (shadowImage, Image::BitmapData::readWrite); - - const int filter = roundToInt (63.0f / radius); - const int radiusMinus1 = roundToInt ((radius - 1.0f) * 63.0f); - - for (int x = w; --x >= 0;) - { - int shadowAlpha = 0; - - const PixelARGB* src = ((const PixelARGB*) srcData.data) + x; - uint8* shadowPix = destData.data + x; - - for (int y = h; --y >= 0;) - { - shadowAlpha = ((shadowAlpha * radiusMinus1 + (src->getAlpha() << 6)) * filter) >> 12; - - *shadowPix = (uint8) shadowAlpha; - src = addBytesToPointer (src, srcData.lineStride); - shadowPix += destData.lineStride; - } - } - - for (int y = h; --y >= 0;) - { - int shadowAlpha = 0; - uint8* shadowPix = destData.getLinePointer (y); - - for (int x = w; --x >= 0;) - { - shadowAlpha = ((shadowAlpha * radiusMinus1 + (*shadowPix << 6)) * filter) >> 12; - *shadowPix++ = (uint8) shadowAlpha; - } - } - } - - g.setColour (Colours::black.withAlpha (opacity * alpha)); - g.drawImageAt (shadowImage, offsetX, offsetY, true); - - g.setOpacity (alpha); - g.drawImageAt (image, 0, 0); -} - -#if JUCE_MSVC && JUCE_DEBUG - #pragma optimize ("", on) // resets optimisations to the project defaults -#endif diff --git a/src/juce/JuceLibraryCode/modules/juce_graphics/effects/juce_DropShadowEffect.h b/src/juce/JuceLibraryCode/modules/juce_graphics/effects/juce_DropShadowEffect.h deleted file mode 100644 index 2fdc7068..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/effects/juce_DropShadowEffect.h +++ /dev/null @@ -1,92 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_DROPSHADOWEFFECT_JUCEHEADER__ -#define __JUCE_DROPSHADOWEFFECT_JUCEHEADER__ - -#include "juce_ImageEffectFilter.h" - - -//============================================================================== -/** - 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. - - @param newRadius the (approximate) radius of the blur used - @param newOpacity the opacity with which the shadow is rendered - @param newShadowOffsetX allows the shadow to be shifted in relation to the - component's contents - @param newShadowOffsetY allows the shadow to be shifted in relation to the - component's contents - */ - void setShadowProperties (float newRadius, - float newOpacity, - int newShadowOffsetX, - int newShadowOffsetY); - - - //============================================================================== - /** @internal */ - void applyEffect (Image& sourceImage, Graphics& destContext, float alpha); - - -private: - //============================================================================== - int offsetX, offsetY; - float radius, opacity; - - JUCE_LEAK_DETECTOR (DropShadowEffect); -}; - - -#endif // __JUCE_DROPSHADOWEFFECT_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_graphics/effects/juce_GlowEffect.cpp b/src/juce/JuceLibraryCode/modules/juce_graphics/effects/juce_GlowEffect.cpp deleted file mode 100644 index ef238897..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/effects/juce_GlowEffect.cpp +++ /dev/null @@ -1,59 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -GlowEffect::GlowEffect() - : radius (2.0f), - colour (Colours::white) -{ -} - -GlowEffect::~GlowEffect() -{ -} - -void GlowEffect::setGlowProperties (const float newRadius, - const Colour& newColour) -{ - radius = newRadius; - colour = newColour; -} - -void GlowEffect::applyEffect (Image& image, Graphics& g, float alpha) -{ - Image temp (image.getFormat(), image.getWidth(), image.getHeight(), true); - - ImageConvolutionKernel blurKernel (roundToInt (radius * 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/src/juce/JuceLibraryCode/modules/juce_graphics/effects/juce_GlowEffect.h b/src/juce/JuceLibraryCode/modules/juce_graphics/effects/juce_GlowEffect.h deleted file mode 100644 index e843c053..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/effects/juce_GlowEffect.h +++ /dev/null @@ -1,77 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_GLOWEFFECT_JUCEHEADER__ -#define __JUCE_GLOWEFFECT_JUCEHEADER__ - -#include "juce_ImageEffectFilter.h" - - -//============================================================================== -/** - 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, - const Colour& newColour); - - - //============================================================================== - /** @internal */ - void applyEffect (Image& sourceImage, Graphics& destContext, float alpha); - -private: - //============================================================================== - float radius; - Colour colour; - - JUCE_LEAK_DETECTOR (GlowEffect); -}; - - -#endif // __JUCE_GLOWEFFECT_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_graphics/effects/juce_ImageEffectFilter.h b/src/juce/JuceLibraryCode/modules/juce_graphics/effects/juce_ImageEffectFilter.h deleted file mode 100644 index 66b8994a..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/effects/juce_ImageEffectFilter.h +++ /dev/null @@ -1,68 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_IMAGEEFFECTFILTER_JUCEHEADER__ -#define __JUCE_IMAGEEFFECTFILTER_JUCEHEADER__ - -#include "../contexts/juce_GraphicsContext.h" - - -//============================================================================== -/** - 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 alpha the alpha with which to draw the resultant image to the - target context - */ - virtual void applyEffect (Image& sourceImage, - Graphics& destContext, - float alpha) = 0; - - /** Destructor. */ - virtual ~ImageEffectFilter() {} - -}; - -#endif // __JUCE_IMAGEEFFECTFILTER_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_graphics/fonts/juce_AttributedString.cpp b/src/juce/JuceLibraryCode/modules/juce_graphics/fonts/juce_AttributedString.cpp deleted file mode 100644 index a84e2373..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/fonts/juce_AttributedString.cpp +++ /dev/null @@ -1,217 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -AttributedString::Attribute::Attribute (const Range& range_, const Colour& colour_) - : range (range_), colour (new Colour (colour_)) -{ -} - -AttributedString::Attribute::Attribute (const 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() {} - -//============================================================================== -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, const 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, const 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::clear() -{ - text = String::empty; - attributes.clear(); -} - -void AttributedString::setJustification (const 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 (const Range& range, const Colour& colour) -{ - attributes.add (new Attribute (range, colour)); -} - -void AttributedString::setColour (const 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 (const 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/src/juce/JuceLibraryCode/modules/juce_graphics/fonts/juce_AttributedString.h b/src/juce/JuceLibraryCode/modules/juce_graphics/fonts/juce_AttributedString.h deleted file mode 100644 index f2c289b6..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/fonts/juce_AttributedString.h +++ /dev/null @@ -1,211 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_ATTRIBUTEDSTRING_JUCEHEADER__ -#define __JUCE_ATTRIBUTEDSTRING_JUCEHEADER__ - - -//============================================================================== -/** - 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, const Colour& colour); - /** Appends some text, with a specified font and colour. */ - void append (const String& textToAppend, const Font& font, const Colour& colour); - - /** 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 (const 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 (const Range& range, const Colour& colour); - - /** Creates an attribute that changes the font for a range of characters. - @see AttributedString::setFont() - */ - Attribute (const 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; - - 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 (const Range& range, const Colour& colour); - - /** Removes all existing colour attributes, and applies this colour to the whole string. */ - void setColour (const Colour& colour); - - /** Adds a font attribute for the specified range. */ - void setFont (const 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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_graphics/fonts/juce_CustomTypeface.cpp b/src/juce/JuceLibraryCode/modules/juce_graphics/fonts/juce_CustomTypeface.cpp deleted file mode 100644 index a9505f01..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/fonts/juce_CustomTypeface.cpp +++ /dev/null @@ -1,408 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -class CustomTypeface::GlyphInfo -{ -public: - GlyphInfo (const juce_wchar character_, const Path& path_, const float width_) noexcept - : character (character_), path (path_), width (width_) - { - } - - 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::empty) -{ - clear(); -} - -CustomTypeface::CustomTypeface (InputStream& serialisedTypefaceStream) - : Typeface (String::empty) -{ - clear(); - - GZIPDecompressorInputStream gzin (serialisedTypefaceStream); - BufferedInputStream in (gzin, 32768); - - name = in.readString(); - isBold = in.readBool(); - isItalic = in.readBool(); - ascent = in.readFloat(); - defaultCharacter = CustomTypefaceHelpers::readChar (in); - - int i, numChars = in.readInt(); - - for (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 (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; - isBold = isItalic = false; - zeromem (lookupTable, sizeof (lookupTable)); - glyphs.clear(); -} - -void CustomTypeface::setCharacteristics (const String& name_, const float ascent_, const bool isBold_, - const bool isItalic_, const juce_wchar defaultCharacter_) noexcept -{ - name = name_; - defaultCharacter = defaultCharacter_; - ascent = ascent_; - isBold = isBold_; - isItalic = isItalic_; -} - -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) - { - GlyphInfo* const g = findGlyph (char1, true); - jassert (g != nullptr); // can only add kerning pairs for characters that exist! - - if (g != nullptr) - g->addKerningPair (char2, extraAmount); - } -} - -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, typefaceToCopy.getAscent(), isBold, isItalic, 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 (isBold); - out.writeBool (isItalic); - out.writeFloat (ascent); - CustomTypefaceHelpers::writeChar (out, defaultCharacter); - out.writeInt (glyphs.size()); - - int i, numKerningPairs = 0; - - for (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 (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::getStringWidth (const String& text) -{ - float x = 0; - String::CharPointerType t (text.getCharPointer()); - - while (! t.isEmpty()) - { - const juce_wchar c = t.getAndAdvance(); - const GlyphInfo* const glyph = findGlyph (c, true); - - if (glyph == nullptr) - { - const Typeface::Ptr fallbackTypeface (Typeface::getFallbackTypeface()); - - if (fallbackTypeface != nullptr && fallbackTypeface != this) - x += fallbackTypeface->getStringWidth (String::charToString (c)); - } - - if (glyph != nullptr) - x += glyph->getHorizontalSpacing (*t); - } - - return x; -} - -void CustomTypeface::getGlyphPositions (const String& text, Array & resultGlyphs, Array& xOffsets) -{ - xOffsets.add (0); - float x = 0; - String::CharPointerType t (text.getCharPointer()); - - while (! t.isEmpty()) - { - const juce_wchar c = t.getAndAdvance(); - const GlyphInfo* const glyph = findGlyph (c, true); - - if (glyph == nullptr) - { - const Typeface::Ptr fallbackTypeface (Typeface::getFallbackTypeface()); - - if (fallbackTypeface != nullptr && fallbackTypeface != this) - { - Array subGlyphs; - Array subOffsets; - fallbackTypeface->getGlyphPositions (String::charToString (c), subGlyphs, subOffsets); - - if (subGlyphs.size() > 0) - { - resultGlyphs.add (subGlyphs.getFirst()); - x += subOffsets[1]; - xOffsets.add (x); - } - } - } - - if (glyph != nullptr) - { - x += glyph->getHorizontalSpacing (*t); - resultGlyphs.add ((int) glyph->character); - xOffsets.add (x); - } - } -} - -bool CustomTypeface::getOutlineForGlyph (int glyphNumber, Path& path) -{ - const GlyphInfo* const glyph = findGlyph ((juce_wchar) glyphNumber, true); - - if (glyph == nullptr) - { - const Typeface::Ptr fallbackTypeface (Typeface::getFallbackTypeface()); - - if (fallbackTypeface != nullptr && fallbackTypeface != this) - fallbackTypeface->getOutlineForGlyph (glyphNumber, path); - } - - if (glyph != nullptr) - { - path = glyph->path; - return true; - } - - return false; -} - -EdgeTable* CustomTypeface::getEdgeTableForGlyph (int glyphNumber, const AffineTransform& transform) -{ - const GlyphInfo* const glyph = findGlyph ((juce_wchar) glyphNumber, true); - - if (glyph == nullptr) - { - const Typeface::Ptr fallbackTypeface (Typeface::getFallbackTypeface()); - - if (fallbackTypeface != nullptr && fallbackTypeface != this) - return fallbackTypeface->getEdgeTableForGlyph (glyphNumber, transform); - } - - if (glyph != nullptr && ! glyph->path.isEmpty()) - return new EdgeTable (glyph->path.getBoundsTransformed (transform).getSmallestIntegerContainer().expanded (1, 0), - glyph->path, transform); - - return nullptr; -} diff --git a/src/juce/JuceLibraryCode/modules/juce_graphics/fonts/juce_CustomTypeface.h b/src/juce/JuceLibraryCode/modules/juce_graphics/fonts/juce_CustomTypeface.h deleted file mode 100644 index bd4d14a6..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/fonts/juce_CustomTypeface.h +++ /dev/null @@ -1,143 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_CUSTOMTYPEFACE_JUCEHEADER__ -#define __JUCE_CUSTOMTYPEFACE_JUCEHEADER__ - -#include "juce_Typeface.h" -class InputStream; -class OutputStream; - - -//============================================================================== -/** - 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. - - @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(). - @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 name the typeface's name - @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& name, float ascent, - bool isBold, bool isItalic, - 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. - */ - bool writeToStream (OutputStream& outputStream); - - //============================================================================== - // The following methods implement the basic Typeface behaviour. - float getAscent() const; - float getDescent() const; - float getStringWidth (const String& text); - void getGlyphPositions (const String& text, Array & glyphs, Array& xOffsets); - bool getOutlineForGlyph (int glyphNumber, Path& path); - EdgeTable* getEdgeTableForGlyph (int glyphNumber, const AffineTransform& transform); - -protected: - //============================================================================== - juce_wchar defaultCharacter; - float ascent; - bool isBold, isItalic; - - //============================================================================== - /** 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 class OwnedArray; - 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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_graphics/fonts/juce_Font.cpp b/src/juce/JuceLibraryCode/modules/juce_graphics/fonts/juce_Font.cpp deleted file mode 100644 index d43636d6..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/fonts/juce_Font.cpp +++ /dev/null @@ -1,583 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce 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; -} - -typedef Typeface::Ptr (*GetTypefaceForFont) (const Font&); -GetTypefaceForFont juce_getTypefaceForFont = nullptr; - -//============================================================================== -class TypefaceCache : public DeletedAtShutdown -{ -public: - TypefaceCache() - : counter (0) - { - setSize (10); - } - - ~TypefaceCache() - { - clearSingletonInstance(); - } - - juce_DeclareSingleton_SingleThreaded_Minimal (TypefaceCache); - - void setSize (const int numToCache) - { - faces.clear(); - faces.insertMultiple (-1, CachedFace(), numToCache); - } - - Typeface::Ptr findTypefaceFor (const Font& font) - { - const int flags = font.getStyleFlags() & (Font::bold | Font::italic); - const String faceName (font.getTypefaceName()); - - int i; - for (i = faces.size(); --i >= 0;) - { - CachedFace& face = faces.getReference(i); - - if (face.flags == flags - && face.typefaceName == faceName - && face.typeface->isSuitableForFont (font)) - { - face.lastUsageCount = ++counter; - return face.typeface; - } - } - - int replaceIndex = 0; - size_t bestLastUsageCount = std::numeric_limits::max(); - - for (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.flags = flags; - 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 getDefaultTypeface() const noexcept - { - return defaultFace; - } - -private: - struct CachedFace - { - CachedFace() noexcept - : lastUsageCount (0), flags (-1) - { - } - - // 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; - size_t lastUsageCount; - int flags; - Typeface::Ptr typeface; - }; - - Array faces; - Typeface::Ptr defaultFace; - size_t counter; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (TypefaceCache); -}; - -juce_ImplementSingleton_SingleThreaded (TypefaceCache) - -void Typeface::setTypefaceCacheSize (int numFontsToCache) -{ - TypefaceCache::getInstance()->setSize (numFontsToCache); -} - -//============================================================================== -class Font::SharedFontInternal : public SingleThreadedReferenceCountedObject -{ -public: - SharedFontInternal (const float height_, const int styleFlags_) noexcept - : typefaceName (Font::getDefaultSansSerifFontName()), - height (height_), - horizontalScale (1.0f), - kerning (0), - ascent (0), - styleFlags (styleFlags_), - typeface ((styleFlags_ & (Font::bold | Font::italic)) == 0 - ? TypefaceCache::getInstance()->getDefaultTypeface() : nullptr) - { - } - - SharedFontInternal (const String& typefaceName_, const float height_, const int styleFlags_) noexcept - : typefaceName (typefaceName_), - height (height_), - horizontalScale (1.0f), - kerning (0), - ascent (0), - styleFlags (styleFlags_), - typeface (nullptr) - { - } - - SharedFontInternal (const Typeface::Ptr& typeface_) noexcept - : typefaceName (typeface_->getName()), - height (FontValues::defaultFontHeight), - horizontalScale (1.0f), - kerning (0), - ascent (0), - styleFlags (Font::plain), - typeface (typeface_) - { - } - - SharedFontInternal (const SharedFontInternal& other) noexcept - : typefaceName (other.typefaceName), - height (other.height), - horizontalScale (other.horizontalScale), - kerning (other.kerning), - ascent (other.ascent), - styleFlags (other.styleFlags), - typeface (other.typeface) - { - } - - bool operator== (const SharedFontInternal& other) const noexcept - { - return height == other.height - && styleFlags == other.styleFlags - && horizontalScale == other.horizontalScale - && kerning == other.kerning - && typefaceName == other.typefaceName; - } - - String typefaceName; - float height, horizontalScale, kerning, ascent; - int styleFlags; - Typeface::Ptr typeface; -}; - -//============================================================================== -Font::Font() - : font (new SharedFontInternal (FontValues::defaultFontHeight, Font::plain)) -{ -} - -Font::Font (const float fontHeight, const int styleFlags) - : font (new SharedFontInternal (FontValues::limitFontHeight (fontHeight), styleFlags)) -{ -} - -Font::Font (const String& typefaceName, const float fontHeight, const int styleFlags) - : font (new SharedFontInternal (typefaceName, FontValues::limitFontHeight (fontHeight), styleFlags)) -{ -} - -Font::Font (const Typeface::Ptr& typeface) - : font (new SharedFontInternal (typeface)) -{ -} - -Font::Font (const Font& other) noexcept - : font (other.font) -{ -} - -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); -} - -//============================================================================== -const String& Font::getDefaultSansSerifFontName() -{ - static const String name (""); - return name; -} - -const String& Font::getDefaultSerifFontName() -{ - static const String name (""); - return name; -} - -const String& Font::getDefaultMonospacedFontName() -{ - static const String name (""); - return name; -} - -const String& Font::getTypefaceName() const noexcept -{ - return font->typefaceName; -} - -void Font::setTypefaceName (const String& faceName) -{ - if (faceName != font->typefaceName) - { - dupeInternalIfShared(); - font->typefaceName = faceName; - font->typeface = nullptr; - font->ascent = 0; - } -} - -Typeface* Font::getTypeface() const -{ - if (font->typeface == nullptr) - font->typeface = TypefaceCache::getInstance()->findTypefaceFor (*this); - - 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 -} - -//============================================================================== -float Font::getHeight() const noexcept -{ - return font->height; -} - -Font Font::withHeight (const float newHeight) const -{ - Font f (*this); - f.setHeight (newHeight); - return f; -} - -void Font::setHeight (float newHeight) -{ - newHeight = FontValues::limitFontHeight (newHeight); - - if (font->height != newHeight) - { - dupeInternalIfShared(); - font->height = newHeight; - } -} - -void Font::setHeightWithoutChangingWidth (float newHeight) -{ - newHeight = FontValues::limitFontHeight (newHeight); - - if (font->height != newHeight) - { - dupeInternalIfShared(); - font->horizontalScale *= (font->height / newHeight); - font->height = newHeight; - } -} - -int Font::getStyleFlags() const noexcept -{ - return font->styleFlags; -} - -Font Font::withStyle (const int newFlags) const -{ - Font f (*this); - f.setStyleFlags (newFlags); - return f; -} - -void Font::setStyleFlags (const int newFlags) -{ - if (font->styleFlags != newFlags) - { - dupeInternalIfShared(); - font->styleFlags = newFlags; - font->typeface = nullptr; - 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; - } - - setStyleFlags (newStyleFlags); -} - -float Font::getHorizontalScale() const noexcept -{ - return font->horizontalScale; -} - -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; -} - -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; -} - -Font Font::boldened() const { return withStyle (font->styleFlags | bold); } -Font Font::italicised() const { return withStyle (font->styleFlags | italic); } - -bool Font::isBold() const noexcept { return (font->styleFlags & bold) != 0; } -bool Font::isItalic() const noexcept { return (font->styleFlags & italic) != 0; } - -void Font::setBold (const bool shouldBeBold) -{ - setStyleFlags (shouldBeBold ? (font->styleFlags | bold) - : (font->styleFlags & ~bold)); -} - -void Font::setItalic (const bool shouldBeItalic) -{ - setStyleFlags (shouldBeItalic ? (font->styleFlags | italic) - : (font->styleFlags & ~italic)); -} - -void Font::setUnderline (const bool shouldBeUnderlined) -{ - setStyleFlags (shouldBeUnderlined ? (font->styleFlags | underlined) - : (font->styleFlags & ~underlined)); -} - -bool Font::isUnderlined() const noexcept -{ - return (font->styleFlags & underlined) != 0; -} - -float Font::getAscent() const -{ - if (font->ascent == 0) - font->ascent = getTypeface()->getAscent(); - - return font->height * font->ascent; -} - -float Font::getDescent() const -{ - return font->height - getAscent(); -} - -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) - destArray.add (Font (names[i], FontValues::defaultFontHeight, Font::plain)); -} - -//============================================================================== -String Font::toString() const -{ - String s (getTypefaceName()); - - if (s == getDefaultSansSerifFontName()) - s = String::empty; - else - s += "; "; - - s += String (getHeight(), 1); - - if (isBold()) s += " bold"; - if (isItalic()) s += " italic"; - - 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)); - - float height = sizeAndStyle.getFloatValue(); - if (height <= 0) - height = 10.0f; - - int flags = Font::plain; - if (sizeAndStyle.containsIgnoreCase ("bold")) flags |= Font::bold; - if (sizeAndStyle.containsIgnoreCase ("italic")) flags |= Font::italic; - - return Font (name, height, flags); -} diff --git a/src/juce/JuceLibraryCode/modules/juce_graphics/fonts/juce_Font.h b/src/juce/JuceLibraryCode/modules/juce_graphics/fonts/juce_Font.h deleted file mode 100644 index b237d636..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/fonts/juce_Font.h +++ /dev/null @@ -1,382 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_FONT_JUCEHEADER__ -#define __JUCE_FONT_JUCEHEADER__ - -#include "juce_Typeface.h" -class LowLevelGraphicsContext; - - -//============================================================================== -/** - 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 name 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 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 name of the typeface family. - - 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 names, - but are generic names that are used to represent the various default fonts. - If you need to know the exact typeface name being used, you can call - Font::getTypeface()->getTypefaceName(), which will give you the platform-specific name. - - If a suitable font isn't found on the machine, it'll just use a default instead. - */ - void setTypefaceName (const String& faceName); - - /** Returns the name of the typeface family 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 names, - but are generic names that are used to represent the various default fonts. - - If you need to know the exact typeface name being used, you can call - Font::getTypeface()->getTypefaceName(), which will give you the platform-specific name. - */ - const String& getTypefaceName() const noexcept; - - //============================================================================== - /** Returns a typeface name 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 name of this font. - - @see setTypefaceName, getDefaultSerifFontName, getDefaultMonospacedFontName - */ - static const String& getDefaultSansSerifFontName(); - - /** Returns a typeface name that represents the default sans-serif font. - - Note that this method just returns a generic placeholder string that means "the default - serif font" - it's not the actual name of this font. - - @see setTypefaceName, getDefaultSansSerifFontName, getDefaultMonospacedFontName - */ - static const String& getDefaultSerifFontName(); - - /** Returns a typeface name that represents the default sans-serif font. - - Note that this method just returns a generic placeholder string that means "the default - monospaced font" - it's not the actual name of this font. - - @see setTypefaceName, getDefaultSansSerifFontName, getDefaultSerifFontName - */ - static const String& getDefaultMonospacedFontName(); - - /** Returns the default system typeface for the given font. */ - static Typeface::Ptr getDefaultTypefaceForFont (const Font& font); - - //============================================================================== - /** Returns the total height of this font. - - 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 a copy of this font with a new height. */ - Font withHeight (float height) 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 height of the font above its baseline. - This is the maximum height from the baseline to the top. - @see getHeight, getDescent - */ - float getAscent() const; - - /** Returns the amount that the font descends below its baseline. - This is calculated as (getHeight() - getAscent()). - @see getAscent, getHeight - */ - float getDescent() 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); - - //============================================================================== - /** 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 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 names. - - The names returned can be passed into setTypefaceName(). - - You can use this instead of findFonts() if you only need their names, and not - font objects. - */ - static StringArray findAllTypefaceNames(); - - //============================================================================== - /** Returns the name 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) name 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); - - //============================================================================== - /** 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(); - - JUCE_LEAK_DETECTOR (Font); -}; - -#endif // __JUCE_FONT_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_graphics/fonts/juce_GlyphArrangement.cpp b/src/juce/JuceLibraryCode/modules/juce_graphics/fonts/juce_GlyphArrangement.cpp deleted file mode 100644 index e6df03cb..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/fonts/juce_GlyphArrangement.cpp +++ /dev/null @@ -1,801 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -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) -{ -} - -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; -} - -void PositionedGlyph::draw (const Graphics& g) const -{ - if (! isWhitespace()) - { - LowLevelGraphicsContext* const context = g.getInternalContext(); - context->setFont (font); - context->drawGlyph (glyph, AffineTransform::translation (x, y)); - } -} - -void PositionedGlyph::draw (const Graphics& g, - const AffineTransform& transform) const -{ - if (! isWhitespace()) - { - LowLevelGraphicsContext* const context = g.getInternalContext(); - context->setFont (font); - context->drawGlyph (glyph, AffineTransform::translation (x, y) - .followedBy (transform)); - } -} - -void PositionedGlyph::createPath (Path& path) const -{ - if (! isWhitespace()) - { - Typeface* const t = font.getTypeface(); - - if (t != nullptr) - { - 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()) - { - Typeface* const t = font.getTypeface(); - - if (t != nullptr) - { - 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) -{ - addGlyphArrangement (other); -} - -GlyphArrangement& GlyphArrangement::operator= (const GlyphArrangement& other) -{ - if (this != &other) - { - clear(); - addGlyphArrangement (other); - } - - return *this; -} - -GlyphArrangement::~GlyphArrangement() -{ -} - -//============================================================================== -void GlyphArrangement::clear() -{ - glyphs.clear(); -} - -PositionedGlyph& GlyphArrangement::getGlyph (const int index) const -{ - jassert (isPositiveAndBelow (index, glyphs.size())); - - return *glyphs [index]; -} - -//============================================================================== -void GlyphArrangement::addGlyphArrangement (const GlyphArrangement& other) -{ - glyphs.ensureStorageAllocated (glyphs.size() + other.glyphs.size()); - glyphs.addCopiesOf (other.glyphs); -} - -void GlyphArrangement::addGlyph (const PositionedGlyph& glyph) -{ - glyphs.add (new PositionedGlyph (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 thisX = xOffsets.getUnchecked (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; - } - else - { - const bool isWhitespace = t.isWhitespace(); - - glyphs.add (new 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.getUnchecked (--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++, new 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, - const Justification& horizontalLayout) -{ - int lineStartIndex = glyphs.size(); - addLineOfText (font, text, x, y); - - const float originalY = y; - - while (lineStartIndex < glyphs.size()) - { - int i = lineStartIndex; - - if (glyphs.getUnchecked(i)->getCharacter() != '\n' - && glyphs.getUnchecked(i)->getCharacter() != '\r') - ++i; - - const float lineMaxX = glyphs.getUnchecked (lineStartIndex)->getLeft() + maxLineWidth; - int lastWordBreakIndex = -1; - - while (i < glyphs.size()) - { - const PositionedGlyph* pg = glyphs.getUnchecked (i); - const juce_wchar c = pg->getCharacter(); - - if (c == '\r' || c == '\n') - { - ++i; - - if (c == '\r' && i < glyphs.size() - && glyphs.getUnchecked(i)->getCharacter() == '\n') - ++i; - - break; - } - else if (pg->isWhitespace()) - { - lastWordBreakIndex = i + 1; - } - else if (pg->getRight() - 0.0001f >= lineMaxX) - { - if (lastWordBreakIndex >= 0) - i = lastWordBreakIndex; - - break; - } - - ++i; - } - - const float currentLineStartX = glyphs.getUnchecked (lineStartIndex)->getLeft(); - float currentLineEndX = currentLineStartX; - - for (int j = i; --j >= lineStartIndex;) - { - if (! glyphs.getUnchecked (j)->isWhitespace()) - { - currentLineEndX = glyphs.getUnchecked (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, - const 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")) - { - 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.ensureStorageAllocated (glyphs.size() + ga.glyphs.size()); - - for (int i = 0; i < ga.glyphs.size(); ++i) - glyphs.add (ga.glyphs.getUnchecked (i)); - - ga.glyphs.clear (false); - return; - } - - int startIndex = glyphs.size(); - addLineOfText (f, text.trim(), x, y); - - if (glyphs.size() > startIndex) - { - float lineWidth = glyphs.getUnchecked (glyphs.size() - 1)->getRight() - - glyphs.getUnchecked (startIndex)->getLeft(); - - if (lineWidth <= 0) - return; - - if (lineWidth * minimumHorizontalScale < width) - { - if (lineWidth > width) - stretchRangeOfGlyphs (startIndex, glyphs.size() - startIndex, - width / lineWidth); - - justifyGlyphs (startIndex, glyphs.size() - startIndex, - x, y, width, height, layout); - } - else if (maximumLines <= 1) - { - fitLineIntoSpace (startIndex, glyphs.size() - startIndex, - x, y, width, height, f, layout, minimumHorizontalScale); - } - else - { - Font font (f); - String txt (text.trim()); - const int length = txt.length(); - const int originalStartIndex = startIndex; - int numLines = 1; - - if (length <= 12 && ! txt.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, txt, x, y); - - lineWidth = glyphs.getUnchecked (glyphs.size() - 1)->getRight() - - glyphs.getUnchecked (startIndex)->getLeft(); - } - - if (numLines > lineWidth / width || newFontHeight < 8.0f) - break; - } - - if (numLines < 1) - numLines = 1; - - float lineY = y; - float widthPerLine = lineWidth / numLines; - int lastLineStartIndex = 0; - - for (int line = 0; line < numLines; ++line) - { - int i = startIndex; - lastLineStartIndex = i; - float lineStartX = glyphs.getUnchecked (startIndex)->getLeft(); - - if (line == numLines - 1) - { - widthPerLine = width; - i = glyphs.size(); - } - else - { - while (i < glyphs.size()) - { - lineWidth = (glyphs.getUnchecked (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.getUnchecked (i)->getRight() - lineStartX) * minimumHorizontalScale < width) - { - if (glyphs.getUnchecked (i)->isWhitespace() - || glyphs.getUnchecked (i)->getCharacter() == '-') - { - ++i; - break; - } - } - else - { - // can't find a suitable break, so try looking backwards.. - i = searchStartIndex; - - for (int back = 1; back < jmin (5, i - startIndex - 1); ++back) - { - if (glyphs.getUnchecked (i - back)->isWhitespace() - || glyphs.getUnchecked (i - back)->getCharacter() == '-') - { - i -= back - 1; - break; - } - } - - break; - } - - ++i; - } - - break; - } - - ++i; - } - - int wsStart = i; - while (wsStart > 0 && glyphs.getUnchecked (wsStart - 1)->isWhitespace()) - --wsStart; - - int wsEnd = i; - - while (wsEnd < glyphs.size() && glyphs.getUnchecked (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::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.getUnchecked (startIndex++)->moveBy (dx, dy); - } -} - -int GlyphArrangement::fitLineIntoSpace (int start, int numGlyphs, float x, float y, float w, float h, const Font& font, - const Justification& justification, float minimumHorizontalScale) -{ - int numDeleted = 0; - const float lineStartX = glyphs.getUnchecked (start)->getLeft(); - float lineWidth = glyphs.getUnchecked (start + numGlyphs - 1)->getRight() - lineStartX; - - if (lineWidth > w) - { - if (minimumHorizontalScale < 1.0f) - { - stretchRangeOfGlyphs (start, numGlyphs, jmax (minimumHorizontalScale, w / lineWidth)); - lineWidth = glyphs.getUnchecked (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.getUnchecked (startIndex)->getLeft(); - - while (--num >= 0) - { - PositionedGlyph* const pg = glyphs.getUnchecked (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* const pg = glyphs.getUnchecked (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, - const 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; - - 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(); - - float deltaY = 0.0f; - - 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.getUnchecked (startIndex)->getBaselineY(); - - int i; - for (i = 0; i < num; ++i) - { - const float glyphY = glyphs.getUnchecked (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.getUnchecked (start + num - 1)->getCharacter() != '\r' - && glyphs.getUnchecked (start + num - 1)->getCharacter() != '\n') - { - int numSpaces = 0; - int spacesAtEnd = 0; - - for (int i = 0; i < num; ++i) - { - if (glyphs.getUnchecked (start + i)->isWhitespace()) - { - ++spacesAtEnd; - ++numSpaces; - } - else - { - spacesAtEnd = 0; - } - } - - numSpaces -= spacesAtEnd; - - if (numSpaces > 0) - { - const float startX = glyphs.getUnchecked (start)->getLeft(); - const float endX = glyphs.getUnchecked (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.getUnchecked (start + i)->moveBy (deltaX, 0.0f); - - if (glyphs.getUnchecked (start + i)->isWhitespace()) - deltaX += extraPaddingBetweenWords; - } - } - } -} - -//============================================================================== -void GlyphArrangement::draw (const Graphics& g) const -{ - for (int i = 0; i < glyphs.size(); ++i) - { - const PositionedGlyph* const pg = glyphs.getUnchecked(i); - - if (pg->font.isUnderlined()) - { - const float lineThickness = (pg->font.getDescent()) * 0.3f; - - float nextX = pg->x + pg->w; - - if (i < glyphs.size() - 1 && glyphs.getUnchecked (i + 1)->y == pg->y) - nextX = glyphs.getUnchecked (i + 1)->x; - - g.fillRect (pg->x, pg->y + lineThickness * 2.0f, - nextX - pg->x, lineThickness); - } - - pg->draw (g); - } -} - -void GlyphArrangement::draw (const Graphics& g, const AffineTransform& transform) const -{ - for (int i = 0; i < glyphs.size(); ++i) - { - const PositionedGlyph* const pg = glyphs.getUnchecked(i); - - if (pg->font.isUnderlined()) - { - const float lineThickness = (pg->font.getDescent()) * 0.3f; - - float nextX = pg->x + pg->w; - - if (i < glyphs.size() - 1 && glyphs.getUnchecked (i + 1)->y == pg->y) - nextX = glyphs.getUnchecked (i + 1)->x; - - Path p; - p.addLineSegment (Line (pg->x, pg->y + lineThickness * 2.0f, - nextX, pg->y + lineThickness * 2.0f), - lineThickness); - - g.fillPath (p, transform); - } - - pg->draw (g, transform); - } -} - -void GlyphArrangement::createPath (Path& path) const -{ - for (int i = 0; i < glyphs.size(); ++i) - glyphs.getUnchecked (i)->createPath (path); -} - -int GlyphArrangement::findGlyphIndexAt (float x, float y) const -{ - for (int i = 0; i < glyphs.size(); ++i) - if (glyphs.getUnchecked (i)->hitTest (x, y)) - return i; - - return -1; -} diff --git a/src/juce/JuceLibraryCode/modules/juce_graphics/fonts/juce_GlyphArrangement.h b/src/juce/JuceLibraryCode/modules/juce_graphics/fonts/juce_GlyphArrangement.h deleted file mode 100644 index 23c90d06..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/fonts/juce_GlyphArrangement.h +++ /dev/null @@ -1,315 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_GLYPHARRANGEMENT_JUCEHEADER__ -#define __JUCE_GLYPHARRANGEMENT_JUCEHEADER__ - -#include "juce_Font.h" -#include "../contexts/juce_GraphicsContext.h" - - -//============================================================================== -/** - 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 (const Font& font, juce_wchar character, int glyphNumber, - float anchorX, float baselineY, float width, bool isWhitespace); - - PositionedGlyph (const PositionedGlyph& other); - PositionedGlyph& operator= (const PositionedGlyph& other); - ~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. */ - void draw (const Graphics& g) const; - - /** Draws the glyph into a graphics context, with an extra transform applied to it. */ - void draw (const 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& other); - - /** Copies another arrangement onto this one. - To add another arrangement without clearing this one, use addGlyphArrangement(). - */ - GlyphArrangement& operator= (const GlyphArrangement& other); - - /** 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; - - //============================================================================== - /** 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 co-ordinate 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, - const 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, - const Justification& layout, - int maximumLinesToUse, - float minimumHorizontalScale = 0.7f); - - /** Appends another glyph arrangement to this one. */ - void addGlyphArrangement (const GlyphArrangement& other); - - /** Appends a custom glyph to the arrangement. */ - void addGlyph (const PositionedGlyph& glyph); - - //============================================================================== - /** 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& g) 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& g, const AffineTransform& transform) 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 co-ordinate. - - @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, - const Justification& justification); - - -private: - //============================================================================== - OwnedArray 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&, - const Justification&, float minimumHorizontalScale); - void spreadOutLine (int start, int numGlyphs, float targetWidth); - - JUCE_LEAK_DETECTOR (GlyphArrangement); -}; - - -#endif // __JUCE_GLYPHARRANGEMENT_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_graphics/fonts/juce_TextLayout.cpp b/src/juce/JuceLibraryCode/modules/juce_graphics/fonts/juce_TextLayout.cpp deleted file mode 100644 index 62d6f7bc..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/fonts/juce_TextLayout.cpp +++ /dev/null @@ -1,618 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -TextLayout::Glyph::Glyph (const int glyphCode_, const Point& anchor_, float width_) noexcept - : glyphCode (glyphCode_), anchor (anchor_), width (width_) -{ -} - -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 (const 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 (const Range& stringRange_, const Point& lineOrigin_, - const float ascent_, const float descent_, const float leading_, - const int numRunsToPreallocate) - : stringRange (stringRange_), lineOrigin (lineOrigin_), - ascent (ascent_), descent (descent_), leading (leading_) -{ - 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); - jassert (run != nullptr); - - 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; -} - -//============================================================================== -TextLayout::TextLayout() - : width (0), justification (Justification::topLeft) -{ -} - -TextLayout::TextLayout (const TextLayout& other) - : width (other.width), - 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), - justification (other.justification) -{ -} - -TextLayout& TextLayout::operator= (TextLayout&& other) noexcept -{ - lines = static_cast &&> (other.lines); - width = other.width; - justification = other.justification; - return *this; -} -#endif - -TextLayout& TextLayout::operator= (const TextLayout& other) -{ - width = other.width; - justification = other.justification; - lines.clear(); - lines.addCopiesOf (other.lines); - return *this; -} - -TextLayout::~TextLayout() -{ -} - -float TextLayout::getHeight() const noexcept -{ - const Line* const lastLine = lines.getLast(); - - return lastLine != nullptr ? lastLine->lineOrigin.y + lastLine->descent - : 0; -} - -TextLayout::Line& TextLayout::getLine (const int index) const -{ - return *lines[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 (0, 0, width, getHeight()), area).getPosition()); - - LowLevelGraphicsContext& context = *g.getInternalContext(); - - for (int i = 0; i < getNumLines(); ++i) - { - const Line& line = getLine (i); - const Point lineOrigin (origin + line.lineOrigin); - - for (int j = 0; j < line.runs.size(); ++j) - { - const Run* const run = line.runs.getUnchecked (j); - jassert (run != nullptr); - 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) -{ - lines.clear(); - width = maxWidth; - justification = text.getJustification(); - - if (! createNativeLayout (text)) - createStandardLayout (text); - - recalculateWidth(); -} - -//============================================================================== -namespace TextLayoutHelpers -{ - struct FontAndColour - { - FontAndColour (const Font* font_) noexcept : font (font_), 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& fontAndColour_, const Range& range_) noexcept - : fontAndColour (fontAndColour_), range (range_) - {} - - FontAndColour fontAndColour; - Range range; - }; - - struct Token - { - Token (const String& t, const Font& f, const Colour& c, const bool isWhitespace_) - : text (t), font (f), colour (c), - area (font.getStringWidth (t), roundToInt (f.getHeight())), - isWhitespace (isWhitespace_), - isNewLine (t.containsChar ('\n') || t.containsChar ('\r')) - {} - - const String text; - const Font font; - const Colour colour; - Rectangle area; - int line, 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 ((int) 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* const t = tokens.getUnchecked (i); - const Point tokenPos (t->area.getPosition().toFloat()); - - Array newGlyphs; - Array xOffsets; - t->font.getGlyphPositions (t->text.trimEnd(), newGlyphs, xOffsets); - - if (currentRun == nullptr) currentRun = new TextLayout::Run(); - if (currentLine == nullptr) currentLine = new TextLayout::Line(); - - currentRun->glyphs.ensureStorageAllocated (currentRun->glyphs.size() + newGlyphs.size()); - - for (int j = 0; j < newGlyphs.size(); ++j) - { - if (needToSetLineOrigin) - { - needToSetLineOrigin = false; - currentLine->lineOrigin = tokenPos.translated (0, t->font.getAscent()); - } - - const float x = xOffsets.getUnchecked (j); - currentRun->glyphs.add (TextLayout::Glyph (newGlyphs.getUnchecked(j), - Point (tokenPos.getX() + x, 0), - xOffsets.getUnchecked (j + 1) - x)); - ++charPosition; - } - - 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); - layout.addLine (currentLine.release()); - } - 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); - layout.addLine (currentLine.release()); - - runStartPosition = charPosition; - lineStartPosition = charPosition; - needToSetLineOrigin = true; - } - } - } - - if ((text.getJustification().getFlags() & (Justification::right | Justification::horizontallyCentred)) != 0) - { - const int totalW = (int) layout.getWidth(); - const bool isCentred = (text.getJustification().getFlags() & Justification::horizontallyCentred) != 0; - - for (int i = 0; i < layout.getNumLines(); ++i) - { - float dx = (float) (totalW - getLineWidth (i)); - - if (isCentred) - dx /= 2.0f; - - layout.getLine(i).lineOrigin.x += dx; - } - } - } - - private: - static void addRun (TextLayout::Line* glyphLine, TextLayout::Run* glyphRun, - const Token* const 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, const 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 int maxWidth) - { - int x = 0, y = 0, h = 0; - int i; - - for (i = 0; i < tokens.size(); ++i) - { - Token* const 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 int height) noexcept - { - while (--i >= 0) - { - Token* const tok = tokens.getUnchecked (i); - - if (tok->line == totalLines) - tok->lineHeight = height; - else - break; - } - } - - int getLineWidth (const int lineNumber) const noexcept - { - int maxW = 0; - - for (int i = tokens.size(); --i >= 0;) - { - const Token* const t = tokens.getUnchecked (i); - - if (t->line == lineNumber && ! t->isWhitespace) - maxW = jmax (maxW, t->area.getRight()); - } - - return maxW; - } - - void addTextRuns (const AttributedString& text) - { - Font defaultFont; - Array runAttributes; - - { - const int stringLength = text.getText().length(); - int rangeStart = 0; - FontAndColour lastFontAndColour (nullptr); - - // 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* const attr = text.getAttribute (j); - - // Check if the current character falls within the range of a font attribute - if (attr->getFont() != nullptr && (i >= attr->range.getStart()) && (i < attr->range.getEnd())) - newFontAndColour.font = attr->getFont(); - - // Check if the current character falls within the range of a foreground colour attribute - if (attr->getColour() != nullptr && (i >= attr->range.getStart()) && (i < attr->range.getEnd())) - newFontAndColour.colour = *attr->getColour(); - } - - if (i > 0 && (newFontAndColour != lastFontAndColour || i == stringLength - 1)) - { - runAttributes.add (RunAttribute (lastFontAndColour, - Range (rangeStart, (i < stringLength - 1) ? i : (i + 1)))); - rangeStart = i; - } - - lastFontAndColour = newFontAndColour; - } - } - - for (int i = 0; i < runAttributes.size(); ++i) - { - const RunAttribute& r = runAttributes.getReference(i); - appendText (text, r.range, *(r.fontAndColour.font), r.fontAndColour.colour); - } - } - - OwnedArray tokens; - int totalLines; - - JUCE_DECLARE_NON_COPYABLE (TokenList); - }; -} - -//============================================================================== -void TextLayout::createLayoutWithBalancedLineLengths (const AttributedString& text, float maxWidth) -{ - const float minimumWidth = maxWidth / 2.0f; - float bestWidth = maxWidth; - float bestLineProportion = 0.0f; - - while (maxWidth > minimumWidth) - { - createLayout (text, maxWidth); - - 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); -} - -//============================================================================== -void TextLayout::createStandardLayout (const AttributedString& text) -{ - TextLayoutHelpers::TokenList l; - l.createLayout (text, *this); -} - -void TextLayout::recalculateWidth() -{ - if (lines.size() > 0) - { - Range range (lines.getFirst()->getLineBoundsX()); - - int i; - for (i = lines.size(); --i > 0;) - range = range.getUnionWith (lines.getUnchecked(i)->getLineBoundsX()); - - for (i = lines.size(); --i >= 0;) - lines.getUnchecked(i)->lineOrigin.x -= range.getStart(); - - width = range.getLength(); - } -} diff --git a/src/juce/JuceLibraryCode/modules/juce_graphics/fonts/juce_TextLayout.h b/src/juce/JuceLibraryCode/modules/juce_graphics/fonts/juce_TextLayout.h deleted file mode 100644 index d051af55..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/fonts/juce_TextLayout.h +++ /dev/null @@ -1,181 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_TEXTLAYOUT_JUCEHEADER__ -#define __JUCE_TEXTLAYOUT_JUCEHEADER__ - -#include "juce_Font.h" -#include "../placement/juce_Justification.h" -class Graphics; - -//============================================================================== -/** - 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&& other) 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& text, 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& text, float maxWidth); - - /** 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& g, const Rectangle& area) const; - - //============================================================================== - /** A positioned glyph. */ - class JUCE_API Glyph - { - public: - Glyph (int glyphCode, const 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 (const 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 (const Range& stringRange, const 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; - - 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; - - /** 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* line); - - /** Pre-allocates space for the specified number of lines. */ - void ensureStorageAllocated (int numLinesNeeded); - -private: - OwnedArray lines; - float width; - Justification justification; - - void createStandardLayout (const AttributedString&); - bool createNativeLayout (const AttributedString&); - void recalculateWidth(); - - JUCE_LEAK_DETECTOR (TextLayout); -}; - -#endif // __JUCE_TEXTLAYOUT_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_graphics/fonts/juce_Typeface.cpp b/src/juce/JuceLibraryCode/modules/juce_graphics/fonts/juce_Typeface.cpp deleted file mode 100644 index 1c183080..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/fonts/juce_Typeface.cpp +++ /dev/null @@ -1,50 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -Typeface::Typeface (const String& name_) noexcept - : name (name_) -{ -} - -Typeface::~Typeface() -{ -} - -Typeface::Ptr Typeface::getFallbackTypeface() -{ - const Font fallbackFont (Font::getFallbackFontName(), 10, 0); - return fallbackFont.getTypeface(); -} - -EdgeTable* Typeface::getEdgeTableForGlyph (int glyphNumber, const AffineTransform& transform) -{ - Path path; - - if (getOutlineForGlyph (glyphNumber, path) && ! path.isEmpty()) - return new EdgeTable (path.getBoundsTransformed (transform).getSmallestIntegerContainer().expanded (1, 0), - path, transform); - - return nullptr; -} diff --git a/src/juce/JuceLibraryCode/modules/juce_graphics/fonts/juce_Typeface.h b/src/juce/JuceLibraryCode/modules/juce_graphics/fonts/juce_Typeface.h deleted file mode 100644 index 507c5e15..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/fonts/juce_Typeface.h +++ /dev/null @@ -1,136 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_TYPEFACE_JUCEHEADER__ -#define __JUCE_TYPEFACE_JUCEHEADER__ - -class Path; -class Font; -class EdgeTable; -class AffineTransform; - - -//============================================================================== -/** - 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 SingleThreadedReferenceCountedObject -{ -public: - //============================================================================== - /** A handy typedef for a pointer to a typeface. */ - typedef ReferenceCountedObjectPtr Ptr; - - //============================================================================== - /** Returns the name of the typeface. - @see Font::getTypefaceName - */ - const String& getName() const noexcept { return name; } - - //============================================================================== - /** Creates a new system typeface. */ - static Ptr createSystemTypefaceFor (const Font& font); - - //============================================================================== - /** 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; - - /** 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); - - /** 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); - -protected: - //============================================================================== - String name; - - explicit Typeface (const String& name) noexcept; - - static Ptr getFallbackTypeface(); - -private: - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Typeface); -}; - - -#endif // __JUCE_TYPEFACE_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_graphics/geometry/juce_AffineTransform.cpp b/src/juce/JuceLibraryCode/modules/juce_graphics/geometry/juce_AffineTransform.cpp deleted file mode 100644 index 3acd1e72..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/geometry/juce_AffineTransform.cpp +++ /dev/null @@ -1,247 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce 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 mat00_, const float mat01_, const float mat02_, - const float mat10_, const float mat11_, const float mat12_) noexcept - : mat00 (mat00_), mat01 (mat01_), mat02 (mat02_), - mat10 (mat10_), mat11 (mat11_), mat12 (mat12_) -{ -} - -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::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::scale (const float factorX, const float factorY) noexcept -{ - return AffineTransform (factorX, 0, 0, - 0, factorY, 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, - shearY * mat00 + mat10, - shearY * mat01 + mat11, - shearY * mat02 + mat12); -} - -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 juce_hypot (mat00 + mat01, mat10 + mat11); -} diff --git a/src/juce/JuceLibraryCode/modules/juce_graphics/geometry/juce_AffineTransform.h b/src/juce/JuceLibraryCode/modules/juce_graphics/geometry/juce_AffineTransform.h deleted file mode 100644 index 984c992e..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/geometry/juce_AffineTransform.h +++ /dev/null @@ -1,262 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_AFFINETRANSFORM_JUCEHEADER__ -#define __JUCE_AFFINETRANSFORM_JUCEHEADER__ - - -//============================================================================== -/** - 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 co-ordinate 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 co-ordinates 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 co-ordinates 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 a translation. */ - static AffineTransform translation (float deltaX, - float deltaY) 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 co-ordinates 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 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 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 co-ordinates 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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_graphics/geometry/juce_BorderSize.h b/src/juce/JuceLibraryCode/modules/juce_graphics/geometry/juce_BorderSize.h deleted file mode 100644 index 0fa9e121..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/geometry/juce_BorderSize.h +++ /dev/null @@ -1,158 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_BORDERSIZE_JUCEHEADER__ -#define __JUCE_BORDERSIZE_JUCEHEADER__ - -#include "juce_Rectangle.h" - - -//============================================================================== -/** - 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; - - JUCE_LEAK_DETECTOR (BorderSize); -}; - - -#endif // __JUCE_BORDERSIZE_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_graphics/geometry/juce_EdgeTable.cpp b/src/juce/JuceLibraryCode/modules/juce_graphics/geometry/juce_EdgeTable.cpp deleted file mode 100644 index 48823909..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/geometry/juce_EdgeTable.cpp +++ /dev/null @@ -1,741 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -const int juce_edgeTableDefaultEdgesPerLine = 32; - -//============================================================================== -EdgeTable::EdgeTable (const Rectangle& bounds_, - const Path& path, const AffineTransform& transform) - : bounds (bounds_), - maxEdgesPerLine (juce_edgeTableDefaultEdgesPerLine), - lineStrideElements ((juce_edgeTableDefaultEdgesPerLine << 1) + 1), - needToCheckEmptinesss (true) -{ - table.malloc ((size_t) ((bounds.getHeight() + 1) * lineStrideElements)); - 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 << 1) + 1), - needToCheckEmptinesss (true) -{ - table.malloc ((size_t) jmax (1, bounds.getHeight()) * lineStrideElements); - 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 << 1) + 1), - needToCheckEmptinesss (true) -{ - table.malloc ((size_t) jmax (1, bounds.getHeight()) * lineStrideElements); - - int* t = table; - for (int i = bounds.getHeight(); --i >= 0;) - { - *t = 0; - t += lineStrideElements; - } - - for (RectangleList::Iterator iter (rectanglesToAdd); iter.next();) - { - const Rectangle* const r = iter.getRectangle(); - - 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;) - { - addEdgePoint (x1, y, 255); - addEdgePoint (x2, y, -255); - ++y; - } - } - - 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), - needToCheckEmptinesss (true) -{ - jassert (! rectangleToAdd.isEmpty()); - table.malloc ((size_t) jmax (1, bounds.getHeight()) * lineStrideElements); - 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; - needToCheckEmptinesss = other.needToCheckEmptinesss; - - table.malloc ((size_t) jmax (1, bounds.getHeight()) * lineStrideElements); - copyEdgeTableData (table, lineStrideElements, other.table, lineStrideElements, bounds.getHeight()); - return *this; -} - -EdgeTable::~EdgeTable() -{ -} - -//============================================================================== -void EdgeTable::copyEdgeTableData (int* dest, const int destLineStride, const int* src, const int srcLineStride, int numLines) noexcept -{ - while (--numLines >= 0) - { - memcpy (dest, src, (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 i = bounds.getHeight(); --i >= 0;) - { - int* line = lineStart; - lineStart += lineStrideElements; - - int num = *line; - if (num == 0) - continue; - - int level = 0; - - if (useNonZeroWinding) - { - while (--num > 0) - { - line += 2; - level += *line; - int corrected = abs (level); - if (corrected >> 8) - corrected = 255; - - *line = corrected; - } - } - else - { - while (--num > 0) - { - line += 2; - level += *line; - int corrected = abs (level); - if (corrected >> 8) - { - corrected &= 511; - if (corrected >> 8) - corrected = 511 - corrected; - } - - *line = corrected; - } - } - - line[2] = 0; // force the last level to 0, just in case something went wrong in creating the table - } -} - -void EdgeTable::remapTableForNumEdges (const int newNumEdgesPerLine) -{ - if (newNumEdgesPerLine != maxEdgesPerLine) - { - maxEdgesPerLine = newNumEdgesPerLine; - - jassert (bounds.getHeight() > 0); - const int newLineStrideElements = maxEdgesPerLine * 2 + 1; - - HeapBlock newTable ((size_t) (bounds.getHeight() * newLineStrideElements)); - - 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]; - int n = numPoints << 1; - - if (n > 0) - { - while (n > 0) - { - const int cx = line [n - 1]; - - if (cx <= x) - { - if (cx == x) - { - line [n] += winding; - return; - } - - break; - } - - n -= 2; - } - - if (numPoints >= maxEdgesPerLine) - { - remapTableForNumEdges (maxEdgesPerLine + juce_edgeTableDefaultEdgesPerLine); - jassert (numPoints < maxEdgesPerLine); - line = table + lineStrideElements * y; - } - - memmove (line + (n + 3), line + (n + 1), sizeof (int) * ((numPoints << 1) - n)); - } - - line [n + 1] = x; - line [n + 2] = winding; - line[0]++; -} - -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::intersectWithEdgeTableLine (const int y, const int* otherLine) -{ - jassert (y >= 0 && y < bounds.getHeight()); - - int* dest = table + lineStrideElements * y; - if (dest[0] == 0) - return; - - int otherNumPoints = *otherLine; - if (otherNumPoints == 0) - { - *dest = 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 (otherNumPoints == 2 && otherLine[2] >= 255) - { - clipEdgeTableLineToRange (dest, otherLine[1], jmin (right, otherLine[3])); - return; - } - - ++otherLine; - const size_t lineSizeBytes = (dest[0] * 2 + 1) * sizeof (int); - int* temp = static_cast (alloca (lineSizeBytes)); - memcpy (temp, dest, lineSizeBytes); - - const int* src1 = temp; - int srcNum1 = *src1++; - int x1 = *src1++; - - const int* src2 = otherLine; - int srcNum2 = otherNumPoints; - 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) - { - nextX = x1; - level1 = *src1++; - x1 = *src1++; - --srcNum1; - } - else if (x1 == x2) - { - nextX = x1; - level1 = *src1++; - level2 = *src2++; - x1 = *src1++; - x2 = *src2++; - --srcNum1; - --srcNum2; - } - 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) - { - dest[0] = destTotal; - remapTableForNumEdges (maxEdgesPerLine + juce_edgeTableDefaultEdgesPerLine); - dest = table + lineStrideElements * y; - } - - ++destTotal; - lastLevel = nextLevel; - dest[++destIndex] = nextX; - dest[++destIndex] = nextLevel; - } - } - } - - if (lastLevel > 0) - { - if (destTotal >= maxEdgesPerLine) - { - dest[0] = destTotal; - remapTableForNumEdges (maxEdgesPerLine + juce_edgeTableDefaultEdgesPerLine); - dest = table + lineStrideElements * y; - } - - ++destTotal; - dest[++destIndex] = right; - dest[++destIndex] = 0; - } - - dest[0] = destTotal; - -#if JUCE_DEBUG - int last = std::numeric_limits::min(); - for (int i = 0; i < dest[0]; ++i) - { - jassert (dest[i * 2 + 1] > last); - last = dest[i * 2 + 1]; - } - - jassert (dest [dest[0] * 2] == 0); -#endif -} - -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, dest[0] * (sizeof (int) * 2)); - } - - dest[1] = x1; - } -} - - -//============================================================================== -void EdgeTable::clipToRectangle (const Rectangle& r) -{ - const Rectangle clipped (r.getIntersection (bounds)); - - if (clipped.isEmpty()) - { - needToCheckEmptinesss = 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; - } - } - - needToCheckEmptinesss = 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); - - needToCheckEmptinesss = true; - } -} - -void EdgeTable::clipToEdgeTable (const EdgeTable& other) -{ - const Rectangle clipped (other.bounds.getIntersection (bounds)); - - if (clipped.isEmpty()) - { - needToCheckEmptinesss = 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()); - - int i = 0; - for (i = top; --i >= 0;) - table [lineStrideElements * i] = 0; - - const int* otherLine = other.table + other.lineStrideElements * (clipped.getY() - other.bounds.getY()); - - for (i = top; i < bottom; ++i) - { - intersectWithEdgeTableLine (i, otherLine); - otherLine += other.lineStrideElements; - } - - needToCheckEmptinesss = 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; - - needToCheckEmptinesss = true; - - if (numPixels <= 0) - { - table [lineStrideElements * y] = 0; - return; - } - - int* tempLine = static_cast (alloca ((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 (needToCheckEmptinesss) - { - needToCheckEmptinesss = 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/src/juce/JuceLibraryCode/modules/juce_graphics/geometry/juce_EdgeTable.h b/src/juce/JuceLibraryCode/modules/juce_graphics/geometry/juce_EdgeTable.h deleted file mode 100644 index fd1e625f..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/geometry/juce_EdgeTable.h +++ /dev/null @@ -1,211 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_EDGETABLE_JUCEHEADER__ -#define __JUCE_EDGETABLE_JUCEHEADER__ - -#include "../geometry/juce_AffineTransform.h" -#include "../geometry/juce_Rectangle.h" -#include "../geometry/juce_RectangleList.h" -class Path; -class Image; - - -//============================================================================== -/** - 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. */ - explicit EdgeTable (const Rectangle& rectangleToAdd); - - /** Creates a copy of another edge table. */ - EdgeTable (const EdgeTable& other); - - /** Copies from another edge table. */ - EdgeTable& operator= (const EdgeTable& other); - - /** Destructor. */ - ~EdgeTable(); - - //============================================================================== - void clipToRectangle (const Rectangle& r); - void excludeRectangle (const Rectangle& r); - void clipToEdgeTable (const EdgeTable& other); - 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; - - /** 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 - HeapBlock table; - Rectangle bounds; - int maxEdgesPerLine, lineStrideElements; - bool needToCheckEmptinesss; - - void addEdgePoint (int x, 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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_graphics/geometry/juce_Line.h b/src/juce/JuceLibraryCode/modules/juce_graphics/geometry/juce_Line.h deleted file mode 100644 index 4d86e545..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/geometry/juce_Line.h +++ /dev/null @@ -1,406 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_LINE_JUCEHEADER__ -#define __JUCE_LINE_JUCEHEADER__ - -#include "juce_Point.h" - - -//============================================================================== -/** - 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 co-ordinates 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 co-ordinate of the line's start point. */ - inline ValueType getStartX() const noexcept { return start.x; } - - /** Returns the y co-ordinate of the line's start point. */ - inline ValueType getStartY() const noexcept { return start.y; } - - /** Returns the x co-ordinate of the line's end point. */ - inline ValueType getEndX() const noexcept { return end.x; } - - /** Returns the y co-ordinate of the line's end point. */ - inline ValueType getEndY() const noexcept { return end.y; } - - /** Returns the line's start point. */ - inline const Point& getStart() const noexcept { return start; } - - /** Returns the line's end point. */ - inline const 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 co-ordinates are the same. */ - bool isVertical() const noexcept { return start.x == end.x; } - - /** Returns true if the line's start and end y co-ordinates 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); } - - //============================================================================== - /** 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 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 co-ordinates returned will still - be valid - */ - bool intersects (const Line& line, Point& intersection) const noexcept - { - return findIntersection (start, end, line.start, line.end, intersection); - } - - /** 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; - } - - //============================================================================== - /** 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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_graphics/geometry/juce_Path.cpp b/src/juce/JuceLibraryCode/modules/juce_graphics/geometry/juce_Path.cpp deleted file mode 100644 index 177605a8..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/geometry/juce_Path.cpp +++ /dev/null @@ -1,1570 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -// tests that some co-ords 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().transformed (transform); -} - -//============================================================================== -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); - - data.ensureAllocatedSize ((int) numElements + 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); - - data.ensureAllocatedSize ((int) numElements + 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); - - data.ensureAllocatedSize ((int) numElements + 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); - - data.ensureAllocatedSize ((int) numElements + 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) - { - data.ensureAllocatedSize ((int) numElements + 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); - - data.ensureAllocatedSize ((int) numElements + 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 (const float x, const float y, - const float w, const float h, - float csx, - float csy) -{ - 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; - - startNewSubPath (x + csx, y); - lineTo (x2 - csx, y); - cubicTo (x2 - cs45x, y, x2, y + cs45y, x2, y + csy); - lineTo (x2, y2 - csy); - cubicTo (x2, y2 - cs45y, x2 - cs45x, y2, x2 - csx, y2); - lineTo (x + csx, y2); - cubicTo (x + cs45x, y2, x, y2 - cs45y, x, y2 - csy); - lineTo (x, y + csy); - cubicTo (x, y + cs45y, x + cs45x, y, x + csx, y); - closeSubPath(); -} - -void Path::addRoundedRectangle (const float x, const float y, - const float w, const float h, - float cs) -{ - addRoundedRectangle (x, y, w, h, cs, cs); -} - -void Path::addTriangle (const float x1, const float y1, - const float x2, const float y2, - const float x3, const float y3) -{ - startNewSubPath (x1, y1); - lineTo (x2, y2); - lineTo (x3, y3); - 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 (const float x, const float y, - const float w, const float h) -{ - const float hw = w * 0.5f; - const float hw55 = hw * 0.55f; - const float hh = h * 0.5f; - const float hh55 = hh * 0.55f; - const float cx = x + hw; - const float cy = y + 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 (float x, float y, - float w, float h, - float cs, - float tipX, - float tipY, - int whichSide, - float arrowPos, - float arrowWidth) -{ - if (w > 1.0f && h > 1.0f) - { - cs = jmin (cs, w * 0.5f, h * 0.5f); - const float cs2 = 2.0f * cs; - - startNewSubPath (x + cs, y); - - if (whichSide == 0) - { - const float halfArrowW = jmin (arrowWidth, w - cs2) * 0.5f; - const float arrowX1 = x + cs + jmax (0.0f, (w - cs2 - arrowWidth) * arrowPos - halfArrowW); - lineTo (arrowX1, y); - lineTo (tipX, tipY); - lineTo (arrowX1 + halfArrowW * 2.0f, y); - } - - lineTo (x + w - cs, y); - - if (cs > 0.0f) - addArc (x + w - cs2, y, cs2, cs2, 0, float_Pi * 0.5f); - - if (whichSide == 3) - { - const float halfArrowH = jmin (arrowWidth, h - cs2) * 0.5f; - const float arrowY1 = y + cs + jmax (0.0f, (h - cs2 - arrowWidth) * arrowPos - halfArrowH); - lineTo (x + w, arrowY1); - lineTo (tipX, tipY); - lineTo (x + w, arrowY1 + halfArrowH * 2.0f); - } - - lineTo (x + w, y + h - cs); - - if (cs > 0.0f) - addArc (x + w - cs2, y + h - cs2, cs2, cs2, float_Pi * 0.5f, float_Pi); - - if (whichSide == 2) - { - const float halfArrowW = jmin (arrowWidth, w - cs2) * 0.5f; - const float arrowX1 = x + cs + jmax (0.0f, (w - cs2 - arrowWidth) * arrowPos - halfArrowW); - lineTo (arrowX1 + halfArrowW * 2.0f, y + h); - lineTo (tipX, tipY); - lineTo (arrowX1, y + h); - } - - lineTo (x + cs, y + h); - - if (cs > 0.0f) - addArc (x, y + h - cs2, cs2, cs2, float_Pi, float_Pi * 1.5f); - - if (whichSide == 1) - { - const float halfArrowH = jmin (arrowWidth, h - cs2) * 0.5f; - const float arrowY1 = y + cs + jmax (0.0f, (h - cs2 - arrowWidth) * arrowPos - halfArrowH); - lineTo (x, arrowY1 + halfArrowH * 2.0f); - lineTo (tipX, tipY); - lineTo (x, arrowY1); - } - - lineTo (x, y + cs); - - if (cs > 0.0f) - addArc (x, y, cs2, cs2, float_Pi * 1.5f, float_Pi * 2.0f - PathHelpers::ellipseAngularIncrement); - - 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 float x, const float y, - const float w, const float h, - const bool preserveProportions, - const Justification& justification) const -{ - Rectangle bounds (getBounds()); - - if (preserveProportions) - { - if (w <= 0 || h <= 0 || bounds.isEmpty()) - return AffineTransform::identity; - - float newW, newH; - const float srcRatio = bounds.getHeight() / bounds.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 (bounds.getWidth() * -0.5f - bounds.getX(), - bounds.getHeight() * -0.5f - bounds.getY()) - .scaled (newW / bounds.getWidth(), - newH / bounds.getHeight()) - .translated (newXCentre, newYCentre); - } - else - { - return AffineTransform::translation (-bounds.getX(), -bounds.getY()) - .scaled (w / bounds.getWidth(), - h / bounds.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 (const String& stringVersion) -{ - clear(); - setUsingNonZeroWinding (true); - - String::CharPointerType t (stringVersion.getCharPointer()); - 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/src/juce/JuceLibraryCode/modules/juce_graphics/geometry/juce_Path.h b/src/juce/JuceLibraryCode/modules/juce_graphics/geometry/juce_Path.h deleted file mode 100644 index 1192eb86..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/geometry/juce_Path.h +++ /dev/null @@ -1,766 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_PATH_JUCEHEADER__ -#define __JUCE_PATH_JUCEHEADER__ - -#include "juce_AffineTransform.h" -#include "juce_Line.h" -#include "juce_Rectangle.h" -#include "../placement/juce_Justification.h" -class Image; -class InputStream; -class OutputStream; - - -//============================================================================== -/** - 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& other); - - /** Destructor. */ - ~Path(); - - /** Copies this path from another one. */ - Path& operator= (const Path& other); - - #if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS - Path (Path&& other) noexcept; - Path& operator= (Path&& other) noexcept; - #endif - - bool operator== (const Path& other) const noexcept; - bool operator!= (const Path& other) 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 co-ordinates 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 co-ordinates 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 - */ - 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 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 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 bodyX the left of the main body area of the bubble - @param bodyY the top of the main body area of the bubble - @param bodyW the width of the main body area of the bubble - @param bodyH the height of the main body area of the bubble - @param cornerSize the amount by which to round off the corners of the main body rectangle - @param arrowTipX the x position that the tip of the arrow should connect to - @param arrowTipY the y position that the tip of the arrow should connect to - @param whichSide the side to connect the arrow to: 0 = top, 1 = left, 2 = bottom, 3 = right - @param arrowPositionAlongEdgeProportional how far along the edge of the main rectangle the - arrow's base should be - this is a proportional distance between 0 and 1.0 - @param arrowWidth how wide the base of the arrow should be where it joins the main rectangle - */ - void addBubble (float bodyX, float bodyY, - float bodyW, float bodyH, - float cornerSize, - float arrowTipX, - float arrowTipY, - int whichSide, - float arrowPositionAlongEdgeProportional, - float arrowWidth); - - /** 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& other) noexcept; - - //============================================================================== - /** 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, - const 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 (const String& 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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_graphics/geometry/juce_PathIterator.cpp b/src/juce/JuceLibraryCode/modules/juce_graphics/geometry/juce_PathIterator.cpp deleted file mode 100644 index 849708ef..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/geometry/juce_PathIterator.cpp +++ /dev/null @@ -1,289 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce 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; - float type; - - for (;;) - { - if (stackPos == stackBase) - { - if (index >= path.numElements) - { - return false; - } - else - { - 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; - } - else 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/src/juce/JuceLibraryCode/modules/juce_graphics/geometry/juce_PathIterator.h b/src/juce/JuceLibraryCode/modules/juce_graphics/geometry/juce_PathIterator.h deleted file mode 100644 index 6bb3e86f..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/geometry/juce_PathIterator.h +++ /dev/null @@ -1,116 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_PATHITERATOR_JUCEHEADER__ -#define __JUCE_PATHITERATOR_JUCEHEADER__ - -#include "juce_Path.h" - - -//============================================================================== -/** - 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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_graphics/geometry/juce_PathStrokeType.cpp b/src/juce/JuceLibraryCode/modules/juce_graphics/geometry/juce_PathStrokeType.cpp deleted file mode 100644 index 3004dbb2..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/geometry/juce_PathStrokeType.cpp +++ /dev/null @@ -1,741 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -PathStrokeType::PathStrokeType (const float strokeThickness, - const JointStyle jointStyle_, - const EndCapStyle endStyle_) noexcept - : thickness (strokeThickness), - jointStyle (jointStyle_), - endStyle (endStyle_) -{ -} - -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); - } - - int i; - for (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 (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/src/juce/JuceLibraryCode/modules/juce_graphics/geometry/juce_PathStrokeType.h b/src/juce/JuceLibraryCode/modules/juce_graphics/geometry/juce_PathStrokeType.h deleted file mode 100644 index ca23527c..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/geometry/juce_PathStrokeType.h +++ /dev/null @@ -1,204 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_PATHSTROKETYPE_JUCEHEADER__ -#define __JUCE_PATHSTROKETYPE_JUCEHEADER__ - -#include "juce_Path.h" - - -//============================================================================== -/** - 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. - - @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 = mitered, - EndCapStyle endStyle = butt) noexcept; - - /** Createes a copy of another stroke type. */ - PathStrokeType (const PathStrokeType& other) noexcept; - - /** Copies another stroke onto this one. */ - PathStrokeType& operator= (const PathStrokeType& other) 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& other) const noexcept; - - /** Compares the stroke thickness, joint and end styles of two stroke types. */ - bool operator!= (const PathStrokeType& other) const noexcept; - -private: - //============================================================================== - float thickness; - JointStyle jointStyle; - EndCapStyle endStyle; - - JUCE_LEAK_DETECTOR (PathStrokeType); -}; - -#endif // __JUCE_PATHSTROKETYPE_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_graphics/geometry/juce_Point.h b/src/juce/JuceLibraryCode/modules/juce_graphics/geometry/juce_Point.h deleted file mode 100644 index 1f7b9934..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/geometry/juce_Point.h +++ /dev/null @@ -1,185 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_POINT_JUCEHEADER__ -#define __JUCE_POINT_JUCEHEADER__ - -#include "juce_AffineTransform.h" - - -//============================================================================== -/** - A pair of (x, y) co-ordinates. - - 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 with co-ordinates (0, 0). */ - 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 (const ValueType initialX, const ValueType initialY) noexcept : x (initialX), y (initialY) {} - - /** Destructor. */ - ~Point() noexcept {} - - //============================================================================== - /** Copies this point from another one. */ - Point& operator= (const Point& other) noexcept { x = other.x; y = other.y; return *this; } - - inline bool operator== (const Point& other) const noexcept { return x == other.x && y == other.y; } - inline bool operator!= (const 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 co-ordinate. */ - inline ValueType getX() const noexcept { return x; } - - /** Returns the point's y co-ordinate. */ - inline ValueType getY() const noexcept { return y; } - - /** Sets the point's x co-ordinate. */ - inline void setX (const ValueType newX) noexcept { x = newX; } - - /** Sets the point's y co-ordinate. */ - inline void setY (const ValueType newY) noexcept { y = newY; } - - /** Returns a point which has the same Y position as this one, but a new X. */ - Point withX (const 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 (const ValueType newY) const noexcept { return Point (x, newY); } - - /** Changes the point's x and y co-ordinates. */ - void setXY (const ValueType newX, const ValueType newY) noexcept { x = newX; y = newY; } - - /** Adds a pair of co-ordinates to this value. */ - void addXY (const ValueType xToAdd, const ValueType yToAdd) noexcept { x += xToAdd; y += yToAdd; } - - /** Returns a point with a given offset from this one. */ - Point translated (const ValueType xDelta, const ValueType yDelta) const noexcept { return Point (x + xDelta, y + yDelta); } - - /** Adds two points together. */ - Point operator+ (const Point& other) const noexcept { return Point (x + other.x, y + other.y); } - - /** Adds another point's co-ordinates to this one. */ - Point& operator+= (const Point& other) noexcept { x += other.x; y += other.y; return *this; } - - /** Subtracts one points from another. */ - Point operator- (const Point& other) const noexcept { return Point (x - other.x, y - other.y); } - - /** Subtracts another point's co-ordinates to this one. */ - Point& operator-= (const Point& other) noexcept { x -= other.x; y -= other.y; return *this; } - - /** Returns a point whose coordinates are multiplied by a given value. */ - Point operator* (const ValueType multiplier) const noexcept { return Point (x * multiplier, y * multiplier); } - - /** Multiplies the point's co-ordinates by a value. */ - Point& operator*= (const ValueType multiplier) noexcept { x *= multiplier; y *= multiplier; return *this; } - - /** Returns a point whose coordinates are divided by a given value. */ - Point operator/ (const ValueType divisor) const noexcept { return Point (x / divisor, y / divisor); } - - /** Divides the point's co-ordinates by a value. */ - Point& operator/= (const ValueType divisor) noexcept { x /= divisor; y /= divisor; return *this; } - - /** Returns the inverse of this point. */ - Point operator-() const noexcept { return Point (-x, -y); } - - /** 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 (const Point& other) const noexcept { return juce_hypot (x - other.x, y - other.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 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 (const Point& other) const noexcept - { return static_cast (std::atan2 (other.x - x, y - other.y)); } - - /** 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 (const float radius, const 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 (const float radiusX, const float radiusY, const float angle) const noexcept - { return Point (static_cast (x + radiusX * std::sin (angle)), - static_cast (y - radiusY * std::cos (angle))); } - - /** Uses a transform to change the point's co-ordinates. - 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 (transform.mat00 * x + transform.mat01 * y + transform.mat02, - 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)); } - - /** 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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_graphics/geometry/juce_Rectangle.h b/src/juce/JuceLibraryCode/modules/juce_graphics/geometry/juce_Rectangle.h deleted file mode 100644 index 9972c35b..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/geometry/juce_Rectangle.h +++ /dev/null @@ -1,712 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_RECTANGLE_JUCEHEADER__ -#define __JUCE_RECTANGLE_JUCEHEADER__ - -#include "juce_Point.h" -class RectangleList; - - -//============================================================================== -/** - 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 co-ordinates 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 and height are both zero or less */ - bool isEmpty() const noexcept { return w <= ValueType() || h <= ValueType(); } - - /** Returns the x co-ordinate of the rectangle's left-hand-side. */ - inline ValueType getX() const noexcept { return pos.x; } - - /** Returns the y co-ordinate 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 co-ordinate of the rectangle's right-hand-side. */ - inline ValueType getRight() const noexcept { return pos.x + w; } - - /** Returns the y co-ordinate of the rectangle's bottom edge. */ - inline ValueType getBottom() const noexcept { return pos.y + h; } - - /** Returns the x co-ordinate of the rectangle's centre. */ - ValueType getCentreX() const noexcept { return pos.x + w / (ValueType) 2; } - - /** Returns the y co-ordinate 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 const 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. */ - const 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 co-ordinates. */ - 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; } - - /** 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 which has the same position and height as this one, but with a different width. */ - Rectangle withWidth (const 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 (const ValueType newHeight) const noexcept { return Rectangle (pos.x, pos.y, w, newHeight); } - - /** Returns a rectangle with the same position as this one, but a new size. */ - Rectangle withSize (const ValueType newWidth, const ValueType newHeight) const noexcept { return Rectangle (pos.x, pos.y, 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 (const 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 (const 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 (const 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 (const 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 (const 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 (const 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 (const 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 (const ValueType newBottom) const noexcept { return Rectangle (pos.x, jmin (pos.y, newBottom), w, jmax (ValueType(), newBottom - pos.y)); } - - //============================================================================== - /** Moves the rectangle's position by adding amount to its x and y co-ordinates. */ - 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; - } - - /** 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); - } - - /** 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); - } - - /** 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 co-ordinate 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 co-ordinate 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 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(); - } - - /** 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 rectangle so that it lies only within this one. - This is a non-static version of intersectRectangles(). - Returns false if the two regions 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; - } - - /** 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; - } - else 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; - } - - /** 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 transformed (const AffineTransform& transform) const noexcept - { - float x1 = pos.x, y1 = pos.y; - float x2 = pos.x + w, y2 = pos.y; - float x3 = pos.x, y3 = pos.y + h; - float x4 = x2, y4 = y3; - - transform.transformPoints (x1, y1, x2, y2); - transform.transformPoints (x3, y3, x4, y4); - - const float rx = jmin (x1, x2, x3, x4); - const float ry = jmin (y1, y2, y3, y4); - - return Rectangle (rx, ry, - jmax (x1, x2, x3, x4) - rx, - jmax (y1, y2, y3, y4) - ry); - } - - /** 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 = static_cast (std::floor (static_cast (pos.x))); - const int y1 = static_cast (std::floor (static_cast (pos.y))); - const int x2 = static_cast (std::ceil (static_cast (pos.x + w))); - const int y2 = static_cast (std::ceil (static_cast (pos.y + h))); - - return Rectangle (x1, y1, x2 - x1, y2 - y1); - } - - /** 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); - } - - /** Casts this rectangle to a Rectangle. - Obviously this is mainly useful for rectangles that use integer types. - @see getSmallestIntegerContainer - */ - Rectangle toFloat() const noexcept - { - return Rectangle (static_cast (pos.x), static_cast (pos.y), - static_cast (w), static_cast (h)); - } - - //============================================================================== - /** Static utility to intersect two sets of rectangular co-ordinates. - 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 (const String& stringVersion) - { - StringArray toks; - toks.addTokens (stringVersion.trim(), ",; \t\r\n", String::empty); - - return Rectangle (parseIntAfterSpace (toks[0]), - parseIntAfterSpace (toks[1]), - parseIntAfterSpace (toks[2]), - parseIntAfterSpace (toks[3])); - } - -private: - friend class RectangleList; - Point pos; - ValueType w, h; - - static int parseIntAfterSpace (const String& s) noexcept - { return s.getCharPointer().findEndOfWhitespace().getIntValue32(); } -}; - - -#endif // __JUCE_RECTANGLE_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_graphics/geometry/juce_RectangleList.cpp b/src/juce/JuceLibraryCode/modules/juce_graphics/geometry/juce_RectangleList.cpp deleted file mode 100644 index f5b9dc79..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/geometry/juce_RectangleList.cpp +++ /dev/null @@ -1,515 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -RectangleList::RectangleList() noexcept -{ -} - -RectangleList::RectangleList (const Rectangle& rect) -{ - addWithoutMerging (rect); -} - -RectangleList::RectangleList (const RectangleList& other) - : rects (other.rects) -{ -} - -RectangleList& RectangleList::operator= (const RectangleList& other) -{ - rects = other.rects; - return *this; -} - -#if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS -RectangleList::RectangleList (RectangleList&& other) noexcept - : rects (static_cast >&&> (other.rects)) -{ -} - -RectangleList& RectangleList::operator= (RectangleList&& other) noexcept -{ - rects = static_cast >&&> (other.rects); - return *this; -} -#endif - -RectangleList::~RectangleList() -{ -} - -//============================================================================== -void RectangleList::clear() -{ - rects.clearQuick(); -} - -Rectangle RectangleList::getRectangle (const int index) const noexcept -{ - if (isPositiveAndBelow (index, rects.size())) - return rects.getReference (index); - - return Rectangle(); -} - -bool RectangleList::isEmpty() const noexcept -{ - return rects.size() == 0; -} - -//============================================================================== -RectangleList::Iterator::Iterator (const RectangleList& list) noexcept - : current (nullptr), - owner (list), - index (list.rects.size()) -{ -} - -RectangleList::Iterator::~Iterator() -{ -} - -bool RectangleList::Iterator::next() noexcept -{ - if (--index >= 0) - { - current = &(owner.rects.getReference (index)); - return true; - } - - return false; -} - - -//============================================================================== -void RectangleList::add (const Rectangle& rect) -{ - if (! rect.isEmpty()) - { - if (rects.size() == 0) - { - rects.add (rect); - } - else - { - bool anyOverlaps = false; - - for (int j = rects.size(); --j >= 0;) - { - Rectangle& 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 Rectangle& 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); - } - } - } -} - -void RectangleList::addWithoutMerging (const Rectangle& rect) -{ - if (! rect.isEmpty()) - rects.add (rect); -} - -void RectangleList::add (const int x, const int y, const int w, const int h) -{ - add (Rectangle (x, y, w, h)); -} - -void RectangleList::add (const RectangleList& other) -{ - for (int i = 0; i < other.rects.size(); ++i) - add (other.rects.getReference (i)); -} - -void RectangleList::subtract (const Rectangle& rect) -{ - const int originalNumRects = rects.size(); - - if (originalNumRects > 0) - { - const int x1 = rect.pos.x; - const int y1 = rect.pos.y; - const int x2 = x1 + rect.w; - const int y2 = y1 + rect.h; - - for (int i = getNumRectangles(); --i >= 0;) - { - Rectangle& r = rects.getReference (i); - - const int rx1 = r.pos.x; - const int ry1 = r.pos.y; - const int rx2 = rx1 + r.w; - const int ry2 = ry1 + r.h; - - if (! (x2 <= rx1 || x1 >= rx2 || y2 <= ry1 || y1 >= ry2)) - { - if (x1 > rx1 && x1 < rx2) - { - if (y1 <= ry1 && y2 >= ry2 && x2 >= rx2) - { - r.w = x1 - rx1; - } - else - { - r.pos.x = x1; - r.w = rx2 - x1; - - rects.insert (++i, Rectangle (rx1, ry1, x1 - rx1, ry2 - ry1)); - ++i; - } - } - else if (x2 > rx1 && x2 < rx2) - { - r.pos.x = x2; - r.w = rx2 - x2; - - if (y1 > ry1 || y2 < ry2 || x1 > rx1) - { - rects.insert (++i, Rectangle (rx1, ry1, x2 - rx1, ry2 - ry1)); - ++i; - } - } - else if (y1 > ry1 && y1 < ry2) - { - if (x1 <= rx1 && x2 >= rx2 && y2 >= ry2) - { - r.h = y1 - ry1; - } - else - { - r.pos.y = y1; - r.h = ry2 - y1; - - rects.insert (++i, Rectangle (rx1, ry1, rx2 - rx1, y1 - ry1)); - ++i; - } - } - else if (y2 > ry1 && y2 < ry2) - { - r.pos.y = y2; - r.h = ry2 - y2; - - if (x1 > rx1 || x2 < rx2 || y1 > ry1) - { - rects.insert (++i, Rectangle (rx1, ry1, rx2 - rx1, y2 - ry1)); - ++i; - } - } - else - { - rects.remove (i); - } - } - } - } -} - -bool RectangleList::subtract (const RectangleList& otherList) -{ - for (int i = otherList.rects.size(); --i >= 0 && rects.size() > 0;) - subtract (otherList.rects.getReference (i)); - - return rects.size() > 0; -} - -bool RectangleList::clipTo (const Rectangle& rect) -{ - bool notEmpty = false; - - if (rect.isEmpty()) - { - clear(); - } - else - { - for (int i = rects.size(); --i >= 0;) - { - Rectangle& r = rects.getReference (i); - - if (! rect.intersectRectangle (r.pos.x, r.pos.y, r.w, r.h)) - rects.remove (i); - else - notEmpty = true; - } - } - - return notEmpty; -} - -bool RectangleList::clipTo (const RectangleList& other) -{ - if (rects.size() == 0) - return false; - - RectangleList result; - - for (int j = 0; j < rects.size(); ++j) - { - const Rectangle& rect = rects.getReference (j); - - for (int i = other.rects.size(); --i >= 0;) - { - Rectangle r (other.rects.getReference (i)); - - if (rect.intersectRectangle (r.pos.x, r.pos.y, r.w, r.h)) - result.rects.add (r); - } - } - - swapWith (result); - - return ! isEmpty(); -} - -bool RectangleList::getIntersectionWith (const Rectangle& rect, RectangleList& destRegion) const -{ - destRegion.clear(); - - if (! rect.isEmpty()) - { - for (int i = rects.size(); --i >= 0;) - { - Rectangle r (rects.getReference (i)); - - if (rect.intersectRectangle (r.pos.x, r.pos.y, r.w, r.h)) - destRegion.rects.add (r); - } - } - - return destRegion.rects.size() > 0; -} - -void RectangleList::swapWith (RectangleList& otherList) noexcept -{ - rects.swapWithArray (otherList.rects); -} - - -//============================================================================== -void RectangleList::consolidate() -{ - int i; - for (i = 0; i < getNumRectangles() - 1; ++i) - { - Rectangle& r = rects.getReference (i); - const int rx1 = r.pos.x; - const int ry1 = r.pos.y; - const int rx2 = rx1 + r.w; - const int ry2 = ry1 + r.h; - - for (int j = rects.size(); --j > i;) - { - Rectangle& r2 = rects.getReference (j); - const int jrx1 = r2.pos.x; - const int jry1 = r2.pos.y; - const int jrx2 = jrx1 + r2.w; - const int jry2 = jry1 + r2.h; - - // 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.h = jry1 - ry1; - rects.add (Rectangle (rx1, jry1, rx2 - rx1, ry2 - jry1)); - i = -1; - break; - } - - if (jry2 > ry1 && jry2 < ry2) - { - r.h = jry2 - ry1; - rects.add (Rectangle (rx1, jry2, rx2 - rx1, ry2 - jry2)); - i = -1; - break; - } - else if (ry1 > jry1 && ry1 < jry2) - { - r2.h = ry1 - jry1; - rects.add (Rectangle (jrx1, ry1, jrx2 - jrx1, jry2 - ry1)); - i = -1; - break; - } - else if (ry2 > jry1 && ry2 < jry2) - { - r2.h = ry2 - jry1; - rects.add (Rectangle (jrx1, ry2, jrx2 - jrx1, jry2 - ry2)); - i = -1; - break; - } - } - } - } - - for (i = 0; i < rects.size() - 1; ++i) - { - Rectangle& r = rects.getReference (i); - - for (int j = rects.size(); --j > i;) - { - if (r.enlargeIfAdjacent (rects.getReference (j))) - { - rects.remove (j); - i = -1; - break; - } - } - } -} - -//============================================================================== -bool RectangleList::containsPoint (const int x, const int y) const noexcept -{ - for (int i = getNumRectangles(); --i >= 0;) - if (rects.getReference (i).contains (x, y)) - return true; - - return false; -} - -bool RectangleList::containsRectangle (const Rectangle& 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; -} - -bool RectangleList::intersectsRectangle (const Rectangle& rectangleToCheck) const noexcept -{ - for (int i = rects.size(); --i >= 0;) - if (rects.getReference (i).intersects (rectangleToCheck)) - return true; - - return false; -} - -bool RectangleList::intersects (const RectangleList& other) const noexcept -{ - for (int i = rects.size(); --i >= 0;) - if (other.intersectsRectangle (rects.getReference (i))) - return true; - - return false; -} - -Rectangle RectangleList::getBounds() const noexcept -{ - if (rects.size() <= 1) - { - if (rects.size() == 0) - return Rectangle(); - else - return rects.getReference (0); - } - else - { - const Rectangle& r = rects.getReference (0); - - int minX = r.pos.x; - int minY = r.pos.y; - int maxX = minX + r.w; - int maxY = minY + r.h; - - for (int i = rects.size(); --i > 0;) - { - const Rectangle& r2 = rects.getReference (i); - - minX = jmin (minX, r2.pos.x); - minY = jmin (minY, r2.pos.y); - maxX = jmax (maxX, r2.getRight()); - maxY = jmax (maxY, r2.getBottom()); - } - - return Rectangle (minX, minY, maxX - minX, maxY - minY); - } -} - -void RectangleList::offsetAll (const int dx, const int dy) noexcept -{ - for (int i = rects.size(); --i >= 0;) - { - Rectangle& r = rects.getReference (i); - - r.pos.x += dx; - r.pos.y += dy; - } -} - -//============================================================================== -Path RectangleList::toPath() const -{ - Path p; - - for (int i = 0; i < rects.size(); ++i) - p.addRectangle (rects.getReference (i)); - - return p; -} diff --git a/src/juce/JuceLibraryCode/modules/juce_graphics/geometry/juce_RectangleList.h b/src/juce/JuceLibraryCode/modules/juce_graphics/geometry/juce_RectangleList.h deleted file mode 100644 index c7c4cb8f..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/geometry/juce_RectangleList.h +++ /dev/null @@ -1,256 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_RECTANGLELIST_JUCEHEADER__ -#define __JUCE_RECTANGLELIST_JUCEHEADER__ - -#include "juce_Rectangle.h" -#include "juce_Path.h" - - -//============================================================================== -/** - 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 -*/ -class JUCE_API RectangleList -{ -public: - //============================================================================== - /** Creates an empty RectangleList */ - RectangleList() noexcept; - - /** Creates a copy of another list */ - RectangleList (const RectangleList& other); - - /** Creates a list containing just one rectangle. */ - RectangleList (const Rectangle& rect); - - /** Copies this list from another one. */ - RectangleList& operator= (const RectangleList& other); - - #if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS - RectangleList (RectangleList&& other) noexcept; - RectangleList& operator= (RectangleList&& other) noexcept; - #endif - - /** Destructor. */ - ~RectangleList(); - - //============================================================================== - /** Returns true if the region is empty. */ - bool isEmpty() const noexcept; - - /** 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. - */ - Rectangle getRectangle (int index) const noexcept; - - - //============================================================================== - /** Removes all rectangles to leave an empty region. */ - void clear(); - - /** 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 (int x, int y, int width, int height); - - /** 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 Rectangle& rect); - - /** 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 Rectangle& 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); - - /** 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 Rectangle& rect); - - /** 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); - - /** 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 Rectangle& rect); - - /** 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 - */ - bool clipTo (const RectangleList& other); - - /** 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 Rectangle& rect, RectangleList& destRegion) const; - - /** 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; - - //============================================================================== - /** Checks whether the region contains a given point. - - @returns true if the point lies within one of the rectangles in the list - */ - bool containsPoint (int x, int y) const noexcept; - - /** 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 Rectangle& rectangleToCheck) const; - - /** 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 Rectangle& rectangleToCheck) const noexcept; - - /** Checks whether this region intersects any part of another one. - - @see intersectsRectangle - */ - bool intersects (const RectangleList& other) const noexcept; - - //============================================================================== - /** Returns the smallest rectangle that can enclose the whole of this region. */ - Rectangle getBounds() const noexcept; - - /** 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(); - - /** Adds an x and y value to all the co-ordinates. */ - void offsetAll (int dx, int dy) noexcept; - - //============================================================================== - /** Creates a Path object to represent this region. */ - Path toPath() const; - - - //============================================================================== - /** An iterator for accessing all the rectangles in a RectangleList. */ - class JUCE_API Iterator - { - public: - //============================================================================== - Iterator (const RectangleList& list) noexcept; - ~Iterator(); - - //============================================================================== - /** Advances to the next rectangle, and returns true if it's not finished. - - Call this before using getRectangle() to find the rectangle that was returned. - */ - bool next() noexcept; - - /** Returns the current rectangle. */ - const Rectangle* getRectangle() const noexcept { return current; } - - private: - const Rectangle* current; - const RectangleList& owner; - int index; - - JUCE_DECLARE_NON_COPYABLE (Iterator); - }; - -private: - //============================================================================== - friend class Iterator; - Array > rects; - - JUCE_LEAK_DETECTOR (RectangleList); -}; - - -#endif // __JUCE_RECTANGLELIST_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/README b/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/README deleted file mode 100644 index 86cc2066..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/cderror.h b/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/cderror.h deleted file mode 100644 index c19d38fb..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/changes to libjpeg for JUCE.txt b/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/changes to libjpeg for JUCE.txt deleted file mode 100644 index d4924fe9..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcapimin.c b/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcapimin.c deleted file mode 100644 index 55e2c9b1..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcapistd.c b/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcapistd.c deleted file mode 100644 index fed66caf..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jccoefct.c b/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jccoefct.c deleted file mode 100644 index 554a21e3..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jccolor.c b/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jccolor.c deleted file mode 100644 index fa239c13..00000000 --- a/src/juce/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; - register int r, g, b; - register INT32 * ctab = cconvert->rgb_ycc_tab; - register JSAMPROW inptr; - register JSAMPROW outptr0, outptr1, outptr2; - register 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; - register int r, g, b; - register INT32 * ctab = cconvert->rgb_ycc_tab; - register JSAMPROW inptr; - register JSAMPROW outptr; - register 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; - register int r, g, b; - register INT32 * ctab = cconvert->rgb_ycc_tab; - register JSAMPROW inptr; - register JSAMPROW outptr0, outptr1, outptr2, outptr3; - register 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) -{ - register JSAMPROW inptr; - register JSAMPROW outptr; - register 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) -{ - register JSAMPROW inptr; - register JSAMPROW outptr; - register JDIMENSION col; - register 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/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcdctmgr.c b/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcdctmgr.c deleted file mode 100644 index e3f90dc3..00000000 --- a/src/juce/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 */ - { register DCTELEM *workspaceptr; - register JSAMPROW elemptr; - register 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 - { register 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[] */ - { register DCTELEM temp, qval; - register int i; - register 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 */ - { register FAST_FLOAT *workspaceptr; - register JSAMPROW elemptr; - register 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 - { register 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[] */ - { register FAST_FLOAT temp; - register int i; - register 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/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jchuff.c b/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jchuff.c deleted file mode 100644 index 581ed59c..00000000 --- a/src/juce/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. */ - register INT32 put_buffer = (INT32) code; - register 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) -{ - register int temp, temp2; - register int nbits; - register 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[]) -{ - register int temp; - register int nbits; - register 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/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jchuff.h b/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jchuff.h deleted file mode 100644 index 783b32be..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcinit.c b/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcinit.c deleted file mode 100644 index 19de8d0e..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcmainct.c b/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcmainct.c deleted file mode 100644 index 261b2845..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcmarker.c b/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcmarker.c deleted file mode 100644 index be90314b..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcmaster.c b/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcmaster.c deleted file mode 100644 index a45b03b6..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcomapi.c b/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcomapi.c deleted file mode 100644 index 1b1a340c..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jconfig.h b/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jconfig.h deleted file mode 100644 index 22f61408..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcparam.c b/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcparam.c deleted file mode 100644 index a91bc6a9..00000000 --- a/src/juce/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 */ - scanptr = 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); - scanptr = fill_scans(scanptr, ncomps, 1, 63, 1, 0); - } -} - -#endif /* C_PROGRESSIVE_SUPPORTED */ diff --git a/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcphuff.c b/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcphuff.c deleted file mode 100644 index 692b52b9..00000000 --- a/src/juce/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. */ - register INT32 put_buffer = (INT32) code; - register 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) -{ - register 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; - register int temp, temp2; - register 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; - register int temp, temp2; - register int nbits; - register 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; - register 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; - register int temp; - register 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/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcprepct.c b/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcprepct.c deleted file mode 100644 index fdc4bc2d..00000000 --- a/src/juce/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) -{ - register 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/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcsample.c b/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcsample.c deleted file mode 100644 index 37c658f5..00000000 --- a/src/juce/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) -{ - register JSAMPROW ptr; - register JSAMPLE pixval; - register 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; - register JSAMPROW inptr, outptr; - register 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; - register JSAMPROW inptr0, inptr1, outptr; - register 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; - register 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; - register 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/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jctrans.c b/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jctrans.c deleted file mode 100644 index 7e209f95..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdapimin.c b/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdapimin.c deleted file mode 100644 index bdff21b8..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdapistd.c b/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdapistd.c deleted file mode 100644 index f6c7fffe..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdatasrc.c b/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdatasrc.c deleted file mode 100644 index bd4770e0..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdcoefct.c b/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdcoefct.c deleted file mode 100644 index 4f15e631..00000000 --- a/src/juce/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-register 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/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdcolor.c b/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdcolor.c deleted file mode 100644 index a4ca2568..00000000 --- a/src/juce/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; - register int y, cb, cr; - register JSAMPROW outptr; - register JSAMPROW inptr0, inptr1, inptr2; - register JDIMENSION col; - JDIMENSION num_cols = cinfo->output_width; - /* copy these pointers into registers if possible */ - register JSAMPLE * range_limit = cinfo->sample_range_limit; - register int * Crrtab = cconvert->Cr_r_tab; - register int * Cbbtab = cconvert->Cb_b_tab; - register INT32 * Crgtab = cconvert->Cr_g_tab; - register 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) -{ - register JSAMPROW inptr, outptr; - register JDIMENSION count; - register 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) -{ - register JSAMPROW inptr, outptr; - register 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; - register int y, cb, cr; - register JSAMPROW outptr; - register JSAMPROW inptr0, inptr1, inptr2, inptr3; - register JDIMENSION col; - JDIMENSION num_cols = cinfo->output_width; - /* copy these pointers into registers if possible */ - register JSAMPLE * range_limit = cinfo->sample_range_limit; - register int * Crrtab = cconvert->Cr_r_tab; - register int * Cbbtab = cconvert->Cb_b_tab; - register INT32 * Crgtab = cconvert->Cr_g_tab; - register 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/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdct.h b/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdct.h deleted file mode 100644 index d8df1b4c..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jddctmgr.c b/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jddctmgr.c deleted file mode 100644 index 0e44eb14..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdhuff.c b/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdhuff.c deleted file mode 100644 index 1468a834..00000000 --- a/src/juce/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, - register bit_buf_type get_buffer, register 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) */ - register const JOCTET * next_input_byte = state->next_input_byte; - register 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) { - register 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, - register bit_buf_type get_buffer, register int bits_left, - d_derived_tbl * htbl, int min_bits) -{ - register int l = min_bits; - register 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]; - register 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/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdhuff.h b/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdhuff.h deleted file mode 100644 index 1b139871..00000000 --- a/src/juce/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 register 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 \ - register bit_buf_type get_buffer; \ - register 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, register bit_buf_type get_buffer, - register 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) \ -{ register 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, register bit_buf_type get_buffer, - register int bits_left, d_derived_tbl * htbl, int min_bits)); - -#endif diff --git a/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdinput.c b/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdinput.c deleted file mode 100644 index 621b7146..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdmainct.c b/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdmainct.c deleted file mode 100644 index ee23fa82..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdmarker.c b/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdmarker.c deleted file mode 100644 index 0a57cca4..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdmaster.c b/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdmaster.c deleted file mode 100644 index 8c7ec43d..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdmerge.c b/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdmerge.c deleted file mode 100644 index faee6ce5..00000000 --- a/src/juce/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; - register int y, cred, cgreen, cblue; - int cb, cr; - register JSAMPROW outptr; - JSAMPROW inptr0, inptr1, inptr2; - JDIMENSION col; - /* copy these pointers into registers if possible */ - register 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; - register int y, cred, cgreen, cblue; - int cb, cr; - register JSAMPROW outptr0, outptr1; - JSAMPROW inptr00, inptr01, inptr1, inptr2; - JDIMENSION col; - /* copy these pointers into registers if possible */ - register 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/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdphuff.c b/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdphuff.c deleted file mode 100644 index c7009683..00000000 --- a/src/juce/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; - register 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; - register 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 */ - register 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/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdpostct.c b/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdpostct.c deleted file mode 100644 index 2d93839e..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdsample.c b/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdsample.c deleted file mode 100644 index c0a142a7..00000000 --- a/src/juce/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; - register JSAMPROW inptr, outptr; - register JSAMPLE invalue; - register 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; - register JSAMPROW inptr, outptr; - register 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; - register JSAMPROW inptr, outptr; - register 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; - register JSAMPROW inptr, outptr; - register int invalue; - register 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; - register JSAMPROW inptr0, inptr1, outptr; -#if BITS_IN_JSAMPLE == 8 - register int thiscolsum, lastcolsum, nextcolsum; -#else - register INT32 thiscolsum, lastcolsum, nextcolsum; -#endif - register 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/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdtrans.c b/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdtrans.c deleted file mode 100644 index 12c193c8..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jerror.c b/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jerror.c deleted file mode 100644 index c98aed76..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jerror.h b/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jerror.h deleted file mode 100644 index 79084f2e..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jfdctflt.c b/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jfdctflt.c deleted file mode 100644 index 102f7d5a..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jfdctfst.c b/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jfdctfst.c deleted file mode 100644 index f26221de..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jfdctint.c b/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jfdctint.c deleted file mode 100644 index a9058494..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jidctflt.c b/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jidctflt.c deleted file mode 100644 index 4a89578d..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jidctfst.c b/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jidctfst.c deleted file mode 100644 index 41790ea8..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jidctint.c b/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jidctint.c deleted file mode 100644 index 63ad6d37..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jidctred.c b/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jidctred.c deleted file mode 100644 index 6a923f45..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jinclude.h b/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jinclude.h deleted file mode 100644 index ab660087..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jmemmgr.c b/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jmemmgr.c deleted file mode 100644 index c11609b8..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jmemnobs.c b/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jmemnobs.c deleted file mode 100644 index e74edbcb..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jmemsys.h b/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jmemsys.h deleted file mode 100644 index d834ea4f..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jmorecfg.h b/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jmorecfg.h deleted file mode 100644 index c856e226..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jpegint.h b/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jpegint.h deleted file mode 100644 index 685a3610..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jpeglib.h b/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jpeglib.h deleted file mode 100644 index bf6ce08a..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jquant1.c b/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jquant1.c deleted file mode 100644 index 7153f467..00000000 --- a/src/juce/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; - register int pixcode, ci; - register JSAMPROW ptrin, ptrout; - int row; - JDIMENSION col; - JDIMENSION width = cinfo->output_width; - register 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; - register int pixcode; - register 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; - register JSAMPROW input_ptr; - register 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; - register int pixcode; - register JSAMPROW input_ptr; - register 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; - register 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; - register FSERRPTR errorptr; /* => fserrors[] at column before current */ - register JSAMPROW input_ptr; - register 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/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jquant2.c b/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jquant2.c deleted file mode 100644 index 6c2524e1..00000000 --- a/src/juce/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; - register JSAMPROW ptr; - register histptr histp; - register 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 */ -{ - register boxptr boxp; - register int i; - register 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 */ -{ - register boxptr boxp; - register int i; - register 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; - register 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; - register INT32 * bptr; /* pointer into bestdist[] array */ - JSAMPLE * cptr; /* pointer into bestcolor[] array */ - INT32 dist0, dist1; /* initial distance values */ - register INT32 dist2; /* current distance in inner loop */ - INT32 xx0, xx1; /* distance increments */ - register 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; - register JSAMPLE * cptr; /* pointer into bestcolor[] array */ - register 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; - register JSAMPROW inptr, outptr; - register histptr cachep; - register 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; - register 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 */ - register 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 */ - { register 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. - */ - { register 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/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jutils.c b/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jutils.c deleted file mode 100644 index 286cda20..00000000 --- a/src/juce/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. - */ -{ - register JSAMPROW inptr, outptr; -#ifdef FMEMCOPY - register size_t count = (size_t) (num_cols * SIZEOF(JSAMPLE)); -#else - register JDIMENSION count; -#endif - register 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 - register JCOEFPTR inptr, outptr; - register 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 - register char FAR * ptr = (char FAR *) target; - register size_t count; - - for (count = bytestozero; count > 0; count--) { - *ptr++ = 0; - } -#endif -} diff --git a/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jversion.h b/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jversion.h deleted file mode 100644 index dadd453a..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/transupp.c b/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/transupp.c deleted file mode 100644 index 35e293e3..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/transupp.h b/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/transupp.h deleted file mode 100644 index eb0b0556..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/juce_GIFLoader.cpp b/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/juce_GIFLoader.cpp deleted file mode 100644 index b97f0a4d..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/juce_GIFLoader.cpp +++ /dev/null @@ -1,444 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce 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::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/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/juce_JPEGLoader.cpp b/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/juce_JPEGLoader.cpp deleted file mode 100644 index fdd7094f..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/juce_JPEGLoader.cpp +++ /dev/null @@ -1,421 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce 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 - #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" -#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; - } - - //============================================================================== - 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 -= num; - } - - static boolean jpegFill (j_decompress_ptr) - { - return 0; - } - - //============================================================================== - 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, (int) 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, numToWrite); - } -} - -//============================================================================== -JPEGImageFormat::JPEGImageFormat() - : quality (-1.0f) -{ -} - -JPEGImageFormat::~JPEGImageFormat() {} - -void JPEGImageFormat::setQuality (const float newQuality) -{ - quality = newQuality; -} - -String JPEGImageFormat::getFormatName() { return "JPEG"; } - -bool JPEGImageFormat::canUnderstand (InputStream& in) -{ - const int bytesNeeded = 10; - uint8 header [bytesNeeded]; - - if (in.read (header, bytesNeeded) == bytesNeeded) - { - return header[0] == 0xff - && header[1] == 0xd8 - && header[2] == 0xff - && (header[3] == 0xe0 || header[3] == 0xe1); - } - - return false; -} - -#if (JUCE_MAC || JUCE_IOS) && USE_COREGRAPHICS_RENDERING && JUCE_USE_COREIMAGE_LOADER - Image juce_loadWithCoreImage (InputStream& input); -#endif - -Image JPEGImageFormat::decodeImage (InputStream& in) -{ -#if (JUCE_MAC || JUCE_IOS) && USE_COREGRAPHICS_RENDERING && JUCE_USE_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; - - struct jpeg_compress_struct 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 * 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/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/juce_PNGLoader.cpp b/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/juce_PNGLoader.cpp deleted file mode 100644 index 848cddf3..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/juce_PNGLoader.cpp +++ /dev/null @@ -1,350 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce 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 - - using std::abs; - #define PNG_INTERNAL - #define NO_DUMMY_DECL - #define PNG_SETJMP_NOT_SUPPORTED - - #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" -#else - extern "C" - { - #include - #include - } -#endif -} - -#undef max -#undef min - -#if JUCE_MSVC - #pragma warning (pop) -#endif - -//============================================================================== -namespace PNGHelpers -{ - using namespace pnglibNamespace; - - 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); - } - - static void JUCE_CDECL writeDataCallback (png_structp png, png_bytep data, png_size_t length) - { - static_cast (png_get_io_ptr (png))->write (data, (int) length); - } - - struct PNGErrorStruct {}; - - static void JUCE_CDECL errorCallback (png_structp, png_const_charp) - { - throw PNGErrorStruct(); - } -} - -//============================================================================== -PNGImageFormat::PNGImageFormat() {} -PNGImageFormat::~PNGImageFormat() {} - -String PNGImageFormat::getFormatName() { return "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_MAC || JUCE_IOS) && USE_COREGRAPHICS_RENDERING && JUCE_USE_COREIMAGE_LOADER - Image juce_loadWithCoreImage (InputStream& input); -#endif - -Image PNGImageFormat::decodeImage (InputStream& in) -{ -#if (JUCE_MAC || JUCE_IOS) && USE_COREGRAPHICS_RENDERING && JUCE_USE_COREIMAGE_LOADER - return juce_loadWithCoreImage (in); -#else - using namespace pnglibNamespace; - Image image; - - png_structp pngReadStruct; - png_infop pngInfoStruct; - - pngReadStruct = png_create_read_struct (PNG_LIBPNG_VER_STRING, 0, 0, 0); - - if (pngReadStruct != 0) - { - try - { - pngInfoStruct = png_create_info_struct (pngReadStruct); - - if (pngInfoStruct == 0) - { - png_destroy_read_struct (&pngReadStruct, 0, 0); - return Image::null; - } - - png_set_error_fn (pngReadStruct, 0, PNGHelpers::errorCallback, PNGHelpers::errorCallback ); - - // read the header.. - png_set_read_fn (pngReadStruct, &in, PNGHelpers::readCallback); - - png_uint_32 width, height; - int bitDepth, colorType, 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.. - HeapBlock tempBuffer (height * (width << 2)); - - { - HeapBlock rows (height); - for (int y = (int) height; --y >= 0;) - rows[y] = (png_bytep) (tempBuffer + (width << 2) * 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); - uint8* srcRow = tempBuffer; - uint8* destRow = destData.data; - - for (int y = 0; y < (int) height; ++y) - { - const uint8* src = srcRow; - srcRow += (width << 2); - uint8* dest = destRow; - destRow += destData.lineStride; - - 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 == 0) - return false; - - png_infop pngInfoStruct = png_create_info_struct (pngWriteStruct); - - if (pngInfoStruct == 0) - { - png_destroy_write_struct (&pngWriteStruct, (png_infopp) 0); - 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.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/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/LICENSE b/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/LICENSE deleted file mode 100644 index 462c70df..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/libpng_readme.txt b/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/libpng_readme.txt deleted file mode 100644 index 75a4595a..00000000 --- a/src/juce/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/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/png.c b/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/png.c deleted file mode 100644 index 108de4e9..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/png.c +++ /dev/null @@ -1,798 +0,0 @@ - -/* png.c - location for general purpose libpng functions - * - * Last changed in libpng 1.2.21 [October 4, 2007] - * For conditions of distribution and use, see copyright notice in png.h - * Copyright (c) 1998-2007 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.) - */ - -#define PNG_INTERNAL -#define PNG_NO_EXTERN -#include "png.h" - -/* Generate a compiler error if there is an old png.h in the search path. */ -typedef version_1_2_21 Your_png_h_is_not_version_1_2_21; - -/* Version information for C files. This had better match the version - * string defined in png.h. */ - -#ifdef PNG_USE_GLOBAL_ARRAYS -/* png_libpng_ver was changed to a function in version 1.0.5c */ -PNG_CONST char png_libpng_ver[18] = PNG_LIBPNG_VER_STRING; - -#ifdef PNG_READ_SUPPORTED - -/* png_sig was changed to a function in version 1.0.5c */ -/* Place to hold the signature string for a PNG file. */ -PNG_CONST png_byte FARDATA png_sig[8] = {137, 80, 78, 71, 13, 10, 26, 10}; -#endif /* PNG_READ_SUPPORTED */ - -/* Invoke global declarations for constant strings for known chunk types */ -PNG_IHDR; -PNG_IDAT; -PNG_IEND; -PNG_PLTE; -PNG_bKGD; -PNG_cHRM; -PNG_gAMA; -PNG_hIST; -PNG_iCCP; -PNG_iTXt; -PNG_oFFs; -PNG_pCAL; -PNG_sCAL; -PNG_pHYs; -PNG_sBIT; -PNG_sPLT; -PNG_sRGB; -PNG_tEXt; -PNG_tIME; -PNG_tRNS; -PNG_zTXt; - -#ifdef PNG_READ_SUPPORTED -/* arrays to facilitate easy interlacing - use pass (0 - 6) as index */ - -/* start of interlace block */ -PNG_CONST int FARDATA png_pass_start[] = {0, 4, 0, 2, 0, 1, 0}; - -/* offset to next interlace block */ -PNG_CONST int FARDATA png_pass_inc[] = {8, 8, 4, 4, 2, 2, 1}; - -/* start of interlace block in the y direction */ -PNG_CONST int FARDATA png_pass_ystart[] = {0, 0, 4, 0, 2, 0, 1}; - -/* offset to next interlace block in the y direction */ -PNG_CONST int FARDATA 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 -PNG_CONST int FARDATA png_pass_height[] = {8, 8, 4, 4, 2, 2, 1}; -*/ - -/* Mask to determine which pixels are valid in a pass */ -PNG_CONST int FARDATA png_pass_mask[] = {0x80, 0x08, 0x88, 0x22, 0xaa, 0x55, 0xff}; - -/* Mask to determine which pixels to overwrite while displaying */ -PNG_CONST int FARDATA png_pass_dsp_mask[] - = {0xff, 0x0f, 0xff, 0x33, 0xff, 0x55, 0xff}; - -#endif /* PNG_READ_SUPPORTED */ -#endif /* PNG_USE_GLOBAL_ARRAYS */ - -/* 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_structp png_ptr, int num_bytes) -{ - if(png_ptr == NULL) return; - png_debug(1, "in png_set_sig_bytes\n"); - 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 behaviour as strcmp, memcmp, etc). - */ -int PNGAPI -png_sig_cmp(png_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)(png_memcmp(&sig[start], &png_signature[start], num_to_check))); -} - -#if defined(PNG_1_0_X) || defined(PNG_1_2_X) -/* (Obsolete) function to check signature bytes. It does not allow one - * to check a partial signature. This function might be removed in the - * future - use png_sig_cmp(). Returns true (nonzero) if the file is PNG. - */ -int PNGAPI -png_check_sig(png_bytep sig, int num) -{ - return ((int)!png_sig_cmp(sig, (png_size_t)0, (png_size_t)num)); -} -#endif -#endif /* PNG_READ_SUPPORTED */ - -#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) -/* Function to allocate memory for zlib and clear it to 0. */ -#ifdef PNG_1_0_X -voidpf PNGAPI -#else -voidpf /* private */ -#endif -png_zalloc(voidpf png_ptr, uInt items, uInt size) -{ - png_voidp ptr; - png_structp p=(png_structp)png_ptr; - png_uint_32 save_flags=p->flags; - png_uint_32 num_bytes; - - if(png_ptr == NULL) return (NULL); - if (items > PNG_UINT_32_MAX/size) - { - png_warning (p, "Potential overflow in png_zalloc()"); - return (NULL); - } - num_bytes = (png_uint_32)items * size; - - p->flags|=PNG_FLAG_MALLOC_NULL_MEM_OK; - ptr = (png_voidp)png_malloc((png_structp)png_ptr, num_bytes); - p->flags=save_flags; - -#if defined(PNG_1_0_X) && !defined(PNG_NO_ZALLOC_ZERO) - if (ptr == NULL) - return ((voidpf)ptr); - - if (num_bytes > (png_uint_32)0x8000L) - { - png_memset(ptr, 0, (png_size_t)0x8000L); - png_memset((png_bytep)ptr + (png_size_t)0x8000L, 0, - (png_size_t)(num_bytes - (png_uint_32)0x8000L)); - } - else - { - png_memset(ptr, 0, (png_size_t)num_bytes); - } -#endif - return ((voidpf)ptr); -} - -/* function to free memory for zlib */ -#ifdef PNG_1_0_X -void PNGAPI -#else -void /* private */ -#endif -png_zfree(voidpf png_ptr, voidpf ptr) -{ - png_free((png_structp)png_ptr, (png_voidp)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_structp png_ptr) -{ - png_ptr->crc = 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_structp png_ptr, png_bytep ptr, png_size_t length) -{ - int need_crc = 1; - - if (png_ptr->chunk_name[0] & 0x20) /* ancillary */ - { - 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; - } - - if (need_crc) - png_ptr->crc = crc32(png_ptr->crc, ptr, (uInt)length); -} - -/* Allocate the memory for an info_struct for the application. We don't - * really need the png_ptr, but it could potentially be useful in the - * future. This should be used in favour of malloc(png_sizeof(png_info)) - * and png_info_init() so that applications that want to use a shared - * libpng don't have to be recompiled if png_info changes size. - */ -png_infop PNGAPI -png_create_info_struct(png_structp png_ptr) -{ - png_infop info_ptr; - - png_debug(1, "in png_create_info_struct\n"); - if(png_ptr == NULL) return (NULL); -#ifdef PNG_USER_MEM_SUPPORTED - info_ptr = (png_infop)png_create_struct_2(PNG_STRUCT_INFO, - png_ptr->malloc_fn, png_ptr->mem_ptr); -#else - info_ptr = (png_infop)png_create_struct(PNG_STRUCT_INFO); -#endif - if (info_ptr != NULL) - png_info_init_3(&info_ptr, png_sizeof(png_info)); - - 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. - */ -void PNGAPI -png_destroy_info_struct(png_structp png_ptr, png_infopp info_ptr_ptr) -{ - png_infop info_ptr = NULL; - if(png_ptr == NULL) return; - - png_debug(1, "in png_destroy_info_struct\n"); - if (info_ptr_ptr != NULL) - info_ptr = *info_ptr_ptr; - - if (info_ptr != NULL) - { - png_info_destroy(png_ptr, info_ptr); - -#ifdef PNG_USER_MEM_SUPPORTED - png_destroy_struct_2((png_voidp)info_ptr, png_ptr->free_fn, - png_ptr->mem_ptr); -#else - png_destroy_struct((png_voidp)info_ptr); -#endif - *info_ptr_ptr = NULL; - } -} - -/* 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. - */ -#if defined(PNG_1_0_X) || defined(PNG_1_2_X) -#undef png_info_init -void PNGAPI -png_info_init(png_infop info_ptr) -{ - /* We only come here via pre-1.0.12-compiled applications */ - png_info_init_3(&info_ptr, 0); -} -#endif - -void PNGAPI -png_info_init_3(png_infopp ptr_ptr, png_size_t png_info_struct_size) -{ - png_infop info_ptr = *ptr_ptr; - - if(info_ptr == NULL) return; - - png_debug(1, "in png_info_init_3\n"); - - if(png_sizeof(png_info) > png_info_struct_size) - { - png_destroy_struct(info_ptr); - info_ptr = (png_infop)png_create_struct(PNG_STRUCT_INFO); - *ptr_ptr = info_ptr; - } - - /* set everything to 0 */ - png_memset(info_ptr, 0, png_sizeof (png_info)); -} - -#ifdef PNG_FREE_ME_SUPPORTED -void PNGAPI -png_data_freer(png_structp png_ptr, png_infop info_ptr, - int freer, png_uint_32 mask) -{ - png_debug(1, "in png_data_freer\n"); - 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_warning(png_ptr, - "Unknown freer parameter in png_data_freer."); -} -#endif - -void PNGAPI -png_free_data(png_structp png_ptr, png_infop info_ptr, png_uint_32 mask, - int num) -{ - png_debug(1, "in png_free_data\n"); - if (png_ptr == NULL || info_ptr == NULL) - return; - -#if defined(PNG_TEXT_SUPPORTED) -/* free text item num or (if num == -1) all text items */ -#ifdef PNG_FREE_ME_SUPPORTED -if ((mask & PNG_FREE_TEXT) & info_ptr->free_me) -#else -if (mask & PNG_FREE_TEXT) -#endif -{ - 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 - -#if defined(PNG_tRNS_SUPPORTED) -/* free any tRNS entry */ -#ifdef PNG_FREE_ME_SUPPORTED -if ((mask & PNG_FREE_TRNS) & info_ptr->free_me) -#else -if ((mask & PNG_FREE_TRNS) && (png_ptr->flags & PNG_FLAG_FREE_TRNS)) -#endif -{ - png_free(png_ptr, info_ptr->trans); - info_ptr->valid &= ~PNG_INFO_tRNS; -#ifndef PNG_FREE_ME_SUPPORTED - png_ptr->flags &= ~PNG_FLAG_FREE_TRNS; -#endif - info_ptr->trans = NULL; -} -#endif - -#if defined(PNG_sCAL_SUPPORTED) -/* free any sCAL entry */ -#ifdef PNG_FREE_ME_SUPPORTED -if ((mask & PNG_FREE_SCAL) & info_ptr->free_me) -#else -if (mask & PNG_FREE_SCAL) -#endif -{ -#if defined(PNG_FIXED_POINT_SUPPORTED) && !defined(PNG_FLOATING_POINT_SUPPORTED) - 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; -#endif - info_ptr->valid &= ~PNG_INFO_sCAL; -} -#endif - -#if defined(PNG_pCAL_SUPPORTED) -/* free any pCAL entry */ -#ifdef PNG_FREE_ME_SUPPORTED -if ((mask & PNG_FREE_PCAL) & info_ptr->free_me) -#else -if (mask & PNG_FREE_PCAL) -#endif -{ - 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) - { - int i; - for (i = 0; i < (int)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 - -#if defined(PNG_iCCP_SUPPORTED) -/* free any iCCP entry */ -#ifdef PNG_FREE_ME_SUPPORTED -if ((mask & PNG_FREE_ICCP) & info_ptr->free_me) -#else -if (mask & PNG_FREE_ICCP) -#endif -{ - 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 - -#if defined(PNG_sPLT_SUPPORTED) -/* free a given sPLT entry, or (if num == -1) all sPLT entries */ -#ifdef PNG_FREE_ME_SUPPORTED -if ((mask & PNG_FREE_SPLT) & info_ptr->free_me) -#else -if (mask & PNG_FREE_SPLT) -#endif -{ - 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 < (int)info_ptr->splt_palettes_num; i++) - png_free_data(png_ptr, info_ptr, PNG_FREE_SPLT, 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 - -#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) - if(png_ptr->unknown_chunk.data) - { - png_free(png_ptr, png_ptr->unknown_chunk.data); - png_ptr->unknown_chunk.data = NULL; - } -#ifdef PNG_FREE_ME_SUPPORTED -if ((mask & PNG_FREE_UNKN) & info_ptr->free_me) -#else -if (mask & PNG_FREE_UNKN) -#endif -{ - 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 < (int)info_ptr->unknown_chunks_num; i++) - png_free_data(png_ptr, info_ptr, PNG_FREE_UNKN, i); - - png_free(png_ptr, info_ptr->unknown_chunks); - info_ptr->unknown_chunks = NULL; - info_ptr->unknown_chunks_num = 0; - } - } -} -#endif - -#if defined(PNG_hIST_SUPPORTED) -/* free any hIST entry */ -#ifdef PNG_FREE_ME_SUPPORTED -if ((mask & PNG_FREE_HIST) & info_ptr->free_me) -#else -if ((mask & PNG_FREE_HIST) && (png_ptr->flags & PNG_FLAG_FREE_HIST)) -#endif -{ - png_free(png_ptr, info_ptr->hist); - info_ptr->hist = NULL; - info_ptr->valid &= ~PNG_INFO_hIST; -#ifndef PNG_FREE_ME_SUPPORTED - png_ptr->flags &= ~PNG_FLAG_FREE_HIST; -#endif -} -#endif - -/* free any PLTE entry that was internally allocated */ -#ifdef PNG_FREE_ME_SUPPORTED -if ((mask & PNG_FREE_PLTE) & info_ptr->free_me) -#else -if ((mask & PNG_FREE_PLTE) && (png_ptr->flags & PNG_FLAG_FREE_PLTE)) -#endif -{ - png_zfree(png_ptr, info_ptr->palette); - info_ptr->palette = NULL; - info_ptr->valid &= ~PNG_INFO_PLTE; -#ifndef PNG_FREE_ME_SUPPORTED - png_ptr->flags &= ~PNG_FLAG_FREE_PLTE; -#endif - info_ptr->num_palette = 0; -} - -#if defined(PNG_INFO_IMAGE_SUPPORTED) -/* free any image bits attached to the info structure */ -#ifdef PNG_FREE_ME_SUPPORTED -if ((mask & PNG_FREE_ROWS) & info_ptr->free_me) -#else -if (mask & PNG_FREE_ROWS) -#endif -{ - if(info_ptr->row_pointers) - { - int row; - for (row = 0; row < (int)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 - -#ifdef PNG_FREE_ME_SUPPORTED - if(num == -1) - info_ptr->free_me &= ~mask; - else - info_ptr->free_me &= ~(mask & ~PNG_FREE_MUL); -#endif -} - -/* This is an internal routine to free any memory that the info struct is - * pointing to before re-using it or freeing the struct itself. Recall - * that png_free() checks for NULL pointers for us. - */ -void /* PRIVATE */ -png_info_destroy(png_structp png_ptr, png_infop info_ptr) -{ - png_debug(1, "in png_info_destroy\n"); - - png_free_data(png_ptr, info_ptr, PNG_FREE_ALL, -1); - -#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) - if (png_ptr->num_chunk_list) - { - png_free(png_ptr, png_ptr->chunk_list); - png_ptr->chunk_list=NULL; - png_ptr->num_chunk_list=0; - } -#endif - - png_info_init_3(&info_ptr, png_sizeof(png_info)); -} -#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_structp png_ptr) -{ - if(png_ptr == NULL) return (NULL); - return (png_ptr->io_ptr); -} - -#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) -#if !defined(PNG_NO_STDIO) -/* 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, you must use a function of your own because "FILE *" isn't - * necessarily available. - */ -void PNGAPI -png_init_io(png_structp png_ptr, png_FILE_p fp) -{ - png_debug(1, "in png_init_io\n"); - if(png_ptr == NULL) return; - png_ptr->io_ptr = (png_voidp)fp; -} -#endif - -#if defined(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. - */ -png_charp PNGAPI -png_convert_to_rfc1123(png_structp png_ptr, png_timep ptime) -{ - static PNG_CONST char short_months[12][4] = - {"Jan", "Feb", "Mar", "Apr", "May", "Jun", - "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; - - if(png_ptr == NULL) return (NULL); - if (png_ptr->time_buffer == NULL) - { - png_ptr->time_buffer = (png_charp)png_malloc(png_ptr, (png_uint_32)(29* - png_sizeof(char))); - } - -#if defined(_WIN32_WCE) - { - wchar_t time_buf[29]; - wsprintf(time_buf, TEXT("%d %S %d %02d:%02d:%02d +0000"), - ptime->day % 32, short_months[(ptime->month - 1) % 12], - ptime->year, ptime->hour % 24, ptime->minute % 60, - ptime->second % 61); - WideCharToMultiByte(CP_ACP, 0, time_buf, -1, png_ptr->time_buffer, 29, - NULL, NULL); - } -#else -#ifdef USE_FAR_KEYWORD - { - char near_time_buf[29]; - png_snprintf6(near_time_buf,29,"%d %s %d %02d:%02d:%02d +0000", - ptime->day % 32, short_months[(ptime->month - 1) % 12], - ptime->year, ptime->hour % 24, ptime->minute % 60, - ptime->second % 61); - png_memcpy(png_ptr->time_buffer, near_time_buf, - 29*png_sizeof(char)); - } -#else - png_snprintf6(png_ptr->time_buffer,29,"%d %s %d %02d:%02d:%02d +0000", - ptime->day % 32, short_months[(ptime->month - 1) % 12], - ptime->year, ptime->hour % 24, ptime->minute % 60, - ptime->second % 61); -#endif -#endif /* _WIN32_WCE */ - return ((png_charp)png_ptr->time_buffer); -} -#endif /* PNG_TIME_RFC1123_SUPPORTED */ - -#endif /* defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) */ - -png_charp PNGAPI -png_get_copyright(png_structp png_ptr) -{ - png_ptr = png_ptr; /* silence compiler warning about unused png_ptr */ - return ((png_charp) "\n libpng version 1.2.21 - October 4, 2007\n\ - Copyright (c) 1998-2007 Glenn Randers-Pehrson\n\ - Copyright (c) 1996-1997 Andreas Dilger\n\ - Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.\n"); -} - -/* 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_charp PNGAPI -png_get_libpng_ver(png_structp png_ptr) -{ - /* Version of *.c files used when building libpng */ - png_ptr = png_ptr; /* silence compiler warning about unused png_ptr */ - return ((png_charp) PNG_LIBPNG_VER_STRING); -} - -png_charp PNGAPI -png_get_header_ver(png_structp png_ptr) -{ - /* Version of *.h files used when building libpng */ - png_ptr = png_ptr; /* silence compiler warning about unused png_ptr */ - return ((png_charp) PNG_LIBPNG_VER_STRING); -} - -png_charp PNGAPI -png_get_header_version(png_structp png_ptr) -{ - /* Returns longer string containing both version and date */ - png_ptr = png_ptr; /* silence compiler warning about unused png_ptr */ - return ((png_charp) PNG_HEADER_VERSION_STRING -#ifndef PNG_READ_SUPPORTED - " (NO READ SUPPORT)" -#endif - "\n"); -} - -#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) -#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED -int PNGAPI -png_handle_as_unknown(png_structp png_ptr, png_bytep chunk_name) -{ - /* check chunk_name and return "keep" value if it's on the list, else 0 */ - int i; - png_bytep p; - if(png_ptr == NULL || chunk_name == NULL || png_ptr->num_chunk_list<=0) - return 0; - p=png_ptr->chunk_list+png_ptr->num_chunk_list*5-5; - for (i = png_ptr->num_chunk_list; i; i--, p-=5) - if (!png_memcmp(chunk_name, p, 4)) - return ((int)*(p+4)); - return 0; -} -#endif - -/* This function, added to libpng-1.0.6g, is untested. */ -int PNGAPI -png_reset_zstream(png_structp png_ptr) -{ - if (png_ptr == NULL) return Z_STREAM_ERROR; - return (inflateReset(&png_ptr->zstream)); -} -#endif /* defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_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_ASSEMBLER_CODE_SUPPORTED) -#if !defined(PNG_1_0_X) -/* this function was added to libpng 1.2.0 */ -int PNGAPI -png_mmx_support(void) -{ - /* obsolete, to be removed from libpng-1.4.0 */ - return -1; -} -#endif /* PNG_1_0_X */ -#endif /* PNG_READ_SUPPORTED && PNG_ASSEMBLER_CODE_SUPPORTED */ - -#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) -#ifdef PNG_SIZE_T -/* Added at libpng version 1.2.6 */ - PNG_EXTERN png_size_t PNGAPI png_convert_size PNGARG((size_t size)); -png_size_t PNGAPI -png_convert_size(size_t size) -{ - if (size > (png_size_t)-1) - PNG_ABORT(); /* We haven't got access to png_ptr, so no png_error() */ - return ((png_size_t)size); -} -#endif /* PNG_SIZE_T */ -#endif /* defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) */ diff --git a/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/png.h b/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/png.h deleted file mode 100644 index a20bbd4b..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/png.h +++ /dev/null @@ -1,3539 +0,0 @@ - -/* png.h - header file for PNG reference library - * - * libpng version 1.2.21 - October 4, 2007 - * Copyright (c) 1998-2007 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.) - * - * 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.2.21 - October 4, 2007: 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 10.so.0.1.0.17rc1 - * 1.2.7rc1 13 10207 12.so.0.1.2.7rc1 - * 1.0.17 10 10017 10.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 10.so.0.1.0.18rc1-5 - * 1.2.8rc1-5 13 10208 12.so.0.1.2.8rc1-5 - * 1.0.18 10 10018 10.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-8 13 10210 12.so.0.10[.0] - * 1.2.10rc1-3 13 10210 12.so.0.10[.0] - * 1.2.10 13 10210 12.so.0.10[.0] - * 1.2.11beta1-4 13 10211 12.so.0.11[.0] - * 1.0.19rc1-5 10 10019 10.so.0.19[.0] - * 1.2.11rc1-5 13 10211 12.so.0.11[.0] - * 1.0.19 10 10019 10.so.0.19[.0] - * 1.2.11 13 10211 12.so.0.11[.0] - * 1.0.20 10 10020 10.so.0.20[.0] - * 1.2.12 13 10212 12.so.0.12[.0] - * 1.2.13beta1 13 10213 12.so.0.13[.0] - * 1.0.21 10 10021 10.so.0.21[.0] - * 1.2.13 13 10213 12.so.0.13[.0] - * 1.2.14beta1-2 13 10214 12.so.0.14[.0] - * 1.0.22rc1 10 10022 10.so.0.22[.0] - * 1.2.14rc1 13 10214 12.so.0.14[.0] - * 1.0.22 10 10022 10.so.0.22[.0] - * 1.2.14 13 10214 12.so.0.14[.0] - * 1.2.15beta1-6 13 10215 12.so.0.15[.0] - * 1.0.23rc1-5 10 10023 10.so.0.23[.0] - * 1.2.15rc1-5 13 10215 12.so.0.15[.0] - * 1.0.23 10 10023 10.so.0.23[.0] - * 1.2.15 13 10215 12.so.0.15[.0] - * 1.2.16beta1-2 13 10216 12.so.0.16[.0] - * 1.2.16rc1 13 10216 12.so.0.16[.0] - * 1.0.24 10 10024 10.so.0.24[.0] - * 1.2.16 13 10216 12.so.0.16[.0] - * 1.2.17beta1-2 13 10217 12.so.0.17[.0] - * 1.0.25rc1 10 10025 10.so.0.25[.0] - * 1.2.17rc1-3 13 10217 12.so.0.17[.0] - * 1.0.25 10 10025 10.so.0.25[.0] - * 1.2.17 13 10217 12.so.0.17[.0] - * 1.0.26 10 10026 10.so.0.26[.0] - * 1.2.18 13 10218 12.so.0.18[.0] - * 1.2.19beta1-31 13 10219 12.so.0.19[.0] - * 1.0.27rc1-6 10 10027 10.so.0.27[.0] - * 1.2.19rc1-6 13 10219 12.so.0.19[.0] - * 1.0.27 10 10027 10.so.0.27[.0] - * 1.2.19 13 10219 12.so.0.19[.0] - * 1.2.20beta01-04 13 10220 12.so.0.20[.0] - * 1.0.28rc1-6 10 10028 10.so.0.28[.0] - * 1.2.20rc1-6 13 10220 12.so.0.20[.0] - * 1.0.28 10 10028 10.so.0.28[.0] - * 1.2.20 13 10220 12.so.0.20[.0] - * 1.2.21beta1-2 13 10221 12.so.0.21[.0] - * 1.2.21rc1-3 13 10221 12.so.0.21[.0] - * 1.0.29 10 10029 10.so.0.29[.0] - * 1.2.21 13 10221 12.so.0.21[.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 "rcN". - * - * 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.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 0x8000L /* 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_uint_32 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 FAR * png_row_infop; -typedef png_row_info FAR * FAR * 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. - */ -typedef struct png_struct_def png_struct; -typedef png_struct FAR * png_structp; - -typedef void (PNGAPI *png_error_ptr) PNGARG((png_structp, png_const_charp)); -typedef void (PNGAPI *png_rw_ptr) PNGARG((png_structp, png_bytep, png_size_t)); -typedef void (PNGAPI *png_flush_ptr) PNGARG((png_structp)); -typedef void (PNGAPI *png_read_status_ptr) PNGARG((png_structp, png_uint_32, - int)); -typedef void (PNGAPI *png_write_status_ptr) PNGARG((png_structp, png_uint_32, - int)); - -#ifdef PNG_PROGRESSIVE_READ_SUPPORTED -typedef void (PNGAPI *png_progressive_info_ptr) PNGARG((png_structp, png_infop)); -typedef void (PNGAPI *png_progressive_end_ptr) PNGARG((png_structp, png_infop)); -typedef void (PNGAPI *png_progressive_row_ptr) PNGARG((png_structp, png_bytep, - png_uint_32, int)); -#endif - -#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ - defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) || \ - defined(PNG_LEGACY_SUPPORTED) -typedef void (PNGAPI *png_user_transform_ptr) PNGARG((png_structp, - png_row_infop, png_bytep)); -#endif - -#if defined(PNG_USER_CHUNKS_SUPPORTED) -typedef int (PNGAPI *png_user_chunk_ptr) PNGARG((png_structp, png_unknown_chunkp)); -#endif -#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) -typedef void (PNGAPI *png_unknown_chunk_ptr) PNGARG((png_structp)); -#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 */ - -/* 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 - -typedef png_voidp (*png_malloc_ptr) PNGARG((png_structp, png_size_t)); -typedef void (*png_free_ptr) PNGARG((png_structp, png_voidp)); - -/* 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, except to store - * the jmp_buf. - */ - -struct png_struct_def -{ -#ifdef PNG_SETJMP_SUPPORTED - jmp_buf jmpbuf; /* used in png_error */ -#endif - png_error_ptr error_fn; /* function for printing errors and aborting */ - png_error_ptr warning_fn; /* function for printing warnings */ - 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 */ - -#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) - png_user_transform_ptr read_user_transform_fn; /* user read transform */ -#endif - -#if defined(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 */ -#if defined(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 */ - - z_stream zstream; /* pointer to decompression structure (below) */ - png_bytep zbuf; /* buffer for zlib */ - png_size_t zbuf_size; /* size of zbuf */ - 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 */ - - 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_uint_32 rowbytes; /* size of row in bytes */ - png_uint_32 irowbytes; /* size of current interlaced 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_bytep prev_row; /* buffer to save previous (unfiltered) row */ - png_bytep row_buf; /* buffer to save current (unfiltered) row */ - 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 */ - png_row_info row_info; /* used for transformation routines */ - - 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 */ - png_uint_16 num_trans; /* number of transparency values */ - png_byte chunk_name[5]; /* null-terminated name of current chunk */ - 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 */ - png_byte pixel_depth; /* number of bits per pixel */ - png_byte channels; /* number of channels in file */ - png_byte usr_channels; /* channels at start of write */ - png_byte sig_bytes; /* magic bytes read/written from start of file */ - -#if defined(PNG_READ_FILLER_SUPPORTED) || defined(PNG_WRITE_FILLER_SUPPORTED) -#ifdef PNG_LEGACY_SUPPORTED - png_byte filler; /* filler byte for pixel expansion */ -#else - png_uint_16 filler; /* filler bytes for pixel expansion */ -#endif -#endif - -#if defined(PNG_bKGD_SUPPORTED) - png_byte background_gamma_type; -# ifdef PNG_FLOATING_POINT_SUPPORTED - float background_gamma; -# endif - png_color_16 background; /* background color in screen gamma space */ -#if defined(PNG_READ_GAMMA_SUPPORTED) - png_color_16 background_1; /* background normalized to gamma 1.0 */ -#endif -#endif /* PNG_bKGD_SUPPORTED */ - -#if defined(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 - -#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) - int gamma_shift; /* number of "insignificant" bits 16-bit gamma */ -#ifdef PNG_FLOATING_POINT_SUPPORTED - float gamma; /* file gamma value */ - float screen_gamma; /* screen gamma value (display_exponent) */ -#endif -#endif - -#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) - png_bytep gamma_table; /* gamma table for 8-bit depth files */ - 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_table; /* gamma table for 16-bit depth files */ - 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 - -#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; /* transparency values for paletted files */ - png_color_16 trans_values; /* transparency values 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 each 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 */ - -# if defined(PNG_TEXT_SUPPORTED) - png_size_t current_text_size; /* current size of text input data */ - png_size_t current_text_left; /* how much text left to read in input */ - png_charp current_text; /* current text chunk buffer */ - png_charp current_text_ptr; /* current location in current_text */ -# endif /* PNG_TEXT_SUPPORTED */ -#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 - -#if defined(PNG_READ_DITHER_SUPPORTED) - png_bytep palette_lookup; /* lookup table for dithering */ - png_bytep dither_index; /* index translation for palette files */ -#endif - -#if defined(PNG_READ_DITHER_SUPPORTED) || defined(PNG_hIST_SUPPORTED) - png_uint_16p hist; /* histogram */ -#endif - -#if defined(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 - -#if defined(PNG_TIME_RFC1123_SUPPORTED) - png_charp time_buffer; /* String to hold RFC 1123 time text */ -#endif - -/* New members added in libpng-1.0.6 */ - -#ifdef PNG_FREE_ME_SUPPORTED - png_uint_32 free_me; /* flags items libpng is responsible for freeing */ -#endif - -#if defined(PNG_USER_CHUNKS_SUPPORTED) - png_voidp user_chunk_ptr; - png_user_chunk_ptr read_user_chunk_fn; /* user read chunk handler */ -#endif - -#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) - int num_chunk_list; - png_bytep chunk_list; -#endif - -/* New members added in libpng-1.0.3 */ -#if defined(PNG_READ_RGB_TO_GRAY_SUPPORTED) - png_byte rgb_to_gray_status; - /* 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; - png_uint_16 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) || \ - defined(PNG_READ_EMPTY_PLTE_SUPPORTED) || \ - defined(PNG_WRITE_EMPTY_PLTE_SUPPORTED) -/* changed from png_byte to png_uint_32 at version 1.2.0 */ -#ifdef PNG_1_0_X - png_byte mng_features_permitted; -#else - png_uint_32 mng_features_permitted; -#endif /* PNG_1_0_X */ -#endif - -/* New member added in libpng-1.0.7 */ -#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) - png_fixed_point int_gamma; -#endif - -/* New member added in libpng-1.0.9, ifdef'ed out in 1.0.12, enabled in 1.2.0 */ -#if defined(PNG_MNG_FEATURES_SUPPORTED) - png_byte filter_type; -#endif - -#if defined(PNG_1_0_X) -/* New member added in libpng-1.0.10, ifdef'ed out in 1.2.0 */ - png_uint_32 row_buf_size; -#endif - -/* New members added in libpng-1.2.0 */ -#if defined(PNG_ASSEMBLER_CODE_SUPPORTED) -# if !defined(PNG_1_0_X) -# if defined(PNG_MMX_CODE_SUPPORTED) - png_byte mmx_bitdepth_threshold; - png_uint_32 mmx_rowbytes_threshold; -# endif - png_uint_32 asm_flags; -# endif -#endif - -/* 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 */ - -#if defined(PNG_READ_DITHER_SUPPORTED) -/* The following three members were added at version 1.0.14 and 1.2.4 */ - png_bytep dither_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_SET_USER_LIMITS_SUPPORTED - png_uint_32 user_width_max; - png_uint_32 user_height_max; -#endif - -/* New member added in libpng-1.0.25 and 1.2.17 */ -#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) - /* storage for unknown chunk that the library doesn't recognize. */ - png_unknown_chunk unknown_chunk; -#endif -}; - - -/* This triggers a compiler error in png.c, if png.c and png.h - * do not agree upon the version number. - */ -typedef png_structp version_1_2_21; - -typedef png_struct FAR * FAR * png_structpp; - -/* Here are the function definitions most commonly used. This is not - * the place to find out how to use libpng. See libpng.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. - */ - -/* Returns the version number of the library */ -extern PNG_EXPORT(png_uint_32,png_access_version_number) PNGARG((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. - */ -extern PNG_EXPORT(void,png_set_sig_bytes) PNGARG((png_structp 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). - */ -extern PNG_EXPORT(int,png_sig_cmp) PNGARG((png_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). - */ -extern PNG_EXPORT(int,png_check_sig) PNGARG((png_bytep sig, int num)); - -/* Allocate and initialize png_ptr struct for reading, and any other memory. */ -extern PNG_EXPORT(png_structp,png_create_read_struct) - PNGARG((png_const_charp user_png_ver, png_voidp error_ptr, - png_error_ptr error_fn, png_error_ptr warn_fn)); - -/* Allocate and initialize png_ptr struct for writing, and any other memory */ -extern PNG_EXPORT(png_structp,png_create_write_struct) - PNGARG((png_const_charp user_png_ver, png_voidp error_ptr, - png_error_ptr error_fn, png_error_ptr warn_fn)); - -#ifdef PNG_WRITE_SUPPORTED -extern PNG_EXPORT(png_uint_32,png_get_compression_buffer_size) - PNGARG((png_structp png_ptr)); -#endif - -#ifdef PNG_WRITE_SUPPORTED -extern PNG_EXPORT(void,png_set_compression_buffer_size) - PNGARG((png_structp png_ptr, png_uint_32 size)); -#endif - -/* Reset the compression stream */ -extern PNG_EXPORT(int,png_reset_zstream) PNGARG((png_structp png_ptr)); - -/* New functions added in libpng-1.0.2 (not enabled by default until 1.2.0) */ -#ifdef PNG_USER_MEM_SUPPORTED -extern PNG_EXPORT(png_structp,png_create_read_struct_2) - PNGARG((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)); -extern PNG_EXPORT(png_structp,png_create_write_struct_2) - PNGARG((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)); -#endif - -/* Write a PNG chunk - size, type, (optional) data, CRC. */ -extern PNG_EXPORT(void,png_write_chunk) PNGARG((png_structp png_ptr, - png_bytep chunk_name, png_bytep data, png_size_t length)); - -/* Write the start of a PNG chunk - length and chunk name. */ -extern PNG_EXPORT(void,png_write_chunk_start) PNGARG((png_structp png_ptr, - png_bytep chunk_name, png_uint_32 length)); - -/* Write the data of a PNG chunk started with png_write_chunk_start(). */ -extern PNG_EXPORT(void,png_write_chunk_data) PNGARG((png_structp png_ptr, - png_bytep data, png_size_t length)); - -/* Finish a chunk started with png_write_chunk_start() (includes CRC). */ -extern PNG_EXPORT(void,png_write_chunk_end) PNGARG((png_structp png_ptr)); - -/* Allocate and initialize the info structure */ -extern PNG_EXPORT(png_infop,png_create_info_struct) - PNGARG((png_structp png_ptr)); - -#if defined(PNG_1_0_X) || defined (PNG_1_2_X) -/* Initialize the info structure (old interface - DEPRECATED) */ -extern PNG_EXPORT(void,png_info_init) PNGARG((png_infop info_ptr)); -#undef png_info_init -#define png_info_init(info_ptr) png_info_init_3(&info_ptr,\ - png_sizeof(png_info)); -#endif - -extern PNG_EXPORT(void,png_info_init_3) PNGARG((png_infopp info_ptr, - png_size_t png_info_struct_size)); - -/* Writes all the PNG information before the image. */ -extern PNG_EXPORT(void,png_write_info_before_PLTE) PNGARG((png_structp png_ptr, - png_infop info_ptr)); -extern PNG_EXPORT(void,png_write_info) PNGARG((png_structp png_ptr, - png_infop info_ptr)); - -#ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED -/* read the information before the actual image data. */ -extern PNG_EXPORT(void,png_read_info) PNGARG((png_structp png_ptr, - png_infop info_ptr)); -#endif - -#if defined(PNG_TIME_RFC1123_SUPPORTED) -extern PNG_EXPORT(png_charp,png_convert_to_rfc1123) - PNGARG((png_structp png_ptr, png_timep ptime)); -#endif - -#if !defined(_WIN32_WCE) -/* "time.h" functions are not supported on WindowsCE */ -#if defined(PNG_WRITE_tIME_SUPPORTED) -/* convert from a struct tm to png_time */ -extern PNG_EXPORT(void,png_convert_from_struct_tm) PNGARG((png_timep ptime, - struct tm FAR * ttime)); - -/* convert from time_t to png_time. Uses gmtime() */ -extern PNG_EXPORT(void,png_convert_from_time_t) PNGARG((png_timep ptime, - time_t ttime)); -#endif /* PNG_WRITE_tIME_SUPPORTED */ -#endif /* _WIN32_WCE */ - -#if defined(PNG_READ_EXPAND_SUPPORTED) -/* Expand data to 24-bit RGB, or 8-bit grayscale, with alpha if available. */ -extern PNG_EXPORT(void,png_set_expand) PNGARG((png_structp png_ptr)); -#if !defined(PNG_1_0_X) -extern PNG_EXPORT(void,png_set_expand_gray_1_2_4_to_8) PNGARG((png_structp - png_ptr)); -#endif -extern PNG_EXPORT(void,png_set_palette_to_rgb) PNGARG((png_structp png_ptr)); -extern PNG_EXPORT(void,png_set_tRNS_to_alpha) PNGARG((png_structp png_ptr)); -#if defined(PNG_1_0_X) || defined (PNG_1_2_X) -/* Deprecated */ -extern PNG_EXPORT(void,png_set_gray_1_2_4_to_8) PNGARG((png_structp png_ptr)); -#endif -#endif - -#if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED) -/* Use blue, green, red order for pixels. */ -extern PNG_EXPORT(void,png_set_bgr) PNGARG((png_structp png_ptr)); -#endif - -#if defined(PNG_READ_GRAY_TO_RGB_SUPPORTED) -/* Expand the grayscale to 24-bit RGB if necessary. */ -extern PNG_EXPORT(void,png_set_gray_to_rgb) PNGARG((png_structp png_ptr)); -#endif - -#if defined(PNG_READ_RGB_TO_GRAY_SUPPORTED) -/* Reduce RGB to grayscale. */ -#ifdef PNG_FLOATING_POINT_SUPPORTED -extern PNG_EXPORT(void,png_set_rgb_to_gray) PNGARG((png_structp png_ptr, - int error_action, double red, double green )); -#endif -extern PNG_EXPORT(void,png_set_rgb_to_gray_fixed) PNGARG((png_structp png_ptr, - int error_action, png_fixed_point red, png_fixed_point green )); -extern PNG_EXPORT(png_byte,png_get_rgb_to_gray_status) PNGARG((png_structp - png_ptr)); -#endif - -extern PNG_EXPORT(void,png_build_grayscale_palette) PNGARG((int bit_depth, - png_colorp palette)); - -#if defined(PNG_READ_STRIP_ALPHA_SUPPORTED) -extern PNG_EXPORT(void,png_set_strip_alpha) PNGARG((png_structp png_ptr)); -#endif - -#if defined(PNG_READ_SWAP_ALPHA_SUPPORTED) || \ - defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED) -extern PNG_EXPORT(void,png_set_swap_alpha) PNGARG((png_structp png_ptr)); -#endif - -#if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) || \ - defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED) -extern PNG_EXPORT(void,png_set_invert_alpha) PNGARG((png_structp 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. */ -extern PNG_EXPORT(void,png_set_filler) PNGARG((png_structp 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. */ -#if !defined(PNG_1_0_X) -extern PNG_EXPORT(void,png_set_add_alpha) PNGARG((png_structp png_ptr, - png_uint_32 filler, int flags)); -#endif -#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. */ -extern PNG_EXPORT(void,png_set_swap) PNGARG((png_structp 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. */ -extern PNG_EXPORT(void,png_set_packing) PNGARG((png_structp png_ptr)); -#endif - -#if defined(PNG_READ_PACKSWAP_SUPPORTED) || defined(PNG_WRITE_PACKSWAP_SUPPORTED) -/* Swap packing order of pixels in bytes. */ -extern PNG_EXPORT(void,png_set_packswap) PNGARG((png_structp png_ptr)); -#endif - -#if defined(PNG_READ_SHIFT_SUPPORTED) || defined(PNG_WRITE_SHIFT_SUPPORTED) -/* Converts files to legal bit depths. */ -extern PNG_EXPORT(void,png_set_shift) PNGARG((png_structp png_ptr, - png_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. */ -extern PNG_EXPORT(int,png_set_interlace_handling) PNGARG((png_structp png_ptr)); -#endif - -#if defined(PNG_READ_INVERT_SUPPORTED) || defined(PNG_WRITE_INVERT_SUPPORTED) -/* Invert monochrome files */ -extern PNG_EXPORT(void,png_set_invert_mono) PNGARG((png_structp png_ptr)); -#endif - -#if defined(PNG_READ_BACKGROUND_SUPPORTED) -/* Handle alpha and tRNS by replacing with a background color. */ -#ifdef PNG_FLOATING_POINT_SUPPORTED -extern PNG_EXPORT(void,png_set_background) PNGARG((png_structp png_ptr, - png_color_16p background_color, int background_gamma_code, - int need_expand, double background_gamma)); -#endif -#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 - -#if defined(PNG_READ_16_TO_8_SUPPORTED) -/* strip the second byte of information from a 16-bit depth file. */ -extern PNG_EXPORT(void,png_set_strip_16) PNGARG((png_structp png_ptr)); -#endif - -#if defined(PNG_READ_DITHER_SUPPORTED) -/* Turn on dithering, and reduce the palette to the number of colors available. */ -extern PNG_EXPORT(void,png_set_dither) PNGARG((png_structp png_ptr, - png_colorp palette, int num_palette, int maximum_colors, - png_uint_16p histogram, int full_dither)); -#endif - -#if defined(PNG_READ_GAMMA_SUPPORTED) -/* Handle gamma correction. Screen_gamma=(display_exponent) */ -#ifdef PNG_FLOATING_POINT_SUPPORTED -extern PNG_EXPORT(void,png_set_gamma) PNGARG((png_structp png_ptr, - double screen_gamma, double default_file_gamma)); -#endif -#endif - -#if defined(PNG_1_0_X) || defined (PNG_1_2_X) -#if defined(PNG_READ_EMPTY_PLTE_SUPPORTED) || \ - defined(PNG_WRITE_EMPTY_PLTE_SUPPORTED) -/* Permit or disallow empty PLTE (0: not permitted, 1: permitted) */ -/* Deprecated and will be removed. Use png_permit_mng_features() instead. */ -extern PNG_EXPORT(void,png_permit_empty_plte) PNGARG((png_structp png_ptr, - int empty_plte_permitted)); -#endif -#endif - -#if defined(PNG_WRITE_FLUSH_SUPPORTED) -/* Set how many lines between output flushes - 0 for no flushing */ -extern PNG_EXPORT(void,png_set_flush) PNGARG((png_structp png_ptr, int nrows)); -/* Flush the current PNG output buffer */ -extern PNG_EXPORT(void,png_write_flush) PNGARG((png_structp png_ptr)); -#endif - -/* optional update palette with requested transformations */ -extern PNG_EXPORT(void,png_start_read_image) PNGARG((png_structp png_ptr)); - -/* optional call to update the users info structure */ -extern PNG_EXPORT(void,png_read_update_info) PNGARG((png_structp png_ptr, - png_infop info_ptr)); - -#ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED -/* read one or more rows of image data. */ -extern PNG_EXPORT(void,png_read_rows) PNGARG((png_structp png_ptr, - png_bytepp row, png_bytepp display_row, png_uint_32 num_rows)); -#endif - -#ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED -/* read a row of data. */ -extern PNG_EXPORT(void,png_read_row) PNGARG((png_structp png_ptr, - png_bytep row, - png_bytep display_row)); -#endif - -#ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED -/* read the whole image into memory at once. */ -extern PNG_EXPORT(void,png_read_image) PNGARG((png_structp png_ptr, - png_bytepp image)); -#endif - -/* write a row of image data */ -extern PNG_EXPORT(void,png_write_row) PNGARG((png_structp png_ptr, - png_bytep row)); - -/* write a few rows of image data */ -extern PNG_EXPORT(void,png_write_rows) PNGARG((png_structp png_ptr, - png_bytepp row, png_uint_32 num_rows)); - -/* write the image data */ -extern PNG_EXPORT(void,png_write_image) PNGARG((png_structp png_ptr, - png_bytepp image)); - -/* writes the end of the PNG file. */ -extern PNG_EXPORT(void,png_write_end) PNGARG((png_structp png_ptr, - png_infop info_ptr)); - -#ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED -/* read the end of the PNG file. */ -extern PNG_EXPORT(void,png_read_end) PNGARG((png_structp png_ptr, - png_infop info_ptr)); -#endif - -/* free any memory associated with the png_info_struct */ -extern PNG_EXPORT(void,png_destroy_info_struct) PNGARG((png_structp png_ptr, - png_infopp info_ptr_ptr)); - -/* free any memory associated with the png_struct and the png_info_structs */ -extern PNG_EXPORT(void,png_destroy_read_struct) PNGARG((png_structpp - png_ptr_ptr, png_infopp info_ptr_ptr, png_infopp end_info_ptr_ptr)); - -/* free all memory used by the read (old method - NOT DLL EXPORTED) */ -extern void png_read_destroy PNGARG((png_structp png_ptr, png_infop info_ptr, - png_infop end_info_ptr)); - -/* free any memory associated with the png_struct and the png_info_structs */ -extern PNG_EXPORT(void,png_destroy_write_struct) - PNGARG((png_structpp png_ptr_ptr, png_infopp info_ptr_ptr)); - -/* free any memory used in png_ptr struct (old method - NOT DLL EXPORTED) */ -extern void png_write_destroy PNGARG((png_structp png_ptr)); - -/* set the libpng method of handling chunk CRC errors */ -extern PNG_EXPORT(void,png_set_crc_action) PNGARG((png_structp png_ptr, - int crit_action, int ancil_action)); - -/* Values for png_set_crc_action() to 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. - */ -extern PNG_EXPORT(void,png_set_filter) PNGARG((png_structp 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 - -#if defined(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. - */ -#ifdef PNG_FLOATING_POINT_SUPPORTED -extern PNG_EXPORT(void,png_set_filter_heuristics) PNGARG((png_structp png_ptr, - int heuristic_method, int num_weights, png_doublep filter_weights, - png_doublep filter_costs)); -#endif -#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 */ - -/* 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. - */ -extern PNG_EXPORT(void,png_set_compression_level) PNGARG((png_structp png_ptr, - int level)); - -extern PNG_EXPORT(void,png_set_compression_mem_level) - PNGARG((png_structp png_ptr, int mem_level)); - -extern PNG_EXPORT(void,png_set_compression_strategy) - PNGARG((png_structp png_ptr, int strategy)); - -extern PNG_EXPORT(void,png_set_compression_window_bits) - PNGARG((png_structp png_ptr, int window_bits)); - -extern PNG_EXPORT(void,png_set_compression_method) PNGARG((png_structp png_ptr, - int method)); - -/* 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.txt for - * more information. - */ - -#if !defined(PNG_NO_STDIO) -/* Initialize the input/output for the PNG file to the default functions. */ -extern PNG_EXPORT(void,png_init_io) PNGARG((png_structp 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. - */ - -extern PNG_EXPORT(void,png_set_error_fn) PNGARG((png_structp 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 */ -extern PNG_EXPORT(png_voidp,png_get_error_ptr) PNGARG((png_structp 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). - */ -extern PNG_EXPORT(void,png_set_write_fn) PNGARG((png_structp 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. */ -extern PNG_EXPORT(void,png_set_read_fn) PNGARG((png_structp png_ptr, - png_voidp io_ptr, png_rw_ptr read_data_fn)); - -/* Return the user pointer associated with the I/O functions */ -extern PNG_EXPORT(png_voidp,png_get_io_ptr) PNGARG((png_structp png_ptr)); - -extern PNG_EXPORT(void,png_set_read_status_fn) PNGARG((png_structp png_ptr, - png_read_status_ptr read_row_fn)); - -extern PNG_EXPORT(void,png_set_write_status_fn) PNGARG((png_structp 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). */ -extern PNG_EXPORT(void,png_set_mem_fn) PNGARG((png_structp 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 */ -extern PNG_EXPORT(png_voidp,png_get_mem_ptr) PNGARG((png_structp png_ptr)); -#endif - -#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ - defined(PNG_LEGACY_SUPPORTED) -extern PNG_EXPORT(void,png_set_read_user_transform_fn) PNGARG((png_structp - png_ptr, png_user_transform_ptr read_user_transform_fn)); -#endif - -#if defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) || \ - defined(PNG_LEGACY_SUPPORTED) -extern PNG_EXPORT(void,png_set_write_user_transform_fn) PNGARG((png_structp - png_ptr, png_user_transform_ptr write_user_transform_fn)); -#endif - -#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ - defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) || \ - defined(PNG_LEGACY_SUPPORTED) -extern PNG_EXPORT(void,png_set_user_transform_info) PNGARG((png_structp - 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 */ -extern PNG_EXPORT(png_voidp,png_get_user_transform_ptr) - PNGARG((png_structp png_ptr)); -#endif - -#ifdef PNG_USER_CHUNKS_SUPPORTED -extern PNG_EXPORT(void,png_set_read_user_chunk_fn) PNGARG((png_structp png_ptr, - png_voidp user_chunk_ptr, png_user_chunk_ptr read_user_chunk_fn)); -extern PNG_EXPORT(png_voidp,png_get_user_chunk_ptr) PNGARG((png_structp - 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. - */ -extern PNG_EXPORT(void,png_set_progressive_read_fn) PNGARG((png_structp 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 */ -extern PNG_EXPORT(png_voidp,png_get_progressive_ptr) - PNGARG((png_structp png_ptr)); - -/* function to be called when data becomes available */ -extern PNG_EXPORT(void,png_process_data) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_bytep buffer, png_size_t buffer_size)); - -/* function that combines rows. Not very much different than the - * png_combine_row() call. Is this even used????? - */ -extern PNG_EXPORT(void,png_progressive_combine_row) PNGARG((png_structp png_ptr, - png_bytep old_row, png_bytep new_row)); -#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ - -extern PNG_EXPORT(png_voidp,png_malloc) PNGARG((png_structp png_ptr, - png_uint_32 size)); - -#if defined(PNG_1_0_X) -# define png_malloc_warn png_malloc -#else -/* Added at libpng version 1.2.4 */ -extern PNG_EXPORT(png_voidp,png_malloc_warn) PNGARG((png_structp png_ptr, - png_uint_32 size)); -#endif - -/* frees a pointer allocated by png_malloc() */ -extern PNG_EXPORT(void,png_free) PNGARG((png_structp png_ptr, png_voidp ptr)); - -#if defined(PNG_1_0_X) -/* Function to allocate memory for zlib. */ -extern PNG_EXPORT(voidpf,png_zalloc) PNGARG((voidpf png_ptr, uInt items, - uInt size)); - -/* Function to free memory for zlib */ -extern PNG_EXPORT(void,png_zfree) PNGARG((voidpf png_ptr, voidpf ptr)); -#endif - -/* Free data that was allocated internally */ -extern PNG_EXPORT(void,png_free_data) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_uint_32 free_me, int num)); -#ifdef PNG_FREE_ME_SUPPORTED -/* Reassign responsibility for freeing existing data, whether allocated - * by libpng or by the application */ -extern PNG_EXPORT(void,png_data_freer) PNGARG((png_structp png_ptr, - png_infop info_ptr, int freer, png_uint_32 mask)); -#endif -/* 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 -#define PNG_FREE_UNKN 0x0200 -#define PNG_FREE_LIST 0x0400 -#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 -extern PNG_EXPORT(png_voidp,png_malloc_default) PNGARG((png_structp png_ptr, - png_uint_32 size)); -extern PNG_EXPORT(void,png_free_default) PNGARG((png_structp png_ptr, - png_voidp ptr)); -#endif - -extern PNG_EXPORT(png_voidp,png_memcpy_check) PNGARG((png_structp png_ptr, - png_voidp s1, png_voidp s2, png_uint_32 size)); - -extern PNG_EXPORT(png_voidp,png_memset_check) PNGARG((png_structp png_ptr, - png_voidp s1, int value, png_uint_32 size)); - -#if defined(USE_FAR_KEYWORD) /* memory model conversion function */ -extern void *png_far_to_near PNGARG((png_structp png_ptr,png_voidp ptr, - int check)); -#endif /* USE_FAR_KEYWORD */ - -#ifndef PNG_NO_ERROR_TEXT -/* Fatal error in PNG image of libpng - can't continue */ -extern PNG_EXPORT(void,png_error) PNGARG((png_structp png_ptr, - png_const_charp error_message)); - -/* The same, but the chunk name is prepended to the error string. */ -extern PNG_EXPORT(void,png_chunk_error) PNGARG((png_structp png_ptr, - png_const_charp error_message)); -#else -/* Fatal error in PNG image of libpng - can't continue */ -extern PNG_EXPORT(void,png_err) PNGARG((png_structp png_ptr)); -#endif - -#ifndef PNG_NO_WARNINGS -/* Non-fatal error in libpng. Can continue, but may have a problem. */ -extern PNG_EXPORT(void,png_warning) PNGARG((png_structp png_ptr, - png_const_charp warning_message)); - -#ifdef PNG_READ_SUPPORTED -/* Non-fatal error in libpng, chunk name is prepended to message. */ -extern PNG_EXPORT(void,png_chunk_warning) PNGARG((png_structp png_ptr, - png_const_charp warning_message)); -#endif /* PNG_READ_SUPPORTED */ -#endif /* PNG_NO_WARNINGS */ - -/* 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. */ -extern PNG_EXPORT(png_uint_32,png_get_valid) PNGARG((png_structp png_ptr, -png_infop info_ptr, png_uint_32 flag)); - -/* Returns number of bytes needed to hold a transformed row. */ -extern PNG_EXPORT(png_uint_32,png_get_rowbytes) PNGARG((png_structp png_ptr, -png_infop info_ptr)); - -#if defined(PNG_INFO_IMAGE_SUPPORTED) -/* Returns row_pointers, which is an array of pointers to scanlines that was -returned from png_read_png(). */ -extern PNG_EXPORT(png_bytepp,png_get_rows) PNGARG((png_structp png_ptr, -png_infop info_ptr)); -/* Set row_pointers, which is an array of pointers to scanlines for use -by png_write_png(). */ -extern PNG_EXPORT(void,png_set_rows) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_bytepp row_pointers)); -#endif - -/* Returns number of color channels in image. */ -extern PNG_EXPORT(png_byte,png_get_channels) PNGARG((png_structp png_ptr, -png_infop info_ptr)); - -#ifdef PNG_EASY_ACCESS_SUPPORTED -/* Returns image width in pixels. */ -extern PNG_EXPORT(png_uint_32, png_get_image_width) PNGARG((png_structp -png_ptr, png_infop info_ptr)); - -/* Returns image height in pixels. */ -extern PNG_EXPORT(png_uint_32, png_get_image_height) PNGARG((png_structp -png_ptr, png_infop info_ptr)); - -/* Returns image bit_depth. */ -extern PNG_EXPORT(png_byte, png_get_bit_depth) PNGARG((png_structp -png_ptr, png_infop info_ptr)); - -/* Returns image color_type. */ -extern PNG_EXPORT(png_byte, png_get_color_type) PNGARG((png_structp -png_ptr, png_infop info_ptr)); - -/* Returns image filter_type. */ -extern PNG_EXPORT(png_byte, png_get_filter_type) PNGARG((png_structp -png_ptr, png_infop info_ptr)); - -/* Returns image interlace_type. */ -extern PNG_EXPORT(png_byte, png_get_interlace_type) PNGARG((png_structp -png_ptr, png_infop info_ptr)); - -/* Returns image compression_type. */ -extern PNG_EXPORT(png_byte, png_get_compression_type) PNGARG((png_structp -png_ptr, png_infop info_ptr)); - -/* Returns image resolution in pixels per meter, from pHYs chunk data. */ -extern PNG_EXPORT(png_uint_32, png_get_pixels_per_meter) PNGARG((png_structp -png_ptr, png_infop info_ptr)); -extern PNG_EXPORT(png_uint_32, png_get_x_pixels_per_meter) PNGARG((png_structp -png_ptr, png_infop info_ptr)); -extern PNG_EXPORT(png_uint_32, png_get_y_pixels_per_meter) PNGARG((png_structp -png_ptr, png_infop info_ptr)); - -/* Returns pixel aspect ratio, computed from pHYs chunk data. */ -#ifdef PNG_FLOATING_POINT_SUPPORTED -extern PNG_EXPORT(float, png_get_pixel_aspect_ratio) PNGARG((png_structp -png_ptr, png_infop info_ptr)); -#endif - -/* Returns image x, y offset in pixels or microns, from oFFs chunk data. */ -extern PNG_EXPORT(png_int_32, png_get_x_offset_pixels) PNGARG((png_structp -png_ptr, png_infop info_ptr)); -extern PNG_EXPORT(png_int_32, png_get_y_offset_pixels) PNGARG((png_structp -png_ptr, png_infop info_ptr)); -extern PNG_EXPORT(png_int_32, png_get_x_offset_microns) PNGARG((png_structp -png_ptr, png_infop info_ptr)); -extern PNG_EXPORT(png_int_32, png_get_y_offset_microns) PNGARG((png_structp -png_ptr, png_infop info_ptr)); - -#endif /* PNG_EASY_ACCESS_SUPPORTED */ - -/* Returns pointer to signature string read from PNG header */ -extern PNG_EXPORT(png_bytep,png_get_signature) PNGARG((png_structp png_ptr, -png_infop info_ptr)); - -#if defined(PNG_bKGD_SUPPORTED) -extern PNG_EXPORT(png_uint_32,png_get_bKGD) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_color_16p *background)); -#endif - -#if defined(PNG_bKGD_SUPPORTED) -extern PNG_EXPORT(void,png_set_bKGD) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_color_16p background)); -#endif - -#if defined(PNG_cHRM_SUPPORTED) -#ifdef PNG_FLOATING_POINT_SUPPORTED -extern PNG_EXPORT(png_uint_32,png_get_cHRM) PNGARG((png_structp png_ptr, - png_infop 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)); -#endif -#ifdef PNG_FIXED_POINT_SUPPORTED -extern PNG_EXPORT(png_uint_32,png_get_cHRM_fixed) PNGARG((png_structp png_ptr, - png_infop 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)); -#endif -#endif - -#if defined(PNG_cHRM_SUPPORTED) -#ifdef PNG_FLOATING_POINT_SUPPORTED -extern PNG_EXPORT(void,png_set_cHRM) PNGARG((png_structp png_ptr, - png_infop 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)); -#endif -#ifdef PNG_FIXED_POINT_SUPPORTED -extern PNG_EXPORT(void,png_set_cHRM_fixed) PNGARG((png_structp png_ptr, - png_infop 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)); -#endif -#endif - -#if defined(PNG_gAMA_SUPPORTED) -#ifdef PNG_FLOATING_POINT_SUPPORTED -extern PNG_EXPORT(png_uint_32,png_get_gAMA) PNGARG((png_structp png_ptr, - png_infop info_ptr, double *file_gamma)); -#endif -extern PNG_EXPORT(png_uint_32,png_get_gAMA_fixed) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_fixed_point *int_file_gamma)); -#endif - -#if defined(PNG_gAMA_SUPPORTED) -#ifdef PNG_FLOATING_POINT_SUPPORTED -extern PNG_EXPORT(void,png_set_gAMA) PNGARG((png_structp png_ptr, - png_infop info_ptr, double file_gamma)); -#endif -extern PNG_EXPORT(void,png_set_gAMA_fixed) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_fixed_point int_file_gamma)); -#endif - -#if defined(PNG_hIST_SUPPORTED) -extern PNG_EXPORT(png_uint_32,png_get_hIST) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_uint_16p *hist)); -#endif - -#if defined(PNG_hIST_SUPPORTED) -extern PNG_EXPORT(void,png_set_hIST) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_uint_16p hist)); -#endif - -extern PNG_EXPORT(png_uint_32,png_get_IHDR) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_uint_32 *width, png_uint_32 *height, - int *bit_depth, int *color_type, int *interlace_method, - int *compression_method, int *filter_method)); - -extern PNG_EXPORT(void,png_set_IHDR) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_uint_32 width, png_uint_32 height, int bit_depth, - int color_type, int interlace_method, int compression_method, - int filter_method)); - -#if defined(PNG_oFFs_SUPPORTED) -extern PNG_EXPORT(png_uint_32,png_get_oFFs) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_int_32 *offset_x, png_int_32 *offset_y, - int *unit_type)); -#endif - -#if defined(PNG_oFFs_SUPPORTED) -extern PNG_EXPORT(void,png_set_oFFs) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_int_32 offset_x, png_int_32 offset_y, - int unit_type)); -#endif - -#if defined(PNG_pCAL_SUPPORTED) -extern PNG_EXPORT(png_uint_32,png_get_pCAL) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_charp *purpose, png_int_32 *X0, png_int_32 *X1, - int *type, int *nparams, png_charp *units, png_charpp *params)); -#endif - -#if defined(PNG_pCAL_SUPPORTED) -extern PNG_EXPORT(void,png_set_pCAL) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_charp purpose, png_int_32 X0, png_int_32 X1, - int type, int nparams, png_charp units, png_charpp params)); -#endif - -#if defined(PNG_pHYs_SUPPORTED) -extern PNG_EXPORT(png_uint_32,png_get_pHYs) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_uint_32 *res_x, png_uint_32 *res_y, int *unit_type)); -#endif - -#if defined(PNG_pHYs_SUPPORTED) -extern PNG_EXPORT(void,png_set_pHYs) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_uint_32 res_x, png_uint_32 res_y, int unit_type)); -#endif - -extern PNG_EXPORT(png_uint_32,png_get_PLTE) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_colorp *palette, int *num_palette)); - -extern PNG_EXPORT(void,png_set_PLTE) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_colorp palette, int num_palette)); - -#if defined(PNG_sBIT_SUPPORTED) -extern PNG_EXPORT(png_uint_32,png_get_sBIT) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_color_8p *sig_bit)); -#endif - -#if defined(PNG_sBIT_SUPPORTED) -extern PNG_EXPORT(void,png_set_sBIT) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_color_8p sig_bit)); -#endif - -#if defined(PNG_sRGB_SUPPORTED) -extern PNG_EXPORT(png_uint_32,png_get_sRGB) PNGARG((png_structp png_ptr, - png_infop info_ptr, int *intent)); -#endif - -#if defined(PNG_sRGB_SUPPORTED) -extern PNG_EXPORT(void,png_set_sRGB) PNGARG((png_structp png_ptr, - png_infop info_ptr, int intent)); -extern PNG_EXPORT(void,png_set_sRGB_gAMA_and_cHRM) PNGARG((png_structp png_ptr, - png_infop info_ptr, int intent)); -#endif - -#if defined(PNG_iCCP_SUPPORTED) -extern PNG_EXPORT(png_uint_32,png_get_iCCP) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_charpp name, int *compression_type, - png_charpp profile, png_uint_32 *proflen)); - /* Note to maintainer: profile should be png_bytepp */ -#endif - -#if defined(PNG_iCCP_SUPPORTED) -extern PNG_EXPORT(void,png_set_iCCP) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_charp name, int compression_type, - png_charp profile, png_uint_32 proflen)); - /* Note to maintainer: profile should be png_bytep */ -#endif - -#if defined(PNG_sPLT_SUPPORTED) -extern PNG_EXPORT(png_uint_32,png_get_sPLT) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_sPLT_tpp entries)); -#endif - -#if defined(PNG_sPLT_SUPPORTED) -extern PNG_EXPORT(void,png_set_sPLT) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_sPLT_tp entries, int nentries)); -#endif - -#if defined(PNG_TEXT_SUPPORTED) -/* png_get_text also returns the number of text chunks in *num_text */ -extern PNG_EXPORT(png_uint_32,png_get_text) PNGARG((png_structp png_ptr, - png_infop 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. - */ - -#if defined(PNG_TEXT_SUPPORTED) -extern PNG_EXPORT(void,png_set_text) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_textp text_ptr, int num_text)); -#endif - -#if defined(PNG_tIME_SUPPORTED) -extern PNG_EXPORT(png_uint_32,png_get_tIME) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_timep *mod_time)); -#endif - -#if defined(PNG_tIME_SUPPORTED) -extern PNG_EXPORT(void,png_set_tIME) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_timep mod_time)); -#endif - -#if defined(PNG_tRNS_SUPPORTED) -extern PNG_EXPORT(png_uint_32,png_get_tRNS) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_bytep *trans, int *num_trans, - png_color_16p *trans_values)); -#endif - -#if defined(PNG_tRNS_SUPPORTED) -extern PNG_EXPORT(void,png_set_tRNS) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_bytep trans, int num_trans, - png_color_16p trans_values)); -#endif - -#if defined(PNG_tRNS_SUPPORTED) -#endif - -#if defined(PNG_sCAL_SUPPORTED) -#ifdef PNG_FLOATING_POINT_SUPPORTED -extern PNG_EXPORT(png_uint_32,png_get_sCAL) PNGARG((png_structp png_ptr, - png_infop info_ptr, int *unit, double *width, double *height)); -#else -#ifdef PNG_FIXED_POINT_SUPPORTED -extern PNG_EXPORT(png_uint_32,png_get_sCAL_s) PNGARG((png_structp png_ptr, - png_infop info_ptr, int *unit, png_charpp swidth, png_charpp sheight)); -#endif -#endif -#endif /* PNG_sCAL_SUPPORTED */ - -#if defined(PNG_sCAL_SUPPORTED) -#ifdef PNG_FLOATING_POINT_SUPPORTED -extern PNG_EXPORT(void,png_set_sCAL) PNGARG((png_structp png_ptr, - png_infop info_ptr, int unit, double width, double height)); -#else -#ifdef PNG_FIXED_POINT_SUPPORTED -extern PNG_EXPORT(void,png_set_sCAL_s) PNGARG((png_structp png_ptr, - png_infop info_ptr, int unit, png_charp swidth, png_charp sheight)); -#endif -#endif -#endif /* PNG_sCAL_SUPPORTED || PNG_WRITE_sCAL_SUPPORTED */ - -#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) -/* provide a list of chunks and how they are to be handled, if the built-in - handling or default unknown chunk handling is not desired. Any chunks not - listed will be handled in the default manner. The IHDR and IEND chunks - must not be listed. - keep = 0: follow default behaviour - = 1: do not keep - = 2: keep only if safe-to-copy - = 3: keep even if unsafe-to-copy -*/ -extern PNG_EXPORT(void, png_set_keep_unknown_chunks) PNGARG((png_structp - png_ptr, int keep, png_bytep chunk_list, int num_chunks)); -extern PNG_EXPORT(void, png_set_unknown_chunks) PNGARG((png_structp png_ptr, - png_infop info_ptr, png_unknown_chunkp unknowns, int num_unknowns)); -extern PNG_EXPORT(void, png_set_unknown_chunk_location) - PNGARG((png_structp png_ptr, png_infop info_ptr, int chunk, int location)); -extern PNG_EXPORT(png_uint_32,png_get_unknown_chunks) PNGARG((png_structp - png_ptr, png_infop info_ptr, png_unknown_chunkpp entries)); -#endif -#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED -PNG_EXPORT(int,png_handle_as_unknown) PNGARG((png_structp png_ptr, png_bytep - chunk_name)); -#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); */ -extern PNG_EXPORT(void, png_set_invalid) PNGARG((png_structp png_ptr, - png_infop info_ptr, int mask)); - -#if defined(PNG_INFO_IMAGE_SUPPORTED) -/* The "params" pointer is currently not used and is for future expansion. */ -extern PNG_EXPORT(void, png_read_png) PNGARG((png_structp png_ptr, - png_infop info_ptr, - int transforms, - png_voidp params)); -extern PNG_EXPORT(void, png_write_png) PNGARG((png_structp png_ptr, - png_infop info_ptr, - int transforms, - png_voidp params)); -#endif - -/* Define PNG_DEBUG at compile time for debugging information. Higher - * numbers for PNG_DEBUG mean more debugging information. This has - * only been added since version 0.95 so it is not implemented throughout - * libpng yet, but more support will be added as needed. - */ -#ifdef PNG_DEBUG -#if (PNG_DEBUG > 0) -#if !defined(PNG_DEBUG_FILE) && defined(_MSC_VER) -#include -#if (PNG_DEBUG > 1) -#define png_debug(l,m) _RPT0(_CRT_WARN,m) -#define png_debug1(l,m,p1) _RPT1(_CRT_WARN,m,p1) -#define png_debug2(l,m,p1,p2) _RPT2(_CRT_WARN,m,p1,p2) -#endif -#else /* PNG_DEBUG_FILE || !_MSC_VER */ -#ifndef PNG_DEBUG_FILE -#define PNG_DEBUG_FILE stderr -#endif /* PNG_DEBUG_FILE */ -#if (PNG_DEBUG > 1) -#define png_debug(l,m) \ -{ \ - int num_tabs=l; \ - fprintf(PNG_DEBUG_FILE,"%s"m,(num_tabs==1 ? "\t" : \ - (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":"")))); \ -} -#define png_debug1(l,m,p1) \ -{ \ - int num_tabs=l; \ - fprintf(PNG_DEBUG_FILE,"%s"m,(num_tabs==1 ? "\t" : \ - (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))),p1); \ -} -#define png_debug2(l,m,p1,p2) \ -{ \ - int num_tabs=l; \ - fprintf(PNG_DEBUG_FILE,"%s"m,(num_tabs==1 ? "\t" : \ - (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))),p1,p2); \ -} -#endif /* (PNG_DEBUG > 1) */ -#endif /* _MSC_VER */ -#endif /* (PNG_DEBUG > 0) */ -#endif /* PNG_DEBUG */ -#ifndef png_debug -#define png_debug(l, m) -#endif -#ifndef png_debug1 -#define png_debug1(l, m, p1) -#endif -#ifndef png_debug2 -#define png_debug2(l, m, p1, p2) -#endif - -extern PNG_EXPORT(png_charp,png_get_copyright) PNGARG((png_structp png_ptr)); -extern PNG_EXPORT(png_charp,png_get_header_ver) PNGARG((png_structp png_ptr)); -extern PNG_EXPORT(png_charp,png_get_header_version) PNGARG((png_structp png_ptr)); -extern PNG_EXPORT(png_charp,png_get_libpng_ver) PNGARG((png_structp png_ptr)); - -#ifdef PNG_MNG_FEATURES_SUPPORTED -extern PNG_EXPORT(png_uint_32,png_permit_mng_features) PNGARG((png_structp - 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 - -/* Added to version 1.2.0 */ -#if defined(PNG_ASSEMBLER_CODE_SUPPORTED) -#if defined(PNG_MMX_CODE_SUPPORTED) -#define PNG_ASM_FLAG_MMX_SUPPORT_COMPILED 0x01 /* not user-settable */ -#define PNG_ASM_FLAG_MMX_SUPPORT_IN_CPU 0x02 /* not user-settable */ -#define PNG_ASM_FLAG_MMX_READ_COMBINE_ROW 0x04 -#define PNG_ASM_FLAG_MMX_READ_INTERLACE 0x08 -#define PNG_ASM_FLAG_MMX_READ_FILTER_SUB 0x10 -#define PNG_ASM_FLAG_MMX_READ_FILTER_UP 0x20 -#define PNG_ASM_FLAG_MMX_READ_FILTER_AVG 0x40 -#define PNG_ASM_FLAG_MMX_READ_FILTER_PAETH 0x80 -#define PNG_ASM_FLAGS_INITIALIZED 0x80000000 /* not user-settable */ - -#define PNG_MMX_READ_FLAGS ( PNG_ASM_FLAG_MMX_READ_COMBINE_ROW \ - | PNG_ASM_FLAG_MMX_READ_INTERLACE \ - | PNG_ASM_FLAG_MMX_READ_FILTER_SUB \ - | PNG_ASM_FLAG_MMX_READ_FILTER_UP \ - | PNG_ASM_FLAG_MMX_READ_FILTER_AVG \ - | PNG_ASM_FLAG_MMX_READ_FILTER_PAETH ) -#define PNG_MMX_WRITE_FLAGS ( 0 ) - -#define PNG_MMX_FLAGS ( PNG_ASM_FLAG_MMX_SUPPORT_COMPILED \ - | PNG_ASM_FLAG_MMX_SUPPORT_IN_CPU \ - | PNG_MMX_READ_FLAGS \ - | PNG_MMX_WRITE_FLAGS ) - -#define PNG_SELECT_READ 1 -#define PNG_SELECT_WRITE 2 -#endif /* PNG_MMX_CODE_SUPPORTED */ - -#if !defined(PNG_1_0_X) -/* pngget.c */ -extern PNG_EXPORT(png_uint_32,png_get_mmx_flagmask) - PNGARG((int flag_select, int *compilerID)); - -/* pngget.c */ -extern PNG_EXPORT(png_uint_32,png_get_asm_flagmask) - PNGARG((int flag_select)); - -/* pngget.c */ -extern PNG_EXPORT(png_uint_32,png_get_asm_flags) - PNGARG((png_structp png_ptr)); - -/* pngget.c */ -extern PNG_EXPORT(png_byte,png_get_mmx_bitdepth_threshold) - PNGARG((png_structp png_ptr)); - -/* pngget.c */ -extern PNG_EXPORT(png_uint_32,png_get_mmx_rowbytes_threshold) - PNGARG((png_structp png_ptr)); - -/* pngset.c */ -extern PNG_EXPORT(void,png_set_asm_flags) - PNGARG((png_structp png_ptr, png_uint_32 asm_flags)); - -/* pngset.c */ -extern PNG_EXPORT(void,png_set_mmx_thresholds) - PNGARG((png_structp png_ptr, png_byte mmx_bitdepth_threshold, - png_uint_32 mmx_rowbytes_threshold)); - -#endif /* PNG_1_0_X */ - -#if !defined(PNG_1_0_X) -/* png.c, pnggccrd.c, or pngvcrd.c */ -extern PNG_EXPORT(int,png_mmx_support) PNGARG((void)); -#endif /* PNG_ASSEMBLER_CODE_SUPPORTED */ - -/* 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 -extern PNG_EXPORT(void,png_set_strip_error_numbers) PNGARG((png_structp - png_ptr, png_uint_32 strip_mode)); -#endif - -#endif /* PNG_1_0_X */ - -/* Added at libpng-1.2.6 */ -#ifdef PNG_SET_USER_LIMITS_SUPPORTED -extern PNG_EXPORT(void,png_set_user_limits) PNGARG((png_structp - png_ptr, png_uint_32 user_width_max, png_uint_32 user_height_max)); -extern PNG_EXPORT(png_uint_32,png_get_user_width_max) PNGARG((png_structp - png_ptr)); -extern PNG_EXPORT(png_uint_32,png_get_user_height_max) PNGARG((png_structp - png_ptr)); -#endif - -/* Maintainer: Put new public prototypes here ^, in libpng.3, and project defs */ - -#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)) + (png_uint_16)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)*(png_uint_32)(65535L - \ - (png_uint_32)(alpha)) + (png_uint_32)32768L); \ - (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)) + \ - (png_uint_16)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)(65535L - (png_uint_32)(alpha)) + \ - (png_uint_32)32767) / (png_uint_32)65535L) - -#endif /* PNG_READ_COMPOSITE_NODIV_SUPPORTED */ - -/* Inline macros to do direct reads of bytes from the input buffer. These - * require that you are using an architecture that uses PNG byte ordering - * (MSB first) and supports unaligned data storage. I think that PowerPC - * in big-endian mode and 680x0 are the only ones that will support this. - * The x86 line of processors definitely do not. The png_get_int_32() - * routine also assumes we are using two's complement format for negative - * values, which is almost certainly true. - */ -#if defined(PNG_READ_BIG_ENDIAN_SUPPORTED) -# define png_get_uint_32(buf) ( *((png_uint_32p) (buf))) -# define png_get_uint_16(buf) ( *((png_uint_16p) (buf))) -# define png_get_int_32(buf) ( *((png_int_32p) (buf))) -#else -extern PNG_EXPORT(png_uint_32,png_get_uint_32) PNGARG((png_bytep buf)); -extern PNG_EXPORT(png_uint_16,png_get_uint_16) PNGARG((png_bytep buf)); -extern PNG_EXPORT(png_int_32,png_get_int_32) PNGARG((png_bytep buf)); -#endif /* !PNG_READ_BIG_ENDIAN_SUPPORTED */ -extern PNG_EXPORT(png_uint_32,png_get_uint_31) - PNGARG((png_structp png_ptr, png_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). - */ -extern PNG_EXPORT(void,png_save_uint_32) - PNGARG((png_bytep buf, png_uint_32 i)); -extern PNG_EXPORT(void,png_save_int_32) - PNGARG((png_bytep buf, png_int_32 i)); - -/* 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. - */ -extern PNG_EXPORT(void,png_save_uint_16) - PNGARG((png_bytep buf, unsigned int i)); -/* No png_save_int_16 -- may be added if there's a real need for it. */ - -/* ************************************************************************* */ - -/* These next functions are used internally in the code. They generally - * shouldn't be used unless you are writing code to add or replace some - * functionality in libpng. More information about most functions can - * be found in the files where the functions are located. - */ - - -/* Various modes of operation, that are visible to applications because - * they are used for unknown chunk location. - */ -#define PNG_HAVE_IHDR 0x01 -#define PNG_HAVE_PLTE 0x02 -#define PNG_HAVE_IDAT 0x04 -#define PNG_AFTER_IDAT 0x08 /* Have complete zlib datastream */ -#define PNG_HAVE_IEND 0x10 - -#if defined(PNG_INTERNAL) - -/* More modes of operation. Note that after an init, mode is set to - * zero automatically when the structure is created. - */ -#define PNG_HAVE_gAMA 0x20 -#define PNG_HAVE_cHRM 0x40 -#define PNG_HAVE_sRGB 0x80 -#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 */ - -/* 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_DITHER 0x0040 -#define PNG_BACKGROUND 0x0080 -#define PNG_BACKGROUND_EXPAND 0x0100 - /* 0x0200 unused */ -#define PNG_16_TO_8 0x0400 -#define PNG_RGBA 0x0800 -#define PNG_EXPAND 0x1000 -#define PNG_GAMMA 0x2000 -#define PNG_GRAY_TO_RGB 0x4000 -#define PNG_FILLER 0x8000L -#define PNG_PACKSWAP 0x10000L -#define PNG_SWAP_ALPHA 0x20000L -#define PNG_STRIP_ALPHA 0x40000L -#define PNG_INVERT_ALPHA 0x80000L -#define PNG_USER_TRANSFORM 0x100000L -#define PNG_RGB_TO_GRAY_ERR 0x200000L -#define PNG_RGB_TO_GRAY_WARN 0x400000L -#define PNG_RGB_TO_GRAY 0x600000L /* two bits, RGB_TO_GRAY_ERR|WARN */ - /* 0x800000L Unused */ -#define PNG_ADD_ALPHA 0x1000000L /* Added to libpng-1.2.7 */ -#define PNG_EXPAND_tRNS 0x2000000L /* Added to libpng-1.2.9 */ - /* 0x4000000L unused */ - /* 0x8000000L unused */ - /* 0x10000000L unused */ - /* 0x20000000L unused */ - /* 0x40000000L 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_SHIFT 8 -#define PNG_WEIGHT_FACTOR (1<<(PNG_WEIGHT_SHIFT)) -#define PNG_COST_SHIFT 3 -#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_ZLIB_CUSTOM_LEVEL 0x0002 -#define PNG_FLAG_ZLIB_CUSTOM_MEM_LEVEL 0x0004 -#define PNG_FLAG_ZLIB_CUSTOM_WINDOW_BITS 0x0008 -#define PNG_FLAG_ZLIB_CUSTOM_METHOD 0x0010 -#define PNG_FLAG_ZLIB_FINISHED 0x0020 -#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_FREE_PLTE 0x1000 -#define PNG_FLAG_FREE_TRNS 0x2000 -#define PNG_FLAG_FREE_HIST 0x4000 -#define PNG_FLAG_KEEP_UNKNOWN_CHUNKS 0x8000L -#define PNG_FLAG_KEEP_UNSAFE_CHUNKS 0x10000L -#define PNG_FLAG_LIBRARY_MISMATCH 0x20000L -#define PNG_FLAG_STRIP_ERROR_NUMBERS 0x40000L -#define PNG_FLAG_STRIP_ERROR_TEXT 0x80000L -#define PNG_FLAG_MALLOC_NULL_MEM_OK 0x100000L -#define PNG_FLAG_ADD_ALPHA 0x200000L /* Added to libpng-1.2.8 */ -#define PNG_FLAG_STRIP_ALPHA 0x400000L /* Added to libpng-1.2.8 */ - /* 0x800000L unused */ - /* 0x1000000L unused */ - /* 0x2000000L unused */ - /* 0x4000000L unused */ - /* 0x8000000L unused */ - /* 0x10000000L unused */ - /* 0x20000000L unused */ - /* 0x40000000L 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.2.6 JB */ -#define PNG_ROWBYTES(pixel_bits, width) \ - ((pixel_bits) >= 8 ? \ - ((width) * (((png_uint_32)(pixel_bits)) >> 3)) : \ - (( ((width) * ((png_uint_32)(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) ) - -/* variables declared in png.c - only it needs to define PNG_NO_EXTERN */ -#if !defined(PNG_NO_EXTERN) || defined(PNG_ALWAYS_EXTERN) -/* place to hold the signature string for a PNG file. */ -#ifdef PNG_USE_GLOBAL_ARRAYS - PNG_EXPORT_VAR (PNG_CONST png_byte FARDATA) png_sig[8]; -#else -#endif -#endif /* PNG_NO_EXTERN */ - -/* Constant strings for known chunk types. If you need to add a chunk, - * define the name here, and add an invocation of the macro in png.c and - * wherever it's needed. - */ -#define PNG_IHDR png_byte png_IHDR[5] = { 73, 72, 68, 82, '\0'} -#define PNG_IDAT png_byte png_IDAT[5] = { 73, 68, 65, 84, '\0'} -#define PNG_IEND png_byte png_IEND[5] = { 73, 69, 78, 68, '\0'} -#define PNG_PLTE png_byte png_PLTE[5] = { 80, 76, 84, 69, '\0'} -#define PNG_bKGD png_byte png_bKGD[5] = { 98, 75, 71, 68, '\0'} -#define PNG_cHRM png_byte png_cHRM[5] = { 99, 72, 82, 77, '\0'} -#define PNG_gAMA png_byte png_gAMA[5] = {103, 65, 77, 65, '\0'} -#define PNG_hIST png_byte png_hIST[5] = {104, 73, 83, 84, '\0'} -#define PNG_iCCP png_byte png_iCCP[5] = {105, 67, 67, 80, '\0'} -#define PNG_iTXt png_byte png_iTXt[5] = {105, 84, 88, 116, '\0'} -#define PNG_oFFs png_byte png_oFFs[5] = {111, 70, 70, 115, '\0'} -#define PNG_pCAL png_byte png_pCAL[5] = {112, 67, 65, 76, '\0'} -#define PNG_sCAL png_byte png_sCAL[5] = {115, 67, 65, 76, '\0'} -#define PNG_pHYs png_byte png_pHYs[5] = {112, 72, 89, 115, '\0'} -#define PNG_sBIT png_byte png_sBIT[5] = {115, 66, 73, 84, '\0'} -#define PNG_sPLT png_byte png_sPLT[5] = {115, 80, 76, 84, '\0'} -#define PNG_sRGB png_byte png_sRGB[5] = {115, 82, 71, 66, '\0'} -#define PNG_tEXt png_byte png_tEXt[5] = {116, 69, 88, 116, '\0'} -#define PNG_tIME png_byte png_tIME[5] = {116, 73, 77, 69, '\0'} -#define PNG_tRNS png_byte png_tRNS[5] = {116, 82, 78, 83, '\0'} -#define PNG_zTXt png_byte png_zTXt[5] = {122, 84, 88, 116, '\0'} - -#ifdef PNG_USE_GLOBAL_ARRAYS -PNG_EXPORT_VAR (png_byte FARDATA) png_IHDR[5]; -PNG_EXPORT_VAR (png_byte FARDATA) png_IDAT[5]; -PNG_EXPORT_VAR (png_byte FARDATA) png_IEND[5]; -PNG_EXPORT_VAR (png_byte FARDATA) png_PLTE[5]; -PNG_EXPORT_VAR (png_byte FARDATA) png_bKGD[5]; -PNG_EXPORT_VAR (png_byte FARDATA) png_cHRM[5]; -PNG_EXPORT_VAR (png_byte FARDATA) png_gAMA[5]; -PNG_EXPORT_VAR (png_byte FARDATA) png_hIST[5]; -PNG_EXPORT_VAR (png_byte FARDATA) png_iCCP[5]; -PNG_EXPORT_VAR (png_byte FARDATA) png_iTXt[5]; -PNG_EXPORT_VAR (png_byte FARDATA) png_oFFs[5]; -PNG_EXPORT_VAR (png_byte FARDATA) png_pCAL[5]; -PNG_EXPORT_VAR (png_byte FARDATA) png_sCAL[5]; -PNG_EXPORT_VAR (png_byte FARDATA) png_pHYs[5]; -PNG_EXPORT_VAR (png_byte FARDATA) png_sBIT[5]; -PNG_EXPORT_VAR (png_byte FARDATA) png_sPLT[5]; -PNG_EXPORT_VAR (png_byte FARDATA) png_sRGB[5]; -PNG_EXPORT_VAR (png_byte FARDATA) png_tEXt[5]; -PNG_EXPORT_VAR (png_byte FARDATA) png_tIME[5]; -PNG_EXPORT_VAR (png_byte FARDATA) png_tRNS[5]; -PNG_EXPORT_VAR (png_byte FARDATA) png_zTXt[5]; -#endif /* PNG_USE_GLOBAL_ARRAYS */ - -#if defined(PNG_1_0_X) || defined (PNG_1_2_X) -/* Initialize png_ptr struct for reading, and allocate any other memory. - * (old interface - DEPRECATED - use png_create_read_struct instead). - */ -extern PNG_EXPORT(void,png_read_init) PNGARG((png_structp png_ptr)); -#undef png_read_init -#define png_read_init(png_ptr) png_read_init_3(&png_ptr, \ - PNG_LIBPNG_VER_STRING, png_sizeof(png_struct)); -#endif - -extern PNG_EXPORT(void,png_read_init_3) PNGARG((png_structpp ptr_ptr, - png_const_charp user_png_ver, png_size_t png_struct_size)); -#if defined(PNG_1_0_X) || defined (PNG_1_2_X) -extern PNG_EXPORT(void,png_read_init_2) PNGARG((png_structp png_ptr, - png_const_charp user_png_ver, png_size_t png_struct_size, png_size_t - png_info_size)); -#endif - -#if defined(PNG_1_0_X) || defined (PNG_1_2_X) -/* Initialize png_ptr struct for writing, and allocate any other memory. - * (old interface - DEPRECATED - use png_create_write_struct instead). - */ -extern PNG_EXPORT(void,png_write_init) PNGARG((png_structp png_ptr)); -#undef png_write_init -#define png_write_init(png_ptr) png_write_init_3(&png_ptr, \ - PNG_LIBPNG_VER_STRING, png_sizeof(png_struct)); -#endif - -extern PNG_EXPORT(void,png_write_init_3) PNGARG((png_structpp ptr_ptr, - png_const_charp user_png_ver, png_size_t png_struct_size)); -extern PNG_EXPORT(void,png_write_init_2) PNGARG((png_structp png_ptr, - png_const_charp user_png_ver, png_size_t png_struct_size, png_size_t - png_info_size)); - -/* Allocate memory for an internal libpng struct */ -PNG_EXTERN png_voidp png_create_struct PNGARG((int type)); - -/* Free memory from internal libpng struct */ -PNG_EXTERN void png_destroy_struct PNGARG((png_voidp struct_ptr)); - -PNG_EXTERN png_voidp png_create_struct_2 PNGARG((int type, png_malloc_ptr - malloc_fn, png_voidp mem_ptr)); -PNG_EXTERN void png_destroy_struct_2 PNGARG((png_voidp struct_ptr, - png_free_ptr free_fn, png_voidp mem_ptr)); - -/* Free any memory that info_ptr points to and reset struct. */ -PNG_EXTERN void png_info_destroy PNGARG((png_structp png_ptr, - png_infop info_ptr)); - -#ifndef PNG_1_0_X -/* Function to allocate memory for zlib. */ -PNG_EXTERN voidpf png_zalloc PNGARG((voidpf png_ptr, uInt items, uInt size)); - -/* Function to free memory for zlib */ -PNG_EXTERN void png_zfree PNGARG((voidpf png_ptr, voidpf ptr)); - -#ifdef PNG_SIZE_T -/* Function to convert a sizeof an item to png_sizeof item */ - PNG_EXTERN png_size_t PNGAPI png_convert_size PNGARG((size_t size)); -#endif - -/* Next four functions are used internally as callbacks. PNGAPI is required - * but not PNG_EXPORT. PNGAPI added at libpng version 1.2.3. */ - -PNG_EXTERN void PNGAPI png_default_read_data PNGARG((png_structp png_ptr, - png_bytep data, png_size_t length)); - -#ifdef PNG_PROGRESSIVE_READ_SUPPORTED -PNG_EXTERN void PNGAPI png_push_fill_buffer PNGARG((png_structp png_ptr, - png_bytep buffer, png_size_t length)); -#endif - -PNG_EXTERN void PNGAPI png_default_write_data PNGARG((png_structp png_ptr, - png_bytep data, png_size_t length)); - -#if defined(PNG_WRITE_FLUSH_SUPPORTED) -#if !defined(PNG_NO_STDIO) -PNG_EXTERN void PNGAPI png_default_flush PNGARG((png_structp png_ptr)); -#endif -#endif -#else /* PNG_1_0_X */ -#ifdef PNG_PROGRESSIVE_READ_SUPPORTED -PNG_EXTERN void png_push_fill_buffer PNGARG((png_structp png_ptr, - png_bytep buffer, png_size_t length)); -#endif -#endif /* PNG_1_0_X */ - -/* Reset the CRC variable */ -PNG_EXTERN void png_reset_crc PNGARG((png_structp png_ptr)); - -/* Write the "data" buffer to whatever output you are using. */ -PNG_EXTERN void png_write_data PNGARG((png_structp png_ptr, png_bytep data, - png_size_t length)); - -/* Read data from whatever input you are using into the "data" buffer */ -PNG_EXTERN void png_read_data PNGARG((png_structp png_ptr, png_bytep data, - png_size_t length)); - -/* Read bytes into buf, and update png_ptr->crc */ -PNG_EXTERN void png_crc_read PNGARG((png_structp png_ptr, png_bytep buf, - png_size_t length)); - -/* Decompress data in a chunk that uses compression */ -#if defined(PNG_zTXt_SUPPORTED) || defined(PNG_iTXt_SUPPORTED) || \ - defined(PNG_iCCP_SUPPORTED) || defined(PNG_sPLT_SUPPORTED) -PNG_EXTERN png_charp png_decompress_chunk PNGARG((png_structp png_ptr, - int comp_type, png_charp chunkdata, png_size_t chunklength, - png_size_t prefix_length, png_size_t *data_length)); -#endif - -/* Read "skip" bytes, read the file crc, and (optionally) verify png_ptr->crc */ -PNG_EXTERN int png_crc_finish PNGARG((png_structp png_ptr, png_uint_32 skip)); - -/* Read the CRC from the file and compare it to the libpng calculated CRC */ -PNG_EXTERN int png_crc_error PNGARG((png_structp png_ptr)); - -/* 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_EXTERN void png_calculate_crc PNGARG((png_structp png_ptr, png_bytep ptr, - png_size_t length)); - -#if defined(PNG_WRITE_FLUSH_SUPPORTED) -PNG_EXTERN void png_flush PNGARG((png_structp png_ptr)); -#endif - -/* simple function to write the signature */ -PNG_EXTERN void png_write_sig PNGARG((png_structp png_ptr)); - -/* write various chunks */ - -/* Write the IHDR chunk, and update the png_struct with the necessary - * information. - */ -PNG_EXTERN void png_write_IHDR PNGARG((png_structp 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_EXTERN void png_write_PLTE PNGARG((png_structp png_ptr, png_colorp palette, - png_uint_32 num_pal)); - -PNG_EXTERN void png_write_IDAT PNGARG((png_structp png_ptr, png_bytep data, - png_size_t length)); - -PNG_EXTERN void png_write_IEND PNGARG((png_structp png_ptr)); - -#if defined(PNG_WRITE_gAMA_SUPPORTED) -#ifdef PNG_FLOATING_POINT_SUPPORTED -PNG_EXTERN void png_write_gAMA PNGARG((png_structp png_ptr, double file_gamma)); -#endif -#ifdef PNG_FIXED_POINT_SUPPORTED -PNG_EXTERN void png_write_gAMA_fixed PNGARG((png_structp png_ptr, png_fixed_point - file_gamma)); -#endif -#endif - -#if defined(PNG_WRITE_sBIT_SUPPORTED) -PNG_EXTERN void png_write_sBIT PNGARG((png_structp png_ptr, png_color_8p sbit, - int color_type)); -#endif - -#if defined(PNG_WRITE_cHRM_SUPPORTED) -#ifdef PNG_FLOATING_POINT_SUPPORTED -PNG_EXTERN void png_write_cHRM PNGARG((png_structp png_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)); -#endif -#ifdef PNG_FIXED_POINT_SUPPORTED -PNG_EXTERN void png_write_cHRM_fixed PNGARG((png_structp png_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)); -#endif -#endif - -#if defined(PNG_WRITE_sRGB_SUPPORTED) -PNG_EXTERN void png_write_sRGB PNGARG((png_structp png_ptr, - int intent)); -#endif - -#if defined(PNG_WRITE_iCCP_SUPPORTED) -PNG_EXTERN void png_write_iCCP PNGARG((png_structp png_ptr, - png_charp name, int compression_type, - png_charp profile, int proflen)); - /* Note to maintainer: profile should be png_bytep */ -#endif - -#if defined(PNG_WRITE_sPLT_SUPPORTED) -PNG_EXTERN void png_write_sPLT PNGARG((png_structp png_ptr, - png_sPLT_tp palette)); -#endif - -#if defined(PNG_WRITE_tRNS_SUPPORTED) -PNG_EXTERN void png_write_tRNS PNGARG((png_structp png_ptr, png_bytep trans, - png_color_16p values, int number, int color_type)); -#endif - -#if defined(PNG_WRITE_bKGD_SUPPORTED) -PNG_EXTERN void png_write_bKGD PNGARG((png_structp png_ptr, - png_color_16p values, int color_type)); -#endif - -#if defined(PNG_WRITE_hIST_SUPPORTED) -PNG_EXTERN void png_write_hIST PNGARG((png_structp png_ptr, png_uint_16p hist, - int num_hist)); -#endif - -#if defined(PNG_WRITE_TEXT_SUPPORTED) || defined(PNG_WRITE_pCAL_SUPPORTED) || \ - defined(PNG_WRITE_iCCP_SUPPORTED) || defined(PNG_WRITE_sPLT_SUPPORTED) -PNG_EXTERN png_size_t png_check_keyword PNGARG((png_structp png_ptr, - png_charp key, png_charpp new_key)); -#endif - -#if defined(PNG_WRITE_tEXt_SUPPORTED) -PNG_EXTERN void png_write_tEXt PNGARG((png_structp png_ptr, png_charp key, - png_charp text, png_size_t text_len)); -#endif - -#if defined(PNG_WRITE_zTXt_SUPPORTED) -PNG_EXTERN void png_write_zTXt PNGARG((png_structp png_ptr, png_charp key, - png_charp text, png_size_t text_len, int compression)); -#endif - -#if defined(PNG_WRITE_iTXt_SUPPORTED) -PNG_EXTERN void png_write_iTXt PNGARG((png_structp png_ptr, - int compression, png_charp key, png_charp lang, png_charp lang_key, - png_charp text)); -#endif - -#if defined(PNG_TEXT_SUPPORTED) /* Added at version 1.0.14 and 1.2.4 */ -PNG_EXTERN int png_set_text_2 PNGARG((png_structp png_ptr, - png_infop info_ptr, png_textp text_ptr, int num_text)); -#endif - -#if defined(PNG_WRITE_oFFs_SUPPORTED) -PNG_EXTERN void png_write_oFFs PNGARG((png_structp png_ptr, - png_int_32 x_offset, png_int_32 y_offset, int unit_type)); -#endif - -#if defined(PNG_WRITE_pCAL_SUPPORTED) -PNG_EXTERN void png_write_pCAL PNGARG((png_structp png_ptr, png_charp purpose, - png_int_32 X0, png_int_32 X1, int type, int nparams, - png_charp units, png_charpp params)); -#endif - -#if defined(PNG_WRITE_pHYs_SUPPORTED) -PNG_EXTERN void png_write_pHYs PNGARG((png_structp png_ptr, - png_uint_32 x_pixels_per_unit, png_uint_32 y_pixels_per_unit, - int unit_type)); -#endif - -#if defined(PNG_WRITE_tIME_SUPPORTED) -PNG_EXTERN void png_write_tIME PNGARG((png_structp png_ptr, - png_timep mod_time)); -#endif - -#if defined(PNG_WRITE_sCAL_SUPPORTED) -#if defined(PNG_FLOATING_POINT_SUPPORTED) && !defined(PNG_NO_STDIO) -PNG_EXTERN void png_write_sCAL PNGARG((png_structp png_ptr, - int unit, double width, double height)); -#else -#ifdef PNG_FIXED_POINT_SUPPORTED -PNG_EXTERN void png_write_sCAL_s PNGARG((png_structp png_ptr, - int unit, png_charp width, png_charp height)); -#endif -#endif -#endif - -/* Called when finished processing a row of data */ -PNG_EXTERN void png_write_finish_row PNGARG((png_structp png_ptr)); - -/* Internal use only. Called before first row of data */ -PNG_EXTERN void png_write_start_row PNGARG((png_structp png_ptr)); - -#if defined(PNG_READ_GAMMA_SUPPORTED) -PNG_EXTERN void png_build_gamma_table PNGARG((png_structp png_ptr)); -#endif - -/* combine a row of data, dealing with alpha, etc. if requested */ -PNG_EXTERN void png_combine_row PNGARG((png_structp png_ptr, png_bytep row, - int mask)); - -#if defined(PNG_READ_INTERLACING_SUPPORTED) -/* expand an interlaced row */ -/* OLD pre-1.0.9 interface: -PNG_EXTERN void png_do_read_interlace PNGARG((png_row_infop row_info, - png_bytep row, int pass, png_uint_32 transformations)); - */ -PNG_EXTERN void png_do_read_interlace PNGARG((png_structp png_ptr)); -#endif - -/* GRR TO DO (2.0 or whenever): simplify other internal calling interfaces */ - -#if defined(PNG_WRITE_INTERLACING_SUPPORTED) -/* grab pixels out of a row for an interlaced pass */ -PNG_EXTERN void png_do_write_interlace PNGARG((png_row_infop row_info, - png_bytep row, int pass)); -#endif - -/* unfilter a row */ -PNG_EXTERN void png_read_filter_row PNGARG((png_structp png_ptr, - png_row_infop row_info, png_bytep row, png_bytep prev_row, int filter)); - -/* Choose the best filter to use and filter the row data */ -PNG_EXTERN void png_write_find_filter PNGARG((png_structp png_ptr, - png_row_infop row_info)); - -/* Write out the filtered row. */ -PNG_EXTERN void png_write_filtered_row PNGARG((png_structp png_ptr, - png_bytep filtered_row)); -/* finish a row while reading, dealing with interlacing passes, etc. */ -PNG_EXTERN void png_read_finish_row PNGARG((png_structp png_ptr)); - -/* initialize the row buffers, etc. */ -PNG_EXTERN void png_read_start_row PNGARG((png_structp png_ptr)); -/* optional call to update the users info structure */ -PNG_EXTERN void png_read_transform_info PNGARG((png_structp png_ptr, - png_infop info_ptr)); - -/* these are the functions that do the transformations */ -#if defined(PNG_READ_FILLER_SUPPORTED) -PNG_EXTERN void png_do_read_filler PNGARG((png_row_infop row_info, - png_bytep row, png_uint_32 filler, png_uint_32 flags)); -#endif - -#if defined(PNG_READ_SWAP_ALPHA_SUPPORTED) -PNG_EXTERN void png_do_read_swap_alpha PNGARG((png_row_infop row_info, - png_bytep row)); -#endif - -#if defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED) -PNG_EXTERN void png_do_write_swap_alpha PNGARG((png_row_infop row_info, - png_bytep row)); -#endif - -#if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) -PNG_EXTERN void png_do_read_invert_alpha PNGARG((png_row_infop row_info, - png_bytep row)); -#endif - -#if defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED) -PNG_EXTERN void png_do_write_invert_alpha PNGARG((png_row_infop row_info, - png_bytep row)); -#endif - -#if defined(PNG_WRITE_FILLER_SUPPORTED) || \ - defined(PNG_READ_STRIP_ALPHA_SUPPORTED) -PNG_EXTERN void png_do_strip_filler PNGARG((png_row_infop row_info, - png_bytep row, png_uint_32 flags)); -#endif - -#if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED) -PNG_EXTERN void png_do_swap PNGARG((png_row_infop row_info, png_bytep row)); -#endif - -#if defined(PNG_READ_PACKSWAP_SUPPORTED) || defined(PNG_WRITE_PACKSWAP_SUPPORTED) -PNG_EXTERN void png_do_packswap PNGARG((png_row_infop row_info, png_bytep row)); -#endif - -#if defined(PNG_READ_RGB_TO_GRAY_SUPPORTED) -PNG_EXTERN int png_do_rgb_to_gray PNGARG((png_structp png_ptr, png_row_infop - row_info, png_bytep row)); -#endif - -#if defined(PNG_READ_GRAY_TO_RGB_SUPPORTED) -PNG_EXTERN void png_do_gray_to_rgb PNGARG((png_row_infop row_info, - png_bytep row)); -#endif - -#if defined(PNG_READ_PACK_SUPPORTED) -PNG_EXTERN void png_do_unpack PNGARG((png_row_infop row_info, png_bytep row)); -#endif - -#if defined(PNG_READ_SHIFT_SUPPORTED) -PNG_EXTERN void png_do_unshift PNGARG((png_row_infop row_info, png_bytep row, - png_color_8p sig_bits)); -#endif - -#if defined(PNG_READ_INVERT_SUPPORTED) || defined(PNG_WRITE_INVERT_SUPPORTED) -PNG_EXTERN void png_do_invert PNGARG((png_row_infop row_info, png_bytep row)); -#endif - -#if defined(PNG_READ_16_TO_8_SUPPORTED) -PNG_EXTERN void png_do_chop PNGARG((png_row_infop row_info, png_bytep row)); -#endif - -#if defined(PNG_READ_DITHER_SUPPORTED) -PNG_EXTERN void png_do_dither PNGARG((png_row_infop row_info, - png_bytep row, png_bytep palette_lookup, png_bytep dither_lookup)); - -# if defined(PNG_CORRECT_PALETTE_SUPPORTED) -PNG_EXTERN void png_correct_palette PNGARG((png_structp png_ptr, - png_colorp palette, int num_palette)); -# endif -#endif - -#if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED) -PNG_EXTERN void png_do_bgr PNGARG((png_row_infop row_info, png_bytep row)); -#endif - -#if defined(PNG_WRITE_PACK_SUPPORTED) -PNG_EXTERN void png_do_pack PNGARG((png_row_infop row_info, - png_bytep row, png_uint_32 bit_depth)); -#endif - -#if defined(PNG_WRITE_SHIFT_SUPPORTED) -PNG_EXTERN void png_do_shift PNGARG((png_row_infop row_info, png_bytep row, - png_color_8p bit_depth)); -#endif - -#if defined(PNG_READ_BACKGROUND_SUPPORTED) -#if defined(PNG_READ_GAMMA_SUPPORTED) -PNG_EXTERN void png_do_background PNGARG((png_row_infop row_info, png_bytep row, - png_color_16p trans_values, png_color_16p background, - png_color_16p background_1, - png_bytep gamma_table, png_bytep gamma_from_1, png_bytep gamma_to_1, - png_uint_16pp gamma_16, png_uint_16pp gamma_16_from_1, - png_uint_16pp gamma_16_to_1, int gamma_shift)); -#else -PNG_EXTERN void png_do_background PNGARG((png_row_infop row_info, png_bytep row, - png_color_16p trans_values, png_color_16p background)); -#endif -#endif - -#if defined(PNG_READ_GAMMA_SUPPORTED) -PNG_EXTERN void png_do_gamma PNGARG((png_row_infop row_info, png_bytep row, - png_bytep gamma_table, png_uint_16pp gamma_16_table, - int gamma_shift)); -#endif - -#if defined(PNG_READ_EXPAND_SUPPORTED) -PNG_EXTERN void png_do_expand_palette PNGARG((png_row_infop row_info, - png_bytep row, png_colorp palette, png_bytep trans, int num_trans)); -PNG_EXTERN void png_do_expand PNGARG((png_row_infop row_info, - png_bytep row, png_color_16p trans_value)); -#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_EXTERN void png_handle_IHDR PNGARG((png_structp png_ptr, png_infop info_ptr, - png_uint_32 length)); -PNG_EXTERN void png_handle_PLTE PNGARG((png_structp png_ptr, png_infop info_ptr, - png_uint_32 length)); -PNG_EXTERN void png_handle_IEND PNGARG((png_structp png_ptr, png_infop info_ptr, - png_uint_32 length)); - -#if defined(PNG_READ_bKGD_SUPPORTED) -PNG_EXTERN void png_handle_bKGD PNGARG((png_structp png_ptr, png_infop info_ptr, - png_uint_32 length)); -#endif - -#if defined(PNG_READ_cHRM_SUPPORTED) -PNG_EXTERN void png_handle_cHRM PNGARG((png_structp png_ptr, png_infop info_ptr, - png_uint_32 length)); -#endif - -#if defined(PNG_READ_gAMA_SUPPORTED) -PNG_EXTERN void png_handle_gAMA PNGARG((png_structp png_ptr, png_infop info_ptr, - png_uint_32 length)); -#endif - -#if defined(PNG_READ_hIST_SUPPORTED) -PNG_EXTERN void png_handle_hIST PNGARG((png_structp png_ptr, png_infop info_ptr, - png_uint_32 length)); -#endif - -#if defined(PNG_READ_iCCP_SUPPORTED) -extern void png_handle_iCCP PNGARG((png_structp png_ptr, png_infop info_ptr, - png_uint_32 length)); -#endif /* PNG_READ_iCCP_SUPPORTED */ - -#if defined(PNG_READ_iTXt_SUPPORTED) -PNG_EXTERN void png_handle_iTXt PNGARG((png_structp png_ptr, png_infop info_ptr, - png_uint_32 length)); -#endif - -#if defined(PNG_READ_oFFs_SUPPORTED) -PNG_EXTERN void png_handle_oFFs PNGARG((png_structp png_ptr, png_infop info_ptr, - png_uint_32 length)); -#endif - -#if defined(PNG_READ_pCAL_SUPPORTED) -PNG_EXTERN void png_handle_pCAL PNGARG((png_structp png_ptr, png_infop info_ptr, - png_uint_32 length)); -#endif - -#if defined(PNG_READ_pHYs_SUPPORTED) -PNG_EXTERN void png_handle_pHYs PNGARG((png_structp png_ptr, png_infop info_ptr, - png_uint_32 length)); -#endif - -#if defined(PNG_READ_sBIT_SUPPORTED) -PNG_EXTERN void png_handle_sBIT PNGARG((png_structp png_ptr, png_infop info_ptr, - png_uint_32 length)); -#endif - -#if defined(PNG_READ_sCAL_SUPPORTED) -PNG_EXTERN void png_handle_sCAL PNGARG((png_structp png_ptr, png_infop info_ptr, - png_uint_32 length)); -#endif - -#if defined(PNG_READ_sPLT_SUPPORTED) -extern void png_handle_sPLT PNGARG((png_structp png_ptr, png_infop info_ptr, - png_uint_32 length)); -#endif /* PNG_READ_sPLT_SUPPORTED */ - -#if defined(PNG_READ_sRGB_SUPPORTED) -PNG_EXTERN void png_handle_sRGB PNGARG((png_structp png_ptr, png_infop info_ptr, - png_uint_32 length)); -#endif - -#if defined(PNG_READ_tEXt_SUPPORTED) -PNG_EXTERN void png_handle_tEXt PNGARG((png_structp png_ptr, png_infop info_ptr, - png_uint_32 length)); -#endif - -#if defined(PNG_READ_tIME_SUPPORTED) -PNG_EXTERN void png_handle_tIME PNGARG((png_structp png_ptr, png_infop info_ptr, - png_uint_32 length)); -#endif - -#if defined(PNG_READ_tRNS_SUPPORTED) -PNG_EXTERN void png_handle_tRNS PNGARG((png_structp png_ptr, png_infop info_ptr, - png_uint_32 length)); -#endif - -#if defined(PNG_READ_zTXt_SUPPORTED) -PNG_EXTERN void png_handle_zTXt PNGARG((png_structp png_ptr, png_infop info_ptr, - png_uint_32 length)); -#endif - -PNG_EXTERN void png_handle_unknown PNGARG((png_structp png_ptr, - png_infop info_ptr, png_uint_32 length)); - -PNG_EXTERN void png_check_chunk_name PNGARG((png_structp png_ptr, - png_bytep chunk_name)); - -/* handle the transformations for reading and writing */ -PNG_EXTERN void png_do_read_transformations PNGARG((png_structp png_ptr)); -PNG_EXTERN void png_do_write_transformations PNGARG((png_structp png_ptr)); - -PNG_EXTERN void png_init_read_transformations PNGARG((png_structp png_ptr)); - -#ifdef PNG_PROGRESSIVE_READ_SUPPORTED -PNG_EXTERN void png_push_read_chunk PNGARG((png_structp png_ptr, - png_infop info_ptr)); -PNG_EXTERN void png_push_read_sig PNGARG((png_structp png_ptr, - png_infop info_ptr)); -PNG_EXTERN void png_push_check_crc PNGARG((png_structp png_ptr)); -PNG_EXTERN void png_push_crc_skip PNGARG((png_structp png_ptr, - png_uint_32 length)); -PNG_EXTERN void png_push_crc_finish PNGARG((png_structp png_ptr)); -PNG_EXTERN void png_push_save_buffer PNGARG((png_structp png_ptr)); -PNG_EXTERN void png_push_restore_buffer PNGARG((png_structp png_ptr, - png_bytep buffer, png_size_t buffer_length)); -PNG_EXTERN void png_push_read_IDAT PNGARG((png_structp png_ptr)); -PNG_EXTERN void png_process_IDAT_data PNGARG((png_structp png_ptr, - png_bytep buffer, png_size_t buffer_length)); -PNG_EXTERN void png_push_process_row PNGARG((png_structp png_ptr)); -PNG_EXTERN void png_push_handle_unknown PNGARG((png_structp png_ptr, - png_infop info_ptr, png_uint_32 length)); -PNG_EXTERN void png_push_have_info PNGARG((png_structp png_ptr, - png_infop info_ptr)); -PNG_EXTERN void png_push_have_end PNGARG((png_structp png_ptr, - png_infop info_ptr)); -PNG_EXTERN void png_push_have_row PNGARG((png_structp png_ptr, png_bytep row)); -PNG_EXTERN void png_push_read_end PNGARG((png_structp png_ptr, - png_infop info_ptr)); -PNG_EXTERN void png_process_some_data PNGARG((png_structp png_ptr, - png_infop info_ptr)); -PNG_EXTERN void png_read_push_finish_row PNGARG((png_structp png_ptr)); -#if defined(PNG_READ_tEXt_SUPPORTED) -PNG_EXTERN void png_push_handle_tEXt PNGARG((png_structp png_ptr, - png_infop info_ptr, png_uint_32 length)); -PNG_EXTERN void png_push_read_tEXt PNGARG((png_structp png_ptr, - png_infop info_ptr)); -#endif -#if defined(PNG_READ_zTXt_SUPPORTED) -PNG_EXTERN void png_push_handle_zTXt PNGARG((png_structp png_ptr, - png_infop info_ptr, png_uint_32 length)); -PNG_EXTERN void png_push_read_zTXt PNGARG((png_structp png_ptr, - png_infop info_ptr)); -#endif -#if defined(PNG_READ_iTXt_SUPPORTED) -PNG_EXTERN void png_push_handle_iTXt PNGARG((png_structp png_ptr, - png_infop info_ptr, png_uint_32 length)); -PNG_EXTERN void png_push_read_iTXt PNGARG((png_structp png_ptr, - png_infop info_ptr)); -#endif - -#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ - -#ifdef PNG_MNG_FEATURES_SUPPORTED -PNG_EXTERN void png_do_read_intrapixel PNGARG((png_row_infop row_info, - png_bytep row)); -PNG_EXTERN void png_do_write_intrapixel PNGARG((png_row_infop row_info, - png_bytep row)); -#endif - -#if defined(PNG_ASSEMBLER_CODE_SUPPORTED) -#if defined(PNG_MMX_CODE_SUPPORTED) -/* png.c */ /* PRIVATE */ -PNG_EXTERN void png_init_mmx_flags PNGARG((png_structp png_ptr)); -#endif -#endif - -#if defined(PNG_INCH_CONVERSIONS) && defined(PNG_FLOATING_POINT_SUPPORTED) -PNG_EXTERN png_uint_32 png_get_pixels_per_inch PNGARG((png_structp png_ptr, -png_infop info_ptr)); - -PNG_EXTERN png_uint_32 png_get_x_pixels_per_inch PNGARG((png_structp png_ptr, -png_infop info_ptr)); - -PNG_EXTERN png_uint_32 png_get_y_pixels_per_inch PNGARG((png_structp png_ptr, -png_infop info_ptr)); - -PNG_EXTERN float png_get_x_offset_inches PNGARG((png_structp png_ptr, -png_infop info_ptr)); - -PNG_EXTERN float png_get_y_offset_inches PNGARG((png_structp png_ptr, -png_infop info_ptr)); - -#if defined(PNG_pHYs_SUPPORTED) -PNG_EXTERN png_uint_32 png_get_pHYs_dpi PNGARG((png_structp png_ptr, -png_infop info_ptr, png_uint_32 *res_x, png_uint_32 *res_y, int *unit_type)); -#endif /* PNG_pHYs_SUPPORTED */ -#endif /* PNG_INCH_CONVERSIONS && PNG_FLOATING_POINT_SUPPORTED */ - -/* Maintainer: Put new private prototypes here ^ and in libpngpf.3 */ - -#endif /* PNG_INTERNAL */ - -#ifdef __cplusplus -//} -#endif - -#endif /* PNG_VERSION_INFO_ONLY */ -/* do not put anything past this line */ -#endif /* PNG_H */ diff --git a/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngconf.h b/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngconf.h deleted file mode 100644 index c379da88..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngconf.h +++ /dev/null @@ -1,1505 +0,0 @@ - -/* pngconf.h - machine configurable file for libpng - * - * libpng version 1.2.21 - October 4, 2007 - * For conditions of distribution and use, see copyright notice in png.h - * Copyright (c) 1998-2007 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.) - */ - -/* 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 - -#define PNG_1_2_X - -//============================================================================== -// These are some Juce config settings that should remove any unnecessary code bloat.. - -#define PNG_NO_STDIO 1 -#define PNG_DEBUG 0 -#define PNG_NO_WARNINGS 1 -#define PNG_NO_ERROR_TEXT 1 -#define PNG_NO_ERROR_NUMBERS 1 -#define PNG_NO_USER_MEM 1 -#define PNG_NO_READ_iCCP 1 -#define PNG_NO_READ_UNKNOWN_CHUNKS 1 -#define PNG_NO_READ_USER_CHUNKS 1 -#define PNG_NO_READ_iTXt 1 -#define PNG_NO_READ_sCAL 1 -#define PNG_NO_READ_sPLT 1 - -#define png_error(a, b) png_err(a) -#define png_warning(a, b) -#define png_chunk_error(a, b) png_err(a) -#define png_chunk_warning(a, b) - -//============================================================================== - -/* - * PNG_USER_CONFIG has to be defined on the compiler command line. This - * includes the resource compiler for Windows DLL configurations. - */ -#ifdef PNG_USER_CONFIG -# ifndef PNG_USER_PRIVATEBUILD -# define PNG_USER_PRIVATEBUILD -# endif -#include "pngusr.h" -#endif - -/* PNG_CONFIGURE_LIBPNG is set by the "configure" script. */ -#ifdef PNG_CONFIGURE_LIBPNG -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif -#endif - -/* - * Added at libpng-1.2.8 - * - * If you create a private DLL you need to define in "pngusr.h" the followings: - * #define PNG_USER_PRIVATEBUILD - * e.g. #define PNG_USER_PRIVATEBUILD "Build by MyCompany for xyz reasons." - * #define PNG_USER_DLLFNAME_POSTFIX - * e.g. // private DLL "libpng13gx.dll" - * #define PNG_USER_DLLFNAME_POSTFIX "gx" - * - * The following macros are also at your disposal if you want to complete the - * DLL VERSIONINFO structure. - * - PNG_USER_VERSIONINFO_COMMENTS - * - PNG_USER_VERSIONINFO_COMPANYNAME - * - PNG_USER_VERSIONINFO_LEGALTRADEMARKS - */ - -#ifdef __STDC__ -#ifdef SPECIALBUILD -# pragma message("PNG_LIBPNG_SPECIALBUILD (and deprecated SPECIALBUILD)\ - are now LIBPNG reserved macros. Use PNG_USER_PRIVATEBUILD instead.") -#endif - -#ifdef PRIVATEBUILD -# pragma message("PRIVATEBUILD is deprecated.\ - Use PNG_USER_PRIVATEBUILD instead.") -# define PNG_USER_PRIVATEBUILD PRIVATEBUILD -#endif -#endif /* __STDC__ */ - -#ifndef PNG_VERSION_INFO_ONLY - -/* End of material added to libpng-1.2.8 */ - -/* Added at libpng-1.2.19, removed at libpng-1.2.20 because it caused trouble - Restored at libpng-1.2.21 */ -# define PNG_WARN_UNINITIALIZED_ROW 1 -/* End of material added at libpng-1.2.19/1.2.21 */ - -/* This is the size of the compression buffer, and thus the size of - * an IDAT chunk. Make this whatever size you feel is best for your - * machine. One of these will be allocated per png_struct. When this - * is full, it writes the data to the disk, and does some other - * calculations. Making this an extremely small size will slow - * the library down, but you may want to experiment to determine - * where it becomes significant, if you are concerned with memory - * usage. Note that zlib allocates at least 32Kb also. For readers, - * this describes the size of the buffer available to read the data in. - * Unless this gets smaller than the size of a row (compressed), - * it should not make much difference how big this is. - */ - -#ifndef PNG_ZBUF_SIZE -# define PNG_ZBUF_SIZE 8192 -#endif - -/* Enable if you want a write-only libpng */ - -#ifndef PNG_NO_READ_SUPPORTED -# define PNG_READ_SUPPORTED -#endif - -/* Enable if you want a read-only libpng */ - -#ifndef PNG_NO_WRITE_SUPPORTED -# define PNG_WRITE_SUPPORTED -#endif - -/* Enabled by default in 1.2.0. You can disable this if you don't need to - support PNGs that are embedded in MNG datastreams */ -#if !defined(PNG_1_0_X) && !defined(PNG_NO_MNG_FEATURES) -# ifndef PNG_MNG_FEATURES_SUPPORTED -# define PNG_MNG_FEATURES_SUPPORTED -# endif -#endif - -#ifndef PNG_NO_FLOATING_POINT_SUPPORTED -# ifndef PNG_FLOATING_POINT_SUPPORTED -# define PNG_FLOATING_POINT_SUPPORTED -# endif -#endif - -/* 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. -#define PNG_MAX_MALLOC_64K - */ -#if defined(MAXSEG_64K) && !defined(PNG_MAX_MALLOC_64K) -# define PNG_MAX_MALLOC_64K -#endif - -/* Special munging to support doing things the 'cygwin' way: - * 'Normal' png-on-win32 defines/defaults: - * PNG_BUILD_DLL -- building dll - * PNG_USE_DLL -- building an application, linking to dll - * (no define) -- building static library, or building an - * application and linking to the static lib - * 'Cygwin' defines/defaults: - * PNG_BUILD_DLL -- (ignored) building the dll - * (no define) -- (ignored) building an application, linking to the dll - * PNG_STATIC -- (ignored) building the static lib, or building an - * application that links to the static lib. - * ALL_STATIC -- (ignored) building various static libs, or building an - * application that links to the static libs. - * Thus, - * a cygwin user should define either PNG_BUILD_DLL or PNG_STATIC, and - * this bit of #ifdefs will define the 'correct' config variables based on - * that. If a cygwin user *wants* to define 'PNG_USE_DLL' that's okay, but - * unnecessary. - * - * Also, the precedence order is: - * ALL_STATIC (since we can't #undef something outside our namespace) - * PNG_BUILD_DLL - * PNG_STATIC - * (nothing) == PNG_USE_DLL - * - * CYGWIN (2002-01-20): The preceding is now obsolete. With the advent - * of auto-import in binutils, we no longer need to worry about - * __declspec(dllexport) / __declspec(dllimport) and friends. Therefore, - * we don't need to worry about PNG_STATIC or ALL_STATIC when it comes - * to __declspec() stuff. However, we DO need to worry about - * PNG_BUILD_DLL and PNG_STATIC because those change some defaults - * such as CONSOLE_IO and whether GLOBAL_ARRAYS are allowed. - */ -#if defined(__CYGWIN__) -# if defined(ALL_STATIC) -# if defined(PNG_BUILD_DLL) -# undef PNG_BUILD_DLL -# endif -# if defined(PNG_USE_DLL) -# undef PNG_USE_DLL -# endif -# if defined(PNG_DLL) -# undef PNG_DLL -# endif -# if !defined(PNG_STATIC) -# define PNG_STATIC -# endif -# else -# if defined (PNG_BUILD_DLL) -# if defined(PNG_STATIC) -# undef PNG_STATIC -# endif -# if defined(PNG_USE_DLL) -# undef PNG_USE_DLL -# endif -# if !defined(PNG_DLL) -# define PNG_DLL -# endif -# else -# if defined(PNG_STATIC) -# if defined(PNG_USE_DLL) -# undef PNG_USE_DLL -# endif -# if defined(PNG_DLL) -# undef PNG_DLL -# endif -# else -# if !defined(PNG_USE_DLL) -# define PNG_USE_DLL -# endif -# if !defined(PNG_DLL) -# define PNG_DLL -# endif -# endif -# endif -# endif -#endif - -/* This protects us against compilers that run on a windowing system - * and thus don't have or would rather us not use the stdio types: - * stdin, stdout, and stderr. The only one currently used is stderr - * in png_error() and png_warning(). #defining PNG_NO_CONSOLE_IO will - * prevent these from being compiled and used. #defining PNG_NO_STDIO - * will also prevent these, plus will prevent the entire set of stdio - * macros and functions (FILE *, printf, etc.) from being compiled and used, - * unless (PNG_DEBUG > 0) has been #defined. - * - * #define PNG_NO_CONSOLE_IO - * #define PNG_NO_STDIO - */ - -#if defined(_WIN32_WCE) -# include - /* Console I/O functions are not supported on WindowsCE */ -# define PNG_NO_CONSOLE_IO -# ifdef PNG_DEBUG -# undef PNG_DEBUG -# endif -#endif - -#ifdef PNG_BUILD_DLL -# ifndef PNG_CONSOLE_IO_SUPPORTED -# ifndef PNG_NO_CONSOLE_IO -# define PNG_NO_CONSOLE_IO -# endif -# endif -#endif - -# ifdef PNG_NO_STDIO -# ifndef PNG_NO_CONSOLE_IO -# define PNG_NO_CONSOLE_IO -# endif -# ifdef PNG_DEBUG -# if (PNG_DEBUG > 0) -# include -# endif -# endif -# else -# if !defined(_WIN32_WCE) -/* "stdio.h" functions are not supported on WindowsCE */ -# include -# endif -# endif - -/* This macro protects us against machines that don't have function - * prototypes (ie K&R style headers). If your compiler does not handle - * function prototypes, define this macro and use the included ansi2knr. - * I've always been able to use _NO_PROTO as the indicator, but you may - * need to drag the empty declaration out in front of here, or change the - * ifdef to suit your own needs. - */ -#ifndef PNGARG - -#ifdef OF /* zlib prototype munger */ -# define PNGARG(arglist) OF(arglist) -#else - -#ifdef _NO_PROTO -# define PNGARG(arglist) () -# ifndef PNG_TYPECAST_NULL -# define PNG_TYPECAST_NULL -# endif -#else -# define PNGARG(arglist) arglist -#endif /* _NO_PROTO */ - - -#endif /* OF */ - -#endif /* PNGARG */ - -/* Try to determine if we are compiling on a Mac. Note that testing for - * just __MWERKS__ is not good enough, because the Codewarrior is now used - * on non-Mac platforms. - */ -#ifndef MACOS -# if (defined(__MWERKS__) && defined(macintosh)) || defined(applec) || \ - defined(THINK_C) || defined(__SC__) || defined(TARGET_OS_MAC) -# define MACOS -# endif -#endif - -/* enough people need this for various reasons to include it here */ -#if !defined(MACOS) && !defined(RISCOS) && !defined(_WIN32_WCE) -# include -#endif - -#if !defined(PNG_SETJMP_NOT_SUPPORTED) && !defined(PNG_NO_SETJMP_SUPPORTED) -# define PNG_SETJMP_SUPPORTED -#endif - -#ifdef PNG_SETJMP_SUPPORTED -/* This is an attempt to force a single setjmp behaviour on Linux. If - * the X config stuff didn't define _BSD_SOURCE we wouldn't need this. - */ - -# ifdef __linux__ -# ifdef _BSD_SOURCE -# define PNG_SAVE_BSD_SOURCE -# undef _BSD_SOURCE -# endif -# ifdef _SETJMP_H - /* If you encounter a compiler error here, see the explanation - * near the end of INSTALL. - */ - __png.h__ already includes setjmp.h; - __dont__ include it again.; -# endif -# endif /* __linux__ */ - - /* include setjmp.h for error handling */ -# include - -# ifdef __linux__ -# ifdef PNG_SAVE_BSD_SOURCE -# define _BSD_SOURCE -# undef PNG_SAVE_BSD_SOURCE -# endif -# endif /* __linux__ */ -#endif /* PNG_SETJMP_SUPPORTED */ - -#ifdef BSD -#if ! JUCE_MAC -# include -#endif -#else -# include -#endif - -/* Other defines for things like memory and the like can go here. */ -#ifdef PNG_INTERNAL - -#include - -/* The functions exported by PNG_EXTERN are PNG_INTERNAL functions, which - * aren't usually used outside the library (as far as I know), so it is - * debatable if they should be exported at all. In the future, when it is - * possible to have run-time registry of chunk-handling functions, some of - * these will be made available again. -#define PNG_EXTERN extern - */ -#define PNG_EXTERN - -/* 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) -# if defined(MACOS) - /* 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 - -/* Codewarrior on NT has linking problems without this. */ -#if (defined(__MWERKS__) && defined(WIN32)) || defined(__STDC__) -# define PNG_ALWAYS_EXTERN -#endif - -/* This provides the non-ANSI (far) memory allocation routines. */ -#if defined(__TURBOC__) && defined(__MSDOS__) -# include -# include -#endif - -/* I have no idea why is this necessary... */ -#if defined(_MSC_VER) && (defined(WIN32) || defined(_Windows) || \ - defined(_WINDOWS) || defined(_WIN32) || defined(__WIN32__)) -# include -#endif - -/* This controls how fine the dithering gets. As this allocates - * a largish chunk of memory (32K), those who are not as concerned - * with dithering quality can decrease some or all of these. - */ -#ifndef PNG_DITHER_RED_BITS -# define PNG_DITHER_RED_BITS 5 -#endif -#ifndef PNG_DITHER_GREEN_BITS -# define PNG_DITHER_GREEN_BITS 5 -#endif -#ifndef PNG_DITHER_BLUE_BITS -# define PNG_DITHER_BLUE_BITS 5 -#endif - -/* This controls how fine the gamma correction becomes when you - * are only interested in 8 bits anyway. Increasing this value - * results in more memory being used, and more pow() functions - * being called to fill in the gamma tables. Don't set this value - * less then 8, and even that may not work (I haven't tested it). - */ - -#ifndef PNG_MAX_GAMMA_8 -# define PNG_MAX_GAMMA_8 11 -#endif - -/* This controls how much a difference in gamma we can tolerate before - * we actually start doing gamma conversion. - */ -#ifndef PNG_GAMMA_THRESHOLD -# define PNG_GAMMA_THRESHOLD 0.05 -#endif - -#endif /* PNG_INTERNAL */ - -/* The following uses const char * instead of char * for error - * and warning message functions, so some compilers won't complain. - * If you do not want to use const, define PNG_NO_CONST here. - */ - -#ifndef PNG_NO_CONST -# define PNG_CONST const -#else -# define PNG_CONST -#endif - -/* The following defines give you the ability to remove code from the - * library that you will not be using. I wish I could figure out how to - * automate this, but I can't do that without making it seriously hard - * on the users. So if you are not using an ability, change the #define - * to and #undef, and that part of the library will not be compiled. If - * your linker can't find a function, you may want to make sure the - * ability is defined here. Some of these depend upon some others being - * defined. I haven't figured out all the interactions here, so you may - * have to experiment awhile to get everything to compile. If you are - * creating or using a shared library, you probably shouldn't touch this, - * as it will affect the size of the structures, and this will cause bad - * things to happen if the library and/or application ever change. - */ - -/* Any features you will not be using can be undef'ed here */ - -/* GR-P, 0.96a: Set "*TRANSFORMS_SUPPORTED as default but allow user - * to turn it off with "*TRANSFORMS_NOT_SUPPORTED" or *PNG_NO_*_TRANSFORMS - * on the compile line, then pick and choose which ones to define without - * having to edit this file. It is safe to use the *TRANSFORMS_NOT_SUPPORTED - * if you only want to have a png-compliant reader/writer but don't need - * any of the extra transformations. This saves about 80 kbytes in a - * typical installation of the library. (PNG_NO_* form added in version - * 1.0.1c, for consistency) - */ - -/* The size of the png_text structure changed in libpng-1.0.6 when - * iTXt support was added. iTXt support was turned off by default through - * libpng-1.2.x, to support old apps that malloc the png_text structure - * instead of calling png_set_text() and letting libpng malloc it. It - * was turned on by default in libpng-1.3.0. - */ - -#if defined(PNG_1_0_X) || defined (PNG_1_2_X) -# ifndef PNG_NO_iTXt_SUPPORTED -# define PNG_NO_iTXt_SUPPORTED -# endif -# ifndef PNG_NO_READ_iTXt -# define PNG_NO_READ_iTXt -# endif -# ifndef PNG_NO_WRITE_iTXt -# define PNG_NO_WRITE_iTXt -# endif -#endif - -#if !defined(PNG_NO_iTXt_SUPPORTED) -# if !defined(PNG_READ_iTXt_SUPPORTED) && !defined(PNG_NO_READ_iTXt) -# define PNG_READ_iTXt -# endif -# if !defined(PNG_WRITE_iTXt_SUPPORTED) && !defined(PNG_NO_WRITE_iTXt) -# define PNG_WRITE_iTXt -# endif -#endif - -/* The following support, added after version 1.0.0, can be turned off here en - * masse by defining PNG_LEGACY_SUPPORTED in case you need binary compatibility - * with old applications that require the length of png_struct and png_info - * to remain unchanged. - */ - -#ifdef PNG_LEGACY_SUPPORTED -# define PNG_NO_FREE_ME -# define PNG_NO_READ_UNKNOWN_CHUNKS -# define PNG_NO_WRITE_UNKNOWN_CHUNKS -# define PNG_NO_READ_USER_CHUNKS -# define PNG_NO_READ_iCCP -# define PNG_NO_WRITE_iCCP -# define PNG_NO_READ_iTXt -# define PNG_NO_WRITE_iTXt -# define PNG_NO_READ_sCAL -# define PNG_NO_WRITE_sCAL -# define PNG_NO_READ_sPLT -# define PNG_NO_WRITE_sPLT -# define PNG_NO_INFO_IMAGE -# define PNG_NO_READ_RGB_TO_GRAY -# define PNG_NO_READ_USER_TRANSFORM -# define PNG_NO_WRITE_USER_TRANSFORM -# define PNG_NO_USER_MEM -# define PNG_NO_READ_EMPTY_PLTE -# define PNG_NO_MNG_FEATURES -# define PNG_NO_FIXED_POINT_SUPPORTED -#endif - -/* Ignore attempt to turn off both floating and fixed point support */ -#if !defined(PNG_FLOATING_POINT_SUPPORTED) || \ - !defined(PNG_NO_FIXED_POINT_SUPPORTED) -# define PNG_FIXED_POINT_SUPPORTED -#endif - -#ifndef PNG_NO_FREE_ME -# define PNG_FREE_ME_SUPPORTED -#endif - -#if defined(PNG_READ_SUPPORTED) - -#if !defined(PNG_READ_TRANSFORMS_NOT_SUPPORTED) && \ - !defined(PNG_NO_READ_TRANSFORMS) -# define PNG_READ_TRANSFORMS_SUPPORTED -#endif - -#ifdef PNG_READ_TRANSFORMS_SUPPORTED -# ifndef PNG_NO_READ_EXPAND -# define PNG_READ_EXPAND_SUPPORTED -# endif -# ifndef PNG_NO_READ_SHIFT -# define PNG_READ_SHIFT_SUPPORTED -# endif -# ifndef PNG_NO_READ_PACK -# define PNG_READ_PACK_SUPPORTED -# endif -# ifndef PNG_NO_READ_BGR -# define PNG_READ_BGR_SUPPORTED -# endif -# ifndef PNG_NO_READ_SWAP -# define PNG_READ_SWAP_SUPPORTED -# endif -# ifndef PNG_NO_READ_PACKSWAP -# define PNG_READ_PACKSWAP_SUPPORTED -# endif -# ifndef PNG_NO_READ_INVERT -# define PNG_READ_INVERT_SUPPORTED -# endif -# ifndef PNG_NO_READ_DITHER -# define PNG_READ_DITHER_SUPPORTED -# endif -# ifndef PNG_NO_READ_BACKGROUND -# define PNG_READ_BACKGROUND_SUPPORTED -# endif -# ifndef PNG_NO_READ_16_TO_8 -# define PNG_READ_16_TO_8_SUPPORTED -# endif -# ifndef PNG_NO_READ_FILLER -# define PNG_READ_FILLER_SUPPORTED -# endif -# ifndef PNG_NO_READ_GAMMA -# define PNG_READ_GAMMA_SUPPORTED -# endif -# ifndef PNG_NO_READ_GRAY_TO_RGB -# define PNG_READ_GRAY_TO_RGB_SUPPORTED -# endif -# ifndef PNG_NO_READ_SWAP_ALPHA -# define PNG_READ_SWAP_ALPHA_SUPPORTED -# endif -# ifndef PNG_NO_READ_INVERT_ALPHA -# define PNG_READ_INVERT_ALPHA_SUPPORTED -# endif -# ifndef PNG_NO_READ_STRIP_ALPHA -# define PNG_READ_STRIP_ALPHA_SUPPORTED -# endif -# ifndef PNG_NO_READ_USER_TRANSFORM -# define PNG_READ_USER_TRANSFORM_SUPPORTED -# endif -# ifndef PNG_NO_READ_RGB_TO_GRAY -# define PNG_READ_RGB_TO_GRAY_SUPPORTED -# endif -#endif /* PNG_READ_TRANSFORMS_SUPPORTED */ - -#if !defined(PNG_NO_PROGRESSIVE_READ) && \ - !defined(PNG_PROGRESSIVE_READ_SUPPORTED) /* if you don't do progressive */ -# define PNG_PROGRESSIVE_READ_SUPPORTED /* reading. This is not talking */ -#endif /* about interlacing capability! You'll */ - /* still have interlacing unless you change the following line: */ - -#define PNG_READ_INTERLACING_SUPPORTED /* required in PNG-compliant decoders */ - -#ifndef PNG_NO_READ_COMPOSITE_NODIV -# ifndef PNG_NO_READ_COMPOSITED_NODIV /* libpng-1.0.x misspelling */ -# define PNG_READ_COMPOSITE_NODIV_SUPPORTED /* well tested on Intel, SGI */ -# endif -#endif - -#if defined(PNG_1_0_X) || defined (PNG_1_2_X) -/* Deprecated, will be removed from version 2.0.0. - Use PNG_MNG_FEATURES_SUPPORTED instead. */ -#ifndef PNG_NO_READ_EMPTY_PLTE -# define PNG_READ_EMPTY_PLTE_SUPPORTED -#endif -#endif - -#endif /* PNG_READ_SUPPORTED */ - -#if defined(PNG_WRITE_SUPPORTED) - -# if !defined(PNG_WRITE_TRANSFORMS_NOT_SUPPORTED) && \ - !defined(PNG_NO_WRITE_TRANSFORMS) -# define PNG_WRITE_TRANSFORMS_SUPPORTED -#endif - -#ifdef PNG_WRITE_TRANSFORMS_SUPPORTED -# ifndef PNG_NO_WRITE_SHIFT -# define PNG_WRITE_SHIFT_SUPPORTED -# endif -# ifndef PNG_NO_WRITE_PACK -# define PNG_WRITE_PACK_SUPPORTED -# endif -# ifndef PNG_NO_WRITE_BGR -# define PNG_WRITE_BGR_SUPPORTED -# endif -# ifndef PNG_NO_WRITE_SWAP -# define PNG_WRITE_SWAP_SUPPORTED -# endif -# ifndef PNG_NO_WRITE_PACKSWAP -# define PNG_WRITE_PACKSWAP_SUPPORTED -# endif -# ifndef PNG_NO_WRITE_INVERT -# define PNG_WRITE_INVERT_SUPPORTED -# endif -# ifndef PNG_NO_WRITE_FILLER -# define PNG_WRITE_FILLER_SUPPORTED /* same as WRITE_STRIP_ALPHA */ -# endif -# ifndef PNG_NO_WRITE_SWAP_ALPHA -# define PNG_WRITE_SWAP_ALPHA_SUPPORTED -# endif -# ifndef PNG_NO_WRITE_INVERT_ALPHA -# define PNG_WRITE_INVERT_ALPHA_SUPPORTED -# endif -# ifndef PNG_NO_WRITE_USER_TRANSFORM -# define PNG_WRITE_USER_TRANSFORM_SUPPORTED -# endif -#endif /* PNG_WRITE_TRANSFORMS_SUPPORTED */ - -#if !defined(PNG_NO_WRITE_INTERLACING_SUPPORTED) && \ - !defined(PNG_WRITE_INTERLACING_SUPPORTED) -#define PNG_WRITE_INTERLACING_SUPPORTED /* not required for PNG-compliant - encoders, but can cause trouble - if left undefined */ -#endif - -#if !defined(PNG_NO_WRITE_WEIGHTED_FILTER) && \ - !defined(PNG_WRITE_WEIGHTED_FILTER) && \ - defined(PNG_FLOATING_POINT_SUPPORTED) -# define PNG_WRITE_WEIGHTED_FILTER_SUPPORTED -#endif - -#ifndef PNG_NO_WRITE_FLUSH -# define PNG_WRITE_FLUSH_SUPPORTED -#endif - -#if defined(PNG_1_0_X) || defined (PNG_1_2_X) -/* Deprecated, see PNG_MNG_FEATURES_SUPPORTED, above */ -#ifndef PNG_NO_WRITE_EMPTY_PLTE -# define PNG_WRITE_EMPTY_PLTE_SUPPORTED -#endif -#endif - -#endif /* PNG_WRITE_SUPPORTED */ - -#ifndef PNG_1_0_X -# ifndef PNG_NO_ERROR_NUMBERS -# define PNG_ERROR_NUMBERS_SUPPORTED -# endif -#endif /* PNG_1_0_X */ - -#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ - defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) -# ifndef PNG_NO_USER_TRANSFORM_PTR -# define PNG_USER_TRANSFORM_PTR_SUPPORTED -# endif -#endif - -#ifndef PNG_NO_STDIO -# define PNG_TIME_RFC1123_SUPPORTED -#endif - -/* This adds extra functions in pngget.c for accessing data from the - * info pointer (added in version 0.99) - * png_get_image_width() - * png_get_image_height() - * png_get_bit_depth() - * png_get_color_type() - * png_get_compression_type() - * png_get_filter_type() - * png_get_interlace_type() - * png_get_pixel_aspect_ratio() - * png_get_pixels_per_meter() - * png_get_x_offset_pixels() - * png_get_y_offset_pixels() - * png_get_x_offset_microns() - * png_get_y_offset_microns() - */ -#if !defined(PNG_NO_EASY_ACCESS) && !defined(PNG_EASY_ACCESS_SUPPORTED) -# define PNG_EASY_ACCESS_SUPPORTED -#endif - -/* PNG_ASSEMBLER_CODE was enabled by default in version 1.2.0 - * and removed from version 1.2.20. The following will be removed - * from libpng-1.4.0 -*/ - -#if defined(PNG_READ_SUPPORTED) && !defined(PNG_NO_OPTIMIZED_CODE) -# ifndef PNG_OPTIMIZED_CODE_SUPPORTED -# define PNG_OPTIMIZED_CODE_SUPPORTED -# endif -#endif - -#if defined(PNG_READ_SUPPORTED) && !defined(PNG_NO_ASSEMBLER_CODE) -# ifndef PNG_ASSEMBLER_CODE_SUPPORTED -# define PNG_ASSEMBLER_CODE_SUPPORTED -# endif - -# if defined(__GNUC__) && defined(__x86_64__) && (__GNUC__ < 4) - /* work around 64-bit gcc compiler bugs in gcc-3.x */ -# if !defined(PNG_MMX_CODE_SUPPORTED) && !defined(PNG_NO_MMX_CODE) -# define PNG_NO_MMX_CODE -# endif -# endif - -# if defined(__APPLE__) -# if !defined(PNG_MMX_CODE_SUPPORTED) && !defined(PNG_NO_MMX_CODE) -# define PNG_NO_MMX_CODE -# endif -# endif - -# if (defined(__MWERKS__) && ((__MWERKS__ < 0x0900) || macintosh)) -# if !defined(PNG_MMX_CODE_SUPPORTED) && !defined(PNG_NO_MMX_CODE) -# define PNG_NO_MMX_CODE -# endif -# endif - -# if !defined(PNG_MMX_CODE_SUPPORTED) && !defined(PNG_NO_MMX_CODE) -# define PNG_MMX_CODE_SUPPORTED -# endif - -#endif -/* end of obsolete code to be removed from libpng-1.4.0 */ - -#if !defined(PNG_1_0_X) -#if !defined(PNG_NO_USER_MEM) && !defined(PNG_USER_MEM_SUPPORTED) -# define PNG_USER_MEM_SUPPORTED -#endif -#endif /* PNG_1_0_X */ - -/* Added at libpng-1.2.6 */ -#if !defined(PNG_1_0_X) -#ifndef PNG_SET_USER_LIMITS_SUPPORTED -#if !defined(PNG_NO_SET_USER_LIMITS) && !defined(PNG_SET_USER_LIMITS_SUPPORTED) -# define PNG_SET_USER_LIMITS_SUPPORTED -#endif -#endif -#endif /* PNG_1_0_X */ - -/* Added at libpng-1.0.16 and 1.2.6. To accept all valid PNGS no matter - * how large, set these limits to 0x7fffffffL - */ -#ifndef PNG_USER_WIDTH_MAX -# define PNG_USER_WIDTH_MAX 1000000L -#endif -#ifndef PNG_USER_HEIGHT_MAX -# define PNG_USER_HEIGHT_MAX 1000000L -#endif - -/* These are currently experimental features, define them if you want */ - -/* very little testing */ -/* -#ifdef PNG_READ_SUPPORTED -# ifndef PNG_READ_16_TO_8_ACCURATE_SCALE_SUPPORTED -# define PNG_READ_16_TO_8_ACCURATE_SCALE_SUPPORTED -# endif -#endif -*/ - -/* This is only for PowerPC big-endian and 680x0 systems */ -/* some testing */ -/* -#ifndef PNG_READ_BIG_ENDIAN_SUPPORTED -# define PNG_READ_BIG_ENDIAN_SUPPORTED -#endif -*/ - -/* Buggy compilers (e.g., gcc 2.7.2.2) need this */ -/* -#define PNG_NO_POINTER_INDEXING -*/ - -/* These functions are turned off by default, as they will be phased out. */ -/* -#define PNG_USELESS_TESTS_SUPPORTED -#define PNG_CORRECT_PALETTE_SUPPORTED -*/ - -/* Any chunks you are not interested in, you can undef here. The - * ones that allocate memory may be expecially important (hIST, - * tEXt, zTXt, tRNS, pCAL). Others will just save time and make png_info - * a bit smaller. - */ - -#if defined(PNG_READ_SUPPORTED) && \ - !defined(PNG_READ_ANCILLARY_CHUNKS_NOT_SUPPORTED) && \ - !defined(PNG_NO_READ_ANCILLARY_CHUNKS) -# define PNG_READ_ANCILLARY_CHUNKS_SUPPORTED -#endif - -#if defined(PNG_WRITE_SUPPORTED) && \ - !defined(PNG_WRITE_ANCILLARY_CHUNKS_NOT_SUPPORTED) && \ - !defined(PNG_NO_WRITE_ANCILLARY_CHUNKS) -# define PNG_WRITE_ANCILLARY_CHUNKS_SUPPORTED -#endif - -#ifdef PNG_READ_ANCILLARY_CHUNKS_SUPPORTED - -#ifdef PNG_NO_READ_TEXT -# define PNG_NO_READ_iTXt -# define PNG_NO_READ_tEXt -# define PNG_NO_READ_zTXt -#endif -#ifndef PNG_NO_READ_bKGD -# define PNG_READ_bKGD_SUPPORTED -# define PNG_bKGD_SUPPORTED -#endif -#ifndef PNG_NO_READ_cHRM -# define PNG_READ_cHRM_SUPPORTED -# define PNG_cHRM_SUPPORTED -#endif -#ifndef PNG_NO_READ_gAMA -# define PNG_READ_gAMA_SUPPORTED -# define PNG_gAMA_SUPPORTED -#endif -#ifndef PNG_NO_READ_hIST -# define PNG_READ_hIST_SUPPORTED -# define PNG_hIST_SUPPORTED -#endif -#ifndef PNG_NO_READ_iCCP -# define PNG_READ_iCCP_SUPPORTED -# define PNG_iCCP_SUPPORTED -#endif -#ifndef PNG_NO_READ_iTXt -# ifndef PNG_READ_iTXt_SUPPORTED -# define PNG_READ_iTXt_SUPPORTED -# endif -# ifndef PNG_iTXt_SUPPORTED -# define PNG_iTXt_SUPPORTED -# endif -#endif -#ifndef PNG_NO_READ_oFFs -# define PNG_READ_oFFs_SUPPORTED -# define PNG_oFFs_SUPPORTED -#endif -#ifndef PNG_NO_READ_pCAL -# define PNG_READ_pCAL_SUPPORTED -# define PNG_pCAL_SUPPORTED -#endif -#ifndef PNG_NO_READ_sCAL -# define PNG_READ_sCAL_SUPPORTED -# define PNG_sCAL_SUPPORTED -#endif -#ifndef PNG_NO_READ_pHYs -# define PNG_READ_pHYs_SUPPORTED -# define PNG_pHYs_SUPPORTED -#endif -#ifndef PNG_NO_READ_sBIT -# define PNG_READ_sBIT_SUPPORTED -# define PNG_sBIT_SUPPORTED -#endif -#ifndef PNG_NO_READ_sPLT -# define PNG_READ_sPLT_SUPPORTED -# define PNG_sPLT_SUPPORTED -#endif -#ifndef PNG_NO_READ_sRGB -# define PNG_READ_sRGB_SUPPORTED -# define PNG_sRGB_SUPPORTED -#endif -#ifndef PNG_NO_READ_tEXt -# define PNG_READ_tEXt_SUPPORTED -# define PNG_tEXt_SUPPORTED -#endif -#ifndef PNG_NO_READ_tIME -# define PNG_READ_tIME_SUPPORTED -# define PNG_tIME_SUPPORTED -#endif -#ifndef PNG_NO_READ_tRNS -# define PNG_READ_tRNS_SUPPORTED -# define PNG_tRNS_SUPPORTED -#endif -#ifndef PNG_NO_READ_zTXt -# define PNG_READ_zTXt_SUPPORTED -# define PNG_zTXt_SUPPORTED -#endif -#ifndef PNG_NO_READ_UNKNOWN_CHUNKS -# define PNG_READ_UNKNOWN_CHUNKS_SUPPORTED -# ifndef PNG_UNKNOWN_CHUNKS_SUPPORTED -# define PNG_UNKNOWN_CHUNKS_SUPPORTED -# endif -# ifndef PNG_NO_HANDLE_AS_UNKNOWN -# define PNG_HANDLE_AS_UNKNOWN_SUPPORTED -# endif -#endif -#if !defined(PNG_NO_READ_USER_CHUNKS) && \ - defined(PNG_READ_UNKNOWN_CHUNKS_SUPPORTED) -# define PNG_READ_USER_CHUNKS_SUPPORTED -# define PNG_USER_CHUNKS_SUPPORTED -# ifdef PNG_NO_READ_UNKNOWN_CHUNKS -# undef PNG_NO_READ_UNKNOWN_CHUNKS -# endif -# ifdef PNG_NO_HANDLE_AS_UNKNOWN -# undef PNG_NO_HANDLE_AS_UNKNOWN -# endif -#endif -#ifndef PNG_NO_READ_OPT_PLTE -# define PNG_READ_OPT_PLTE_SUPPORTED /* only affects support of the */ -#endif /* optional PLTE chunk in RGB and RGBA images */ -#if defined(PNG_READ_iTXt_SUPPORTED) || defined(PNG_READ_tEXt_SUPPORTED) || \ - defined(PNG_READ_zTXt_SUPPORTED) -# define PNG_READ_TEXT_SUPPORTED -# define PNG_TEXT_SUPPORTED -#endif - -#endif /* PNG_READ_ANCILLARY_CHUNKS_SUPPORTED */ - -#ifdef PNG_WRITE_ANCILLARY_CHUNKS_SUPPORTED - -#ifdef PNG_NO_WRITE_TEXT -# define PNG_NO_WRITE_iTXt -# define PNG_NO_WRITE_tEXt -# define PNG_NO_WRITE_zTXt -#endif -#ifndef PNG_NO_WRITE_bKGD -# define PNG_WRITE_bKGD_SUPPORTED -# ifndef PNG_bKGD_SUPPORTED -# define PNG_bKGD_SUPPORTED -# endif -#endif -#ifndef PNG_NO_WRITE_cHRM -# define PNG_WRITE_cHRM_SUPPORTED -# ifndef PNG_cHRM_SUPPORTED -# define PNG_cHRM_SUPPORTED -# endif -#endif -#ifndef PNG_NO_WRITE_gAMA -# define PNG_WRITE_gAMA_SUPPORTED -# ifndef PNG_gAMA_SUPPORTED -# define PNG_gAMA_SUPPORTED -# endif -#endif -#ifndef PNG_NO_WRITE_hIST -# define PNG_WRITE_hIST_SUPPORTED -# ifndef PNG_hIST_SUPPORTED -# define PNG_hIST_SUPPORTED -# endif -#endif -#ifndef PNG_NO_WRITE_iCCP -# define PNG_WRITE_iCCP_SUPPORTED -# ifndef PNG_iCCP_SUPPORTED -# define PNG_iCCP_SUPPORTED -# endif -#endif -#ifndef PNG_NO_WRITE_iTXt -# ifndef PNG_WRITE_iTXt_SUPPORTED -# define PNG_WRITE_iTXt_SUPPORTED -# endif -# ifndef PNG_iTXt_SUPPORTED -# define PNG_iTXt_SUPPORTED -# endif -#endif -#ifndef PNG_NO_WRITE_oFFs -# define PNG_WRITE_oFFs_SUPPORTED -# ifndef PNG_oFFs_SUPPORTED -# define PNG_oFFs_SUPPORTED -# endif -#endif -#ifndef PNG_NO_WRITE_pCAL -# define PNG_WRITE_pCAL_SUPPORTED -# ifndef PNG_pCAL_SUPPORTED -# define PNG_pCAL_SUPPORTED -# endif -#endif -#ifndef PNG_NO_WRITE_sCAL -# define PNG_WRITE_sCAL_SUPPORTED -# ifndef PNG_sCAL_SUPPORTED -# define PNG_sCAL_SUPPORTED -# endif -#endif -#ifndef PNG_NO_WRITE_pHYs -# define PNG_WRITE_pHYs_SUPPORTED -# ifndef PNG_pHYs_SUPPORTED -# define PNG_pHYs_SUPPORTED -# endif -#endif -#ifndef PNG_NO_WRITE_sBIT -# define PNG_WRITE_sBIT_SUPPORTED -# ifndef PNG_sBIT_SUPPORTED -# define PNG_sBIT_SUPPORTED -# endif -#endif -#ifndef PNG_NO_WRITE_sPLT -# define PNG_WRITE_sPLT_SUPPORTED -# ifndef PNG_sPLT_SUPPORTED -# define PNG_sPLT_SUPPORTED -# endif -#endif -#ifndef PNG_NO_WRITE_sRGB -# define PNG_WRITE_sRGB_SUPPORTED -# ifndef PNG_sRGB_SUPPORTED -# define PNG_sRGB_SUPPORTED -# endif -#endif -#ifndef PNG_NO_WRITE_tEXt -# define PNG_WRITE_tEXt_SUPPORTED -# ifndef PNG_tEXt_SUPPORTED -# define PNG_tEXt_SUPPORTED -# endif -#endif -#ifndef PNG_NO_WRITE_tIME -# define PNG_WRITE_tIME_SUPPORTED -# ifndef PNG_tIME_SUPPORTED -# define PNG_tIME_SUPPORTED -# endif -#endif -#ifndef PNG_NO_WRITE_tRNS -# define PNG_WRITE_tRNS_SUPPORTED -# ifndef PNG_tRNS_SUPPORTED -# define PNG_tRNS_SUPPORTED -# endif -#endif -#ifndef PNG_NO_WRITE_zTXt -# define PNG_WRITE_zTXt_SUPPORTED -# ifndef PNG_zTXt_SUPPORTED -# define PNG_zTXt_SUPPORTED -# endif -#endif -#ifndef PNG_NO_WRITE_UNKNOWN_CHUNKS -# define PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED -# ifndef PNG_UNKNOWN_CHUNKS_SUPPORTED -# define PNG_UNKNOWN_CHUNKS_SUPPORTED -# endif -# ifndef PNG_NO_HANDLE_AS_UNKNOWN -# ifndef PNG_HANDLE_AS_UNKNOWN_SUPPORTED -# define PNG_HANDLE_AS_UNKNOWN_SUPPORTED -# endif -# endif -#endif -#if defined(PNG_WRITE_iTXt_SUPPORTED) || defined(PNG_WRITE_tEXt_SUPPORTED) || \ - defined(PNG_WRITE_zTXt_SUPPORTED) -# define PNG_WRITE_TEXT_SUPPORTED -# ifndef PNG_TEXT_SUPPORTED -# define PNG_TEXT_SUPPORTED -# endif -#endif - -#endif /* PNG_WRITE_ANCILLARY_CHUNKS_SUPPORTED */ - -/* Turn this off to disable png_read_png() and - * png_write_png() and leave the row_pointers member - * out of the info structure. - */ -#ifndef PNG_NO_INFO_IMAGE -# define PNG_INFO_IMAGE_SUPPORTED -#endif - -/* need the time information for reading tIME chunks */ -#if defined(PNG_tIME_SUPPORTED) -# if !defined(_WIN32_WCE) - /* "time.h" functions are not supported on WindowsCE */ -# include -# endif -#endif - -/* Some typedefs to get us started. These should be safe on most of the - * common platforms. The typedefs should be at least as large as the - * numbers suggest (a png_uint_32 must be at least 32 bits long), but they - * don't have to be exactly that size. Some compilers dislike passing - * unsigned shorts as function parameters, so you may be better off using - * unsigned int for png_uint_16. Likewise, for 64-bit systems, you may - * want to have unsigned int for png_uint_32 instead of unsigned long. - */ - -typedef unsigned long png_uint_32; -typedef long png_int_32; -typedef unsigned short png_uint_16; -typedef short png_int_16; -typedef unsigned char png_byte; - -/* This is usually size_t. It is typedef'ed just in case you need it to - change (I'm not sure if you will or not, so I thought I'd be safe) */ -#ifdef PNG_SIZE_T - typedef PNG_SIZE_T png_size_t; -# define png_sizeof(x) png_convert_size(sizeof (x)) -#else - typedef size_t png_size_t; -# define png_sizeof(x) sizeof (x) -#endif - -/* The following is needed for medium model support. It cannot be in the - * PNG_INTERNAL section. Needs modification for other compilers besides - * MSC. Model independent support declares all arrays and pointers to be - * large using the far keyword. The zlib version used must also support - * model independent data. As of version zlib 1.0.4, the necessary changes - * have been made in zlib. The USE_FAR_KEYWORD define triggers other - * changes that are needed. (Tim Wegner) - */ - -/* Separate compiler dependencies (problem here is that zlib.h always - defines FAR. (SJT) */ -#ifdef __BORLANDC__ -# if defined(__LARGE__) || defined(__HUGE__) || defined(__COMPACT__) -# define LDATA 1 -# else -# define LDATA 0 -# endif - /* GRR: why is Cygwin in here? Cygwin is not Borland C... */ -# if !defined(__WIN32__) && !defined(__FLAT__) && !defined(__CYGWIN__) -# define PNG_MAX_MALLOC_64K -# if (LDATA != 1) -# ifndef FAR -# define FAR __far -# endif -# define USE_FAR_KEYWORD -# endif /* LDATA != 1 */ - /* Possibly useful for moving data out of default segment. - * Uncomment it if you want. Could also define FARDATA as - * const if your compiler supports it. (SJT) -# define FARDATA FAR - */ -# endif /* __WIN32__, __FLAT__, __CYGWIN__ */ -#endif /* __BORLANDC__ */ - - -/* Suggest testing for specific compiler first before testing for - * FAR. The Watcom compiler defines both __MEDIUM__ and M_I86MM, - * making reliance oncertain keywords suspect. (SJT) - */ - -/* MSC Medium model */ -#if defined(FAR) -# if defined(M_I86MM) -# define USE_FAR_KEYWORD -# define FARDATA FAR -# include -# endif -#endif - -/* SJT: default case */ -#ifndef FAR -# define FAR -#endif - -/* At this point FAR is always defined */ -#ifndef FARDATA -# define FARDATA -#endif - -/* Typedef for floating-point numbers that are converted - to fixed-point with a multiple of 100,000, e.g., int_gamma */ -typedef png_int_32 png_fixed_point; - -/* Add typedefs for pointers */ -typedef void FAR * png_voidp; -typedef png_byte FAR * png_bytep; -typedef png_uint_32 FAR * png_uint_32p; -typedef png_int_32 FAR * png_int_32p; -typedef png_uint_16 FAR * png_uint_16p; -typedef png_int_16 FAR * png_int_16p; -typedef PNG_CONST char FAR * png_const_charp; -typedef char FAR * png_charp; -typedef png_fixed_point FAR * png_fixed_point_p; - -#ifndef PNG_NO_STDIO -#if defined(_WIN32_WCE) -typedef HANDLE png_FILE_p; -#else -typedef FILE * png_FILE_p; -#endif -#endif - -#ifdef PNG_FLOATING_POINT_SUPPORTED -typedef double FAR * png_doublep; -#endif - -/* Pointers to pointers; i.e. arrays */ -typedef png_byte FAR * FAR * png_bytepp; -typedef png_uint_32 FAR * FAR * png_uint_32pp; -typedef png_int_32 FAR * FAR * png_int_32pp; -typedef png_uint_16 FAR * FAR * png_uint_16pp; -typedef png_int_16 FAR * FAR * png_int_16pp; -typedef PNG_CONST char FAR * FAR * png_const_charpp; -typedef char FAR * FAR * png_charpp; -typedef png_fixed_point FAR * FAR * png_fixed_point_pp; -#ifdef PNG_FLOATING_POINT_SUPPORTED -typedef double FAR * FAR * png_doublepp; -#endif - -/* Pointers to pointers to pointers; i.e., pointer to array */ -typedef char FAR * FAR * FAR * png_charppp; - -#if 0 -/* SPC - Is this stuff deprecated? */ -/* It'll be removed as of libpng-1.3.0 - GR-P */ -/* libpng typedefs for types in zlib. If zlib changes - * or another compression library is used, then change these. - * Eliminates need to change all the source files. - */ -typedef charf * png_zcharp; -typedef charf * FAR * png_zcharpp; -typedef z_stream FAR * png_zstreamp; -#endif /* (PNG_1_0_X) || defined(PNG_1_2_X) */ - -/* - * Define PNG_BUILD_DLL if the module being built is a Windows - * LIBPNG DLL. - * - * Define PNG_USE_DLL if you want to *link* to the Windows LIBPNG DLL. - * It is equivalent to Microsoft predefined macro _DLL that is - * automatically defined when you compile using the share - * version of the CRT (C Run-Time library) - * - * The cygwin mods make this behavior a little different: - * Define PNG_BUILD_DLL if you are building a dll for use with cygwin - * Define PNG_STATIC if you are building a static library for use with cygwin, - * -or- if you are building an application that you want to link to the - * static library. - * PNG_USE_DLL is defined by default (no user action needed) unless one of - * the other flags is defined. - */ - -#if !defined(PNG_DLL) && (defined(PNG_BUILD_DLL) || defined(PNG_USE_DLL)) -# define PNG_DLL -#endif -/* If CYGWIN, then disallow GLOBAL ARRAYS unless building a static lib. - * When building a static lib, default to no GLOBAL ARRAYS, but allow - * command-line override - */ -#if defined(__CYGWIN__) -# if !defined(PNG_STATIC) -# if defined(PNG_USE_GLOBAL_ARRAYS) -# undef PNG_USE_GLOBAL_ARRAYS -# endif -# if !defined(PNG_USE_LOCAL_ARRAYS) -# define PNG_USE_LOCAL_ARRAYS -# endif -# else -# if defined(PNG_USE_LOCAL_ARRAYS) || defined(PNG_NO_GLOBAL_ARRAYS) -# if defined(PNG_USE_GLOBAL_ARRAYS) -# undef PNG_USE_GLOBAL_ARRAYS -# endif -# endif -# endif -# if !defined(PNG_USE_LOCAL_ARRAYS) && !defined(PNG_USE_GLOBAL_ARRAYS) -# define PNG_USE_LOCAL_ARRAYS -# endif -#endif - -/* Do not use global arrays (helps with building DLL's) - * They are no longer used in libpng itself, since version 1.0.5c, - * but might be required for some pre-1.0.5c applications. - */ -#if !defined(PNG_USE_LOCAL_ARRAYS) && !defined(PNG_USE_GLOBAL_ARRAYS) -# if defined(PNG_NO_GLOBAL_ARRAYS) || \ - (defined(__GNUC__) && defined(PNG_DLL)) || defined(_MSC_VER) -# define PNG_USE_LOCAL_ARRAYS -# else -# define PNG_USE_GLOBAL_ARRAYS -# endif -#endif - -#if defined(__CYGWIN__) -# undef PNGAPI -# define PNGAPI __cdecl -# undef PNG_IMPEXP -# define PNG_IMPEXP -#endif - -/* If you define PNGAPI, e.g., with compiler option "-DPNGAPI=__stdcall", - * you may get warnings regarding the linkage of png_zalloc and png_zfree. - * Don't ignore those warnings; you must also reset the default calling - * convention in your compiler to match your PNGAPI, and you must build - * zlib and your applications the same way you build libpng. - */ - -#if defined(__MINGW32__) && !defined(PNG_MODULEDEF) -# ifndef PNG_NO_MODULEDEF -# define PNG_NO_MODULEDEF -# endif -#endif - -#if !defined(PNG_IMPEXP) && defined(PNG_BUILD_DLL) && !defined(PNG_NO_MODULEDEF) -# define PNG_IMPEXP -#endif - -#if defined(PNG_DLL) || defined(_DLL) || defined(__DLL__ ) || \ - (( defined(_Windows) || defined(_WINDOWS) || \ - defined(WIN32) || defined(_WIN32) || defined(__WIN32__) )) - -# ifndef PNGAPI -# if defined(__GNUC__) || (defined (_MSC_VER) && (_MSC_VER >= 800)) -# define PNGAPI __cdecl -# else -# define PNGAPI _cdecl -# endif -# endif - -# if !defined(PNG_IMPEXP) && (!defined(PNG_DLL) || \ - 0 /* WINCOMPILER_WITH_NO_SUPPORT_FOR_DECLIMPEXP */) -# define PNG_IMPEXP -# endif - -# if !defined(PNG_IMPEXP) - -# define PNG_EXPORT_TYPE1(type,symbol) PNG_IMPEXP type PNGAPI symbol -# define PNG_EXPORT_TYPE2(type,symbol) type PNG_IMPEXP PNGAPI symbol - - /* Borland/Microsoft */ -# if defined(_MSC_VER) || defined(__BORLANDC__) -# if (_MSC_VER >= 800) || (__BORLANDC__ >= 0x500) -# define PNG_EXPORT PNG_EXPORT_TYPE1 -# else -# define PNG_EXPORT PNG_EXPORT_TYPE2 -# if defined(PNG_BUILD_DLL) -# define PNG_IMPEXP __export -# else -# define PNG_IMPEXP /*__import */ /* doesn't exist AFAIK in - VC++ */ -# endif /* Exists in Borland C++ for - C++ classes (== huge) */ -# endif -# endif - -# if !defined(PNG_IMPEXP) -# if defined(PNG_BUILD_DLL) -# define PNG_IMPEXP __declspec(dllexport) -# else -# define PNG_IMPEXP __declspec(dllimport) -# endif -# endif -# endif /* PNG_IMPEXP */ -#else /* !(DLL || non-cygwin WINDOWS) */ -# if (defined(__IBMC__) || defined(__IBMCPP__)) && defined(__OS2__) -# ifndef PNGAPI -# define PNGAPI _System -# endif -# else -# if 0 /* ... other platforms, with other meanings */ -# endif -# endif -#endif - -#ifndef PNGAPI -# define PNGAPI -#endif -#ifndef PNG_IMPEXP -# define PNG_IMPEXP -#endif - -#ifdef PNG_BUILDSYMS -# ifndef PNG_EXPORT -# define PNG_EXPORT(type,symbol) PNG_FUNCTION_EXPORT symbol END -# endif -# ifdef PNG_USE_GLOBAL_ARRAYS -# ifndef PNG_EXPORT_VAR -# define PNG_EXPORT_VAR(type) PNG_DATA_EXPORT -# endif -# endif -#endif - -#ifndef PNG_EXPORT -# define PNG_EXPORT(type,symbol) PNG_IMPEXP type PNGAPI symbol -#endif - -#ifdef PNG_USE_GLOBAL_ARRAYS -# ifndef PNG_EXPORT_VAR -# define PNG_EXPORT_VAR(type) extern PNG_IMPEXP type -# endif -#endif - -/* User may want to use these so they are not in PNG_INTERNAL. Any library - * functions that are passed far data must be model independent. - */ - -#ifndef PNG_ABORT -# define PNG_ABORT() abort() -#endif - -#ifdef PNG_SETJMP_SUPPORTED -# define png_jmpbuf(png_ptr) ((png_ptr)->jmpbuf) -#else -# define png_jmpbuf(png_ptr) \ - (LIBPNG_WAS_COMPILED_WITH__PNG_SETJMP_NOT_SUPPORTED) -#endif - -#if defined(USE_FAR_KEYWORD) /* memory model independent fns */ -/* use this to make far-to-near assignments */ -# define CHECK 1 -# define NOCHECK 0 -# define CVT_PTR(ptr) (png_far_to_near(png_ptr,ptr,CHECK)) -# define CVT_PTR_NOCHECK(ptr) (png_far_to_near(png_ptr,ptr,NOCHECK)) -# define png_snprintf _fsnprintf /* Added to v 1.2.19 */ -# define png_strcpy _fstrcpy -# define png_strncpy _fstrncpy /* Added to v 1.2.6 */ -# define png_strlen _fstrlen -# define png_memcmp _fmemcmp /* SJT: added */ -# define png_memcpy _fmemcpy -# define png_memset _fmemset -#else /* use the usual functions */ -# define CVT_PTR(ptr) (ptr) -# define CVT_PTR_NOCHECK(ptr) (ptr) -# ifndef PNG_NO_SNPRINTF -# ifdef _MSC_VER -# define png_snprintf _snprintf /* Added to v 1.2.19 */ -# define png_snprintf2 _snprintf -# define png_snprintf6 _snprintf -# else -# define png_snprintf snprintf /* Added to v 1.2.19 */ -# define png_snprintf2 snprintf -# define png_snprintf6 snprintf -# endif -# else - /* You don't have or don't want to use snprintf(). Caution: Using - * sprintf instead of snprintf exposes your application to accidental - * or malevolent buffer overflows. If you don't have snprintf() - * as a general rule you should provide one (you can get one from - * Portable OpenSSH). */ -# define png_snprintf(s1,n,fmt,x1) sprintf(s1,fmt,x1) -# define png_snprintf2(s1,n,fmt,x1,x2) sprintf(s1,fmt,x1,x2) -# define png_snprintf6(s1,n,fmt,x1,x2,x3,x4,x5,x6) \ - sprintf(s1,fmt,x1,x2,x3,x4,x5,x6) -# endif -# define png_strcpy strcpy -# define png_strncpy strncpy /* Added to v 1.2.6 */ -# define png_strlen strlen -# define png_memcmp memcmp /* SJT: added */ -# define png_memcpy memcpy -# define png_memset memset -#endif -/* End of memory model independent support */ - -/* 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 - -/* Added at libpng-1.2.8 */ -#endif /* PNG_VERSION_INFO_ONLY */ - -#endif /* PNGCONF_H */ diff --git a/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngerror.c b/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngerror.c deleted file mode 100644 index 70336bd8..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngerror.c +++ /dev/null @@ -1,341 +0,0 @@ - -/* pngerror.c - stub functions for i/o and memory allocation - * - * Last changed in libpng 1.2.20 October 4, 2007 - * For conditions of distribution and use, see copyright notice in png.h - * Copyright (c) 1998-2007 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 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. - */ - -#define PNG_INTERNAL -#include "png.h" - -#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) -static void /* PRIVATE */ -png_default_error PNGARG((png_structp png_ptr, - png_const_charp error_message)); -#ifndef PNG_NO_WARNINGS -static void /* PRIVATE */ -png_default_warning PNGARG((png_structp png_ptr, - png_const_charp warning_message)); -#endif /* PNG_NO_WARNINGS */ - -/* 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. - */ -#ifndef PNG_NO_ERROR_TEXT -void PNGAPI -png_error(png_structp png_ptr, png_const_charp error_message) -{ -#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 == '#') - { - 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; iflags&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_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 -void PNGAPI -png_err(png_structp png_ptr) -{ - if (png_ptr != NULL && png_ptr->error_fn != NULL) - (*(png_ptr->error_fn))(png_ptr, '\0'); - - /* If the custom handler doesn't exist, or if it returns, - use the default handler, which will not return. */ - png_default_error(png_ptr, '\0'); -} -#endif /* PNG_NO_ERROR_TEXT */ - -#ifndef PNG_NO_WARNINGS -/* 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_structp 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 == '#') - { - 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_ptr, warning_message+offset); - } - else - png_default_warning(png_ptr, warning_message+offset); -} -#endif /* PNG_NO_WARNINGS */ - - -/* 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' -};*/ - -#if !defined(PNG_NO_WARNINGS) || !defined(PNG_NO_ERROR_TEXT) -static void /* PRIVATE */ -png_format_buffer(png_structp png_ptr, png_charp buffer, png_const_charp - error_message) -{ - int iout = 0, iin = 0; - - while (iin < 4) - { - int c = png_ptr->chunk_name[iin++]; - if (isnonalpha(c)) - { - buffer[iout++] = '['; - buffer[iout++] = png_digit[(c & 0xf0) >> 4]; - buffer[iout++] = png_digit[c & 0x0f]; - buffer[iout++] = ']'; - } - else - { - buffer[iout++] = (png_byte)c; - } - } - - if (error_message == NULL) - buffer[iout] = 0; - else - { - buffer[iout++] = ':'; - buffer[iout++] = ' '; - png_strncpy(buffer+iout, error_message, 63); - buffer[iout+63] = 0; - } -} - -#ifdef PNG_READ_SUPPORTED -void PNGAPI -png_chunk_error(png_structp png_ptr, png_const_charp error_message) -{ - char msg[18+64]; - 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 */ -#endif /* !defined(PNG_NO_WARNINGS) || !defined(PNG_NO_ERROR_TEXT) */ - -#ifndef PNG_NO_WARNINGS -void PNGAPI -png_chunk_warning(png_structp png_ptr, png_const_charp warning_message) -{ - char msg[18+64]; - 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_NO_WARNINGS */ - - -/* 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 void /* PRIVATE */ -png_default_error(png_structp, png_const_charp error_message) -{ -#ifndef PNG_NO_CONSOLE_IO -#ifdef PNG_ERROR_NUMBERS_SUPPORTED - if (*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\n", error_number, - error_message+offset); - } - else - fprintf(stderr, "libpng error: %s, offset=%d\n", error_message,offset); - } - else -#endif - fprintf(stderr, "libpng error: %s\n", error_message); -#endif - -#ifdef PNG_SETJMP_SUPPORTED - if (png_ptr) - { -# ifdef USE_FAR_KEYWORD - { - jmp_buf jmpbuf; - png_memcpy(jmpbuf, png_ptr->jmpbuf, png_sizeof(jmp_buf)); - longjmp(jmpbuf, 1); - } -# else - longjmp(png_ptr->jmpbuf, 1); -# endif - } -#else - PNG_ABORT(); -#endif -#ifdef PNG_NO_CONSOLE_IO - error_message = error_message; /* make compiler happy */ -#endif -} - -#ifndef PNG_NO_WARNINGS -/* 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_structp png_ptr, png_const_charp warning_message) -{ -#ifndef PNG_NO_CONSOLE_IO -# ifdef PNG_ERROR_NUMBERS_SUPPORTED - if (*warning_message == '#') - { - 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\n", warning_number, - warning_message+offset); - } - else - fprintf(stderr, "libpng warning: %s\n", warning_message); - } - else -# endif - fprintf(stderr, "libpng warning: %s\n", warning_message); -#else - warning_message = warning_message; /* make compiler happy */ -#endif - png_ptr = png_ptr; /* make compiler happy */ -} -#endif /* PNG_NO_WARNINGS */ - -/* 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->jmpbuf, 1) - */ -void PNGAPI -png_set_error_fn(png_structp 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; - png_ptr->warning_fn = warning_fn; -} - - -/* 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_structp 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_structp 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 -#endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */ diff --git a/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngget.c b/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngget.c deleted file mode 100644 index 36be6a6c..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngget.c +++ /dev/null @@ -1,901 +0,0 @@ - -/* pngget.c - retrieval of values from info struct - * - * Last changed in libpng 1.2.15 January 5, 2007 - * For conditions of distribution and use, see copyright notice in png.h - * Copyright (c) 1998-2007 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.) - */ - -#define PNG_INTERNAL -#include "png.h" - -#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) - -png_uint_32 PNGAPI -png_get_valid(png_structp png_ptr, png_infop info_ptr, png_uint_32 flag) -{ - if (png_ptr != NULL && info_ptr != NULL) - return(info_ptr->valid & flag); - else - return(0); -} - -png_uint_32 PNGAPI -png_get_rowbytes(png_structp png_ptr, png_infop info_ptr) -{ - if (png_ptr != NULL && info_ptr != NULL) - return(info_ptr->rowbytes); - else - return(0); -} - -#if defined(PNG_INFO_IMAGE_SUPPORTED) -png_bytepp PNGAPI -png_get_rows(png_structp png_ptr, png_infop info_ptr) -{ - if (png_ptr != NULL && info_ptr != NULL) - return(info_ptr->row_pointers); - else - 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_structp png_ptr, png_infop info_ptr) -{ - if (png_ptr != NULL && info_ptr != NULL) - { - return info_ptr->width; - } - return (0); -} - -png_uint_32 PNGAPI -png_get_image_height(png_structp png_ptr, png_infop info_ptr) -{ - if (png_ptr != NULL && info_ptr != NULL) - { - return info_ptr->height; - } - return (0); -} - -png_byte PNGAPI -png_get_bit_depth(png_structp png_ptr, png_infop info_ptr) -{ - if (png_ptr != NULL && info_ptr != NULL) - { - return info_ptr->bit_depth; - } - return (0); -} - -png_byte PNGAPI -png_get_color_type(png_structp png_ptr, png_infop info_ptr) -{ - if (png_ptr != NULL && info_ptr != NULL) - { - return info_ptr->color_type; - } - return (0); -} - -png_byte PNGAPI -png_get_filter_type(png_structp png_ptr, png_infop info_ptr) -{ - if (png_ptr != NULL && info_ptr != NULL) - { - return info_ptr->filter_type; - } - return (0); -} - -png_byte PNGAPI -png_get_interlace_type(png_structp png_ptr, png_infop info_ptr) -{ - if (png_ptr != NULL && info_ptr != NULL) - { - return info_ptr->interlace_type; - } - return (0); -} - -png_byte PNGAPI -png_get_compression_type(png_structp png_ptr, png_infop 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_structp png_ptr, png_infop info_ptr) -{ - if (png_ptr != NULL && info_ptr != NULL) -#if defined(PNG_pHYs_SUPPORTED) - if (info_ptr->valid & PNG_INFO_pHYs) - { - png_debug1(1, "in %s retrieval function\n", "png_get_x_pixels_per_meter"); - if(info_ptr->phys_unit_type != PNG_RESOLUTION_METER) - return (0); - else return (info_ptr->x_pixels_per_unit); - } -#else - return (0); -#endif - return (0); -} - -png_uint_32 PNGAPI -png_get_y_pixels_per_meter(png_structp png_ptr, png_infop info_ptr) -{ - if (png_ptr != NULL && info_ptr != NULL) -#if defined(PNG_pHYs_SUPPORTED) - if (info_ptr->valid & PNG_INFO_pHYs) - { - png_debug1(1, "in %s retrieval function\n", "png_get_y_pixels_per_meter"); - if(info_ptr->phys_unit_type != PNG_RESOLUTION_METER) - return (0); - else return (info_ptr->y_pixels_per_unit); - } -#else - return (0); -#endif - return (0); -} - -png_uint_32 PNGAPI -png_get_pixels_per_meter(png_structp png_ptr, png_infop info_ptr) -{ - if (png_ptr != NULL && info_ptr != NULL) -#if defined(PNG_pHYs_SUPPORTED) - if (info_ptr->valid & PNG_INFO_pHYs) - { - png_debug1(1, "in %s retrieval function\n", "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 (0); - else return (info_ptr->x_pixels_per_unit); - } -#else - return (0); -#endif - return (0); -} - -#ifdef PNG_FLOATING_POINT_SUPPORTED -float PNGAPI -png_get_pixel_aspect_ratio(png_structp png_ptr, png_infop info_ptr) - { - if (png_ptr != NULL && info_ptr != NULL) -#if defined(PNG_pHYs_SUPPORTED) - if (info_ptr->valid & PNG_INFO_pHYs) - { - png_debug1(1, "in %s retrieval function\n", "png_get_aspect_ratio"); - if (info_ptr->x_pixels_per_unit == 0) - return ((float)0.0); - else - return ((float)((float)info_ptr->y_pixels_per_unit - /(float)info_ptr->x_pixels_per_unit)); - } -#else - return (0.0); -#endif - return ((float)0.0); -} -#endif - -png_int_32 PNGAPI -png_get_x_offset_microns(png_structp png_ptr, png_infop info_ptr) -{ - if (png_ptr != NULL && info_ptr != NULL) -#if defined(PNG_oFFs_SUPPORTED) - if (info_ptr->valid & PNG_INFO_oFFs) - { - png_debug1(1, "in %s retrieval function\n", "png_get_x_offset_microns"); - if(info_ptr->offset_unit_type != PNG_OFFSET_MICROMETER) - return (0); - else return (info_ptr->x_offset); - } -#else - return (0); -#endif - return (0); -} - -png_int_32 PNGAPI -png_get_y_offset_microns(png_structp png_ptr, png_infop info_ptr) -{ - if (png_ptr != NULL && info_ptr != NULL) -#if defined(PNG_oFFs_SUPPORTED) - if (info_ptr->valid & PNG_INFO_oFFs) - { - png_debug1(1, "in %s retrieval function\n", "png_get_y_offset_microns"); - if(info_ptr->offset_unit_type != PNG_OFFSET_MICROMETER) - return (0); - else return (info_ptr->y_offset); - } -#else - return (0); -#endif - return (0); -} - -png_int_32 PNGAPI -png_get_x_offset_pixels(png_structp png_ptr, png_infop info_ptr) -{ - if (png_ptr != NULL && info_ptr != NULL) -#if defined(PNG_oFFs_SUPPORTED) - if (info_ptr->valid & PNG_INFO_oFFs) - { - png_debug1(1, "in %s retrieval function\n", "png_get_x_offset_microns"); - if(info_ptr->offset_unit_type != PNG_OFFSET_PIXEL) - return (0); - else return (info_ptr->x_offset); - } -#else - return (0); -#endif - return (0); -} - -png_int_32 PNGAPI -png_get_y_offset_pixels(png_structp png_ptr, png_infop info_ptr) -{ - if (png_ptr != NULL && info_ptr != NULL) -#if defined(PNG_oFFs_SUPPORTED) - if (info_ptr->valid & PNG_INFO_oFFs) - { - png_debug1(1, "in %s retrieval function\n", "png_get_y_offset_microns"); - if(info_ptr->offset_unit_type != PNG_OFFSET_PIXEL) - return (0); - else return (info_ptr->y_offset); - } -#else - return (0); -#endif - return (0); -} - -#if defined(PNG_INCH_CONVERSIONS) && defined(PNG_FLOATING_POINT_SUPPORTED) -png_uint_32 PNGAPI -png_get_pixels_per_inch(png_structp png_ptr, png_infop info_ptr) -{ - return ((png_uint_32)((float)png_get_pixels_per_meter(png_ptr, info_ptr) - *.0254 +.5)); -} - -png_uint_32 PNGAPI -png_get_x_pixels_per_inch(png_structp png_ptr, png_infop info_ptr) -{ - return ((png_uint_32)((float)png_get_x_pixels_per_meter(png_ptr, info_ptr) - *.0254 +.5)); -} - -png_uint_32 PNGAPI -png_get_y_pixels_per_inch(png_structp png_ptr, png_infop info_ptr) -{ - return ((png_uint_32)((float)png_get_y_pixels_per_meter(png_ptr, info_ptr) - *.0254 +.5)); -} - -float PNGAPI -png_get_x_offset_inches(png_structp png_ptr, png_infop info_ptr) -{ - return ((float)png_get_x_offset_microns(png_ptr, info_ptr) - *.00003937); -} - -float PNGAPI -png_get_y_offset_inches(png_structp png_ptr, png_infop info_ptr) -{ - return ((float)png_get_y_offset_microns(png_ptr, info_ptr) - *.00003937); -} - -#if defined(PNG_pHYs_SUPPORTED) -png_uint_32 PNGAPI -png_get_pHYs_dpi(png_structp png_ptr, png_infop 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\n", "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 && PNG_FLOATING_POINT_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_structp png_ptr, png_infop info_ptr) -{ - if (png_ptr != NULL && info_ptr != NULL) - return(info_ptr->channels); - else - return (0); -} - -png_bytep PNGAPI -png_get_signature(png_structp png_ptr, png_infop info_ptr) -{ - if (png_ptr != NULL && info_ptr != NULL) - return(info_ptr->signature); - else - return (NULL); -} - -#if defined(PNG_bKGD_SUPPORTED) -png_uint_32 PNGAPI -png_get_bKGD(png_structp png_ptr, png_infop 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\n", "bKGD"); - *background = &(info_ptr->background); - return (PNG_INFO_bKGD); - } - return (0); -} -#endif - -#if defined(PNG_cHRM_SUPPORTED) -#ifdef PNG_FLOATING_POINT_SUPPORTED -png_uint_32 PNGAPI -png_get_cHRM(png_structp png_ptr, png_infop 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) -{ - if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_cHRM)) - { - png_debug1(1, "in %s retrieval function\n", "cHRM"); - if (white_x != NULL) - *white_x = (double)info_ptr->x_white; - if (white_y != NULL) - *white_y = (double)info_ptr->y_white; - if (red_x != NULL) - *red_x = (double)info_ptr->x_red; - if (red_y != NULL) - *red_y = (double)info_ptr->y_red; - if (green_x != NULL) - *green_x = (double)info_ptr->x_green; - if (green_y != NULL) - *green_y = (double)info_ptr->y_green; - if (blue_x != NULL) - *blue_x = (double)info_ptr->x_blue; - if (blue_y != NULL) - *blue_y = (double)info_ptr->y_blue; - return (PNG_INFO_cHRM); - } - return (0); -} -#endif -#ifdef PNG_FIXED_POINT_SUPPORTED -png_uint_32 PNGAPI -png_get_cHRM_fixed(png_structp png_ptr, png_infop 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) -{ - if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_cHRM)) - { - png_debug1(1, "in %s retrieval function\n", "cHRM"); - if (white_x != NULL) - *white_x = info_ptr->int_x_white; - if (white_y != NULL) - *white_y = info_ptr->int_y_white; - if (red_x != NULL) - *red_x = info_ptr->int_x_red; - if (red_y != NULL) - *red_y = info_ptr->int_y_red; - if (green_x != NULL) - *green_x = info_ptr->int_x_green; - if (green_y != NULL) - *green_y = info_ptr->int_y_green; - if (blue_x != NULL) - *blue_x = info_ptr->int_x_blue; - if (blue_y != NULL) - *blue_y = info_ptr->int_y_blue; - return (PNG_INFO_cHRM); - } - return (0); -} -#endif -#endif - -#if defined(PNG_gAMA_SUPPORTED) -#ifdef PNG_FLOATING_POINT_SUPPORTED -png_uint_32 PNGAPI -png_get_gAMA(png_structp png_ptr, png_infop info_ptr, double *file_gamma) -{ - if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_gAMA) - && file_gamma != NULL) - { - png_debug1(1, "in %s retrieval function\n", "gAMA"); - *file_gamma = (double)info_ptr->gamma; - return (PNG_INFO_gAMA); - } - return (0); -} -#endif -#ifdef PNG_FIXED_POINT_SUPPORTED -png_uint_32 PNGAPI -png_get_gAMA_fixed(png_structp png_ptr, png_infop info_ptr, - png_fixed_point *int_file_gamma) -{ - if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_gAMA) - && int_file_gamma != NULL) - { - png_debug1(1, "in %s retrieval function\n", "gAMA"); - *int_file_gamma = info_ptr->int_gamma; - return (PNG_INFO_gAMA); - } - return (0); -} -#endif -#endif - -#if defined(PNG_sRGB_SUPPORTED) -png_uint_32 PNGAPI -png_get_sRGB(png_structp png_ptr, png_infop info_ptr, int *file_srgb_intent) -{ - if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_sRGB) - && file_srgb_intent != NULL) - { - png_debug1(1, "in %s retrieval function\n", "sRGB"); - *file_srgb_intent = (int)info_ptr->srgb_intent; - return (PNG_INFO_sRGB); - } - return (0); -} -#endif - -#if defined(PNG_iCCP_SUPPORTED) -png_uint_32 PNGAPI -png_get_iCCP(png_structp png_ptr, png_infop info_ptr, - png_charpp name, int *compression_type, - png_charpp profile, png_uint_32 *proflen) -{ - if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_iCCP) - && name != NULL && profile != NULL && proflen != NULL) - { - png_debug1(1, "in %s retrieval function\n", "iCCP"); - *name = info_ptr->iccp_name; - *profile = info_ptr->iccp_profile; - /* compression_type is a dummy so the API won't have to change - if we introduce multiple compression types later. */ - *proflen = (int)info_ptr->iccp_proflen; - *compression_type = (int)info_ptr->iccp_compression; - return (PNG_INFO_iCCP); - } - return (0); -} -#endif - -#if defined(PNG_sPLT_SUPPORTED) -png_uint_32 PNGAPI -png_get_sPLT(png_structp png_ptr, png_infop info_ptr, - png_sPLT_tpp spalettes) -{ - if (png_ptr != NULL && info_ptr != NULL && spalettes != NULL) - { - *spalettes = info_ptr->splt_palettes; - return ((png_uint_32)info_ptr->splt_palettes_num); - } - return (0); -} -#endif - -#if defined(PNG_hIST_SUPPORTED) -png_uint_32 PNGAPI -png_get_hIST(png_structp png_ptr, png_infop info_ptr, png_uint_16p *hist) -{ - if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_hIST) - && hist != NULL) - { - png_debug1(1, "in %s retrieval function\n", "hIST"); - *hist = info_ptr->hist; - return (PNG_INFO_hIST); - } - return (0); -} -#endif - -png_uint_32 PNGAPI -png_get_IHDR(png_structp png_ptr, png_infop info_ptr, - png_uint_32 *width, png_uint_32 *height, int *bit_depth, - int *color_type, int *interlace_type, int *compression_type, - int *filter_type) - -{ - if (png_ptr != NULL && info_ptr != NULL && width != NULL && height != NULL && - bit_depth != NULL && color_type != NULL) - { - png_debug1(1, "in %s retrieval function\n", "IHDR"); - *width = info_ptr->width; - *height = info_ptr->height; - *bit_depth = info_ptr->bit_depth; - if (info_ptr->bit_depth < 1 || info_ptr->bit_depth > 16) - png_error(png_ptr, "Invalid bit depth"); - *color_type = info_ptr->color_type; - if (info_ptr->color_type > 6) - png_error(png_ptr, "Invalid 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; - - /* check for potential overflow of rowbytes */ - if (*width == 0 || *width > PNG_UINT_31_MAX) - png_error(png_ptr, "Invalid image width"); - if (*height == 0 || *height > PNG_UINT_31_MAX) - png_error(png_ptr, "Invalid image height"); - if (info_ptr->width > (PNG_UINT_32_MAX - >> 3) /* 8-byte RGBA pixels */ - - 64 /* 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 too large for libpng to process image data."); - } - return (1); - } - return (0); -} - -#if defined(PNG_oFFs_SUPPORTED) -png_uint_32 PNGAPI -png_get_oFFs(png_structp png_ptr, png_infop info_ptr, - png_int_32 *offset_x, png_int_32 *offset_y, int *unit_type) -{ - if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_oFFs) - && offset_x != NULL && offset_y != NULL && unit_type != NULL) - { - png_debug1(1, "in %s retrieval function\n", "oFFs"); - *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 - -#if defined(PNG_pCAL_SUPPORTED) -png_uint_32 PNGAPI -png_get_pCAL(png_structp png_ptr, png_infop info_ptr, - png_charp *purpose, png_int_32 *X0, png_int_32 *X1, int *type, int *nparams, - png_charp *units, png_charpp *params) -{ - 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) - { - png_debug1(1, "in %s retrieval function\n", "pCAL"); - *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 - -#if defined(PNG_sCAL_SUPPORTED) -#ifdef PNG_FLOATING_POINT_SUPPORTED -png_uint_32 PNGAPI -png_get_sCAL(png_structp png_ptr, png_infop 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 = info_ptr->scal_pixel_width; - *height = info_ptr->scal_pixel_height; - return (PNG_INFO_sCAL); - } - return(0); -} -#else -#ifdef PNG_FIXED_POINT_SUPPORTED -png_uint_32 PNGAPI -png_get_sCAL_s(png_structp png_ptr, png_infop 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 -#endif -#endif - -#if defined(PNG_pHYs_SUPPORTED) -png_uint_32 PNGAPI -png_get_pHYs(png_structp png_ptr, png_infop 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\n", "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 - -png_uint_32 PNGAPI -png_get_PLTE(png_structp png_ptr, png_infop info_ptr, png_colorp *palette, - int *num_palette) -{ - if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_PLTE) - && palette != NULL) - { - png_debug1(1, "in %s retrieval function\n", "PLTE"); - *palette = info_ptr->palette; - *num_palette = info_ptr->num_palette; - png_debug1(3, "num_palette = %d\n", *num_palette); - return (PNG_INFO_PLTE); - } - return (0); -} - -#if defined(PNG_sBIT_SUPPORTED) -png_uint_32 PNGAPI -png_get_sBIT(png_structp png_ptr, png_infop info_ptr, png_color_8p *sig_bit) -{ - if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_sBIT) - && sig_bit != NULL) - { - png_debug1(1, "in %s retrieval function\n", "sBIT"); - *sig_bit = &(info_ptr->sig_bit); - return (PNG_INFO_sBIT); - } - return (0); -} -#endif - -#if defined(PNG_TEXT_SUPPORTED) -png_uint_32 PNGAPI -png_get_text(png_structp png_ptr, png_infop 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 %s retrieval function\n", - (png_ptr->chunk_name[0] == '\0' ? "text" - : (png_const_charp)png_ptr->chunk_name)); - if (text_ptr != NULL) - *text_ptr = info_ptr->text; - if (num_text != NULL) - *num_text = info_ptr->num_text; - return ((png_uint_32)info_ptr->num_text); - } - if (num_text != NULL) - *num_text = 0; - return(0); -} -#endif - -#if defined(PNG_tIME_SUPPORTED) -png_uint_32 PNGAPI -png_get_tIME(png_structp png_ptr, png_infop info_ptr, png_timep *mod_time) -{ - if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_tIME) - && mod_time != NULL) - { - png_debug1(1, "in %s retrieval function\n", "tIME"); - *mod_time = &(info_ptr->mod_time); - return (PNG_INFO_tIME); - } - return (0); -} -#endif - -#if defined(PNG_tRNS_SUPPORTED) -png_uint_32 PNGAPI -png_get_tRNS(png_structp png_ptr, png_infop info_ptr, - png_bytep *trans, int *num_trans, png_color_16p *trans_values) -{ - png_uint_32 retval = 0; - if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_tRNS)) - { - png_debug1(1, "in %s retrieval function\n", "tRNS"); - if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) - { - if (trans != NULL) - { - *trans = info_ptr->trans; - retval |= PNG_INFO_tRNS; - } - if (trans_values != NULL) - *trans_values = &(info_ptr->trans_values); - } - else /* if (info_ptr->color_type != PNG_COLOR_TYPE_PALETTE) */ - { - if (trans_values != NULL) - { - *trans_values = &(info_ptr->trans_values); - retval |= PNG_INFO_tRNS; - } - if(trans != NULL) - *trans = NULL; - } - if(num_trans != NULL) - { - *num_trans = info_ptr->num_trans; - retval |= PNG_INFO_tRNS; - } - } - return (retval); -} -#endif - -#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) -png_uint_32 PNGAPI -png_get_unknown_chunks(png_structp png_ptr, png_infop info_ptr, - png_unknown_chunkpp unknowns) -{ - if (png_ptr != NULL && info_ptr != NULL && unknowns != NULL) - { - *unknowns = info_ptr->unknown_chunks; - return ((png_uint_32)info_ptr->unknown_chunks_num); - } - return (0); -} -#endif - -#if defined(PNG_READ_RGB_TO_GRAY_SUPPORTED) -png_byte PNGAPI -png_get_rgb_to_gray_status (png_structp png_ptr) -{ - return (png_byte)(png_ptr? png_ptr->rgb_to_gray_status : 0); -} -#endif - -#if defined(PNG_USER_CHUNKS_SUPPORTED) -png_voidp PNGAPI -png_get_user_chunk_ptr(png_structp png_ptr) -{ - return (png_ptr? png_ptr->user_chunk_ptr : NULL); -} -#endif - -#ifdef PNG_WRITE_SUPPORTED -png_uint_32 PNGAPI -png_get_compression_buffer_size(png_structp png_ptr) -{ - return (png_uint_32)(png_ptr? png_ptr->zbuf_size : 0L); -} -#endif - -#ifdef PNG_ASSEMBLER_CODE_SUPPORTED -#ifndef PNG_1_0_X -/* this function was added to libpng 1.2.0 and should exist by default */ -png_uint_32 PNGAPI -png_get_asm_flags (png_structp png_ptr) -{ - /* obsolete, to be removed from libpng-1.4.0 */ - return (png_ptr? 0L: 0L); -} - -/* this function was added to libpng 1.2.0 and should exist by default */ -png_uint_32 PNGAPI -png_get_asm_flagmask (int flag_select) -{ - /* obsolete, to be removed from libpng-1.4.0 */ - flag_select=flag_select; - return 0L; -} - - /* GRR: could add this: && defined(PNG_MMX_CODE_SUPPORTED) */ -/* this function was added to libpng 1.2.0 */ -png_uint_32 PNGAPI -png_get_mmx_flagmask (int flag_select, int *compilerID) -{ - /* obsolete, to be removed from libpng-1.4.0 */ - flag_select=flag_select; - *compilerID = -1; /* unknown (i.e., no asm/MMX code compiled) */ - return 0L; -} - -/* this function was added to libpng 1.2.0 */ -png_byte PNGAPI -png_get_mmx_bitdepth_threshold (png_structp png_ptr) -{ - /* obsolete, to be removed from libpng-1.4.0 */ - return (png_ptr? 0: 0); -} - -/* this function was added to libpng 1.2.0 */ -png_uint_32 PNGAPI -png_get_mmx_rowbytes_threshold (png_structp png_ptr) -{ - /* obsolete, to be removed from libpng-1.4.0 */ - return (png_ptr? 0L: 0L); -} -#endif /* ?PNG_1_0_X */ -#endif /* ?PNG_ASSEMBLER_CODE_SUPPORTED */ - -#ifdef PNG_SET_USER_LIMITS_SUPPORTED -/* these functions were added to libpng 1.2.6 */ -png_uint_32 PNGAPI -png_get_user_width_max (png_structp png_ptr) -{ - return (png_ptr? png_ptr->user_width_max : 0); -} -png_uint_32 PNGAPI -png_get_user_height_max (png_structp png_ptr) -{ - return (png_ptr? png_ptr->user_height_max : 0); -} -#endif /* ?PNG_SET_USER_LIMITS_SUPPORTED */ - - -#endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */ diff --git a/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngmem.c b/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngmem.c deleted file mode 100644 index 6aa70af4..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngmem.c +++ /dev/null @@ -1,608 +0,0 @@ - -/* pngmem.c - stub functions for memory allocation - * - * Last changed in libpng 1.2.13 November 13, 2006 - * For conditions of distribution and use, see copyright notice in png.h - * Copyright (c) 1998-2006 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 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. - */ - -#define PNG_INTERNAL -#include "png.h" - -#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) - -/* Borland DOS special memory handler */ -#if defined(__TURBOC__) && !defined(_Windows) && !defined(__FLAT__) -/* if you change this, be sure to change the one in png.h also */ - -/* Allocate memory for a png_struct. The malloc and memset can be replaced - by a single call to calloc() if this is thought to improve performance. */ -png_voidp /* PRIVATE */ -png_create_struct(int type) -{ -#ifdef PNG_USER_MEM_SUPPORTED - return (png_create_struct_2(type, png_malloc_ptr_NULL, png_voidp_NULL)); -} - -/* Alternate version of png_create_struct, for use with user-defined malloc. */ -png_voidp /* PRIVATE */ -png_create_struct_2(int type, png_malloc_ptr malloc_fn, png_voidp mem_ptr) -{ -#endif /* PNG_USER_MEM_SUPPORTED */ - png_size_t size; - png_voidp struct_ptr; - - if (type == PNG_STRUCT_INFO) - size = png_sizeof(png_info); - else if (type == PNG_STRUCT_PNG) - size = png_sizeof(png_struct); - else - return (png_get_copyright(NULL)); - -#ifdef PNG_USER_MEM_SUPPORTED - if(malloc_fn != NULL) - { - png_struct dummy_struct; - png_structp png_ptr = &dummy_struct; - png_ptr->mem_ptr=mem_ptr; - struct_ptr = (*(malloc_fn))(png_ptr, (png_uint_32)size); - } - else -#endif /* PNG_USER_MEM_SUPPORTED */ - struct_ptr = (png_voidp)farmalloc(size); - if (struct_ptr != NULL) - png_memset(struct_ptr, 0, size); - return (struct_ptr); -} - -/* Free memory allocated by a png_create_struct() call */ -void /* PRIVATE */ -png_destroy_struct(png_voidp struct_ptr) -{ -#ifdef PNG_USER_MEM_SUPPORTED - png_destroy_struct_2(struct_ptr, png_free_ptr_NULL, png_voidp_NULL); -} - -/* Free memory allocated by a png_create_struct() call */ -void /* PRIVATE */ -png_destroy_struct_2(png_voidp struct_ptr, png_free_ptr free_fn, - png_voidp mem_ptr) -{ -#endif - if (struct_ptr != NULL) - { -#ifdef PNG_USER_MEM_SUPPORTED - if(free_fn != NULL) - { - png_struct dummy_struct; - png_structp png_ptr = &dummy_struct; - png_ptr->mem_ptr=mem_ptr; - (*(free_fn))(png_ptr, struct_ptr); - return; - } -#endif /* PNG_USER_MEM_SUPPORTED */ - farfree (struct_ptr); - } -} - -/* 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. - * - * Borland seems to have a problem in DOS mode for exactly 64K. - * It gives you a segment with an offset of 8 (perhaps to store its - * memory stuff). zlib doesn't like this at all, so we have to - * detect and deal with it. This code should not be needed in - * Windows or OS/2 modes, and only in 16 bit mode. This code has - * been updated by Alexander Lehmann for version 0.89 to waste less - * memory. - * - * Note that we can't use png_size_t for the "size" declaration, - * since on some systems a png_size_t is a 16-bit quantity, and as a - * result, we would be truncating potentially larger memory requests - * (which should cause a fatal error) and introducing major problems. - */ - -png_voidp PNGAPI -png_malloc(png_structp png_ptr, png_uint_32 size) -{ - png_voidp ret; - - if (png_ptr == NULL || size == 0) - return (NULL); - -#ifdef PNG_USER_MEM_SUPPORTED - if(png_ptr->malloc_fn != NULL) - ret = ((png_voidp)(*(png_ptr->malloc_fn))(png_ptr, (png_size_t)size)); - else - ret = (png_malloc_default(png_ptr, size)); - if (ret == NULL && (png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) - png_error(png_ptr, "Out of memory!"); - return (ret); -} - -png_voidp PNGAPI -png_malloc_default(png_structp png_ptr, png_uint_32 size) -{ - png_voidp ret; -#endif /* PNG_USER_MEM_SUPPORTED */ - - if (png_ptr == NULL || size == 0) - return (NULL); - -#ifdef PNG_MAX_MALLOC_64K - if (size > (png_uint_32)65536L) - { - png_warning(png_ptr, "Cannot Allocate > 64K"); - ret = NULL; - } - else -#endif - - if (size != (size_t)size) - ret = NULL; - else if (size == (png_uint_32)65536L) - { - if (png_ptr->offset_table == NULL) - { - /* try to see if we need to do any of this fancy stuff */ - ret = farmalloc(size); - if (ret == NULL || ((png_size_t)ret & 0xffff)) - { - int num_blocks; - png_uint_32 total_size; - png_bytep table; - int i; - png_byte huge * hptr; - - if (ret != NULL) - { - farfree(ret); - ret = NULL; - } - - if(png_ptr->zlib_window_bits > 14) - num_blocks = (int)(1 << (png_ptr->zlib_window_bits - 14)); - else - num_blocks = 1; - if (png_ptr->zlib_mem_level >= 7) - num_blocks += (int)(1 << (png_ptr->zlib_mem_level - 7)); - else - num_blocks++; - - total_size = ((png_uint_32)65536L) * (png_uint_32)num_blocks+16; - - table = farmalloc(total_size); - - if (table == NULL) - { -#ifndef PNG_USER_MEM_SUPPORTED - if ((png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) - png_error(png_ptr, "Out Of Memory."); /* Note "O" and "M" */ - else - png_warning(png_ptr, "Out Of Memory."); -#endif - return (NULL); - } - - if ((png_size_t)table & 0xfff0) - { -#ifndef PNG_USER_MEM_SUPPORTED - if ((png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) - png_error(png_ptr, - "Farmalloc didn't return normalized pointer"); - else - png_warning(png_ptr, - "Farmalloc didn't return normalized pointer"); -#endif - return (NULL); - } - - png_ptr->offset_table = table; - png_ptr->offset_table_ptr = farmalloc(num_blocks * - png_sizeof (png_bytep)); - - if (png_ptr->offset_table_ptr == NULL) - { -#ifndef PNG_USER_MEM_SUPPORTED - if ((png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) - png_error(png_ptr, "Out Of memory."); /* Note "O" and "M" */ - else - png_warning(png_ptr, "Out Of memory."); -#endif - return (NULL); - } - - hptr = (png_byte huge *)table; - if ((png_size_t)hptr & 0xf) - { - hptr = (png_byte huge *)((long)(hptr) & 0xfffffff0L); - hptr = hptr + 16L; /* "hptr += 16L" fails on Turbo C++ 3.0 */ - } - for (i = 0; i < num_blocks; i++) - { - png_ptr->offset_table_ptr[i] = (png_bytep)hptr; - hptr = hptr + (png_uint_32)65536L; /* "+=" fails on TC++3.0 */ - } - - png_ptr->offset_table_number = num_blocks; - png_ptr->offset_table_count = 0; - png_ptr->offset_table_count_free = 0; - } - } - - if (png_ptr->offset_table_count >= png_ptr->offset_table_number) - { -#ifndef PNG_USER_MEM_SUPPORTED - if ((png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) - png_error(png_ptr, "Out of Memory."); /* Note "o" and "M" */ - else - png_warning(png_ptr, "Out of Memory."); -#endif - return (NULL); - } - - ret = png_ptr->offset_table_ptr[png_ptr->offset_table_count++]; - } - else - ret = farmalloc(size); - -#ifndef PNG_USER_MEM_SUPPORTED - if (ret == NULL) - { - if ((png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) - png_error(png_ptr, "Out of memory."); /* Note "o" and "m" */ - else - png_warning(png_ptr, "Out of memory."); /* Note "o" and "m" */ - } -#endif - - return (ret); -} - -/* free a pointer allocated by png_malloc(). In the default - configuration, png_ptr is not used, but is passed in case it - is needed. If ptr is NULL, return without taking any action. */ -void PNGAPI -png_free(png_structp 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_ptr, ptr); - return; - } - else png_free_default(png_ptr, ptr); -} - -void PNGAPI -png_free_default(png_structp png_ptr, png_voidp ptr) -{ -#endif /* PNG_USER_MEM_SUPPORTED */ - - if(png_ptr == NULL) return; - - if (png_ptr->offset_table != NULL) - { - int i; - - for (i = 0; i < png_ptr->offset_table_count; i++) - { - if (ptr == png_ptr->offset_table_ptr[i]) - { - ptr = NULL; - png_ptr->offset_table_count_free++; - break; - } - } - if (png_ptr->offset_table_count_free == png_ptr->offset_table_count) - { - farfree(png_ptr->offset_table); - farfree(png_ptr->offset_table_ptr); - png_ptr->offset_table = NULL; - png_ptr->offset_table_ptr = NULL; - } - } - - if (ptr != NULL) - { - farfree(ptr); - } -} - -#else /* Not the Borland DOS special memory handler */ - -/* Allocate memory for a png_struct or a png_info. The malloc and - memset can be replaced by a single call to calloc() if this is thought - to improve performance noticably. */ -png_voidp /* PRIVATE */ -png_create_struct(int type) -{ -#ifdef PNG_USER_MEM_SUPPORTED - return (png_create_struct_2(type, png_malloc_ptr_NULL, png_voidp_NULL)); -} - -/* Allocate memory for a png_struct or a png_info. The malloc and - memset can be replaced by a single call to calloc() if this is thought - to improve performance noticably. */ -png_voidp /* PRIVATE */ -png_create_struct_2(int type, png_malloc_ptr malloc_fn, png_voidp mem_ptr) -{ -#endif /* PNG_USER_MEM_SUPPORTED */ - png_size_t size; - png_voidp struct_ptr; - - if (type == PNG_STRUCT_INFO) - size = png_sizeof(png_info); - else if (type == PNG_STRUCT_PNG) - size = png_sizeof(png_struct); - else - return (NULL); - -#ifdef PNG_USER_MEM_SUPPORTED - if(malloc_fn != NULL) - { - png_struct dummy_struct; - png_structp png_ptr = &dummy_struct; - png_ptr->mem_ptr=mem_ptr; - struct_ptr = (*(malloc_fn))(png_ptr, size); - if (struct_ptr != NULL) - png_memset(struct_ptr, 0, size); - return (struct_ptr); - } -#endif /* PNG_USER_MEM_SUPPORTED */ - -#if defined(__TURBOC__) && !defined(__FLAT__) - struct_ptr = (png_voidp)farmalloc(size); -#else -# if defined(_MSC_VER) && defined(MAXSEG_64K) - struct_ptr = (png_voidp)halloc(size,1); -# else - struct_ptr = (png_voidp)malloc(size); -# endif -#endif - if (struct_ptr != NULL) - png_memset(struct_ptr, 0, size); - - return (struct_ptr); -} - - -/* Free memory allocated by a png_create_struct() call */ -void /* PRIVATE */ -png_destroy_struct(png_voidp struct_ptr) -{ -#ifdef PNG_USER_MEM_SUPPORTED - png_destroy_struct_2(struct_ptr, png_free_ptr_NULL, png_voidp_NULL); -} - -/* Free memory allocated by a png_create_struct() call */ -void /* PRIVATE */ -png_destroy_struct_2(png_voidp struct_ptr, png_free_ptr free_fn, - png_voidp mem_ptr) -{ -#endif /* PNG_USER_MEM_SUPPORTED */ - if (struct_ptr != NULL) - { -#ifdef PNG_USER_MEM_SUPPORTED - if(free_fn != NULL) - { - png_struct dummy_struct; - png_structp png_ptr = &dummy_struct; - png_ptr->mem_ptr=mem_ptr; - (*(free_fn))(png_ptr, struct_ptr); - return; - } -#endif /* PNG_USER_MEM_SUPPORTED */ -#if defined(__TURBOC__) && !defined(__FLAT__) - farfree(struct_ptr); -#else -# if defined(_MSC_VER) && defined(MAXSEG_64K) - hfree(struct_ptr); -# else - free(struct_ptr); -# endif -#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_voidp PNGAPI -png_malloc(png_structp png_ptr, png_uint_32 size) -{ - png_voidp ret; - -#ifdef PNG_USER_MEM_SUPPORTED - if (png_ptr == NULL || size == 0) - return (NULL); - - if(png_ptr->malloc_fn != NULL) - ret = ((png_voidp)(*(png_ptr->malloc_fn))(png_ptr, (png_size_t)size)); - else - ret = (png_malloc_default(png_ptr, size)); - if (ret == NULL && (png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) - png_error(png_ptr, "Out of Memory!"); - return (ret); -} - -png_voidp PNGAPI -png_malloc_default(png_structp png_ptr, png_uint_32 size) -{ - png_voidp ret; -#endif /* PNG_USER_MEM_SUPPORTED */ - - if (png_ptr == NULL || size == 0) - return (NULL); - -#ifdef PNG_MAX_MALLOC_64K - if (size > (png_uint_32)65536L) - { -#ifndef PNG_USER_MEM_SUPPORTED - if(png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) - png_error(png_ptr, "Cannot Allocate > 64K"); - else -#endif - return NULL; - } -#endif - - /* Check for overflow */ -#if defined(__TURBOC__) && !defined(__FLAT__) - if (size != (unsigned long)size) - ret = NULL; - else - ret = farmalloc(size); -#else -# if defined(_MSC_VER) && defined(MAXSEG_64K) - if (size != (unsigned long)size) - ret = NULL; - else - ret = halloc(size, 1); -# else - if (size != (size_t)size) - ret = NULL; - else - ret = malloc((size_t)size); -# endif -#endif - -#ifndef PNG_USER_MEM_SUPPORTED - if (ret == NULL && (png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) - png_error(png_ptr, "Out of Memory"); -#endif - - return (ret); -} - -/* Free a pointer allocated by png_malloc(). If ptr is NULL, return - without taking any action. */ -void PNGAPI -png_free(png_structp 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_ptr, ptr); - return; - } - else png_free_default(png_ptr, ptr); -} -void PNGAPI -png_free_default(png_structp png_ptr, png_voidp ptr) -{ - if (png_ptr == NULL || ptr == NULL) - return; - -#endif /* PNG_USER_MEM_SUPPORTED */ - -#if defined(__TURBOC__) && !defined(__FLAT__) - farfree(ptr); -#else -# if defined(_MSC_VER) && defined(MAXSEG_64K) - hfree(ptr); -# else - free(ptr); -# endif -#endif -} - -#endif /* Not Borland DOS special memory handler */ - -#if defined(PNG_1_0_X) -# define png_malloc_warn png_malloc -#else -/* This function was added at libpng version 1.2.3. The png_malloc_warn() - * function will set up png_malloc() to issue a png_warning and return NULL - * instead of issuing a png_error, if it fails to allocate the requested - * memory. - */ -png_voidp PNGAPI -png_malloc_warn(png_structp png_ptr, png_uint_32 size) -{ - png_voidp ptr; - png_uint_32 save_flags; - if(png_ptr == NULL) return (NULL); - - save_flags=png_ptr->flags; - png_ptr->flags|=PNG_FLAG_MALLOC_NULL_MEM_OK; - ptr = (png_voidp)png_malloc((png_structp)png_ptr, size); - png_ptr->flags=save_flags; - return(ptr); -} -#endif - -png_voidp PNGAPI -png_memcpy_check (png_structp png_ptr, png_voidp s1, png_voidp s2, - png_uint_32 length) -{ - png_size_t size; - - size = (png_size_t)length; - if ((png_uint_32)size != length) - png_error(png_ptr,"Overflow in png_memcpy_check."); - - return(png_memcpy (s1, s2, size)); -} - -png_voidp PNGAPI -png_memset_check (png_structp png_ptr, png_voidp s1, int value, - png_uint_32 length) -{ - png_size_t size; - - size = (png_size_t)length; - if ((png_uint_32)size != length) - png_error(png_ptr,"Overflow in png_memset_check."); - - return (png_memset (s1, value, size)); - -} - -#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_structp 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_structp png_ptr) -{ - if(png_ptr == NULL) return (NULL); - return ((png_voidp)png_ptr->mem_ptr); -} -#endif /* PNG_USER_MEM_SUPPORTED */ -#endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */ diff --git a/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngpread.c b/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngpread.c deleted file mode 100644 index 5e84c4a9..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngpread.c +++ /dev/null @@ -1,1586 +0,0 @@ - -/* pngpread.c - read a png file in push mode - * - * Last changed in libpng 1.2.21 October 4, 2007 - * For conditions of distribution and use, see copyright notice in png.h - * Copyright (c) 1998-2007 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.) - */ - -#define PNG_INTERNAL -#include "png.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_structp png_ptr, png_infop info_ptr, - png_bytep buffer, png_size_t buffer_size) -{ - if(png_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); - } -} - -/* 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_structp png_ptr, png_infop 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; - } -#if defined(PNG_READ_tEXt_SUPPORTED) - case PNG_READ_tEXt_MODE: - { - png_push_read_tEXt(png_ptr, info_ptr); - break; - } -#endif -#if defined(PNG_READ_zTXt_SUPPORTED) - case PNG_READ_zTXt_MODE: - { - png_push_read_zTXt(png_ptr, info_ptr); - break; - } -#endif -#if defined(PNG_READ_iTXt_SUPPORTED) - case PNG_READ_iTXt_MODE: - { - png_push_read_iTXt(png_ptr, info_ptr); - break; - } -#endif - 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_structp png_ptr, png_infop 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_structp png_ptr, png_infop info_ptr) -{ -#ifdef PNG_USE_LOCAL_ARRAYS - PNG_CONST PNG_IHDR; - PNG_CONST PNG_IDAT; - PNG_CONST PNG_IEND; - PNG_CONST PNG_PLTE; -#if defined(PNG_READ_bKGD_SUPPORTED) - PNG_CONST PNG_bKGD; -#endif -#if defined(PNG_READ_cHRM_SUPPORTED) - PNG_CONST PNG_cHRM; -#endif -#if defined(PNG_READ_gAMA_SUPPORTED) - PNG_CONST PNG_gAMA; -#endif -#if defined(PNG_READ_hIST_SUPPORTED) - PNG_CONST PNG_hIST; -#endif -#if defined(PNG_READ_iCCP_SUPPORTED) - PNG_CONST PNG_iCCP; -#endif -#if defined(PNG_READ_iTXt_SUPPORTED) - PNG_CONST PNG_iTXt; -#endif -#if defined(PNG_READ_oFFs_SUPPORTED) - PNG_CONST PNG_oFFs; -#endif -#if defined(PNG_READ_pCAL_SUPPORTED) - PNG_CONST PNG_pCAL; -#endif -#if defined(PNG_READ_pHYs_SUPPORTED) - PNG_CONST PNG_pHYs; -#endif -#if defined(PNG_READ_sBIT_SUPPORTED) - PNG_CONST PNG_sBIT; -#endif -#if defined(PNG_READ_sCAL_SUPPORTED) - PNG_CONST PNG_sCAL; -#endif -#if defined(PNG_READ_sRGB_SUPPORTED) - PNG_CONST PNG_sRGB; -#endif -#if defined(PNG_READ_sPLT_SUPPORTED) - PNG_CONST PNG_sPLT; -#endif -#if defined(PNG_READ_tEXt_SUPPORTED) - PNG_CONST PNG_tEXt; -#endif -#if defined(PNG_READ_tIME_SUPPORTED) - PNG_CONST PNG_tIME; -#endif -#if defined(PNG_READ_tRNS_SUPPORTED) - PNG_CONST PNG_tRNS; -#endif -#if defined(PNG_READ_zTXt_SUPPORTED) - PNG_CONST PNG_zTXt; -#endif -#endif /* PNG_USE_LOCAL_ARRAYS */ - /* 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]; - - 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, png_ptr->chunk_name, 4); - png_ptr->mode |= PNG_HAVE_CHUNK_HEADER; - } - - if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) - if(png_ptr->mode & PNG_AFTER_IDAT) - png_ptr->mode |= PNG_HAVE_CHUNK_AFTER_IDAT; - - if (!png_memcmp(png_ptr->chunk_name, png_IHDR, 4)) - { - 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 (!png_memcmp(png_ptr->chunk_name, png_IEND, 4)) - { - 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 (png_handle_as_unknown(png_ptr, png_ptr->chunk_name)) - { - if (png_ptr->push_length + 4 > png_ptr->buffer_size) - { - png_push_save_buffer(png_ptr); - return; - } - if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) - png_ptr->mode |= PNG_HAVE_IDAT; - png_handle_unknown(png_ptr, info_ptr, png_ptr->push_length); - if (!png_memcmp(png_ptr->chunk_name, png_PLTE, 4)) - png_ptr->mode |= PNG_HAVE_PLTE; - else if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) - { - 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"); - } - } -#endif - else if (!png_memcmp(png_ptr->chunk_name, png_PLTE, 4)) - { - 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 (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) - { - /* 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"); - - if (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_error(png_ptr, "Too many IDAT's found"); - } - - png_ptr->idat_size = png_ptr->push_length; - png_ptr->mode |= PNG_HAVE_IDAT; - png_ptr->process_mode = PNG_READ_IDAT_MODE; - png_push_have_info(png_ptr, info_ptr); - png_ptr->zstream.avail_out = (uInt)png_ptr->irowbytes; - png_ptr->zstream.next_out = png_ptr->row_buf; - return; - } -#if defined(PNG_READ_gAMA_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_gAMA, 4)) - { - 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 -#if defined(PNG_READ_sBIT_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_sBIT, 4)) - { - 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 -#if defined(PNG_READ_cHRM_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_cHRM, 4)) - { - 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 -#if defined(PNG_READ_sRGB_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_sRGB, 4)) - { - 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 -#if defined(PNG_READ_iCCP_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_iCCP, 4)) - { - 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 -#if defined(PNG_READ_sPLT_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_sPLT, 4)) - { - 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 -#if defined(PNG_READ_tRNS_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_tRNS, 4)) - { - 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 -#if defined(PNG_READ_bKGD_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_bKGD, 4)) - { - 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 -#if defined(PNG_READ_hIST_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_hIST, 4)) - { - 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 -#if defined(PNG_READ_pHYs_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_pHYs, 4)) - { - 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 -#if defined(PNG_READ_oFFs_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_oFFs, 4)) - { - 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 -#if defined(PNG_READ_pCAL_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_pCAL, 4)) - { - 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 -#if defined(PNG_READ_sCAL_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_sCAL, 4)) - { - 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 -#if defined(PNG_READ_tIME_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_tIME, 4)) - { - 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 -#if defined(PNG_READ_tEXt_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_tEXt, 4)) - { - if (png_ptr->push_length + 4 > png_ptr->buffer_size) - { - png_push_save_buffer(png_ptr); - return; - } - png_push_handle_tEXt(png_ptr, info_ptr, png_ptr->push_length); - } -#endif -#if defined(PNG_READ_zTXt_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_zTXt, 4)) - { - if (png_ptr->push_length + 4 > png_ptr->buffer_size) - { - png_push_save_buffer(png_ptr); - return; - } - png_push_handle_zTXt(png_ptr, info_ptr, png_ptr->push_length); - } -#endif -#if defined(PNG_READ_iTXt_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_iTXt, 4)) - { - if (png_ptr->push_length + 4 > png_ptr->buffer_size) - { - png_push_save_buffer(png_ptr); - return; - } - png_push_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_push_handle_unknown(png_ptr, info_ptr, png_ptr->push_length); - } - - png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER; -} - -void /* PRIVATE */ -png_push_crc_skip(png_structp 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_structp png_ptr) -{ - if (png_ptr->skip_length && png_ptr->save_buffer_size) - { - png_size_t save_size; - - if (png_ptr->skip_length < (png_uint_32)png_ptr->save_buffer_size) - save_size = (png_size_t)png_ptr->skip_length; - else - save_size = png_ptr->save_buffer_size; - - png_calculate_crc(png_ptr, png_ptr->save_buffer_ptr, save_size); - - png_ptr->skip_length -= save_size; - 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; - - if (png_ptr->skip_length < (png_uint_32)png_ptr->current_buffer_size) - save_size = (png_size_t)png_ptr->skip_length; - else - save_size = png_ptr->current_buffer_size; - - png_calculate_crc(png_ptr, png_ptr->current_buffer_ptr, save_size); - - png_ptr->skip_length -= save_size; - 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 PNGAPI -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; - - png_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; - - png_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_structp 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(png_ptr, - (png_uint_32)new_max); - png_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) - { - png_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_structp 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_structp png_ptr) -{ -#ifdef PNG_USE_LOCAL_ARRAYS - PNG_CONST PNG_IDAT; -#endif - if (!(png_ptr->mode & PNG_HAVE_CHUNK_HEADER)) - { - png_byte chunk_length[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, png_ptr->chunk_name, 4); - png_ptr->mode |= PNG_HAVE_CHUNK_HEADER; - - if (png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) - { - png_ptr->process_mode = PNG_READ_CHUNK_MODE; - if (!(png_ptr->flags & PNG_FLAG_ZLIB_FINISHED)) - 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; - - if (png_ptr->idat_size < (png_uint_32)png_ptr->save_buffer_size) - { - save_size = (png_size_t)png_ptr->idat_size; - /* check for overflow */ - if((png_uint_32)save_size != png_ptr->idat_size) - png_error(png_ptr, "save_size overflowed in pngpread"); - } - else - save_size = png_ptr->save_buffer_size; - - png_calculate_crc(png_ptr, png_ptr->save_buffer_ptr, save_size); - if (!(png_ptr->flags & PNG_FLAG_ZLIB_FINISHED)) - png_process_IDAT_data(png_ptr, png_ptr->save_buffer_ptr, save_size); - png_ptr->idat_size -= save_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; - - if (png_ptr->idat_size < (png_uint_32)png_ptr->current_buffer_size) - { - save_size = (png_size_t)png_ptr->idat_size; - /* check for overflow */ - if((png_uint_32)save_size != png_ptr->idat_size) - png_error(png_ptr, "save_size overflowed in pngpread"); - } - else - save_size = png_ptr->current_buffer_size; - - png_calculate_crc(png_ptr, png_ptr->current_buffer_ptr, save_size); - if (!(png_ptr->flags & PNG_FLAG_ZLIB_FINISHED)) - png_process_IDAT_data(png_ptr, png_ptr->current_buffer_ptr, save_size); - - png_ptr->idat_size -= save_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; - } -} - -void /* PRIVATE */ -png_process_IDAT_data(png_structp png_ptr, png_bytep buffer, - png_size_t buffer_length) -{ - int ret; - - if ((png_ptr->flags & PNG_FLAG_ZLIB_FINISHED) && buffer_length) - png_error(png_ptr, "Extra compression data"); - - png_ptr->zstream.next_in = buffer; - png_ptr->zstream.avail_in = (uInt)buffer_length; - for(;;) - { - ret = inflate(&png_ptr->zstream, Z_PARTIAL_FLUSH); - if (ret != Z_OK) - { - if (ret == Z_STREAM_END) - { - if (png_ptr->zstream.avail_in) - png_error(png_ptr, "Extra compressed data"); - if (!(png_ptr->zstream.avail_out)) - { - png_push_process_row(png_ptr); - } - - png_ptr->mode |= PNG_AFTER_IDAT; - png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED; - break; - } - else if (ret == Z_BUF_ERROR) - break; - else - png_error(png_ptr, "Decompression Error"); - } - if (!(png_ptr->zstream.avail_out)) - { - if (( -#if defined(PNG_READ_INTERLACING_SUPPORTED) - png_ptr->interlaced && png_ptr->pass > 6) || - (!png_ptr->interlaced && -#endif - png_ptr->row_number == png_ptr->num_rows)) - { - if (png_ptr->zstream.avail_in) - { - png_warning(png_ptr, "Too much data in IDAT chunks"); - } - - png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED; - break; - } - png_push_process_row(png_ptr); - png_ptr->zstream.avail_out = (uInt)png_ptr->irowbytes; - png_ptr->zstream.next_out = png_ptr->row_buf; - } - else - break; - } -} - -void /* PRIVATE */ -png_push_process_row(png_structp png_ptr) -{ - png_ptr->row_info.color_type = png_ptr->color_type; - png_ptr->row_info.width = png_ptr->iwidth; - png_ptr->row_info.channels = png_ptr->channels; - png_ptr->row_info.bit_depth = png_ptr->bit_depth; - png_ptr->row_info.pixel_depth = png_ptr->pixel_depth; - - png_ptr->row_info.rowbytes = PNG_ROWBYTES(png_ptr->row_info.pixel_depth, - png_ptr->row_info.width); - - png_read_filter_row(png_ptr, &(png_ptr->row_info), - png_ptr->row_buf + 1, png_ptr->prev_row + 1, - (int)(png_ptr->row_buf[0])); - - png_memcpy_check(png_ptr, png_ptr->prev_row, png_ptr->row_buf, - png_ptr->rowbytes + 1); - - if (png_ptr->transformations || (png_ptr->flags&PNG_FLAG_STRIP_ALPHA)) - png_do_read_transformations(png_ptr); - -#if defined(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) -/* old interface (pre-1.0.9): - png_do_read_interlace(&(png_ptr->row_info), - png_ptr->row_buf + 1, png_ptr->pass, png_ptr->transformations); - */ - png_do_read_interlace(png_ptr); - - 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, png_bytep_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, png_bytep_NULL); - png_read_push_finish_row(png_ptr); - } - } - if (png_ptr->pass == 6 && png_ptr->height <= 4) - { - png_push_have_row(png_ptr, png_bytep_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, png_bytep_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, png_bytep_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, png_bytep_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, png_bytep_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, png_bytep_NULL); - png_read_push_finish_row(png_ptr); - } - if (png_ptr->pass == 6) /* pass 5 might be empty */ - { - png_push_have_row(png_ptr, png_bytep_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, png_bytep_NULL); - png_read_push_finish_row(png_ptr); - } - break; - } - 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, png_bytep_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_structp png_ptr) -{ -#ifdef PNG_USE_LOCAL_ARRAYS - /* arrays to facilitate easy interlacing - use pass (0 - 6) as index */ - - /* start of interlace block */ - PNG_CONST int FARDATA png_pass_start[] = {0, 4, 0, 2, 0, 1, 0}; - - /* offset to next interlace block */ - PNG_CONST int FARDATA png_pass_inc[] = {8, 8, 4, 4, 2, 2, 1}; - - /* start of interlace block in the y direction */ - PNG_CONST int FARDATA png_pass_ystart[] = {0, 0, 4, 0, 2, 0, 1}; - - /* offset to next interlace block in the y direction */ - PNG_CONST int FARDATA 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 - PNG_CONST int FARDATA 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; - - if (png_ptr->interlaced) - { - png_ptr->row_number = 0; - png_memset_check(png_ptr, 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]; - - png_ptr->irowbytes = PNG_ROWBYTES(png_ptr->pixel_depth, - png_ptr->iwidth) + 1; - - 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); - } -} - -#if defined(PNG_READ_tEXt_SUPPORTED) -void /* PRIVATE */ -png_push_handle_tEXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 - length) -{ - if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND)) - { - png_error(png_ptr, "Out of place tEXt"); - info_ptr = info_ptr; /* to quiet some compiler warnings */ - } - -#ifdef PNG_MAX_MALLOC_64K - png_ptr->skip_length = 0; /* This may not be necessary */ - - if (length > (png_uint_32)65535L) /* Can't hold entire string in memory */ - { - png_warning(png_ptr, "tEXt chunk too large to fit in memory"); - png_ptr->skip_length = length - (png_uint_32)65535L; - length = (png_uint_32)65535L; - } -#endif - - png_ptr->current_text = (png_charp)png_malloc(png_ptr, - (png_uint_32)(length+1)); - png_ptr->current_text[length] = '\0'; - png_ptr->current_text_ptr = png_ptr->current_text; - png_ptr->current_text_size = (png_size_t)length; - png_ptr->current_text_left = (png_size_t)length; - png_ptr->process_mode = PNG_READ_tEXt_MODE; -} - -void /* PRIVATE */ -png_push_read_tEXt(png_structp png_ptr, png_infop info_ptr) -{ - if (png_ptr->buffer_size && png_ptr->current_text_left) - { - png_size_t text_size; - - if (png_ptr->buffer_size < png_ptr->current_text_left) - text_size = png_ptr->buffer_size; - else - text_size = png_ptr->current_text_left; - png_crc_read(png_ptr, (png_bytep)png_ptr->current_text_ptr, text_size); - png_ptr->current_text_left -= text_size; - png_ptr->current_text_ptr += text_size; - } - if (!(png_ptr->current_text_left)) - { - png_textp text_ptr; - png_charp text; - png_charp key; - int ret; - - if (png_ptr->buffer_size < 4) - { - png_push_save_buffer(png_ptr); - return; - } - - png_push_crc_finish(png_ptr); - -#if defined(PNG_MAX_MALLOC_64K) - if (png_ptr->skip_length) - return; -#endif - - key = png_ptr->current_text; - - for (text = key; *text; text++) - /* empty loop */ ; - - if (text < key + png_ptr->current_text_size) - text++; - - text_ptr = (png_textp)png_malloc(png_ptr, - (png_uint_32)png_sizeof(png_text)); - text_ptr->compression = PNG_TEXT_COMPRESSION_NONE; - text_ptr->key = key; -#ifdef PNG_iTXt_SUPPORTED - text_ptr->lang = NULL; - text_ptr->lang_key = NULL; -#endif - text_ptr->text = text; - - ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1); - - png_free(png_ptr, key); - png_free(png_ptr, text_ptr); - png_ptr->current_text = NULL; - - if (ret) - png_warning(png_ptr, "Insufficient memory to store text chunk."); - } -} -#endif - -#if defined(PNG_READ_zTXt_SUPPORTED) -void /* PRIVATE */ -png_push_handle_zTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 - length) -{ - if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND)) - { - png_error(png_ptr, "Out of place zTXt"); - info_ptr = info_ptr; /* to quiet some compiler warnings */ - } - -#ifdef PNG_MAX_MALLOC_64K - /* We can't handle zTXt chunks > 64K, since we don't have enough space - * to be able to store the uncompressed data. Actually, the threshold - * is probably around 32K, but it isn't as definite as 64K is. - */ - if (length > (png_uint_32)65535L) - { - png_warning(png_ptr, "zTXt chunk too large to fit in memory"); - png_push_crc_skip(png_ptr, length); - return; - } -#endif - - png_ptr->current_text = (png_charp)png_malloc(png_ptr, - (png_uint_32)(length+1)); - png_ptr->current_text[length] = '\0'; - png_ptr->current_text_ptr = png_ptr->current_text; - png_ptr->current_text_size = (png_size_t)length; - png_ptr->current_text_left = (png_size_t)length; - png_ptr->process_mode = PNG_READ_zTXt_MODE; -} - -void /* PRIVATE */ -png_push_read_zTXt(png_structp png_ptr, png_infop info_ptr) -{ - if (png_ptr->buffer_size && png_ptr->current_text_left) - { - png_size_t text_size; - - if (png_ptr->buffer_size < (png_uint_32)png_ptr->current_text_left) - text_size = png_ptr->buffer_size; - else - text_size = png_ptr->current_text_left; - png_crc_read(png_ptr, (png_bytep)png_ptr->current_text_ptr, text_size); - png_ptr->current_text_left -= text_size; - png_ptr->current_text_ptr += text_size; - } - if (!(png_ptr->current_text_left)) - { - png_textp text_ptr; - png_charp text; - png_charp key; - int ret; - png_size_t text_size, key_size; - - if (png_ptr->buffer_size < 4) - { - png_push_save_buffer(png_ptr); - return; - } - - png_push_crc_finish(png_ptr); - - key = png_ptr->current_text; - - for (text = key; *text; text++) - /* empty loop */ ; - - /* zTXt can't have zero text */ - if (text >= key + png_ptr->current_text_size) - { - png_ptr->current_text = NULL; - png_free(png_ptr, key); - return; - } - - text++; - - if (*text != PNG_TEXT_COMPRESSION_zTXt) /* check compression byte */ - { - png_ptr->current_text = NULL; - png_free(png_ptr, key); - return; - } - - text++; - - png_ptr->zstream.next_in = (png_bytep )text; - png_ptr->zstream.avail_in = (uInt)(png_ptr->current_text_size - - (text - key)); - png_ptr->zstream.next_out = png_ptr->zbuf; - png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; - - key_size = text - key; - text_size = 0; - text = NULL; - ret = Z_STREAM_END; - - while (png_ptr->zstream.avail_in) - { - ret = inflate(&png_ptr->zstream, Z_PARTIAL_FLUSH); - if (ret != Z_OK && ret != Z_STREAM_END) - { - inflateReset(&png_ptr->zstream); - png_ptr->zstream.avail_in = 0; - png_ptr->current_text = NULL; - png_free(png_ptr, key); - png_free(png_ptr, text); - return; - } - if (!(png_ptr->zstream.avail_out) || ret == Z_STREAM_END) - { - if (text == NULL) - { - text = (png_charp)png_malloc(png_ptr, - (png_uint_32)(png_ptr->zbuf_size - png_ptr->zstream.avail_out - + key_size + 1)); - png_memcpy(text + key_size, png_ptr->zbuf, - png_ptr->zbuf_size - png_ptr->zstream.avail_out); - png_memcpy(text, key, key_size); - text_size = key_size + png_ptr->zbuf_size - - png_ptr->zstream.avail_out; - *(text + text_size) = '\0'; - } - else - { - png_charp tmp; - - tmp = text; - text = (png_charp)png_malloc(png_ptr, text_size + - (png_uint_32)(png_ptr->zbuf_size - png_ptr->zstream.avail_out - + 1)); - png_memcpy(text, tmp, text_size); - png_free(png_ptr, tmp); - png_memcpy(text + text_size, png_ptr->zbuf, - png_ptr->zbuf_size - png_ptr->zstream.avail_out); - text_size += png_ptr->zbuf_size - png_ptr->zstream.avail_out; - *(text + text_size) = '\0'; - } - if (ret != Z_STREAM_END) - { - png_ptr->zstream.next_out = png_ptr->zbuf; - png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; - } - } - else - { - break; - } - - if (ret == Z_STREAM_END) - break; - } - - inflateReset(&png_ptr->zstream); - png_ptr->zstream.avail_in = 0; - - if (ret != Z_STREAM_END) - { - png_ptr->current_text = NULL; - png_free(png_ptr, key); - png_free(png_ptr, text); - return; - } - - png_ptr->current_text = NULL; - png_free(png_ptr, key); - key = text; - text += key_size; - - text_ptr = (png_textp)png_malloc(png_ptr, - (png_uint_32)png_sizeof(png_text)); - text_ptr->compression = PNG_TEXT_COMPRESSION_zTXt; - text_ptr->key = key; -#ifdef PNG_iTXt_SUPPORTED - text_ptr->lang = NULL; - text_ptr->lang_key = NULL; -#endif - text_ptr->text = text; - - ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1); - - png_free(png_ptr, key); - png_free(png_ptr, text_ptr); - - if (ret) - png_warning(png_ptr, "Insufficient memory to store text chunk."); - } -} -#endif - -#if defined(PNG_READ_iTXt_SUPPORTED) -void /* PRIVATE */ -png_push_handle_iTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 - length) -{ - if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND)) - { - png_error(png_ptr, "Out of place iTXt"); - info_ptr = info_ptr; /* to quiet some compiler warnings */ - } - -#ifdef PNG_MAX_MALLOC_64K - png_ptr->skip_length = 0; /* This may not be necessary */ - - if (length > (png_uint_32)65535L) /* Can't hold entire string in memory */ - { - png_warning(png_ptr, "iTXt chunk too large to fit in memory"); - png_ptr->skip_length = length - (png_uint_32)65535L; - length = (png_uint_32)65535L; - } -#endif - - png_ptr->current_text = (png_charp)png_malloc(png_ptr, - (png_uint_32)(length+1)); - png_ptr->current_text[length] = '\0'; - png_ptr->current_text_ptr = png_ptr->current_text; - png_ptr->current_text_size = (png_size_t)length; - png_ptr->current_text_left = (png_size_t)length; - png_ptr->process_mode = PNG_READ_iTXt_MODE; -} - -void /* PRIVATE */ -png_push_read_iTXt(png_structp png_ptr, png_infop info_ptr) -{ - - if (png_ptr->buffer_size && png_ptr->current_text_left) - { - png_size_t text_size; - - if (png_ptr->buffer_size < png_ptr->current_text_left) - text_size = png_ptr->buffer_size; - else - text_size = png_ptr->current_text_left; - png_crc_read(png_ptr, (png_bytep)png_ptr->current_text_ptr, text_size); - png_ptr->current_text_left -= text_size; - png_ptr->current_text_ptr += text_size; - } - if (!(png_ptr->current_text_left)) - { - png_textp text_ptr; - png_charp key; - int comp_flag; - png_charp lang; - png_charp lang_key; - png_charp text; - int ret; - - if (png_ptr->buffer_size < 4) - { - png_push_save_buffer(png_ptr); - return; - } - - png_push_crc_finish(png_ptr); - -#if defined(PNG_MAX_MALLOC_64K) - if (png_ptr->skip_length) - return; -#endif - - key = png_ptr->current_text; - - for (lang = key; *lang; lang++) - /* empty loop */ ; - - if (lang < key + png_ptr->current_text_size - 3) - lang++; - - comp_flag = *lang++; - lang++; /* skip comp_type, always zero */ - - for (lang_key = lang; *lang_key; lang_key++) - /* empty loop */ ; - lang_key++; /* skip NUL separator */ - - text=lang_key; - if (lang_key < key + png_ptr->current_text_size - 1) - { - for (; *text; text++) - /* empty loop */ ; - } - - if (text < key + png_ptr->current_text_size) - text++; - - text_ptr = (png_textp)png_malloc(png_ptr, - (png_uint_32)png_sizeof(png_text)); - text_ptr->compression = comp_flag + 2; - text_ptr->key = key; - text_ptr->lang = lang; - text_ptr->lang_key = lang_key; - text_ptr->text = text; - text_ptr->text_length = 0; - text_ptr->itxt_length = png_strlen(text); - - ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1); - - png_ptr->current_text = NULL; - - png_free(png_ptr, text_ptr); - if (ret) - png_warning(png_ptr, "Insufficient memory to store iTXt chunk."); - } -} -#endif - -/* This function is called when we haven't found a handler for this - * chunk. If there isn't a problem with the chunk itself (ie a bad chunk - * name or a critical chunk), the chunk is (currently) silently ignored. - */ -void /* PRIVATE */ -png_push_handle_unknown(png_structp png_ptr, png_infop info_ptr, png_uint_32 - length) -{ - png_uint_32 skip=0; - png_check_chunk_name(png_ptr, png_ptr->chunk_name); - - if (!(png_ptr->chunk_name[0] & 0x20)) - { -#if defined(PNG_READ_UNKNOWN_CHUNKS_SUPPORTED) - if(png_handle_as_unknown(png_ptr, png_ptr->chunk_name) != - PNG_HANDLE_CHUNK_ALWAYS -#if defined(PNG_READ_USER_CHUNKS_SUPPORTED) - && png_ptr->read_user_chunk_fn == NULL -#endif - ) -#endif - png_chunk_error(png_ptr, "unknown critical chunk"); - - info_ptr = info_ptr; /* to quiet some compiler warnings */ - } - -#if defined(PNG_READ_UNKNOWN_CHUNKS_SUPPORTED) - if (png_ptr->flags & PNG_FLAG_KEEP_UNKNOWN_CHUNKS) - { -#ifdef PNG_MAX_MALLOC_64K - if (length > (png_uint_32)65535L) - { - png_warning(png_ptr, "unknown chunk too large to fit in memory"); - skip = length - (png_uint_32)65535L; - length = (png_uint_32)65535L; - } -#endif - png_strncpy((png_charp)png_ptr->unknown_chunk.name, - (png_charp)png_ptr->chunk_name, 5); - png_ptr->unknown_chunk.data = (png_bytep)png_malloc(png_ptr, length); - png_ptr->unknown_chunk.size = (png_size_t)length; - png_crc_read(png_ptr, (png_bytep)png_ptr->unknown_chunk.data, length); -#if defined(PNG_READ_USER_CHUNKS_SUPPORTED) - if(png_ptr->read_user_chunk_fn != NULL) - { - /* callback to user unknown chunk handler */ - int ret; - ret = (*(png_ptr->read_user_chunk_fn)) - (png_ptr, &png_ptr->unknown_chunk); - if (ret < 0) - png_chunk_error(png_ptr, "error in user chunk"); - if (ret == 0) - { - if (!(png_ptr->chunk_name[0] & 0x20)) - if(png_handle_as_unknown(png_ptr, png_ptr->chunk_name) != - PNG_HANDLE_CHUNK_ALWAYS) - png_chunk_error(png_ptr, "unknown critical chunk"); - png_set_unknown_chunks(png_ptr, info_ptr, - &png_ptr->unknown_chunk, 1); - } - } -#else - png_set_unknown_chunks(png_ptr, info_ptr, &png_ptr->unknown_chunk, 1); -#endif - png_free(png_ptr, png_ptr->unknown_chunk.data); - png_ptr->unknown_chunk.data = NULL; - } - else -#endif - skip=length; - png_push_crc_skip(png_ptr, skip); -} - -void /* PRIVATE */ -png_push_have_info(png_structp png_ptr, png_infop info_ptr) -{ - if (png_ptr->info_fn != NULL) - (*(png_ptr->info_fn))(png_ptr, info_ptr); -} - -void /* PRIVATE */ -png_push_have_end(png_structp png_ptr, png_infop info_ptr) -{ - if (png_ptr->end_fn != NULL) - (*(png_ptr->end_fn))(png_ptr, info_ptr); -} - -void /* PRIVATE */ -png_push_have_row(png_structp 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); -} - -void PNGAPI -png_progressive_combine_row (png_structp png_ptr, - png_bytep old_row, png_bytep new_row) -{ -#ifdef PNG_USE_LOCAL_ARRAYS - PNG_CONST int FARDATA png_pass_dsp_mask[7] = - {0xff, 0x0f, 0xff, 0x33, 0xff, 0x55, 0xff}; -#endif - if(png_ptr == NULL) return; - if (new_row != NULL) /* new_row must == png_ptr->row_buf here. */ - png_combine_row(png_ptr, old_row, png_pass_dsp_mask[png_ptr->pass]); -} - -void PNGAPI -png_set_progressive_read_fn(png_structp 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_structp png_ptr) -{ - if(png_ptr == NULL) return (NULL); - return png_ptr->io_ptr; -} -#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ diff --git a/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngread.c b/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngread.c deleted file mode 100644 index 707561ae..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngread.c +++ /dev/null @@ -1,1472 +0,0 @@ - -/* pngread.c - read a PNG file - * - * Last changed in libpng 1.2.20 September 7, 2007 - * For conditions of distribution and use, see copyright notice in png.h - * Copyright (c) 1998-2007 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 file contains routines that an application calls directly to - * read a PNG file or stream. - */ - -#define PNG_INTERNAL -#include "png.h" - -#if defined(PNG_READ_SUPPORTED) - -/* Create a PNG structure for reading, and allocate any memory needed. */ -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) -{ - -#ifdef PNG_USER_MEM_SUPPORTED - return (png_create_read_struct_2(user_png_ver, error_ptr, error_fn, - warn_fn, png_voidp_NULL, png_malloc_ptr_NULL, png_free_ptr_NULL)); -} - -/* Alternate create PNG structure for reading, and allocate any memory needed. */ -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) -{ -#endif /* PNG_USER_MEM_SUPPORTED */ - - png_structp png_ptr; - -#ifdef PNG_SETJMP_SUPPORTED -#ifdef USE_FAR_KEYWORD - jmp_buf jmpbuf; -#endif -#endif - - int i; - - png_debug(1, "in png_create_read_struct\n"); -#ifdef PNG_USER_MEM_SUPPORTED - png_ptr = (png_structp)png_create_struct_2(PNG_STRUCT_PNG, - (png_malloc_ptr)malloc_fn, (png_voidp)mem_ptr); -#else - png_ptr = (png_structp)png_create_struct(PNG_STRUCT_PNG); -#endif - if (png_ptr == NULL) - return (NULL); - - /* added at libpng-1.2.6 */ -#ifdef PNG_SET_USER_LIMITS_SUPPORTED - png_ptr->user_width_max=PNG_USER_WIDTH_MAX; - png_ptr->user_height_max=PNG_USER_HEIGHT_MAX; -#endif - -#ifdef PNG_SETJMP_SUPPORTED -#ifdef USE_FAR_KEYWORD - if (setjmp(jmpbuf)) -#else - if (setjmp(png_ptr->jmpbuf)) -#endif - { - png_free(png_ptr, png_ptr->zbuf); - png_ptr->zbuf=NULL; -#ifdef PNG_USER_MEM_SUPPORTED - png_destroy_struct_2((png_voidp)png_ptr, - (png_free_ptr)free_fn, (png_voidp)mem_ptr); -#else - png_destroy_struct((png_voidp)png_ptr); -#endif - return (NULL); - } -#ifdef USE_FAR_KEYWORD - png_memcpy(png_ptr->jmpbuf,jmpbuf,png_sizeof(jmp_buf)); -#endif -#endif - -#ifdef PNG_USER_MEM_SUPPORTED - png_set_mem_fn(png_ptr, mem_ptr, malloc_fn, free_fn); -#endif - - png_set_error_fn(png_ptr, error_ptr, error_fn, warn_fn); - - i=0; - do - { - if(user_png_ver[i] != png_libpng_ver[i]) - png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH; - } while (png_libpng_ver[i++]); - - 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 digit. - */ - 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[0] == '0' && user_png_ver[2] < '9')) - { -#if !defined(PNG_NO_STDIO) && !defined(_WIN32_WCE) - char msg[80]; - if (user_png_ver) - { - png_snprintf(msg, 80, - "Application was compiled with png.h from libpng-%.20s", - user_png_ver); - png_warning(png_ptr, msg); - } - png_snprintf(msg, 80, - "Application is running with png.c from libpng-%.20s", - png_libpng_ver); - png_warning(png_ptr, msg); -#endif -#ifdef PNG_ERROR_NUMBERS_SUPPORTED - png_ptr->flags=0; -#endif - png_error(png_ptr, - "Incompatible libpng version in application and library"); - } - } - - /* initialize zbuf - compression buffer */ - png_ptr->zbuf_size = PNG_ZBUF_SIZE; - png_ptr->zbuf = (png_bytep)png_malloc(png_ptr, - (png_uint_32)png_ptr->zbuf_size); - png_ptr->zstream.zalloc = png_zalloc; - png_ptr->zstream.zfree = png_zfree; - png_ptr->zstream.opaque = (voidpf)png_ptr; - - switch (inflateInit(&png_ptr->zstream)) - { - case Z_OK: /* Do nothing */ break; - case Z_MEM_ERROR: - case Z_STREAM_ERROR: png_error(png_ptr, "zlib memory error"); break; - case Z_VERSION_ERROR: png_error(png_ptr, "zlib version error"); break; - default: png_error(png_ptr, "Unknown zlib error"); - } - - png_ptr->zstream.next_out = png_ptr->zbuf; - png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; - - png_set_read_fn(png_ptr, png_voidp_NULL, png_rw_ptr_NULL); - -#ifdef PNG_SETJMP_SUPPORTED -/* Applications that neglect to set up their own setjmp() and then encounter - a png_error() will longjmp here. Since the jmpbuf is then meaningless we - abort instead of returning. */ -#ifdef USE_FAR_KEYWORD - if (setjmp(jmpbuf)) - PNG_ABORT(); - png_memcpy(png_ptr->jmpbuf,jmpbuf,png_sizeof(jmp_buf)); -#else - if (setjmp(png_ptr->jmpbuf)) - PNG_ABORT(); -#endif -#endif - return (png_ptr); -} - -#if defined(PNG_1_0_X) || defined(PNG_1_2_X) -/* Initialize PNG structure for reading, and allocate any memory needed. - This interface is deprecated in favour of the png_create_read_struct(), - and it will disappear as of libpng-1.3.0. */ -#undef png_read_init -void PNGAPI -png_read_init(png_structp png_ptr) -{ - /* We only come here via pre-1.0.7-compiled applications */ - png_read_init_2(png_ptr, "1.0.6 or earlier", 0, 0); -} - -void PNGAPI -png_read_init_2(png_structp png_ptr, png_const_charp user_png_ver, - png_size_t png_struct_size, png_size_t png_info_size) -{ - /* We only come here via pre-1.0.12-compiled applications */ - if(png_ptr == NULL) return; -#if !defined(PNG_NO_STDIO) && !defined(_WIN32_WCE) - if(png_sizeof(png_struct) > png_struct_size || - png_sizeof(png_info) > png_info_size) - { - char msg[80]; - png_ptr->warning_fn=NULL; - if (user_png_ver) - { - png_snprintf(msg, 80, - "Application was compiled with png.h from libpng-%.20s", - user_png_ver); - png_warning(png_ptr, msg); - } - png_snprintf(msg, 80, - "Application is running with png.c from libpng-%.20s", - png_libpng_ver); - png_warning(png_ptr, msg); - } -#endif - if(png_sizeof(png_struct) > png_struct_size) - { - png_ptr->error_fn=NULL; -#ifdef PNG_ERROR_NUMBERS_SUPPORTED - png_ptr->flags=0; -#endif - png_error(png_ptr, - "The png struct allocated by the application for reading is too small."); - } - if(png_sizeof(png_info) > png_info_size) - { - png_ptr->error_fn=NULL; -#ifdef PNG_ERROR_NUMBERS_SUPPORTED - png_ptr->flags=0; -#endif - png_error(png_ptr, - "The info struct allocated by application for reading is too small."); - } - png_read_init_3(&png_ptr, user_png_ver, png_struct_size); -} -#endif /* PNG_1_0_X || PNG_1_2_X */ - -void PNGAPI -png_read_init_3(png_structpp ptr_ptr, png_const_charp user_png_ver, - png_size_t png_struct_size) -{ -#ifdef PNG_SETJMP_SUPPORTED - jmp_buf tmp_jmp; /* to save current jump buffer */ -#endif - - int i=0; - - png_structp png_ptr=*ptr_ptr; - - if(png_ptr == NULL) return; - - do - { - if(user_png_ver[i] != png_libpng_ver[i]) - { -#ifdef PNG_LEGACY_SUPPORTED - png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH; -#else - png_ptr->warning_fn=NULL; - png_warning(png_ptr, - "Application uses deprecated png_read_init() and should be recompiled."); - break; -#endif - } - } while (png_libpng_ver[i++]); - - png_debug(1, "in png_read_init_3\n"); - -#ifdef PNG_SETJMP_SUPPORTED - /* save jump buffer and error functions */ - png_memcpy(tmp_jmp, png_ptr->jmpbuf, png_sizeof (jmp_buf)); -#endif - - if(png_sizeof(png_struct) > png_struct_size) - { - png_destroy_struct(png_ptr); - *ptr_ptr = (png_structp)png_create_struct(PNG_STRUCT_PNG); - png_ptr = *ptr_ptr; - } - - /* reset all variables to 0 */ - png_memset(png_ptr, 0, png_sizeof (png_struct)); - -#ifdef PNG_SETJMP_SUPPORTED - /* restore jump buffer */ - png_memcpy(png_ptr->jmpbuf, tmp_jmp, png_sizeof (jmp_buf)); -#endif - - /* added at libpng-1.2.6 */ -#ifdef PNG_SET_USER_LIMITS_SUPPORTED - png_ptr->user_width_max=PNG_USER_WIDTH_MAX; - png_ptr->user_height_max=PNG_USER_HEIGHT_MAX; -#endif - - /* initialize zbuf - compression buffer */ - png_ptr->zbuf_size = PNG_ZBUF_SIZE; - png_ptr->zbuf = (png_bytep)png_malloc(png_ptr, - (png_uint_32)png_ptr->zbuf_size); - png_ptr->zstream.zalloc = png_zalloc; - png_ptr->zstream.zfree = png_zfree; - png_ptr->zstream.opaque = (voidpf)png_ptr; - - switch (inflateInit(&png_ptr->zstream)) - { - case Z_OK: /* Do nothing */ break; - case Z_MEM_ERROR: - case Z_STREAM_ERROR: png_error(png_ptr, "zlib memory"); break; - case Z_VERSION_ERROR: png_error(png_ptr, "zlib version"); break; - default: png_error(png_ptr, "Unknown zlib error"); - } - - png_ptr->zstream.next_out = png_ptr->zbuf; - png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; - - png_set_read_fn(png_ptr, png_voidp_NULL, png_rw_ptr_NULL); -} - -#ifndef PNG_NO_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_structp png_ptr, png_infop info_ptr) -{ - if(png_ptr == NULL) return; - png_debug(1, "in png_read_info\n"); - /* If we haven't checked all of the PNG signature bytes, do so now. */ - if (png_ptr->sig_bytes < 8) - { - png_size_t num_checked = png_ptr->sig_bytes, - num_to_check = 8 - num_checked; - - 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; - } - - for(;;) - { -#ifdef PNG_USE_LOCAL_ARRAYS - PNG_CONST PNG_IHDR; - PNG_CONST PNG_IDAT; - PNG_CONST PNG_IEND; - PNG_CONST PNG_PLTE; -#if defined(PNG_READ_bKGD_SUPPORTED) - PNG_CONST PNG_bKGD; -#endif -#if defined(PNG_READ_cHRM_SUPPORTED) - PNG_CONST PNG_cHRM; -#endif -#if defined(PNG_READ_gAMA_SUPPORTED) - PNG_CONST PNG_gAMA; -#endif -#if defined(PNG_READ_hIST_SUPPORTED) - PNG_CONST PNG_hIST; -#endif -#if defined(PNG_READ_iCCP_SUPPORTED) - PNG_CONST PNG_iCCP; -#endif -#if defined(PNG_READ_iTXt_SUPPORTED) - PNG_CONST PNG_iTXt; -#endif -#if defined(PNG_READ_oFFs_SUPPORTED) - PNG_CONST PNG_oFFs; -#endif -#if defined(PNG_READ_pCAL_SUPPORTED) - PNG_CONST PNG_pCAL; -#endif -#if defined(PNG_READ_pHYs_SUPPORTED) - PNG_CONST PNG_pHYs; -#endif -#if defined(PNG_READ_sBIT_SUPPORTED) - PNG_CONST PNG_sBIT; -#endif -#if defined(PNG_READ_sCAL_SUPPORTED) - PNG_CONST PNG_sCAL; -#endif -#if defined(PNG_READ_sPLT_SUPPORTED) - PNG_CONST PNG_sPLT; -#endif -#if defined(PNG_READ_sRGB_SUPPORTED) - PNG_CONST PNG_sRGB; -#endif -#if defined(PNG_READ_tEXt_SUPPORTED) - PNG_CONST PNG_tEXt; -#endif -#if defined(PNG_READ_tIME_SUPPORTED) - PNG_CONST PNG_tIME; -#endif -#if defined(PNG_READ_tRNS_SUPPORTED) - PNG_CONST PNG_tRNS; -#endif -#if defined(PNG_READ_zTXt_SUPPORTED) - PNG_CONST PNG_zTXt; -#endif -#endif /* PNG_USE_LOCAL_ARRAYS */ - png_byte chunk_length[4]; - png_uint_32 length; - - png_read_data(png_ptr, chunk_length, 4); - length = png_get_uint_31(png_ptr,chunk_length); - - png_reset_crc(png_ptr); - png_crc_read(png_ptr, png_ptr->chunk_name, 4); - - png_debug2(0, "Reading %s chunk, length=%lu.\n", png_ptr->chunk_name, - length); - - /* This should be a binary subdivision search or a hash for - * matching the chunk name rather than a linear search. - */ - if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) - if(png_ptr->mode & PNG_AFTER_IDAT) - png_ptr->mode |= PNG_HAVE_CHUNK_AFTER_IDAT; - - if (!png_memcmp(png_ptr->chunk_name, png_IHDR, 4)) - png_handle_IHDR(png_ptr, info_ptr, length); - else if (!png_memcmp(png_ptr->chunk_name, png_IEND, 4)) - png_handle_IEND(png_ptr, info_ptr, length); -#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED - else if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name)) - { - if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) - png_ptr->mode |= PNG_HAVE_IDAT; - png_handle_unknown(png_ptr, info_ptr, length); - if (!png_memcmp(png_ptr->chunk_name, png_PLTE, 4)) - png_ptr->mode |= PNG_HAVE_PLTE; - else if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) - { - 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"); - break; - } - } -#endif - else if (!png_memcmp(png_ptr->chunk_name, png_PLTE, 4)) - png_handle_PLTE(png_ptr, info_ptr, length); - else if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) - { - 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->idat_size = length; - png_ptr->mode |= PNG_HAVE_IDAT; - break; - } -#if defined(PNG_READ_bKGD_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_bKGD, 4)) - png_handle_bKGD(png_ptr, info_ptr, length); -#endif -#if defined(PNG_READ_cHRM_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_cHRM, 4)) - png_handle_cHRM(png_ptr, info_ptr, length); -#endif -#if defined(PNG_READ_gAMA_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_gAMA, 4)) - png_handle_gAMA(png_ptr, info_ptr, length); -#endif -#if defined(PNG_READ_hIST_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_hIST, 4)) - png_handle_hIST(png_ptr, info_ptr, length); -#endif -#if defined(PNG_READ_oFFs_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_oFFs, 4)) - png_handle_oFFs(png_ptr, info_ptr, length); -#endif -#if defined(PNG_READ_pCAL_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_pCAL, 4)) - png_handle_pCAL(png_ptr, info_ptr, length); -#endif -#if defined(PNG_READ_sCAL_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_sCAL, 4)) - png_handle_sCAL(png_ptr, info_ptr, length); -#endif -#if defined(PNG_READ_pHYs_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_pHYs, 4)) - png_handle_pHYs(png_ptr, info_ptr, length); -#endif -#if defined(PNG_READ_sBIT_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_sBIT, 4)) - png_handle_sBIT(png_ptr, info_ptr, length); -#endif -#if defined(PNG_READ_sRGB_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_sRGB, 4)) - png_handle_sRGB(png_ptr, info_ptr, length); -#endif -#if defined(PNG_READ_iCCP_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_iCCP, 4)) - png_handle_iCCP(png_ptr, info_ptr, length); -#endif -#if defined(PNG_READ_sPLT_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_sPLT, 4)) - png_handle_sPLT(png_ptr, info_ptr, length); -#endif -#if defined(PNG_READ_tEXt_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_tEXt, 4)) - png_handle_tEXt(png_ptr, info_ptr, length); -#endif -#if defined(PNG_READ_tIME_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_tIME, 4)) - png_handle_tIME(png_ptr, info_ptr, length); -#endif -#if defined(PNG_READ_tRNS_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_tRNS, 4)) - png_handle_tRNS(png_ptr, info_ptr, length); -#endif -#if defined(PNG_READ_zTXt_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_zTXt, 4)) - png_handle_zTXt(png_ptr, info_ptr, length); -#endif -#if defined(PNG_READ_iTXt_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_iTXt, 4)) - png_handle_iTXt(png_ptr, info_ptr, length); -#endif - else - png_handle_unknown(png_ptr, info_ptr, length); - } -} -#endif /* PNG_NO_SEQUENTIAL_READ_SUPPORTED */ - -/* optional call to update the users info_ptr structure */ -void PNGAPI -png_read_update_info(png_structp png_ptr, png_infop info_ptr) -{ - png_debug(1, "in png_read_update_info\n"); - if(png_ptr == NULL) return; - if (!(png_ptr->flags & PNG_FLAG_ROW_INIT)) - png_read_start_row(png_ptr); - else - png_warning(png_ptr, - "Ignoring extra png_read_update_info() call; row buffer not reallocated"); - png_read_transform_info(png_ptr, info_ptr); -} - -#ifndef PNG_NO_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_structp png_ptr) -{ - png_debug(1, "in png_start_read_image\n"); - if(png_ptr == NULL) return; - if (!(png_ptr->flags & PNG_FLAG_ROW_INIT)) - png_read_start_row(png_ptr); -} -#endif /* PNG_NO_SEQUENTIAL_READ_SUPPORTED */ - -#ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED -void PNGAPI -png_read_row(png_structp png_ptr, png_bytep row, png_bytep dsp_row) -{ -#ifdef PNG_USE_LOCAL_ARRAYS - PNG_CONST PNG_IDAT; - PNG_CONST int png_pass_dsp_mask[7] = {0xff, 0x0f, 0xff, 0x33, 0xff, 0x55, - 0xff}; - PNG_CONST int png_pass_mask[7] = {0x80, 0x08, 0x88, 0x22, 0xaa, 0x55, 0xff}; -#endif - int ret; - if(png_ptr == NULL) return; - png_debug2(1, "in png_read_row (row %lu, pass %d)\n", - png_ptr->row_number, png_ptr->pass); - if (!(png_ptr->flags & PNG_FLAG_ROW_INIT)) - png_read_start_row(png_ptr); - 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 - } - -#if defined(PNG_READ_INTERLACING_SUPPORTED) - /* if interlaced and we do not need a new row, combine row and return */ - 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, - png_pass_dsp_mask[png_ptr->pass]); - 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, - png_pass_dsp_mask[png_ptr->pass]); - 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, - png_pass_dsp_mask[png_ptr->pass]); - 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, - png_pass_dsp_mask[png_ptr->pass]); - 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, - png_pass_dsp_mask[png_ptr->pass]); - 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, - png_pass_dsp_mask[png_ptr->pass]); - png_read_finish_row(png_ptr); - return; - } - break; - 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"); - - png_ptr->zstream.next_out = png_ptr->row_buf; - png_ptr->zstream.avail_out = (uInt)png_ptr->irowbytes; - do - { - if (!(png_ptr->zstream.avail_in)) - { - while (!png_ptr->idat_size) - { - png_byte chunk_length[4]; - - png_crc_finish(png_ptr, 0); - - png_read_data(png_ptr, chunk_length, 4); - png_ptr->idat_size = png_get_uint_31(png_ptr,chunk_length); - - png_reset_crc(png_ptr); - png_crc_read(png_ptr, png_ptr->chunk_name, 4); - if (png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) - png_error(png_ptr, "Not enough image data"); - } - png_ptr->zstream.avail_in = (uInt)png_ptr->zbuf_size; - png_ptr->zstream.next_in = png_ptr->zbuf; - if (png_ptr->zbuf_size > png_ptr->idat_size) - png_ptr->zstream.avail_in = (uInt)png_ptr->idat_size; - png_crc_read(png_ptr, png_ptr->zbuf, - (png_size_t)png_ptr->zstream.avail_in); - png_ptr->idat_size -= png_ptr->zstream.avail_in; - } - ret = inflate(&png_ptr->zstream, Z_PARTIAL_FLUSH); - if (ret == Z_STREAM_END) - { - if (png_ptr->zstream.avail_out || png_ptr->zstream.avail_in || - png_ptr->idat_size) - png_error(png_ptr, "Extra compressed data"); - png_ptr->mode |= PNG_AFTER_IDAT; - png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED; - break; - } - if (ret != Z_OK) - png_error(png_ptr, png_ptr->zstream.msg ? png_ptr->zstream.msg : - "Decompression error"); - - } while (png_ptr->zstream.avail_out); - - png_ptr->row_info.color_type = png_ptr->color_type; - png_ptr->row_info.width = png_ptr->iwidth; - png_ptr->row_info.channels = png_ptr->channels; - png_ptr->row_info.bit_depth = png_ptr->bit_depth; - png_ptr->row_info.pixel_depth = png_ptr->pixel_depth; - png_ptr->row_info.rowbytes = PNG_ROWBYTES(png_ptr->row_info.pixel_depth, - png_ptr->row_info.width); - - if(png_ptr->row_buf[0]) - png_read_filter_row(png_ptr, &(png_ptr->row_info), - png_ptr->row_buf + 1, png_ptr->prev_row + 1, - (int)(png_ptr->row_buf[0])); - - png_memcpy_check(png_ptr, png_ptr->prev_row, png_ptr->row_buf, - png_ptr->rowbytes + 1); - -#if defined(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(&(png_ptr->row_info), png_ptr->row_buf + 1); - } -#endif - - - if (png_ptr->transformations || (png_ptr->flags&PNG_FLAG_STRIP_ALPHA)) - png_do_read_transformations(png_ptr); - -#if defined(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) -/* old interface (pre-1.0.9): - png_do_read_interlace(&(png_ptr->row_info), - png_ptr->row_buf + 1, png_ptr->pass, png_ptr->transformations); - */ - png_do_read_interlace(png_ptr); - - if (dsp_row != NULL) - png_combine_row(png_ptr, dsp_row, - png_pass_dsp_mask[png_ptr->pass]); - if (row != NULL) - png_combine_row(png_ptr, row, - png_pass_mask[png_ptr->pass]); - } - else -#endif - { - if (row != NULL) - png_combine_row(png_ptr, row, 0xff); - if (dsp_row != NULL) - png_combine_row(png_ptr, dsp_row, 0xff); - } - 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_NO_SEQUENTIAL_READ_SUPPORTED */ - -#ifndef PNG_NO_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_structp 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\n"); - 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, png_bytep_NULL); - rp++; - } - else if(dp != NULL) - for (i = 0; i < num_rows; i++) - { - png_bytep dptr = *dp; - png_read_row(png_ptr, png_bytep_NULL, dptr); - dp++; - } -} -#endif /* PNG_NO_SEQUENTIAL_READ_SUPPORTED */ - -#ifndef PNG_NO_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_structp png_ptr, png_bytepp image) -{ - png_uint_32 i,image_height; - int pass, j; - png_bytepp rp; - - png_debug(1, "in png_read_image\n"); - if(png_ptr == NULL) return; - -#ifdef PNG_READ_INTERLACING_SUPPORTED - 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; - png_ptr->num_rows = image_height; /* Make sure this is set correctly */ - - for (j = 0; j < pass; j++) - { - rp = image; - for (i = 0; i < image_height; i++) - { - png_read_row(png_ptr, *rp, png_bytep_NULL); - rp++; - } - } -} -#endif /* PNG_NO_SEQUENTIAL_READ_SUPPORTED */ - -#ifndef PNG_NO_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_structp png_ptr, png_infop info_ptr) -{ - png_byte chunk_length[4]; - png_uint_32 length; - - png_debug(1, "in png_read_end\n"); - if(png_ptr == NULL) return; - png_crc_finish(png_ptr, 0); /* Finish off CRC from last IDAT chunk */ - - do - { -#ifdef PNG_USE_LOCAL_ARRAYS - PNG_CONST PNG_IHDR; - PNG_CONST PNG_IDAT; - PNG_CONST PNG_IEND; - PNG_CONST PNG_PLTE; -#if defined(PNG_READ_bKGD_SUPPORTED) - PNG_CONST PNG_bKGD; -#endif -#if defined(PNG_READ_cHRM_SUPPORTED) - PNG_CONST PNG_cHRM; -#endif -#if defined(PNG_READ_gAMA_SUPPORTED) - PNG_CONST PNG_gAMA; -#endif -#if defined(PNG_READ_hIST_SUPPORTED) - PNG_CONST PNG_hIST; -#endif -#if defined(PNG_READ_iCCP_SUPPORTED) - PNG_CONST PNG_iCCP; -#endif -#if defined(PNG_READ_iTXt_SUPPORTED) - PNG_CONST PNG_iTXt; -#endif -#if defined(PNG_READ_oFFs_SUPPORTED) - PNG_CONST PNG_oFFs; -#endif -#if defined(PNG_READ_pCAL_SUPPORTED) - PNG_CONST PNG_pCAL; -#endif -#if defined(PNG_READ_pHYs_SUPPORTED) - PNG_CONST PNG_pHYs; -#endif -#if defined(PNG_READ_sBIT_SUPPORTED) - PNG_CONST PNG_sBIT; -#endif -#if defined(PNG_READ_sCAL_SUPPORTED) - PNG_CONST PNG_sCAL; -#endif -#if defined(PNG_READ_sPLT_SUPPORTED) - PNG_CONST PNG_sPLT; -#endif -#if defined(PNG_READ_sRGB_SUPPORTED) - PNG_CONST PNG_sRGB; -#endif -#if defined(PNG_READ_tEXt_SUPPORTED) - PNG_CONST PNG_tEXt; -#endif -#if defined(PNG_READ_tIME_SUPPORTED) - PNG_CONST PNG_tIME; -#endif -#if defined(PNG_READ_tRNS_SUPPORTED) - PNG_CONST PNG_tRNS; -#endif -#if defined(PNG_READ_zTXt_SUPPORTED) - PNG_CONST PNG_zTXt; -#endif -#endif /* PNG_USE_LOCAL_ARRAYS */ - - png_read_data(png_ptr, chunk_length, 4); - length = png_get_uint_31(png_ptr,chunk_length); - - png_reset_crc(png_ptr); - png_crc_read(png_ptr, png_ptr->chunk_name, 4); - - png_debug1(0, "Reading %s chunk.\n", png_ptr->chunk_name); - - if (!png_memcmp(png_ptr->chunk_name, png_IHDR, 4)) - png_handle_IHDR(png_ptr, info_ptr, length); - else if (!png_memcmp(png_ptr->chunk_name, png_IEND, 4)) - png_handle_IEND(png_ptr, info_ptr, length); -#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED - else if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name)) - { - if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) - { - if ((length > 0) || (png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT)) - png_error(png_ptr, "Too many IDAT's found"); - } - png_handle_unknown(png_ptr, info_ptr, length); - if (!png_memcmp(png_ptr->chunk_name, png_PLTE, 4)) - png_ptr->mode |= PNG_HAVE_PLTE; - } -#endif - else if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) - { - /* 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_error(png_ptr, "Too many IDAT's found"); - png_crc_finish(png_ptr, length); - } - else if (!png_memcmp(png_ptr->chunk_name, png_PLTE, 4)) - png_handle_PLTE(png_ptr, info_ptr, length); -#if defined(PNG_READ_bKGD_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_bKGD, 4)) - png_handle_bKGD(png_ptr, info_ptr, length); -#endif -#if defined(PNG_READ_cHRM_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_cHRM, 4)) - png_handle_cHRM(png_ptr, info_ptr, length); -#endif -#if defined(PNG_READ_gAMA_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_gAMA, 4)) - png_handle_gAMA(png_ptr, info_ptr, length); -#endif -#if defined(PNG_READ_hIST_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_hIST, 4)) - png_handle_hIST(png_ptr, info_ptr, length); -#endif -#if defined(PNG_READ_oFFs_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_oFFs, 4)) - png_handle_oFFs(png_ptr, info_ptr, length); -#endif -#if defined(PNG_READ_pCAL_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_pCAL, 4)) - png_handle_pCAL(png_ptr, info_ptr, length); -#endif -#if defined(PNG_READ_sCAL_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_sCAL, 4)) - png_handle_sCAL(png_ptr, info_ptr, length); -#endif -#if defined(PNG_READ_pHYs_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_pHYs, 4)) - png_handle_pHYs(png_ptr, info_ptr, length); -#endif -#if defined(PNG_READ_sBIT_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_sBIT, 4)) - png_handle_sBIT(png_ptr, info_ptr, length); -#endif -#if defined(PNG_READ_sRGB_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_sRGB, 4)) - png_handle_sRGB(png_ptr, info_ptr, length); -#endif -#if defined(PNG_READ_iCCP_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_iCCP, 4)) - png_handle_iCCP(png_ptr, info_ptr, length); -#endif -#if defined(PNG_READ_sPLT_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_sPLT, 4)) - png_handle_sPLT(png_ptr, info_ptr, length); -#endif -#if defined(PNG_READ_tEXt_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_tEXt, 4)) - png_handle_tEXt(png_ptr, info_ptr, length); -#endif -#if defined(PNG_READ_tIME_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_tIME, 4)) - png_handle_tIME(png_ptr, info_ptr, length); -#endif -#if defined(PNG_READ_tRNS_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_tRNS, 4)) - png_handle_tRNS(png_ptr, info_ptr, length); -#endif -#if defined(PNG_READ_zTXt_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_zTXt, 4)) - png_handle_zTXt(png_ptr, info_ptr, length); -#endif -#if defined(PNG_READ_iTXt_SUPPORTED) - else if (!png_memcmp(png_ptr->chunk_name, png_iTXt, 4)) - png_handle_iTXt(png_ptr, info_ptr, length); -#endif - else - png_handle_unknown(png_ptr, info_ptr, length); - } while (!(png_ptr->mode & PNG_HAVE_IEND)); -} -#endif /* PNG_NO_SEQUENTIAL_READ_SUPPORTED */ - -/* 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_structp png_ptr = NULL; - png_infop info_ptr = NULL, end_info_ptr = NULL; -#ifdef PNG_USER_MEM_SUPPORTED - png_free_ptr free_fn; - png_voidp mem_ptr; -#endif - - png_debug(1, "in png_destroy_read_struct\n"); - if (png_ptr_ptr != NULL) - png_ptr = *png_ptr_ptr; - - if (info_ptr_ptr != NULL) - info_ptr = *info_ptr_ptr; - - if (end_info_ptr_ptr != NULL) - end_info_ptr = *end_info_ptr_ptr; - -#ifdef PNG_USER_MEM_SUPPORTED - free_fn = png_ptr->free_fn; - mem_ptr = png_ptr->mem_ptr; -#endif - - png_read_destroy(png_ptr, info_ptr, end_info_ptr); - - if (info_ptr != NULL) - { -#if defined(PNG_TEXT_SUPPORTED) - png_free_data(png_ptr, info_ptr, PNG_FREE_TEXT, -1); -#endif - -#ifdef PNG_USER_MEM_SUPPORTED - png_destroy_struct_2((png_voidp)info_ptr, (png_free_ptr)free_fn, - (png_voidp)mem_ptr); -#else - png_destroy_struct((png_voidp)info_ptr); -#endif - *info_ptr_ptr = NULL; - } - - if (end_info_ptr != NULL) - { -#if defined(PNG_READ_TEXT_SUPPORTED) - png_free_data(png_ptr, end_info_ptr, PNG_FREE_TEXT, -1); -#endif -#ifdef PNG_USER_MEM_SUPPORTED - png_destroy_struct_2((png_voidp)end_info_ptr, (png_free_ptr)free_fn, - (png_voidp)mem_ptr); -#else - png_destroy_struct((png_voidp)end_info_ptr); -#endif - *end_info_ptr_ptr = NULL; - } - - if (png_ptr != NULL) - { -#ifdef PNG_USER_MEM_SUPPORTED - png_destroy_struct_2((png_voidp)png_ptr, (png_free_ptr)free_fn, - (png_voidp)mem_ptr); -#else - png_destroy_struct((png_voidp)png_ptr); -#endif - *png_ptr_ptr = NULL; - } -} - -/* free all memory used by the read (old method) */ -void /* PRIVATE */ -png_read_destroy(png_structp png_ptr, png_infop info_ptr, png_infop end_info_ptr) -{ -#ifdef PNG_SETJMP_SUPPORTED - jmp_buf tmp_jmp; -#endif - png_error_ptr error_fn; - png_error_ptr warning_fn; - png_voidp error_ptr; -#ifdef PNG_USER_MEM_SUPPORTED - png_free_ptr free_fn; -#endif - - png_debug(1, "in png_read_destroy\n"); - if (info_ptr != NULL) - png_info_destroy(png_ptr, info_ptr); - - if (end_info_ptr != NULL) - png_info_destroy(png_ptr, end_info_ptr); - - png_free(png_ptr, png_ptr->zbuf); - png_free(png_ptr, png_ptr->big_row_buf); - png_free(png_ptr, png_ptr->prev_row); -#if defined(PNG_READ_DITHER_SUPPORTED) - png_free(png_ptr, png_ptr->palette_lookup); - png_free(png_ptr, png_ptr->dither_index); -#endif -#if defined(PNG_READ_GAMMA_SUPPORTED) - png_free(png_ptr, png_ptr->gamma_table); -#endif -#if defined(PNG_READ_BACKGROUND_SUPPORTED) - png_free(png_ptr, png_ptr->gamma_from_1); - png_free(png_ptr, png_ptr->gamma_to_1); -#endif -#ifdef PNG_FREE_ME_SUPPORTED - if (png_ptr->free_me & PNG_FREE_PLTE) - png_zfree(png_ptr, png_ptr->palette); - png_ptr->free_me &= ~PNG_FREE_PLTE; -#else - if (png_ptr->flags & PNG_FLAG_FREE_PLTE) - png_zfree(png_ptr, png_ptr->palette); - png_ptr->flags &= ~PNG_FLAG_FREE_PLTE; -#endif -#if defined(PNG_tRNS_SUPPORTED) || \ - defined(PNG_READ_EXPAND_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) -#ifdef PNG_FREE_ME_SUPPORTED - if (png_ptr->free_me & PNG_FREE_TRNS) - png_free(png_ptr, png_ptr->trans); - png_ptr->free_me &= ~PNG_FREE_TRNS; -#else - if (png_ptr->flags & PNG_FLAG_FREE_TRNS) - png_free(png_ptr, png_ptr->trans); - png_ptr->flags &= ~PNG_FLAG_FREE_TRNS; -#endif -#endif -#if defined(PNG_READ_hIST_SUPPORTED) -#ifdef PNG_FREE_ME_SUPPORTED - if (png_ptr->free_me & PNG_FREE_HIST) - png_free(png_ptr, png_ptr->hist); - png_ptr->free_me &= ~PNG_FREE_HIST; -#else - if (png_ptr->flags & PNG_FLAG_FREE_HIST) - png_free(png_ptr, png_ptr->hist); - png_ptr->flags &= ~PNG_FLAG_FREE_HIST; -#endif -#endif -#if defined(PNG_READ_GAMMA_SUPPORTED) - 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); - } -#if defined(PNG_READ_BACKGROUND_SUPPORTED) - 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); - } - 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); - } -#endif -#endif -#if defined(PNG_TIME_RFC1123_SUPPORTED) - png_free(png_ptr, png_ptr->time_buffer); -#endif - - inflateEnd(&png_ptr->zstream); -#ifdef PNG_PROGRESSIVE_READ_SUPPORTED - png_free(png_ptr, png_ptr->save_buffer); -#endif - -#ifdef PNG_PROGRESSIVE_READ_SUPPORTED -#ifdef PNG_TEXT_SUPPORTED - png_free(png_ptr, png_ptr->current_text); -#endif /* PNG_TEXT_SUPPORTED */ -#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ - - /* Save the important info out of the png_struct, in case it is - * being used again. - */ -#ifdef PNG_SETJMP_SUPPORTED - png_memcpy(tmp_jmp, png_ptr->jmpbuf, png_sizeof (jmp_buf)); -#endif - - error_fn = png_ptr->error_fn; - warning_fn = png_ptr->warning_fn; - error_ptr = png_ptr->error_ptr; -#ifdef PNG_USER_MEM_SUPPORTED - free_fn = png_ptr->free_fn; -#endif - - png_memset(png_ptr, 0, png_sizeof (png_struct)); - - png_ptr->error_fn = error_fn; - png_ptr->warning_fn = warning_fn; - png_ptr->error_ptr = error_ptr; -#ifdef PNG_USER_MEM_SUPPORTED - png_ptr->free_fn = free_fn; -#endif - -#ifdef PNG_SETJMP_SUPPORTED - png_memcpy(png_ptr->jmpbuf, tmp_jmp, png_sizeof (jmp_buf)); -#endif - -} - -void PNGAPI -png_set_read_status_fn(png_structp png_ptr, png_read_status_ptr read_row_fn) -{ - if(png_ptr == NULL) return; - png_ptr->read_row_fn = read_row_fn; -} - - -#ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED -#if defined(PNG_INFO_IMAGE_SUPPORTED) -void PNGAPI -png_read_png(png_structp png_ptr, png_infop info_ptr, - int transforms, - voidp params) -{ - int row; - - if(png_ptr == NULL) return; -#if defined(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 - - /* 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/png_sizeof(png_bytep)) - png_error(png_ptr,"Image is too high to process with png_read_png()"); - - /* -------------- image transformations start here ------------------- */ - -#if defined(PNG_READ_16_TO_8_SUPPORTED) - /* tell libpng to strip 16 bit/color files down to 8 bits per color - */ - if (transforms & PNG_TRANSFORM_STRIP_16) - png_set_strip_16(png_ptr); -#endif - -#if defined(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 - -#if defined(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 - -#if defined(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 dithering. - */ - -#if defined(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 - -#if defined(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; - - png_get_sBIT(png_ptr, info_ptr, &sig_bit); - png_set_shift(png_ptr, sig_bit); - } -#endif - -#if defined(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 - -#if defined(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 - -#if defined(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 - - /* We don't handle adding filler bytes */ - - /* 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 ------------------- */ - -#ifdef PNG_FREE_ME_SUPPORTED - png_free_data(png_ptr, info_ptr, PNG_FREE_ROWS, 0); -#endif - if(info_ptr->row_pointers == NULL) - { - info_ptr->row_pointers = (png_bytepp)png_malloc(png_ptr, - info_ptr->height * png_sizeof(png_bytep)); -#ifdef PNG_FREE_ME_SUPPORTED - info_ptr->free_me |= PNG_FREE_ROWS; -#endif - 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); - - transforms = transforms; /* quiet compiler warnings */ - params = params; - -} -#endif /* PNG_INFO_IMAGE_SUPPORTED */ -#endif /* PNG_NO_SEQUENTIAL_READ_SUPPORTED */ -#endif /* PNG_READ_SUPPORTED */ diff --git a/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngrio.c b/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngrio.c deleted file mode 100644 index 22756832..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngrio.c +++ /dev/null @@ -1,167 +0,0 @@ - -/* pngrio.c - functions for data input - * - * Last changed in libpng 1.2.13 November 13, 2006 - * For conditions of distribution and use, see copyright notice in png.h - * Copyright (c) 1998-2006 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 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(...). - */ - -#define PNG_INTERNAL -#include "png.h" - -#if defined(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_structp png_ptr, png_bytep data, png_size_t length) -{ - png_debug1(4,"reading %d bytes\n", (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"); -} - -#if !defined(PNG_NO_STDIO) -/* 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. */ -#ifndef USE_FAR_KEYWORD -void PNGAPI -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. - */ -#if defined(_WIN32_WCE) - if ( !ReadFile((HANDLE)(png_ptr->io_ptr), data, length, &check, NULL) ) - check = 0; -#else - check = (png_size_t)fread(data, (png_size_t)1, length, - (png_FILE_p)png_ptr->io_ptr); -#endif - - if (check != length) - png_error(png_ptr, "Read Error"); -} -#else -/* this is the model-independent version. Since the standard I/O library - can't handle far buffers in the medium and small models, we have to copy - the data. -*/ - -#define NEAR_BUF_SIZE 1024 -#define MIN(a,b) (a <= b ? a : b) - -static void PNGAPI -png_default_read_data(png_structp png_ptr, png_bytep data, png_size_t length) -{ - int check; - png_byte *n_data; - png_FILE_p io_ptr; - - if(png_ptr == NULL) return; - /* Check if data really is near. If so, use usual code. */ - n_data = (png_byte *)CVT_PTR_NOCHECK(data); - io_ptr = (png_FILE_p)CVT_PTR(png_ptr->io_ptr); - if ((png_bytep)n_data == data) - { -#if defined(_WIN32_WCE) - if ( !ReadFile((HANDLE)(png_ptr->io_ptr), data, length, &check, NULL) ) - check = 0; -#else - check = fread(n_data, 1, length, io_ptr); -#endif - } - else - { - png_byte buf[NEAR_BUF_SIZE]; - png_size_t read, remaining, err; - check = 0; - remaining = length; - do - { - read = MIN(NEAR_BUF_SIZE, remaining); -#if defined(_WIN32_WCE) - if ( !ReadFile((HANDLE)(io_ptr), buf, read, &err, NULL) ) - err = 0; -#else - err = fread(buf, (png_size_t)1, read, io_ptr); -#endif - png_memcpy(data, buf, read); /* copy far buffer to near buffer */ - if(err != read) - break; - else - check += err; - data += read; - remaining -= read; - } - while (remaining != 0); - } - if ((png_uint_32)check != (png_uint_32)length) - png_error(png_ptr, "read Error"); -} -#endif -#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"). */ -void PNGAPI -png_set_read_fn(png_structp png_ptr, png_voidp io_ptr, - png_rw_ptr read_data_fn) -{ - if(png_ptr == NULL) return; - png_ptr->io_ptr = io_ptr; - -#if !defined(PNG_NO_STDIO) - 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, - "It's an error to set both read_data_fn and write_data_fn in the "); - png_warning(png_ptr, - "same structure. Resetting write_data_fn to NULL."); - } - -#if defined(PNG_WRITE_FLUSH_SUPPORTED) - png_ptr->output_flush_fn = NULL; -#endif -} -#endif /* PNG_READ_SUPPORTED */ diff --git a/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngrtran.c b/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngrtran.c deleted file mode 100644 index b02b1d16..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngrtran.c +++ /dev/null @@ -1,4287 +0,0 @@ - -/* pngrtran.c - transforms the data in a row for PNG readers - * - * Last changed in libpng 1.2.21 [October 4, 2007] - * For conditions of distribution and use, see copyright notice in png.h - * Copyright (c) 1998-2007 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 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. - */ - -#define PNG_INTERNAL -#include "png.h" - -#if defined(PNG_READ_SUPPORTED) - -/* Set the action on getting a CRC error for an ancillary or critical chunk. */ -void PNGAPI -png_set_crc_action(png_structp png_ptr, int crit_action, int ancil_action) -{ - png_debug(1, "in png_set_crc_action\n"); - /* Tell libpng how we react to CRC errors in critical chunks */ - if(png_ptr == NULL) return; - 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; - } - - 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; - } -} - -#if defined(PNG_READ_BACKGROUND_SUPPORTED) && \ - defined(PNG_FLOATING_POINT_SUPPORTED) -/* handle alpha and tRNS via a background color */ -void PNGAPI -png_set_background(png_structp png_ptr, - png_color_16p background_color, int background_gamma_code, - int need_expand, double background_gamma) -{ - png_debug(1, "in png_set_background\n"); - if(png_ptr == 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_BACKGROUND; - png_memcpy(&(png_ptr->background), background_color, - png_sizeof(png_color_16)); - png_ptr->background_gamma = (float)background_gamma; - png_ptr->background_gamma_type = (png_byte)(background_gamma_code); - png_ptr->transformations |= (need_expand ? PNG_BACKGROUND_EXPAND : 0); -} -#endif - -#if defined(PNG_READ_16_TO_8_SUPPORTED) -/* strip 16 bit depth files to 8 bit depth */ -void PNGAPI -png_set_strip_16(png_structp png_ptr) -{ - png_debug(1, "in png_set_strip_16\n"); - if(png_ptr == NULL) return; - png_ptr->transformations |= PNG_16_TO_8; -} -#endif - -#if defined(PNG_READ_STRIP_ALPHA_SUPPORTED) -void PNGAPI -png_set_strip_alpha(png_structp png_ptr) -{ - png_debug(1, "in png_set_strip_alpha\n"); - if(png_ptr == NULL) return; - png_ptr->flags |= PNG_FLAG_STRIP_ALPHA; -} -#endif - -#if defined(PNG_READ_DITHER_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_dither" indicates - * whether we need a dithering 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 FAR * next; - png_byte left; - png_byte right; -} png_dsort; -typedef png_dsort FAR * png_dsortp; -typedef png_dsort FAR * FAR * png_dsortpp; - -void PNGAPI -png_set_dither(png_structp png_ptr, png_colorp palette, - int num_palette, int maximum_colors, png_uint_16p histogram, - int full_dither) -{ - png_debug(1, "in png_set_dither\n"); - if(png_ptr == NULL) return; - png_ptr->transformations |= PNG_DITHER; - - if (!full_dither) - { - int i; - - png_ptr->dither_index = (png_bytep)png_malloc(png_ptr, - (png_uint_32)(num_palette * png_sizeof (png_byte))); - for (i = 0; i < num_palette; i++) - png_ptr->dither_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->dither_sort = (png_bytep)png_malloc(png_ptr, - (png_uint_32)(num_palette * png_sizeof (png_byte))); - - /* initialize the dither_sort array */ - for (i = 0; i < num_palette; i++) - png_ptr->dither_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->dither_sort[j]] - < histogram[png_ptr->dither_sort[j + 1]]) - { - png_byte t; - - t = png_ptr->dither_sort[j]; - png_ptr->dither_sort[j] = png_ptr->dither_sort[j + 1]; - png_ptr->dither_sort[j + 1] = t; - done = 0; - } - } - if (done) - break; - } - - /* swap the palette around, and set up a table, if necessary */ - if (full_dither) - { - 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->dither_sort[i] >= maximum_colors) - { - do - j--; - while ((int)png_ptr->dither_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->dither_sort[i] >= maximum_colors) - { - png_color tmp_color; - - do - j--; - while ((int)png_ptr->dither_sort[j] >= maximum_colors); - - tmp_color = palette[j]; - palette[j] = palette[i]; - palette[i] = tmp_color; - /* indicate where the color went */ - png_ptr->dither_index[j] = (png_byte)i; - png_ptr->dither_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->dither_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->dither_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->dither_index[i] = (png_byte)min_k; - } - } - } - png_free(png_ptr, png_ptr->dither_sort); - png_ptr->dither_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 * png_sizeof (png_byte))); - png_ptr->palette_to_index = (png_bytep)png_malloc(png_ptr, - (png_uint_32)(num_palette * png_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_malloc(png_ptr, (png_uint_32)(769 * - png_sizeof (png_dsortp))); - for (i = 0; i < 769; i++) - hash[i] = NULL; -/* png_memset(hash, 0, 769 * png_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)(png_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_dither) - { - int k; - - for (k = 0; k < num_palette; k++) - { - if (png_ptr->dither_index[k] == - png_ptr->index_to_palette[j]) - png_ptr->dither_index[k] = - png_ptr->index_to_palette[next_j]; - if ((int)png_ptr->dither_index[k] == - num_new_palette) - png_ptr->dither_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_dither) - { - int i; - png_bytep distance; - int total_bits = PNG_DITHER_RED_BITS + PNG_DITHER_GREEN_BITS + - PNG_DITHER_BLUE_BITS; - int num_red = (1 << PNG_DITHER_RED_BITS); - int num_green = (1 << PNG_DITHER_GREEN_BITS); - int num_blue = (1 << PNG_DITHER_BLUE_BITS); - png_size_t num_entries = ((png_size_t)1 << total_bits); - - png_ptr->palette_lookup = (png_bytep )png_malloc(png_ptr, - (png_uint_32)(num_entries * png_sizeof (png_byte))); - - png_memset(png_ptr->palette_lookup, 0, num_entries * - png_sizeof (png_byte)); - - distance = (png_bytep)png_malloc(png_ptr, (png_uint_32)(num_entries * - png_sizeof(png_byte))); - - png_memset(distance, 0xff, num_entries * png_sizeof(png_byte)); - - for (i = 0; i < num_palette; i++) - { - int ir, ig, ib; - int r = (palette[i].red >> (8 - PNG_DITHER_RED_BITS)); - int g = (palette[i].green >> (8 - PNG_DITHER_GREEN_BITS)); - int b = (palette[i].blue >> (8 - PNG_DITHER_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_DITHER_BLUE_BITS + PNG_DITHER_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_DITHER_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 - -#if defined(PNG_READ_GAMMA_SUPPORTED) && defined(PNG_FLOATING_POINT_SUPPORTED) -/* Transform the image from the file_gamma to the screen_gamma. We - * 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. - * - * We will turn off gamma transformation later if no semitransparent entries - * are present in the tRNS array for palette images. We can't do it here - * because we don't necessarily have the tRNS chunk yet. - */ -void PNGAPI -png_set_gamma(png_structp png_ptr, double scrn_gamma, double file_gamma) -{ - png_debug(1, "in png_set_gamma\n"); - if(png_ptr == NULL) return; - if ((fabs(scrn_gamma * file_gamma - 1.0) > PNG_GAMMA_THRESHOLD) || - (png_ptr->color_type & PNG_COLOR_MASK_ALPHA) || - (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)) - png_ptr->transformations |= PNG_GAMMA; - png_ptr->gamma = (float)file_gamma; - png_ptr->screen_gamma = (float)scrn_gamma; -} -#endif - -#if defined(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_structp png_ptr) -{ - png_debug(1, "in png_set_expand\n"); - if(png_ptr == NULL) return; - png_ptr->transformations |= (PNG_EXPAND | PNG_EXPAND_tRNS); -#ifdef PNG_WARN_UNINITIALIZED_ROW - png_ptr->flags &= ~PNG_FLAG_ROW_INIT; -#endif -} - -/* 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.4.0, png_set_gray_1_2_4_to_8() was modified - * to expand only the sample depth but not to expand the tRNS to alpha. - */ - -/* Expand paletted images to RGB. */ -void PNGAPI -png_set_palette_to_rgb(png_structp png_ptr) -{ - png_debug(1, "in png_set_palette_to_rgb\n"); - if(png_ptr == NULL) return; - png_ptr->transformations |= (PNG_EXPAND | PNG_EXPAND_tRNS); -#ifdef PNG_WARN_UNINITIALIZED_ROW - png_ptr->flags &= !(PNG_FLAG_ROW_INIT); - png_ptr->flags &= ~PNG_FLAG_ROW_INIT; -#endif -} - -#if !defined(PNG_1_0_X) -/* Expand grayscale images of less than 8-bit depth to 8 bits. */ -void PNGAPI -png_set_expand_gray_1_2_4_to_8(png_structp png_ptr) -{ - png_debug(1, "in png_set_expand_gray_1_2_4_to_8\n"); - if(png_ptr == NULL) return; - png_ptr->transformations |= PNG_EXPAND; -#ifdef PNG_WARN_UNINITIALIZED_ROW - png_ptr->flags &= ~PNG_FLAG_ROW_INIT; -#endif -} -#endif - -#if defined(PNG_1_0_X) || defined(PNG_1_2_X) -/* Expand grayscale images of less than 8-bit depth to 8 bits. */ -/* Deprecated as of libpng-1.2.9 */ -void PNGAPI -png_set_gray_1_2_4_to_8(png_structp png_ptr) -{ - png_debug(1, "in png_set_gray_1_2_4_to_8\n"); - if(png_ptr == NULL) return; - png_ptr->transformations |= (PNG_EXPAND | PNG_EXPAND_tRNS); -} -#endif - - -/* Expand tRNS chunks to alpha channels. */ -void PNGAPI -png_set_tRNS_to_alpha(png_structp png_ptr) -{ - png_debug(1, "in png_set_tRNS_to_alpha\n"); - png_ptr->transformations |= (PNG_EXPAND | PNG_EXPAND_tRNS); -#ifdef PNG_WARN_UNINITIALIZED_ROW - png_ptr->flags &= ~PNG_FLAG_ROW_INIT; -#endif -} -#endif /* defined(PNG_READ_EXPAND_SUPPORTED) */ - -#if defined(PNG_READ_GRAY_TO_RGB_SUPPORTED) -void PNGAPI -png_set_gray_to_rgb(png_structp png_ptr) -{ - png_debug(1, "in png_set_gray_to_rgb\n"); - png_ptr->transformations |= PNG_GRAY_TO_RGB; -#ifdef PNG_WARN_UNINITIALIZED_ROW - png_ptr->flags &= ~PNG_FLAG_ROW_INIT; -#endif -} -#endif - -#if defined(PNG_READ_RGB_TO_GRAY_SUPPORTED) -#if defined(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_structp png_ptr, int error_action, double red, - double green) -{ - int red_fixed = (int)((float)red*100000.0 + 0.5); - int green_fixed = (int)((float)green*100000.0 + 0.5); - if(png_ptr == NULL) return; - png_set_rgb_to_gray_fixed(png_ptr, error_action, red_fixed, green_fixed); -} -#endif - -void PNGAPI -png_set_rgb_to_gray_fixed(png_structp png_ptr, int error_action, - png_fixed_point red, png_fixed_point green) -{ - png_debug(1, "in png_set_rgb_to_gray\n"); - if(png_ptr == NULL) return; - switch(error_action) - { - case 1: png_ptr->transformations |= PNG_RGB_TO_GRAY; - break; - case 2: png_ptr->transformations |= PNG_RGB_TO_GRAY_WARN; - break; - case 3: png_ptr->transformations |= PNG_RGB_TO_GRAY_ERR; - } - if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) -#if defined(PNG_READ_EXPAND_SUPPORTED) - png_ptr->transformations |= PNG_EXPAND; -#else - { - png_warning(png_ptr, "Cannot do RGB_TO_GRAY without EXPAND_SUPPORTED."); - png_ptr->transformations &= ~PNG_RGB_TO_GRAY; - } -#endif - { - png_uint_16 red_int, green_int; - if(red < 0 || green < 0) - { - red_int = 6968; /* .212671 * 32768 + .5 */ - green_int = 23434; /* .715160 * 32768 + .5 */ - } - else if(red + green < 100000L) - { - red_int = (png_uint_16)(((png_uint_32)red*32768L)/100000L); - green_int = (png_uint_16)(((png_uint_32)green*32768L)/100000L); - } - else - { - png_warning(png_ptr, "ignoring out of range rgb_to_gray coefficients"); - red_int = 6968; - green_int = 23434; - } - png_ptr->rgb_to_gray_red_coeff = red_int; - png_ptr->rgb_to_gray_green_coeff = green_int; - png_ptr->rgb_to_gray_blue_coeff = (png_uint_16)(32768-red_int-green_int); - } -} -#endif - -#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ - defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) || \ - defined(PNG_LEGACY_SUPPORTED) -void PNGAPI -png_set_read_user_transform_fn(png_structp png_ptr, png_user_transform_ptr - read_user_transform_fn) -{ - png_debug(1, "in png_set_read_user_transform_fn\n"); - if(png_ptr == NULL) return; -#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) - png_ptr->transformations |= PNG_USER_TRANSFORM; - png_ptr->read_user_transform_fn = read_user_transform_fn; -#endif -#ifdef PNG_LEGACY_SUPPORTED - if(read_user_transform_fn) - png_warning(png_ptr, - "This version of libpng does not support user transforms"); -#endif -} -#endif - -/* Initialize everything needed for the read. This includes modifying - * the palette. - */ -void /* PRIVATE */ -png_init_read_transformations(png_structp png_ptr) -{ - png_debug(1, "in png_init_read_transformations\n"); -#if defined(PNG_USELESS_TESTS_SUPPORTED) - if(png_ptr != NULL) -#endif - { -#if defined(PNG_READ_BACKGROUND_SUPPORTED) || defined(PNG_READ_SHIFT_SUPPORTED) \ - || defined(PNG_READ_GAMMA_SUPPORTED) - int color_type = png_ptr->color_type; -#endif - -#if defined(PNG_READ_EXPAND_SUPPORTED) && defined(PNG_READ_BACKGROUND_SUPPORTED) - -#if defined(PNG_READ_GRAY_TO_RGB_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. - */ - if ((png_ptr->transformations & PNG_BACKGROUND_EXPAND) && - !(color_type & PNG_COLOR_MASK_COLOR)) - { - png_ptr->mode |= PNG_BACKGROUND_IS_GRAY; - } else if ((png_ptr->transformations & PNG_BACKGROUND) && - !(png_ptr->transformations & PNG_BACKGROUND_EXPAND) && - (png_ptr->transformations & PNG_GRAY_TO_RGB) && - 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 - - if ((png_ptr->transformations & PNG_BACKGROUND_EXPAND) && - (png_ptr->transformations & PNG_EXPAND)) - { - if (!(color_type & PNG_COLOR_MASK_COLOR)) /* i.e., GRAY or GRAY_ALPHA */ - { - /* expand background and tRNS chunks */ - switch (png_ptr->bit_depth) - { - case 1: - png_ptr->background.gray *= (png_uint_16)0xff; - png_ptr->background.red = png_ptr->background.green - = png_ptr->background.blue = png_ptr->background.gray; - if (!(png_ptr->transformations & PNG_EXPAND_tRNS)) - { - png_ptr->trans_values.gray *= (png_uint_16)0xff; - png_ptr->trans_values.red = png_ptr->trans_values.green - = png_ptr->trans_values.blue = png_ptr->trans_values.gray; - } - break; - case 2: - png_ptr->background.gray *= (png_uint_16)0x55; - png_ptr->background.red = png_ptr->background.green - = png_ptr->background.blue = png_ptr->background.gray; - if (!(png_ptr->transformations & PNG_EXPAND_tRNS)) - { - png_ptr->trans_values.gray *= (png_uint_16)0x55; - png_ptr->trans_values.red = png_ptr->trans_values.green - = png_ptr->trans_values.blue = png_ptr->trans_values.gray; - } - break; - case 4: - png_ptr->background.gray *= (png_uint_16)0x11; - png_ptr->background.red = png_ptr->background.green - = png_ptr->background.blue = png_ptr->background.gray; - if (!(png_ptr->transformations & PNG_EXPAND_tRNS)) - { - png_ptr->trans_values.gray *= (png_uint_16)0x11; - png_ptr->trans_values.red = png_ptr->trans_values.green - = png_ptr->trans_values.blue = png_ptr->trans_values.gray; - } - break; - case 8: - case 16: - png_ptr->background.red = png_ptr->background.green - = png_ptr->background.blue = png_ptr->background.gray; - break; - } - } - else if (color_type == PNG_COLOR_TYPE_PALETTE) - { - 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; - -#if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) - if (png_ptr->transformations & PNG_INVERT_ALPHA) - { -#if defined(PNG_READ_EXPAND_SUPPORTED) - if (!(png_ptr->transformations & PNG_EXPAND_tRNS)) -#endif - { - /* invert the alpha channel (in tRNS) unless the pixels are - going to be expanded, in which case leave it for later */ - int i,istop; - istop=(int)png_ptr->num_trans; - for (i=0; itrans[i] = (png_byte)(255 - png_ptr->trans[i]); - } - } -#endif - - } - } -#endif - -#if defined(PNG_READ_BACKGROUND_SUPPORTED) && defined(PNG_READ_GAMMA_SUPPORTED) - png_ptr->background_1 = png_ptr->background; -#endif -#if defined(PNG_READ_GAMMA_SUPPORTED) && defined(PNG_FLOATING_POINT_SUPPORTED) - - if ((color_type == PNG_COLOR_TYPE_PALETTE && png_ptr->num_trans != 0) - && (fabs(png_ptr->screen_gamma * png_ptr->gamma - 1.0) - < PNG_GAMMA_THRESHOLD)) - { - int i,k; - k=0; - for (i=0; inum_trans; i++) - { - if (png_ptr->trans[i] != 0 && png_ptr->trans[i] != 0xff) - k=1; /* partial transparency is present */ - } - if (k == 0) - png_ptr->transformations &= (~PNG_GAMMA); - } - - if ((png_ptr->transformations & (PNG_GAMMA | PNG_RGB_TO_GRAY)) && - png_ptr->gamma != 0.0) - { - png_build_gamma_table(png_ptr); -#if defined(PNG_READ_BACKGROUND_SUPPORTED) - if (png_ptr->transformations & PNG_BACKGROUND) - { - if (color_type == PNG_COLOR_TYPE_PALETTE) - { - /* could skip if no transparency and - */ - 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 - { - double g, gs; - - switch (png_ptr->background_gamma_type) - { - case PNG_BACKGROUND_GAMMA_SCREEN: - g = (png_ptr->screen_gamma); - gs = 1.0; - break; - case PNG_BACKGROUND_GAMMA_FILE: - g = 1.0 / (png_ptr->gamma); - gs = 1.0 / (png_ptr->gamma * png_ptr->screen_gamma); - break; - case PNG_BACKGROUND_GAMMA_UNIQUE: - g = 1.0 / (png_ptr->background_gamma); - gs = 1.0 / (png_ptr->background_gamma * - png_ptr->screen_gamma); - break; - default: - g = 1.0; /* back_1 */ - gs = 1.0; /* back */ - } - - if ( fabs(gs - 1.0) < PNG_GAMMA_THRESHOLD) - { - back.red = (png_byte)png_ptr->background.red; - back.green = (png_byte)png_ptr->background.green; - back.blue = (png_byte)png_ptr->background.blue; - } - else - { - back.red = (png_byte)(pow( - (double)png_ptr->background.red/255, gs) * 255.0 + .5); - back.green = (png_byte)(pow( - (double)png_ptr->background.green/255, gs) * 255.0 + .5); - back.blue = (png_byte)(pow( - (double)png_ptr->background.blue/255, gs) * 255.0 + .5); - } - - back_1.red = (png_byte)(pow( - (double)png_ptr->background.red/255, g) * 255.0 + .5); - back_1.green = (png_byte)(pow( - (double)png_ptr->background.green/255, g) * 255.0 + .5); - back_1.blue = (png_byte)(pow( - (double)png_ptr->background.blue/255, g) * 255.0 + .5); - } - for (i = 0; i < num_palette; i++) - { - if (i < (int)png_ptr->num_trans && png_ptr->trans[i] != 0xff) - { - if (png_ptr->trans[i] == 0) - { - palette[i] = back; - } - else /* if (png_ptr->trans[i] != 0xff) */ - { - png_byte v, w; - - v = png_ptr->gamma_to_1[palette[i].red]; - png_composite(w, v, png_ptr->trans[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[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[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]; - } - } - } - /* if (png_ptr->background_gamma_type!=PNG_BACKGROUND_GAMMA_UNKNOWN) */ - else - /* color_type != PNG_COLOR_TYPE_PALETTE */ - { - double m = (double)(((png_uint_32)1 << png_ptr->bit_depth) - 1); - double g = 1.0; - double gs = 1.0; - - switch (png_ptr->background_gamma_type) - { - case PNG_BACKGROUND_GAMMA_SCREEN: - g = (png_ptr->screen_gamma); - gs = 1.0; - break; - case PNG_BACKGROUND_GAMMA_FILE: - g = 1.0 / (png_ptr->gamma); - gs = 1.0 / (png_ptr->gamma * png_ptr->screen_gamma); - break; - case PNG_BACKGROUND_GAMMA_UNIQUE: - g = 1.0 / (png_ptr->background_gamma); - gs = 1.0 / (png_ptr->background_gamma * - png_ptr->screen_gamma); - break; - } - - png_ptr->background_1.gray = (png_uint_16)(pow( - (double)png_ptr->background.gray / m, g) * m + .5); - png_ptr->background.gray = (png_uint_16)(pow( - (double)png_ptr->background.gray / m, gs) * m + .5); - - 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 */ - png_ptr->background_1.red = (png_uint_16)(pow( - (double)png_ptr->background.red / m, g) * m + .5); - png_ptr->background_1.green = (png_uint_16)(pow( - (double)png_ptr->background.green / m, g) * m + .5); - png_ptr->background_1.blue = (png_uint_16)(pow( - (double)png_ptr->background.blue / m, g) * m + .5); - png_ptr->background.red = (png_uint_16)(pow( - (double)png_ptr->background.red / m, gs) * m + .5); - png_ptr->background.green = (png_uint_16)(pow( - (double)png_ptr->background.green / m, gs) * m + .5); - png_ptr->background.blue = (png_uint_16)(pow( - (double)png_ptr->background.blue / m, gs) * m + .5); - } - 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; - } - } - } - else - /* transformation does not include PNG_BACKGROUND */ -#endif /* PNG_READ_BACKGROUND_SUPPORTED */ - if (color_type == PNG_COLOR_TYPE_PALETTE) - { - png_colorp palette = png_ptr->palette; - int num_palette = png_ptr->num_palette; - int i; - - 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]; - } - } - } -#if defined(PNG_READ_BACKGROUND_SUPPORTED) - else -#endif -#endif /* PNG_READ_GAMMA_SUPPORTED && PNG_FLOATING_POINT_SUPPORTED */ -#if defined(PNG_READ_BACKGROUND_SUPPORTED) - /* No GAMMA transformation */ - if ((png_ptr->transformations & PNG_BACKGROUND) && - (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[i] == 0) - { - palette[i] = back; - } - else if (png_ptr->trans[i] != 0xff) - { - /* The png_composite() macro is defined in png.h */ - png_composite(palette[i].red, palette[i].red, - png_ptr->trans[i], back.red); - png_composite(palette[i].green, palette[i].green, - png_ptr->trans[i], back.green); - png_composite(palette[i].blue, palette[i].blue, - png_ptr->trans[i], back.blue); - } - } - } -#endif /* PNG_READ_BACKGROUND_SUPPORTED */ - -#if defined(PNG_READ_SHIFT_SUPPORTED) - if ((png_ptr->transformations & PNG_SHIFT) && - (color_type == PNG_COLOR_TYPE_PALETTE)) - { - png_uint_16 i; - png_uint_16 istop = png_ptr->num_palette; - int sr = 8 - png_ptr->sig_bit.red; - int sg = 8 - png_ptr->sig_bit.green; - int sb = 8 - png_ptr->sig_bit.blue; - - if (sr < 0 || sr > 8) - sr = 0; - if (sg < 0 || sg > 8) - sg = 0; - if (sb < 0 || sb > 8) - sb = 0; - for (i = 0; i < istop; i++) - { - png_ptr->palette[i].red >>= sr; - png_ptr->palette[i].green >>= sg; - png_ptr->palette[i].blue >>= sb; - } - } -#endif /* PNG_READ_SHIFT_SUPPORTED */ - } -#if !defined(PNG_READ_GAMMA_SUPPORTED) && !defined(PNG_READ_SHIFT_SUPPORTED) \ - && !defined(PNG_READ_BACKGROUND_SUPPORTED) - if(png_ptr) - return; -#endif -} - -/* 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_structp png_ptr, png_infop info_ptr) -{ - png_debug(1, "in png_read_transform_info\n"); -#if defined(PNG_READ_EXPAND_SUPPORTED) - if (png_ptr->transformations & PNG_EXPAND) - { - if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) - { - if (png_ptr->num_trans && (png_ptr->transformations & PNG_EXPAND_tRNS)) - 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; - else - info_ptr->color_type |= PNG_COLOR_MASK_COLOR; - } - if (info_ptr->bit_depth < 8) - info_ptr->bit_depth = 8; - info_ptr->num_trans = 0; - } - } -#endif - -#if defined(PNG_READ_BACKGROUND_SUPPORTED) - if (png_ptr->transformations & PNG_BACKGROUND) - { - info_ptr->color_type &= ~PNG_COLOR_MASK_ALPHA; - info_ptr->num_trans = 0; - info_ptr->background = png_ptr->background; - } -#endif - -#if defined(PNG_READ_GAMMA_SUPPORTED) - if (png_ptr->transformations & PNG_GAMMA) - { -#ifdef PNG_FLOATING_POINT_SUPPORTED - info_ptr->gamma = png_ptr->gamma; -#endif -#ifdef PNG_FIXED_POINT_SUPPORTED - info_ptr->int_gamma = png_ptr->int_gamma; -#endif - } -#endif - -#if defined(PNG_READ_16_TO_8_SUPPORTED) - if ((png_ptr->transformations & PNG_16_TO_8) && (info_ptr->bit_depth == 16)) - info_ptr->bit_depth = 8; -#endif - -#if defined(PNG_READ_GRAY_TO_RGB_SUPPORTED) - if (png_ptr->transformations & PNG_GRAY_TO_RGB) - info_ptr->color_type |= PNG_COLOR_MASK_COLOR; -#endif - -#if defined(PNG_READ_RGB_TO_GRAY_SUPPORTED) - if (png_ptr->transformations & PNG_RGB_TO_GRAY) - info_ptr->color_type &= ~PNG_COLOR_MASK_COLOR; -#endif - -#if defined(PNG_READ_DITHER_SUPPORTED) - if (png_ptr->transformations & PNG_DITHER) - { - 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 - -#if defined(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; - -#if defined(PNG_READ_STRIP_ALPHA_SUPPORTED) - if (png_ptr->flags & PNG_FLAG_STRIP_ALPHA) - info_ptr->color_type &= ~PNG_COLOR_MASK_ALPHA; -#endif - - if (info_ptr->color_type & PNG_COLOR_MASK_ALPHA) - info_ptr->channels++; - -#if defined(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 !defined(PNG_1_0_X) - if (png_ptr->transformations & PNG_ADD_ALPHA) - info_ptr->color_type |= PNG_COLOR_MASK_ALPHA; -#endif - } -#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); - -#if !defined(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_structp png_ptr) -{ - png_debug(1, "in png_do_read_transformations\n"); - if (png_ptr->row_buf == NULL) - { -#if !defined(PNG_NO_STDIO) && !defined(_WIN32_WCE) - char msg[50]; - - png_snprintf2(msg, 50, - "NULL row buffer for row %ld, pass %d", png_ptr->row_number, - png_ptr->pass); - png_error(png_ptr, msg); -#else - png_error(png_ptr, "NULL row buffer"); -#endif - } -#ifdef PNG_WARN_UNINITIALIZED_ROW - if (!(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 */ -#if (PNG_WARN_UNINITIALIZED_ROW==1) - png_error(png_ptr, "Uninitialized row"); -#else - png_warning(png_ptr, "Uninitialized row"); -#endif -#endif - -#if defined(PNG_READ_EXPAND_SUPPORTED) - if (png_ptr->transformations & PNG_EXPAND) - { - if (png_ptr->row_info.color_type == PNG_COLOR_TYPE_PALETTE) - { - png_do_expand_palette(&(png_ptr->row_info), png_ptr->row_buf + 1, - png_ptr->palette, png_ptr->trans, png_ptr->num_trans); - } - else - { - if (png_ptr->num_trans && - (png_ptr->transformations & PNG_EXPAND_tRNS)) - png_do_expand(&(png_ptr->row_info), png_ptr->row_buf + 1, - &(png_ptr->trans_values)); - else - png_do_expand(&(png_ptr->row_info), png_ptr->row_buf + 1, - NULL); - } - } -#endif - -#if defined(PNG_READ_STRIP_ALPHA_SUPPORTED) - if (png_ptr->flags & PNG_FLAG_STRIP_ALPHA) - png_do_strip_filler(&(png_ptr->row_info), png_ptr->row_buf + 1, - PNG_FLAG_FILLER_AFTER | (png_ptr->flags & PNG_FLAG_STRIP_ALPHA)); -#endif - -#if defined(PNG_READ_RGB_TO_GRAY_SUPPORTED) - if (png_ptr->transformations & PNG_RGB_TO_GRAY) - { - int rgb_error = - png_do_rgb_to_gray(png_ptr, &(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. - */ - -#if defined(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(&(png_ptr->row_info), png_ptr->row_buf + 1); -#endif - -#if defined(PNG_READ_BACKGROUND_SUPPORTED) - if ((png_ptr->transformations & PNG_BACKGROUND) && - ((png_ptr->num_trans != 0 ) || - (png_ptr->color_type & PNG_COLOR_MASK_ALPHA))) - png_do_background(&(png_ptr->row_info), png_ptr->row_buf + 1, - &(png_ptr->trans_values), &(png_ptr->background) -#if defined(PNG_READ_GAMMA_SUPPORTED) - , &(png_ptr->background_1), - png_ptr->gamma_table, png_ptr->gamma_from_1, - png_ptr->gamma_to_1, png_ptr->gamma_16_table, - png_ptr->gamma_16_from_1, png_ptr->gamma_16_to_1, - png_ptr->gamma_shift -#endif -); -#endif - -#if defined(PNG_READ_GAMMA_SUPPORTED) - if ((png_ptr->transformations & PNG_GAMMA) && -#if defined(PNG_READ_BACKGROUND_SUPPORTED) - !((png_ptr->transformations & PNG_BACKGROUND) && - ((png_ptr->num_trans != 0) || - (png_ptr->color_type & PNG_COLOR_MASK_ALPHA))) && -#endif - (png_ptr->color_type != PNG_COLOR_TYPE_PALETTE)) - png_do_gamma(&(png_ptr->row_info), png_ptr->row_buf + 1, - png_ptr->gamma_table, png_ptr->gamma_16_table, - png_ptr->gamma_shift); -#endif - -#if defined(PNG_READ_16_TO_8_SUPPORTED) - if (png_ptr->transformations & PNG_16_TO_8) - png_do_chop(&(png_ptr->row_info), png_ptr->row_buf + 1); -#endif - -#if defined(PNG_READ_DITHER_SUPPORTED) - if (png_ptr->transformations & PNG_DITHER) - { - png_do_dither((png_row_infop)&(png_ptr->row_info), png_ptr->row_buf + 1, - png_ptr->palette_lookup, png_ptr->dither_index); - if(png_ptr->row_info.rowbytes == (png_uint_32)0) - png_error(png_ptr, "png_do_dither returned rowbytes=0"); - } -#endif - -#if defined(PNG_READ_INVERT_SUPPORTED) - if (png_ptr->transformations & PNG_INVERT_MONO) - png_do_invert(&(png_ptr->row_info), png_ptr->row_buf + 1); -#endif - -#if defined(PNG_READ_SHIFT_SUPPORTED) - if (png_ptr->transformations & PNG_SHIFT) - png_do_unshift(&(png_ptr->row_info), png_ptr->row_buf + 1, - &(png_ptr->shift)); -#endif - -#if defined(PNG_READ_PACK_SUPPORTED) - if (png_ptr->transformations & PNG_PACK) - png_do_unpack(&(png_ptr->row_info), png_ptr->row_buf + 1); -#endif - -#if defined(PNG_READ_BGR_SUPPORTED) - if (png_ptr->transformations & PNG_BGR) - png_do_bgr(&(png_ptr->row_info), png_ptr->row_buf + 1); -#endif - -#if defined(PNG_READ_PACKSWAP_SUPPORTED) - if (png_ptr->transformations & PNG_PACKSWAP) - png_do_packswap(&(png_ptr->row_info), png_ptr->row_buf + 1); -#endif - -#if defined(PNG_READ_GRAY_TO_RGB_SUPPORTED) - /* if gray -> RGB, do so now only if we did not do so above */ - if ((png_ptr->transformations & PNG_GRAY_TO_RGB) && - (png_ptr->mode & PNG_BACKGROUND_IS_GRAY)) - png_do_gray_to_rgb(&(png_ptr->row_info), png_ptr->row_buf + 1); -#endif - -#if defined(PNG_READ_FILLER_SUPPORTED) - if (png_ptr->transformations & PNG_FILLER) - png_do_read_filler(&(png_ptr->row_info), png_ptr->row_buf + 1, - (png_uint_32)png_ptr->filler, png_ptr->flags); -#endif - -#if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) - if (png_ptr->transformations & PNG_INVERT_ALPHA) - png_do_read_invert_alpha(&(png_ptr->row_info), png_ptr->row_buf + 1); -#endif - -#if defined(PNG_READ_SWAP_ALPHA_SUPPORTED) - if (png_ptr->transformations & PNG_SWAP_ALPHA) - png_do_read_swap_alpha(&(png_ptr->row_info), png_ptr->row_buf + 1); -#endif - -#if defined(PNG_READ_SWAP_SUPPORTED) - if (png_ptr->transformations & PNG_SWAP_BYTES) - png_do_swap(&(png_ptr->row_info), png_ptr->row_buf + 1); -#endif - -#if defined(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 */ - &(png_ptr->row_info), /* row_info: */ - /* png_uint_32 width; width of row */ - /* png_uint_32 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 */ -#if defined(PNG_USER_TRANSFORM_PTR_SUPPORTED) - if(png_ptr->user_transform_depth) - png_ptr->row_info.bit_depth = png_ptr->user_transform_depth; - if(png_ptr->user_transform_channels) - png_ptr->row_info.channels = png_ptr->user_transform_channels; -#endif - png_ptr->row_info.pixel_depth = (png_byte)(png_ptr->row_info.bit_depth * - png_ptr->row_info.channels); - png_ptr->row_info.rowbytes = PNG_ROWBYTES(png_ptr->row_info.pixel_depth, - png_ptr->row_info.width); - } -#endif - -} - -#if defined(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\n"); -#if defined(PNG_USELESS_TESTS_SUPPORTED) - if (row != NULL && row_info != NULL && row_info->bit_depth < 8) -#else - if (row_info->bit_depth < 8) -#endif - { - 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; - } - } - row_info->bit_depth = 8; - row_info->pixel_depth = (png_byte)(8 * row_info->channels); - row_info->rowbytes = row_width * row_info->channels; - } -} -#endif - -#if defined(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_color_8p sig_bits) -{ - png_debug(1, "in png_do_unshift\n"); - if ( -#if defined(PNG_USELESS_TESTS_SUPPORTED) - row != NULL && row_info != NULL && sig_bits != NULL && -#endif - row_info->color_type != PNG_COLOR_TYPE_PALETTE) - { - int shift[4]; - int channels = 0; - int c; - png_uint_16 value = 0; - png_uint_32 row_width = row_info->width; - - if (row_info->color_type & PNG_COLOR_MASK_COLOR) - { - shift[channels++] = row_info->bit_depth - sig_bits->red; - shift[channels++] = row_info->bit_depth - sig_bits->green; - shift[channels++] = row_info->bit_depth - sig_bits->blue; - } - else - { - shift[channels++] = row_info->bit_depth - sig_bits->gray; - } - if (row_info->color_type & PNG_COLOR_MASK_ALPHA) - { - shift[channels++] = row_info->bit_depth - sig_bits->alpha; - } - - for (c = 0; c < channels; c++) - { - if (shift[c] <= 0) - shift[c] = 0; - else - value = 1; - } - - if (!value) - return; - - switch (row_info->bit_depth) - { - case 2: - { - png_bytep bp; - png_uint_32 i; - png_uint_32 istop = row_info->rowbytes; - - for (bp = row, i = 0; i < istop; i++) - { - *bp >>= 1; - *bp++ &= 0x55; - } - break; - } - case 4: - { - png_bytep bp = row; - png_uint_32 i; - png_uint_32 istop = row_info->rowbytes; - png_byte mask = (png_byte)((((int)0xf0 >> shift[0]) & (int)0xf0) | - (png_byte)((int)0xf >> shift[0])); - - for (i = 0; i < istop; i++) - { - *bp >>= shift[0]; - *bp++ &= mask; - } - break; - } - case 8: - { - png_bytep bp = row; - png_uint_32 i; - png_uint_32 istop = row_width * channels; - - for (i = 0; i < istop; i++) - { - *bp++ >>= shift[i%channels]; - } - break; - } - case 16: - { - png_bytep bp = row; - png_uint_32 i; - png_uint_32 istop = channels * row_width; - - for (i = 0; i < istop; i++) - { - value = (png_uint_16)((*bp << 8) + *(bp + 1)); - value >>= shift[i%channels]; - *bp++ = (png_byte)(value >> 8); - *bp++ = (png_byte)(value & 0xff); - } - break; - } - } - } -} -#endif - -#if defined(PNG_READ_16_TO_8_SUPPORTED) -/* chop rows of bit depth 16 down to 8 */ -void /* PRIVATE */ -png_do_chop(png_row_infop row_info, png_bytep row) -{ - png_debug(1, "in png_do_chop\n"); -#if defined(PNG_USELESS_TESTS_SUPPORTED) - if (row != NULL && row_info != NULL && row_info->bit_depth == 16) -#else - if (row_info->bit_depth == 16) -#endif - { - png_bytep sp = row; - png_bytep dp = row; - png_uint_32 i; - png_uint_32 istop = row_info->width * row_info->channels; - - for (i = 0; i> 8)) >> 8; - * - * Approximate calculation with shift/add instead of multiply/divide: - * *dp = ((((png_uint_32)(*sp) << 8) | - * (png_uint_32)((int)(*(sp + 1)) - *sp)) + 128) >> 8; - * - * What we actually do to avoid extra shifting and conversion: - */ - - *dp = *sp + ((((int)(*(sp + 1)) - *sp) > 128) ? 1 : 0); -#else - /* Simply discard the low order byte */ - *dp = *sp; -#endif - } - 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 - -#if defined(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\n"); -#if defined(PNG_USELESS_TESTS_SUPPORTED) - if (row != NULL && row_info != NULL) -#endif - { - 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; - } - } - /* 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]; - } - } - } - 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; - } - } - /* 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 - -#if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) -void /* PRIVATE */ -png_do_read_invert_alpha(png_row_infop row_info, png_bytep row) -{ - png_debug(1, "in png_do_read_invert_alpha\n"); -#if defined(PNG_USELESS_TESTS_SUPPORTED) - if (row != NULL && row_info != NULL) -#endif - { - png_uint_32 row_width = row_info->width; - if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) - { - /* This inverts the alpha channel in RGBA */ - if (row_info->bit_depth == 8) - { - 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; - } - } - /* 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; - } - } - } - else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA) - { - /* This inverts the alpha channel in GA */ - if (row_info->bit_depth == 8) - { - 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); - } - } - /* This inverts the alpha channel in GGAA */ - 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)); -/* - *(--dp) = *(--sp); - *(--dp) = *(--sp); -*/ - sp-=2; - dp=sp; - } - } - } - } -} -#endif - -#if defined(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; - - png_byte hi_filler = (png_byte)((filler>>8) & 0xff); - png_byte lo_filler = (png_byte)(filler & 0xff); - - png_debug(1, "in png_do_read_filler\n"); - if ( -#if defined(PNG_USELESS_TESTS_SUPPORTED) - row != NULL && row_info != NULL && -#endif - row_info->color_type == PNG_COLOR_TYPE_GRAY) - { - if(row_info->bit_depth == 8) - { - /* This changes the data from G to GX */ - if (flags & PNG_FLAG_FILLER_AFTER) - { - 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; - } - /* This changes the data from G to XG */ - else - { - 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; - } - } - else if(row_info->bit_depth == 16) - { - /* This changes the data from GG to GGXX */ - if (flags & PNG_FLAG_FILLER_AFTER) - { - 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; - } - /* This changes the data from GG to XXGG */ - else - { - 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; - } - } - } /* COLOR_TYPE == GRAY */ - else if (row_info->color_type == PNG_COLOR_TYPE_RGB) - { - if(row_info->bit_depth == 8) - { - /* This changes the data from RGB to RGBX */ - if (flags & PNG_FLAG_FILLER_AFTER) - { - 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; - } - /* This changes the data from RGB to XRGB */ - else - { - 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; - } - } - else if(row_info->bit_depth == 16) - { - /* This changes the data from RRGGBB to RRGGBBXX */ - if (flags & PNG_FLAG_FILLER_AFTER) - { - 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; - } - /* This changes the data from RRGGBB to XXRRGGBB */ - else - { - 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; - } - } - } /* COLOR_TYPE == RGB */ -} -#endif - -#if defined(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\n"); - if (row_info->bit_depth >= 8 && -#if defined(PNG_USELESS_TESTS_SUPPORTED) - row != NULL && row_info != NULL && -#endif - !(row_info->color_type & PNG_COLOR_MASK_COLOR)) - { - if (row_info->color_type == PNG_COLOR_TYPE_GRAY) - { - if (row_info->bit_depth == 8) - { - 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 - { - 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) - { - 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 - { - 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)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 - -#if defined(PNG_READ_RGB_TO_GRAY_SUPPORTED) -/* reduce RGB files to grayscale, with or without alpha - * using the equation given in Poynton's ColorFAQ at - * - * Copyright (c) 1998-01-04 Charles Poynton poynton at inforamp.net - * - * Y = 0.212671 * R + 0.715160 * G + 0.072169 * B - * - * We approximate this with - * - * Y = 0.21268 * R + 0.7151 * G + 0.07217 * B - * - * which can be expressed with integers as - * - * Y = (6969 * R + 23434 * G + 2365 * B)/32768 - * - * The calculation is to be done in a linear colorspace. - * - * Other integer coefficents can be used via png_set_rgb_to_gray(). - */ -int /* PRIVATE */ -png_do_rgb_to_gray(png_structp png_ptr, png_row_infop row_info, png_bytep row) - -{ - png_uint_32 i; - - png_uint_32 row_width = row_info->width; - int rgb_error = 0; - - png_debug(1, "in png_do_rgb_to_gray\n"); - if ( -#if defined(PNG_USELESS_TESTS_SUPPORTED) - row != NULL && row_info != NULL && -#endif - (row_info->color_type & PNG_COLOR_MASK_COLOR)) - { - png_uint_32 rc = png_ptr->rgb_to_gray_red_coeff; - png_uint_32 gc = png_ptr->rgb_to_gray_green_coeff; - png_uint_32 bc = png_ptr->rgb_to_gray_blue_coeff; - - if (row_info->color_type == PNG_COLOR_TYPE_RGB) - { - if (row_info->bit_depth == 8) - { -#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) - if (png_ptr->gamma_from_1 != NULL && png_ptr->gamma_to_1 != NULL) - { - png_bytep sp = row; - png_bytep dp = row; - - for (i = 0; i < row_width; i++) - { - png_byte red = png_ptr->gamma_to_1[*(sp++)]; - png_byte green = png_ptr->gamma_to_1[*(sp++)]; - png_byte blue = png_ptr->gamma_to_1[*(sp++)]; - if(red != green || red != blue) - { - rgb_error |= 1; - *(dp++) = png_ptr->gamma_from_1[ - (rc*red+gc*green+bc*blue)>>15]; - } - else - *(dp++) = *(sp-1); - } - } - else -#endif - { - png_bytep sp = row; - png_bytep dp = row; - 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; - *(dp++) = (png_byte)((rc*red+gc*green+bc*blue)>>15); - } - else - *(dp++) = *(sp-1); - } - } - } - - else /* RGB bit_depth == 16 */ - { -#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) - if (png_ptr->gamma_16_to_1 != NULL && - png_ptr->gamma_16_from_1 != NULL) - { - png_bytep sp = row; - png_bytep dp = row; - 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) - 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)>>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); - } - } - else -#endif - { - png_bytep sp = row; - png_bytep dp = row; - 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; - gray16 = (png_uint_16)((rc*red + gc*green + bc*blue)>>15); - *(dp++) = (png_byte)((gray16>>8) & 0xff); - *(dp++) = (png_byte)(gray16 & 0xff); - } - } - } - } - if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) - { - if (row_info->bit_depth == 8) - { -#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) - if (png_ptr->gamma_from_1 != NULL && png_ptr->gamma_to_1 != NULL) - { - png_bytep sp = row; - png_bytep dp = row; - for (i = 0; i < row_width; i++) - { - png_byte red = png_ptr->gamma_to_1[*(sp++)]; - png_byte green = png_ptr->gamma_to_1[*(sp++)]; - png_byte blue = png_ptr->gamma_to_1[*(sp++)]; - if(red != green || red != blue) - rgb_error |= 1; - *(dp++) = png_ptr->gamma_from_1 - [(rc*red + gc*green + bc*blue)>>15]; - *(dp++) = *(sp++); /* alpha */ - } - } - else -#endif - { - png_bytep sp = row; - png_bytep dp = row; - 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; - *(dp++) = (png_byte)((rc*red + gc*green + bc*blue)>>15); - *(dp++) = *(sp++); /* alpha */ - } - } - } - else /* RGBA bit_depth == 16 */ - { -#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) - if (png_ptr->gamma_16_to_1 != NULL && - png_ptr->gamma_16_from_1 != NULL) - { - png_bytep sp = row; - png_bytep dp = row; - 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) - 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)>>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); - *(dp++) = *(sp++); /* alpha */ - *(dp++) = *(sp++); - } - } - else -#endif - { - png_bytep sp = row; - png_bytep dp = row; - 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; - gray16 = (png_uint_16)((rc*red + gc*green + bc*blue)>>15); - *(dp++) = (png_byte)((gray16>>8) & 0xff); - *(dp++) = (png_byte)(gray16 & 0xff); - *(dp++) = *(sp++); /* alpha */ - *(dp++) = *(sp++); - } - } - } - } - row_info->channels -= (png_byte)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); - } - return rgb_error; -} -#endif - -/* 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. - */ -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\n"); - 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; - } -} - -/* This function is currently unused. Do we really need it? */ -#if defined(PNG_READ_DITHER_SUPPORTED) && defined(PNG_CORRECT_PALETTE_SUPPORTED) -void /* PRIVATE */ -png_correct_palette(png_structp png_ptr, png_colorp palette, - int num_palette) -{ - png_debug(1, "in png_correct_palette\n"); -#if defined(PNG_READ_BACKGROUND_SUPPORTED) && \ - defined(PNG_READ_GAMMA_SUPPORTED) && defined(PNG_FLOATING_POINT_SUPPORTED) - if (png_ptr->transformations & (PNG_GAMMA | PNG_BACKGROUND)) - { - png_color back, back_1; - - 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 - { - double g; - - g = 1.0 / (png_ptr->background_gamma * png_ptr->screen_gamma); - - if (png_ptr->background_gamma_type == PNG_BACKGROUND_GAMMA_SCREEN || - fabs(g - 1.0) < PNG_GAMMA_THRESHOLD) - { - back.red = png_ptr->background.red; - back.green = png_ptr->background.green; - back.blue = png_ptr->background.blue; - } - else - { - back.red = - (png_byte)(pow((double)png_ptr->background.red/255, g) * - 255.0 + 0.5); - back.green = - (png_byte)(pow((double)png_ptr->background.green/255, g) * - 255.0 + 0.5); - back.blue = - (png_byte)(pow((double)png_ptr->background.blue/255, g) * - 255.0 + 0.5); - } - - g = 1.0 / png_ptr->background_gamma; - - back_1.red = - (png_byte)(pow((double)png_ptr->background.red/255, g) * - 255.0 + 0.5); - back_1.green = - (png_byte)(pow((double)png_ptr->background.green/255, g) * - 255.0 + 0.5); - back_1.blue = - (png_byte)(pow((double)png_ptr->background.blue/255, g) * - 255.0 + 0.5); - } - - if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) - { - png_uint_32 i; - - for (i = 0; i < (png_uint_32)num_palette; i++) - { - if (i < png_ptr->num_trans && png_ptr->trans[i] == 0) - { - palette[i] = back; - } - else if (i < png_ptr->num_trans && png_ptr->trans[i] != 0xff) - { - png_byte v, w; - - v = png_ptr->gamma_to_1[png_ptr->palette[i].red]; - png_composite(w, v, png_ptr->trans[i], back_1.red); - palette[i].red = png_ptr->gamma_from_1[w]; - - v = png_ptr->gamma_to_1[png_ptr->palette[i].green]; - png_composite(w, v, png_ptr->trans[i], back_1.green); - palette[i].green = png_ptr->gamma_from_1[w]; - - v = png_ptr->gamma_to_1[png_ptr->palette[i].blue]; - png_composite(w, v, png_ptr->trans[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]; - } - } - } - else - { - int i; - - for (i = 0; i < num_palette; i++) - { - if (palette[i].red == (png_byte)png_ptr->trans_values.gray) - { - palette[i] = back; - } - 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]; - } - } - } - } - else -#endif -#if defined(PNG_READ_GAMMA_SUPPORTED) - if (png_ptr->transformations & PNG_GAMMA) - { - int i; - - 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]; - } - } -#if defined(PNG_READ_BACKGROUND_SUPPORTED) - else -#endif -#endif -#if defined(PNG_READ_BACKGROUND_SUPPORTED) - if (png_ptr->transformations & PNG_BACKGROUND) - { - if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) - { - png_color back; - - 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 < (int)png_ptr->num_trans; i++) - { - if (png_ptr->trans[i] == 0) - { - palette[i].red = back.red; - palette[i].green = back.green; - palette[i].blue = back.blue; - } - else if (png_ptr->trans[i] != 0xff) - { - png_composite(palette[i].red, png_ptr->palette[i].red, - png_ptr->trans[i], back.red); - png_composite(palette[i].green, png_ptr->palette[i].green, - png_ptr->trans[i], back.green); - png_composite(palette[i].blue, png_ptr->palette[i].blue, - png_ptr->trans[i], back.blue); - } - } - } - else /* assume grayscale palette (what else could it be?) */ - { - int i; - - for (i = 0; i < num_palette; i++) - { - if (i == (png_byte)png_ptr->trans_values.gray) - { - palette[i].red = (png_byte)png_ptr->background.red; - palette[i].green = (png_byte)png_ptr->background.green; - palette[i].blue = (png_byte)png_ptr->background.blue; - } - } - } - } -#endif -} -#endif - -#if defined(PNG_READ_BACKGROUND_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_background(png_row_infop row_info, png_bytep row, - png_color_16p trans_values, png_color_16p background -#if defined(PNG_READ_GAMMA_SUPPORTED) - , png_color_16p background_1, - png_bytep gamma_table, png_bytep gamma_from_1, png_bytep gamma_to_1, - png_uint_16pp gamma_16, png_uint_16pp gamma_16_from_1, - png_uint_16pp gamma_16_to_1, int gamma_shift -#endif - ) -{ - png_bytep sp, dp; - png_uint_32 i; - png_uint_32 row_width=row_info->width; - int shift; - - png_debug(1, "in png_do_background\n"); - if (background != NULL && -#if defined(PNG_USELESS_TESTS_SUPPORTED) - row != NULL && row_info != NULL && -#endif - (!(row_info->color_type & PNG_COLOR_MASK_ALPHA) || - (row_info->color_type != PNG_COLOR_TYPE_PALETTE && trans_values))) - { - 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) - == trans_values->gray) - { - *sp &= (png_byte)((0x7f7f >> (7 - shift)) & 0xff); - *sp |= (png_byte)(background->gray << shift); - } - if (!shift) - { - shift = 7; - sp++; - } - else - shift--; - } - break; - } - case 2: - { -#if defined(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) - == trans_values->gray) - { - *sp &= (png_byte)((0x3f3f >> (6 - shift)) & 0xff); - *sp |= (png_byte)(background->gray << shift); - } - else - { - png_byte p = (png_byte)((*sp >> shift) & 0x03); - png_byte g = (png_byte)((gamma_table [p | (p << 2) | - (p << 4) | (p << 6)] >> 6) & 0x03); - *sp &= (png_byte)((0x3f3f >> (6 - shift)) & 0xff); - *sp |= (png_byte)(g << shift); - } - 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) - == trans_values->gray) - { - *sp &= (png_byte)((0x3f3f >> (6 - shift)) & 0xff); - *sp |= (png_byte)(background->gray << shift); - } - if (!shift) - { - shift = 6; - sp++; - } - else - shift -= 2; - } - } - break; - } - case 4: - { -#if defined(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) - == trans_values->gray) - { - *sp &= (png_byte)((0xf0f >> (4 - shift)) & 0xff); - *sp |= (png_byte)(background->gray << shift); - } - else - { - png_byte p = (png_byte)((*sp >> shift) & 0x0f); - png_byte g = (png_byte)((gamma_table[p | - (p << 4)] >> 4) & 0x0f); - *sp &= (png_byte)((0xf0f >> (4 - shift)) & 0xff); - *sp |= (png_byte)(g << shift); - } - 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) - == trans_values->gray) - { - *sp &= (png_byte)((0xf0f >> (4 - shift)) & 0xff); - *sp |= (png_byte)(background->gray << shift); - } - if (!shift) - { - shift = 4; - sp++; - } - else - shift -= 4; - } - } - break; - } - case 8: - { -#if defined(PNG_READ_GAMMA_SUPPORTED) - if (gamma_table != NULL) - { - sp = row; - for (i = 0; i < row_width; i++, sp++) - { - if (*sp == trans_values->gray) - { - *sp = (png_byte)background->gray; - } - else - { - *sp = gamma_table[*sp]; - } - } - } - else -#endif - { - sp = row; - for (i = 0; i < row_width; i++, sp++) - { - if (*sp == trans_values->gray) - { - *sp = (png_byte)background->gray; - } - } - } - break; - } - case 16: - { -#if defined(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 == trans_values->gray) - { - /* background is already in screen gamma */ - *sp = (png_byte)((background->gray >> 8) & 0xff); - *(sp + 1) = (png_byte)(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 == trans_values->gray) - { - *sp = (png_byte)((background->gray >> 8) & 0xff); - *(sp + 1) = (png_byte)(background->gray & 0xff); - } - } - } - break; - } - } - break; - } - case PNG_COLOR_TYPE_RGB: - { - if (row_info->bit_depth == 8) - { -#if defined(PNG_READ_GAMMA_SUPPORTED) - if (gamma_table != NULL) - { - sp = row; - for (i = 0; i < row_width; i++, sp += 3) - { - if (*sp == trans_values->red && - *(sp + 1) == trans_values->green && - *(sp + 2) == trans_values->blue) - { - *sp = (png_byte)background->red; - *(sp + 1) = (png_byte)background->green; - *(sp + 2) = (png_byte)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 == trans_values->red && - *(sp + 1) == trans_values->green && - *(sp + 2) == trans_values->blue) - { - *sp = (png_byte)background->red; - *(sp + 1) = (png_byte)background->green; - *(sp + 2) = (png_byte)background->blue; - } - } - } - } - else /* if (row_info->bit_depth == 16) */ - { -#if defined(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 == trans_values->red && g == trans_values->green && - b == trans_values->blue) - { - /* background is already in screen gamma */ - *sp = (png_byte)((background->red >> 8) & 0xff); - *(sp + 1) = (png_byte)(background->red & 0xff); - *(sp + 2) = (png_byte)((background->green >> 8) & 0xff); - *(sp + 3) = (png_byte)(background->green & 0xff); - *(sp + 4) = (png_byte)((background->blue >> 8) & 0xff); - *(sp + 5) = (png_byte)(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 == trans_values->red && g == trans_values->green && - b == trans_values->blue) - { - *sp = (png_byte)((background->red >> 8) & 0xff); - *(sp + 1) = (png_byte)(background->red & 0xff); - *(sp + 2) = (png_byte)((background->green >> 8) & 0xff); - *(sp + 3) = (png_byte)(background->green & 0xff); - *(sp + 4) = (png_byte)((background->blue >> 8) & 0xff); - *(sp + 5) = (png_byte)(background->blue & 0xff); - } - } - } - } - break; - } - case PNG_COLOR_TYPE_GRAY_ALPHA: - { - if (row_info->bit_depth == 8) - { -#if defined(PNG_READ_GAMMA_SUPPORTED) - if (gamma_to_1 != NULL && gamma_from_1 != NULL && - gamma_table != NULL) - { - sp = row; - dp = row; - for (i = 0; i < row_width; i++, sp += 2, dp++) - { - png_uint_16 a = *(sp + 1); - - if (a == 0xff) - { - *dp = gamma_table[*sp]; - } - else if (a == 0) - { - /* background is already in screen gamma */ - *dp = (png_byte)background->gray; - } - else - { - png_byte v, w; - - v = gamma_to_1[*sp]; - png_composite(w, v, a, background_1->gray); - *dp = gamma_from_1[w]; - } - } - } - else -#endif - { - sp = row; - dp = row; - for (i = 0; i < row_width; i++, sp += 2, dp++) - { - png_byte a = *(sp + 1); - - if (a == 0xff) - { - *dp = *sp; - } -#if defined(PNG_READ_GAMMA_SUPPORTED) - else if (a == 0) - { - *dp = (png_byte)background->gray; - } - else - { - png_composite(*dp, *sp, a, background_1->gray); - } -#else - *dp = (png_byte)background->gray; -#endif - } - } - } - else /* if (png_ptr->bit_depth == 16) */ - { -#if defined(PNG_READ_GAMMA_SUPPORTED) - if (gamma_16 != NULL && gamma_16_from_1 != NULL && - gamma_16_to_1 != NULL) - { - sp = row; - dp = row; - for (i = 0; i < row_width; i++, sp += 4, dp += 2) - { - 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]; - *dp = (png_byte)((v >> 8) & 0xff); - *(dp + 1) = (png_byte)(v & 0xff); - } -#if defined(PNG_READ_GAMMA_SUPPORTED) - else if (a == 0) -#else - else -#endif - { - /* background is already in screen gamma */ - *dp = (png_byte)((background->gray >> 8) & 0xff); - *(dp + 1) = (png_byte)(background->gray & 0xff); - } -#if defined(PNG_READ_GAMMA_SUPPORTED) - else - { - png_uint_16 g, v, w; - - g = gamma_16_to_1[*(sp + 1) >> gamma_shift][*sp]; - png_composite_16(v, g, a, background_1->gray); - w = gamma_16_from_1[(v&0xff) >> gamma_shift][v >> 8]; - *dp = (png_byte)((w >> 8) & 0xff); - *(dp + 1) = (png_byte)(w & 0xff); - } -#endif - } - } - else -#endif - { - sp = row; - dp = row; - for (i = 0; i < row_width; i++, sp += 4, dp += 2) - { - png_uint_16 a = (png_uint_16)(((*(sp+2)) << 8) + *(sp+3)); - if (a == (png_uint_16)0xffff) - { - png_memcpy(dp, sp, 2); - } -#if defined(PNG_READ_GAMMA_SUPPORTED) - else if (a == 0) -#else - else -#endif - { - *dp = (png_byte)((background->gray >> 8) & 0xff); - *(dp + 1) = (png_byte)(background->gray & 0xff); - } -#if defined(PNG_READ_GAMMA_SUPPORTED) - else - { - png_uint_16 g, v; - - g = (png_uint_16)(((*sp) << 8) + *(sp + 1)); - png_composite_16(v, g, a, background_1->gray); - *dp = (png_byte)((v >> 8) & 0xff); - *(dp + 1) = (png_byte)(v & 0xff); - } -#endif - } - } - } - break; - } - case PNG_COLOR_TYPE_RGB_ALPHA: - { - if (row_info->bit_depth == 8) - { -#if defined(PNG_READ_GAMMA_SUPPORTED) - if (gamma_to_1 != NULL && gamma_from_1 != NULL && - gamma_table != NULL) - { - sp = row; - dp = row; - for (i = 0; i < row_width; i++, sp += 4, dp += 3) - { - png_byte a = *(sp + 3); - - if (a == 0xff) - { - *dp = gamma_table[*sp]; - *(dp + 1) = gamma_table[*(sp + 1)]; - *(dp + 2) = gamma_table[*(sp + 2)]; - } - else if (a == 0) - { - /* background is already in screen gamma */ - *dp = (png_byte)background->red; - *(dp + 1) = (png_byte)background->green; - *(dp + 2) = (png_byte)background->blue; - } - else - { - png_byte v, w; - - v = gamma_to_1[*sp]; - png_composite(w, v, a, background_1->red); - *dp = gamma_from_1[w]; - v = gamma_to_1[*(sp + 1)]; - png_composite(w, v, a, background_1->green); - *(dp + 1) = gamma_from_1[w]; - v = gamma_to_1[*(sp + 2)]; - png_composite(w, v, a, background_1->blue); - *(dp + 2) = gamma_from_1[w]; - } - } - } - else -#endif - { - sp = row; - dp = row; - for (i = 0; i < row_width; i++, sp += 4, dp += 3) - { - png_byte a = *(sp + 3); - - if (a == 0xff) - { - *dp = *sp; - *(dp + 1) = *(sp + 1); - *(dp + 2) = *(sp + 2); - } - else if (a == 0) - { - *dp = (png_byte)background->red; - *(dp + 1) = (png_byte)background->green; - *(dp + 2) = (png_byte)background->blue; - } - else - { - png_composite(*dp, *sp, a, background->red); - png_composite(*(dp + 1), *(sp + 1), a, - background->green); - png_composite(*(dp + 2), *(sp + 2), a, - background->blue); - } - } - } - } - else /* if (row_info->bit_depth == 16) */ - { -#if defined(PNG_READ_GAMMA_SUPPORTED) - if (gamma_16 != NULL && gamma_16_from_1 != NULL && - gamma_16_to_1 != NULL) - { - sp = row; - dp = row; - for (i = 0; i < row_width; i++, sp += 8, dp += 6) - { - 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]; - *dp = (png_byte)((v >> 8) & 0xff); - *(dp + 1) = (png_byte)(v & 0xff); - v = gamma_16[*(sp + 3) >> gamma_shift][*(sp + 2)]; - *(dp + 2) = (png_byte)((v >> 8) & 0xff); - *(dp + 3) = (png_byte)(v & 0xff); - v = gamma_16[*(sp + 5) >> gamma_shift][*(sp + 4)]; - *(dp + 4) = (png_byte)((v >> 8) & 0xff); - *(dp + 5) = (png_byte)(v & 0xff); - } - else if (a == 0) - { - /* background is already in screen gamma */ - *dp = (png_byte)((background->red >> 8) & 0xff); - *(dp + 1) = (png_byte)(background->red & 0xff); - *(dp + 2) = (png_byte)((background->green >> 8) & 0xff); - *(dp + 3) = (png_byte)(background->green & 0xff); - *(dp + 4) = (png_byte)((background->blue >> 8) & 0xff); - *(dp + 5) = (png_byte)(background->blue & 0xff); - } - else - { - png_uint_16 v, w, x; - - v = gamma_16_to_1[*(sp + 1) >> gamma_shift][*sp]; - png_composite_16(w, v, a, background_1->red); - x = gamma_16_from_1[((w&0xff) >> gamma_shift)][w >> 8]; - *dp = (png_byte)((x >> 8) & 0xff); - *(dp + 1) = (png_byte)(x & 0xff); - v = gamma_16_to_1[*(sp + 3) >> gamma_shift][*(sp + 2)]; - png_composite_16(w, v, a, background_1->green); - x = gamma_16_from_1[((w&0xff) >> gamma_shift)][w >> 8]; - *(dp + 2) = (png_byte)((x >> 8) & 0xff); - *(dp + 3) = (png_byte)(x & 0xff); - v = gamma_16_to_1[*(sp + 5) >> gamma_shift][*(sp + 4)]; - png_composite_16(w, v, a, background_1->blue); - x = gamma_16_from_1[(w & 0xff) >> gamma_shift][w >> 8]; - *(dp + 4) = (png_byte)((x >> 8) & 0xff); - *(dp + 5) = (png_byte)(x & 0xff); - } - } - } - else -#endif - { - sp = row; - dp = row; - for (i = 0; i < row_width; i++, sp += 8, dp += 6) - { - 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_memcpy(dp, sp, 6); - } - else if (a == 0) - { - *dp = (png_byte)((background->red >> 8) & 0xff); - *(dp + 1) = (png_byte)(background->red & 0xff); - *(dp + 2) = (png_byte)((background->green >> 8) & 0xff); - *(dp + 3) = (png_byte)(background->green & 0xff); - *(dp + 4) = (png_byte)((background->blue >> 8) & 0xff); - *(dp + 5) = (png_byte)(background->blue & 0xff); - } - else - { - 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, background->red); - *dp = (png_byte)((v >> 8) & 0xff); - *(dp + 1) = (png_byte)(v & 0xff); - png_composite_16(v, g, a, background->green); - *(dp + 2) = (png_byte)((v >> 8) & 0xff); - *(dp + 3) = (png_byte)(v & 0xff); - png_composite_16(v, b, a, background->blue); - *(dp + 4) = (png_byte)((v >> 8) & 0xff); - *(dp + 5) = (png_byte)(v & 0xff); - } - } - } - } - break; - } - } - - if (row_info->color_type & PNG_COLOR_MASK_ALPHA) - { - row_info->color_type &= ~PNG_COLOR_MASK_ALPHA; - row_info->channels--; - 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 - -#if defined(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(). - */ - -// (Note: the reason I've pulled this block of code out of png_do_gamma and into its own function -// is because the android NDK compiler was crashing when it tried to compile it) -static void doGamma_RGB (png_uint_32 row_width, png_row_infop row_info, png_bytep row, png_bytep gamma_table, png_uint_16pp gamma_16_table, int gamma_shift) -{ - if (row_info->bit_depth == 8) - { - png_bytep sp = row; - for (png_uint_32 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) */ - { - png_bytep sp = row; - for (png_uint_32 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; - } - } -} - -void /* PRIVATE */ -png_do_gamma(png_row_infop row_info, png_bytep row, - png_bytep gamma_table, png_uint_16pp gamma_16_table, - int gamma_shift) -{ - png_bytep sp; - const png_uint_32 row_width=row_info->width; - - png_debug(1, "in png_do_gamma\n"); - 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: - doGamma_RGB (row_width, row_info, row, gamma_table, gamma_16_table, gamma_shift); - break; - - case PNG_COLOR_TYPE_RGB_ALPHA: - { - if (row_info->bit_depth == 8) - { - sp = row; - for (png_uint_32 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 (png_uint_32 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 (png_uint_32 i = 0; i < row_width; i++) - { - *sp = gamma_table[*sp]; - sp += 2; - } - } - else /* if (row_info->bit_depth == 16) */ - { - sp = row; - for (png_uint_32 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 (png_uint_32 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 (png_uint_32 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 (png_uint_32 i = 0; i < row_width; i++) - { - *sp = gamma_table[*sp]; - sp++; - } - } - else if (row_info->bit_depth == 16) - { - sp = row; - for (png_uint_32 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; - } - } - } -} -#endif - -#if defined(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_colorp palette, png_bytep trans, 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\n"); - if ( -#if defined(PNG_USELESS_TESTS_SUPPORTED) - row != NULL && row_info != NULL && -#endif - 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; - } - } - row_info->bit_depth = 8; - row_info->pixel_depth = 8; - row_info->rowbytes = row_width; - } - switch (row_info->bit_depth) - { - case 8: - { - if (trans != NULL) - { - 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[*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; - } - break; - } - } - } -} - -/* 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_color_16p trans_value) -{ - 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\n"); -#if defined(PNG_USELESS_TESTS_SUPPORTED) - if (row != NULL && row_info != NULL) -#endif - { - if (row_info->color_type == PNG_COLOR_TYPE_GRAY) - { - png_uint_16 gray = (png_uint_16)(trans_value ? trans_value->gray : 0); - - if (row_info->bit_depth < 8) - { - switch (row_info->bit_depth) - { - case 1: - { - gray = (png_uint_16)((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 = (png_uint_16)((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 = (png_uint_16)((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; - } - } - row_info->bit_depth = 8; - row_info->pixel_depth = 8; - row_info->rowbytes = row_width; - } - - if (trans_value != 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) - { - png_byte gray_high = (gray >> 8) & 0xff; - png_byte 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_value) - { - if (row_info->bit_depth == 8) - { - png_byte red = trans_value->red & 0xff; - png_byte green = trans_value->green & 0xff; - png_byte blue = trans_value->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 = (trans_value->red >> 8) & 0xff; - png_byte green_high = (trans_value->green >> 8) & 0xff; - png_byte blue_high = (trans_value->blue >> 8) & 0xff; - png_byte red_low = trans_value->red & 0xff; - png_byte green_low = trans_value->green & 0xff; - png_byte blue_low = trans_value->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 - -#if defined(PNG_READ_DITHER_SUPPORTED) -void /* PRIVATE */ -png_do_dither(png_row_infop row_info, png_bytep row, - png_bytep palette_lookup, png_bytep dither_lookup) -{ - png_bytep sp, dp; - png_uint_32 i; - png_uint_32 row_width=row_info->width; - - png_debug(1, "in png_do_dither\n"); -#if defined(PNG_USELESS_TESTS_SUPPORTED) - if (row != NULL && row_info != NULL) -#endif - { - if (row_info->color_type == PNG_COLOR_TYPE_RGB && - palette_lookup && row_info->bit_depth == 8) - { - 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_DITHER_RED_BITS)) & - ((1 << PNG_DITHER_RED_BITS) - 1)) << - (PNG_DITHER_GREEN_BITS + PNG_DITHER_BLUE_BITS)) | - (((g >> (8 - PNG_DITHER_GREEN_BITS)) & - ((1 << PNG_DITHER_GREEN_BITS) - 1)) << - (PNG_DITHER_BLUE_BITS)) | - ((b >> (8 - PNG_DITHER_BLUE_BITS)) & - ((1 << PNG_DITHER_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 && row_info->bit_depth == 8) - { - 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_DITHER_RED_BITS)) & - ((1 << PNG_DITHER_RED_BITS) - 1)) << - (PNG_DITHER_GREEN_BITS + PNG_DITHER_BLUE_BITS)) | - (((g >> (8 - PNG_DITHER_GREEN_BITS)) & - ((1 << PNG_DITHER_GREEN_BITS) - 1)) << - (PNG_DITHER_BLUE_BITS)) | - ((b >> (8 - PNG_DITHER_BLUE_BITS)) & - ((1 << PNG_DITHER_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 && - dither_lookup && row_info->bit_depth == 8) - { - sp = row; - for (i = 0; i < row_width; i++, sp++) - { - *sp = dither_lookup[*sp]; - } - } - } -} -#endif - -#ifdef PNG_FLOATING_POINT_SUPPORTED -#if defined(PNG_READ_GAMMA_SUPPORTED) -static PNG_CONST int png_gamma_shift[] = - {0x10, 0x21, 0x42, 0x84, 0x110, 0x248, 0x550, 0xff0, 0x00}; - -/* 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_structp png_ptr) -{ - png_debug(1, "in png_build_gamma_table\n"); - - if (png_ptr->bit_depth <= 8) - { - int i; - double g; - - if (png_ptr->screen_gamma > .000001) - g = 1.0 / (png_ptr->gamma * png_ptr->screen_gamma); - else - g = 1.0; - - png_ptr->gamma_table = (png_bytep)png_malloc(png_ptr, - (png_uint_32)256); - - for (i = 0; i < 256; i++) - { - png_ptr->gamma_table[i] = (png_byte)(pow((double)i / 255.0, - g) * 255.0 + .5); - } - -#if defined(PNG_READ_BACKGROUND_SUPPORTED) || \ - defined(PNG_READ_RGB_TO_GRAY_SUPPORTED) - if (png_ptr->transformations & ((PNG_BACKGROUND) | PNG_RGB_TO_GRAY)) - { - - g = 1.0 / (png_ptr->gamma); - - png_ptr->gamma_to_1 = (png_bytep)png_malloc(png_ptr, - (png_uint_32)256); - - for (i = 0; i < 256; i++) - { - png_ptr->gamma_to_1[i] = (png_byte)(pow((double)i / 255.0, - g) * 255.0 + .5); - } - - - png_ptr->gamma_from_1 = (png_bytep)png_malloc(png_ptr, - (png_uint_32)256); - - if(png_ptr->screen_gamma > 0.000001) - g = 1.0 / png_ptr->screen_gamma; - else - g = png_ptr->gamma; /* probably doing rgb_to_gray */ - - for (i = 0; i < 256; i++) - { - png_ptr->gamma_from_1[i] = (png_byte)(pow((double)i / 255.0, - g) * 255.0 + .5); - - } - } -#endif /* PNG_READ_BACKGROUND_SUPPORTED || PNG_RGB_TO_GRAY_SUPPORTED */ - } - else - { - double g; - int i, j, shift, num; - int sig_bit; - png_uint_32 ig; - - if (png_ptr->color_type & PNG_COLOR_MASK_COLOR) - { - sig_bit = (int)png_ptr->sig_bit.red; - if ((int)png_ptr->sig_bit.green > sig_bit) - sig_bit = png_ptr->sig_bit.green; - if ((int)png_ptr->sig_bit.blue > sig_bit) - sig_bit = png_ptr->sig_bit.blue; - } - else - { - sig_bit = (int)png_ptr->sig_bit.gray; - } - - if (sig_bit > 0) - shift = 16 - sig_bit; - else - shift = 0; - - if (png_ptr->transformations & PNG_16_TO_8) - { - if (shift < (16 - PNG_MAX_GAMMA_8)) - shift = (16 - PNG_MAX_GAMMA_8); - } - - if (shift > 8) - shift = 8; - if (shift < 0) - shift = 0; - - png_ptr->gamma_shift = (png_byte)shift; - - num = (1 << (8 - shift)); - - if (png_ptr->screen_gamma > .000001) - g = 1.0 / (png_ptr->gamma * png_ptr->screen_gamma); - else - g = 1.0; - - png_ptr->gamma_16_table = (png_uint_16pp)png_malloc(png_ptr, - (png_uint_32)(num * png_sizeof (png_uint_16p))); - - if (png_ptr->transformations & (PNG_16_TO_8 | PNG_BACKGROUND)) - { - double fin, fout; - png_uint_32 last, max; - - for (i = 0; i < num; i++) - { - png_ptr->gamma_16_table[i] = (png_uint_16p)png_malloc(png_ptr, - (png_uint_32)(256 * png_sizeof (png_uint_16))); - } - - g = 1.0 / g; - last = 0; - for (i = 0; i < 256; i++) - { - fout = ((double)i + 0.5) / 256.0; - fin = pow(fout, g); - max = (png_uint_32)(fin * (double)((png_uint_32)num << 8)); - while (last <= max) - { - png_ptr->gamma_16_table[(int)(last & (0xff >> shift))] - [(int)(last >> (8 - shift))] = (png_uint_16)( - (png_uint_16)i | ((png_uint_16)i << 8)); - last++; - } - } - while (last < ((png_uint_32)num << 8)) - { - png_ptr->gamma_16_table[(int)(last & (0xff >> shift))] - [(int)(last >> (8 - shift))] = (png_uint_16)65535L; - last++; - } - } - else - { - for (i = 0; i < num; i++) - { - png_ptr->gamma_16_table[i] = (png_uint_16p)png_malloc(png_ptr, - (png_uint_32)(256 * png_sizeof (png_uint_16))); - - ig = (((png_uint_32)i * (png_uint_32)png_gamma_shift[shift]) >> 4); - for (j = 0; j < 256; j++) - { - png_ptr->gamma_16_table[i][j] = - (png_uint_16)(pow((double)(ig + ((png_uint_32)j << 8)) / - 65535.0, g) * 65535.0 + .5); - } - } - } - -#if defined(PNG_READ_BACKGROUND_SUPPORTED) || \ - defined(PNG_READ_RGB_TO_GRAY_SUPPORTED) - if (png_ptr->transformations & (PNG_BACKGROUND | PNG_RGB_TO_GRAY)) - { - - g = 1.0 / (png_ptr->gamma); - - png_ptr->gamma_16_to_1 = (png_uint_16pp)png_malloc(png_ptr, - (png_uint_32)(num * png_sizeof (png_uint_16p ))); - - for (i = 0; i < num; i++) - { - png_ptr->gamma_16_to_1[i] = (png_uint_16p)png_malloc(png_ptr, - (png_uint_32)(256 * png_sizeof (png_uint_16))); - - ig = (((png_uint_32)i * - (png_uint_32)png_gamma_shift[shift]) >> 4); - for (j = 0; j < 256; j++) - { - png_ptr->gamma_16_to_1[i][j] = - (png_uint_16)(pow((double)(ig + ((png_uint_32)j << 8)) / - 65535.0, g) * 65535.0 + .5); - } - } - - if(png_ptr->screen_gamma > 0.000001) - g = 1.0 / png_ptr->screen_gamma; - else - g = png_ptr->gamma; /* probably doing rgb_to_gray */ - - png_ptr->gamma_16_from_1 = (png_uint_16pp)png_malloc(png_ptr, - (png_uint_32)(num * png_sizeof (png_uint_16p))); - - for (i = 0; i < num; i++) - { - png_ptr->gamma_16_from_1[i] = (png_uint_16p)png_malloc(png_ptr, - (png_uint_32)(256 * png_sizeof (png_uint_16))); - - ig = (((png_uint_32)i * - (png_uint_32)png_gamma_shift[shift]) >> 4); - for (j = 0; j < 256; j++) - { - png_ptr->gamma_16_from_1[i][j] = - (png_uint_16)(pow((double)(ig + ((png_uint_32)j << 8)) / - 65535.0, g) * 65535.0 + .5); - } - } - } -#endif /* PNG_READ_BACKGROUND_SUPPORTED || PNG_RGB_TO_GRAY_SUPPORTED */ - } -} -#endif -/* To do: install integer version of png_build_gamma_table here */ -#endif - -#if defined(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\n"); - if ( -#if defined(PNG_USELESS_TESTS_SUPPORTED) - row != NULL && row_info != NULL && -#endif - (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 = (png_uint_32)((s0+s1+65536L) & 0xffffL); - png_uint_32 blue = (png_uint_32)((s2+s1+65536L) & 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_MNG_FEATURES_SUPPORTED */ -#endif /* PNG_READ_SUPPORTED */ diff --git a/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngrutil.c b/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngrutil.c deleted file mode 100644 index 6a705a4a..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngrutil.c +++ /dev/null @@ -1,3162 +0,0 @@ - -/* pngrutil.c - utilities to read a PNG file - * - * Last changed in libpng 1.2.21 [October 4, 2007] - * For conditions of distribution and use, see copyright notice in png.h - * Copyright (c) 1998-2007 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 file contains routines that are only called from within - * libpng itself during the course of reading an image. - */ - -#define PNG_INTERNAL -#include "png.h" - -#if defined(PNG_READ_SUPPORTED) - -#if defined(_WIN32_WCE) && (_WIN32_WCE<0x500) -# define WIN32_WCE_OLD -#endif - -#ifdef PNG_FLOATING_POINT_SUPPORTED -# if defined(WIN32_WCE_OLD) -/* strtod() function is not supported on WindowsCE */ -__inline double png_strtod(png_structp png_ptr, PNG_CONST char *nptr, char **endptr) -{ - double result = 0; - int len; - wchar_t *str, *end; - - len = MultiByteToWideChar(CP_ACP, 0, nptr, -1, NULL, 0); - str = (wchar_t *)png_malloc(png_ptr, len * sizeof(wchar_t)); - if ( NULL != str ) - { - MultiByteToWideChar(CP_ACP, 0, nptr, -1, str, len); - result = wcstod(str, &end); - len = WideCharToMultiByte(CP_ACP, 0, end, -1, NULL, 0, NULL, NULL); - *endptr = (char *)nptr + (png_strlen(nptr) - len + 1); - png_free(png_ptr, str); - } - return result; -} -# else -# define png_strtod(p,a,b) strtod(a,b) -# endif -#endif - -png_uint_32 PNGAPI -png_get_uint_31(png_structp png_ptr, png_bytep buf) -{ - png_uint_32 i = png_get_uint_32(buf); - if (i > PNG_UINT_31_MAX) - png_error(png_ptr, "PNG unsigned integer out of range."); - return (i); -} -#ifndef PNG_READ_BIG_ENDIAN_SUPPORTED -/* Grab an unsigned 32-bit integer from a buffer in big-endian format. */ -png_uint_32 PNGAPI -png_get_uint_32(png_bytep buf) -{ - png_uint_32 i = ((png_uint_32)(*buf) << 24) + - ((png_uint_32)(*(buf + 1)) << 16) + - ((png_uint_32)(*(buf + 2)) << 8) + - (png_uint_32)(*(buf + 3)); - - return (i); -} - -/* 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 it is - * assumed that the machine format for signed integers is the same. */ -png_int_32 PNGAPI -png_get_int_32(png_bytep buf) -{ - png_int_32 i = ((png_int_32)(*buf) << 24) + - ((png_int_32)(*(buf + 1)) << 16) + - ((png_int_32)(*(buf + 2)) << 8) + - (png_int_32)(*(buf + 3)); - - return (i); -} - -/* Grab an unsigned 16-bit integer from a buffer in big-endian format. */ -png_uint_16 PNGAPI -png_get_uint_16(png_bytep buf) -{ - png_uint_16 i = (png_uint_16)(((png_uint_16)(*buf) << 8) + - (png_uint_16)(*(buf + 1))); - - return (i); -} -#endif /* PNG_READ_BIG_ENDIAN_SUPPORTED */ - -/* Read data, and (optionally) run it through the CRC. */ -void /* PRIVATE */ -png_crc_read(png_structp png_ptr, png_bytep buf, png_size_t 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 a 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_structp png_ptr, png_uint_32 skip) -{ - png_size_t i; - png_size_t istop = png_ptr->zbuf_size; - - for (i = (png_size_t)skip; i > istop; i -= istop) - { - png_crc_read(png_ptr, png_ptr->zbuf, png_ptr->zbuf_size); - } - if (i) - { - png_crc_read(png_ptr, png_ptr->zbuf, i); - } - - if (png_crc_error(png_ptr)) - { - if (((png_ptr->chunk_name[0] & 0x20) && /* Ancillary */ - !(png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_NOWARN)) || - (!(png_ptr->chunk_name[0] & 0x20) && /* Critical */ - (png_ptr->flags & PNG_FLAG_CRC_CRITICAL_USE))) - { - png_chunk_warning(png_ptr, "CRC error"); - } - else - { - png_chunk_error(png_ptr, "CRC error"); - } - 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_structp png_ptr) -{ - png_byte crc_bytes[4]; - png_uint_32 crc; - int need_crc = 1; - - if (png_ptr->chunk_name[0] & 0x20) /* ancillary */ - { - 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; - } - - 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); -} - -#if defined(PNG_READ_zTXt_SUPPORTED) || defined(PNG_READ_iTXt_SUPPORTED) || \ - defined(PNG_READ_iCCP_SUPPORTED) -/* - * Decompress trailing data in a chunk. The assumption is that chunkdata - * 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). - */ -png_charp /* PRIVATE */ -png_decompress_chunk(png_structp png_ptr, int comp_type, - png_charp chunkdata, png_size_t chunklength, - png_size_t prefix_size, png_size_t *newlength) -{ - static PNG_CONST char msg[] = "Error decoding compressed text"; - png_charp text; - png_size_t text_size; - - if (comp_type == PNG_COMPRESSION_TYPE_BASE) - { - int ret = Z_OK; - png_ptr->zstream.next_in = (png_bytep)(chunkdata + prefix_size); - png_ptr->zstream.avail_in = (uInt)(chunklength - prefix_size); - png_ptr->zstream.next_out = png_ptr->zbuf; - png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; - - text_size = 0; - text = NULL; - - while (png_ptr->zstream.avail_in) - { - ret = inflate(&png_ptr->zstream, Z_PARTIAL_FLUSH); - if (ret != Z_OK && ret != Z_STREAM_END) - { - if (png_ptr->zstream.msg != NULL) - png_warning(png_ptr, png_ptr->zstream.msg); - else - png_warning(png_ptr, msg); - inflateReset(&png_ptr->zstream); - png_ptr->zstream.avail_in = 0; - - if (text == NULL) - { - text_size = prefix_size + png_sizeof(msg) + 1; - text = (png_charp)png_malloc_warn(png_ptr, text_size); - if (text == NULL) - { - png_free(png_ptr,chunkdata); - png_error(png_ptr,"Not enough memory to decompress chunk"); - } - png_memcpy(text, chunkdata, prefix_size); - } - - text[text_size - 1] = 0x00; - - /* Copy what we can of the error message into the text chunk */ - text_size = (png_size_t)(chunklength - (text - chunkdata) - 1); - text_size = png_sizeof(msg) > text_size ? text_size : - png_sizeof(msg); - png_memcpy(text + prefix_size, msg, text_size + 1); - break; - } - if (!png_ptr->zstream.avail_out || ret == Z_STREAM_END) - { - if (text == NULL) - { - text_size = prefix_size + - png_ptr->zbuf_size - png_ptr->zstream.avail_out; - text = (png_charp)png_malloc_warn(png_ptr, text_size + 1); - if (text == NULL) - { - png_free(png_ptr,chunkdata); - png_error(png_ptr,"Not enough memory to decompress chunk."); - } - png_memcpy(text + prefix_size, png_ptr->zbuf, - text_size - prefix_size); - png_memcpy(text, chunkdata, prefix_size); - *(text + text_size) = 0x00; - } - else - { - png_charp tmp; - - tmp = text; - text = (png_charp)png_malloc_warn(png_ptr, - (png_uint_32)(text_size + - png_ptr->zbuf_size - png_ptr->zstream.avail_out + 1)); - if (text == NULL) - { - png_free(png_ptr, tmp); - png_free(png_ptr, chunkdata); - png_error(png_ptr,"Not enough memory to decompress chunk.."); - } - png_memcpy(text, tmp, text_size); - png_free(png_ptr, tmp); - png_memcpy(text + text_size, png_ptr->zbuf, - (png_ptr->zbuf_size - png_ptr->zstream.avail_out)); - text_size += png_ptr->zbuf_size - png_ptr->zstream.avail_out; - *(text + text_size) = 0x00; - } - if (ret == Z_STREAM_END) - break; - else - { - png_ptr->zstream.next_out = png_ptr->zbuf; - png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; - } - } - } - if (ret != Z_STREAM_END) - { -#if !defined(PNG_NO_STDIO) && !defined(_WIN32_WCE) - char umsg[52]; - - if (ret == Z_BUF_ERROR) - png_snprintf(umsg, 52, - "Buffer error in compressed datastream in %s chunk", - png_ptr->chunk_name); - else if (ret == Z_DATA_ERROR) - png_snprintf(umsg, 52, - "Data error in compressed datastream in %s chunk", - png_ptr->chunk_name); - else - png_snprintf(umsg, 52, - "Incomplete compressed datastream in %s chunk", - png_ptr->chunk_name); - png_warning(png_ptr, umsg); -#else - png_warning(png_ptr, - "Incomplete compressed datastream in chunk other than IDAT"); -#endif - text_size=prefix_size; - if (text == NULL) - { - text = (png_charp)png_malloc_warn(png_ptr, text_size+1); - if (text == NULL) - { - png_free(png_ptr, chunkdata); - png_error(png_ptr,"Not enough memory for text."); - } - png_memcpy(text, chunkdata, prefix_size); - } - *(text + text_size) = 0x00; - } - - inflateReset(&png_ptr->zstream); - png_ptr->zstream.avail_in = 0; - - png_free(png_ptr, chunkdata); - chunkdata = text; - *newlength=text_size; - } - else /* if (comp_type != PNG_COMPRESSION_TYPE_BASE) */ - { -#if !defined(PNG_NO_STDIO) && !defined(_WIN32_WCE) - char umsg[50]; - - png_snprintf(umsg, 50, - "Unknown zTXt compression type %d", comp_type); - png_warning(png_ptr, umsg); -#else - png_warning(png_ptr, "Unknown zTXt compression type"); -#endif - - *(chunkdata + prefix_size) = 0x00; - *newlength=prefix_size; - } - - return chunkdata; -} -#endif - -/* read and check the IDHR chunk */ -void /* PRIVATE */ -png_handle_IHDR(png_structp png_ptr, png_infop 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\n"); - - if (png_ptr->mode & PNG_HAVE_IHDR) - png_error(png_ptr, "Out of place IHDR"); - - /* check the length */ - if (length != 13) - png_error(png_ptr, "Invalid IHDR chunk"); - - 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; -#if defined(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) - { - 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\n", png_ptr->bit_depth); - png_debug1(3,"channels = %d\n", png_ptr->channels); - png_debug1(3,"rowbytes = %lu\n", 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_structp png_ptr, png_infop info_ptr, png_uint_32 length) -{ - png_color palette[PNG_MAX_PALETTE_LENGTH]; - int num, i; -#ifndef PNG_NO_POINTER_INDEXING - png_colorp pal_ptr; -#endif - - png_debug(1, "in png_handle_PLTE\n"); - - if (!(png_ptr->mode & PNG_HAVE_IHDR)) - png_error(png_ptr, "Missing IHDR before PLTE"); - else if (png_ptr->mode & PNG_HAVE_IDAT) - { - png_warning(png_ptr, "Invalid PLTE after IDAT"); - png_crc_finish(png_ptr, length); - return; - } - else if (png_ptr->mode & PNG_HAVE_PLTE) - png_error(png_ptr, "Duplicate PLTE chunk"); - - png_ptr->mode |= PNG_HAVE_PLTE; - - if (!(png_ptr->color_type&PNG_COLOR_MASK_COLOR)) - { - png_warning(png_ptr, - "Ignoring PLTE chunk in grayscale PNG"); - png_crc_finish(png_ptr, length); - return; - } -#if !defined(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) - { - if (png_ptr->color_type != PNG_COLOR_TYPE_PALETTE) - { - png_warning(png_ptr, "Invalid palette chunk"); - png_crc_finish(png_ptr, length); - return; - } - else - { - png_error(png_ptr, "Invalid palette chunk"); - } - } - - num = (int)length / 3; - -#ifndef PNG_NO_POINTER_INDEXING - 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. */ -#if !defined(PNG_READ_OPT_PLTE_SUPPORTED) - if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) -#endif - { - png_crc_finish(png_ptr, 0); - } -#if !defined(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). */ - if (!(png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_USE)) - { - if (png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_NOWARN) - { - png_chunk_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 - - png_set_PLTE(png_ptr, info_ptr, palette, num); - -#if defined(PNG_READ_tRNS_SUPPORTED) - if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) - { - if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_tRNS)) - { - if (png_ptr->num_trans > (png_uint_16)num) - { - png_warning(png_ptr, "Truncating incorrect tRNS chunk length"); - png_ptr->num_trans = (png_uint_16)num; - } - if (info_ptr->num_trans > (png_uint_16)num) - { - png_warning(png_ptr, "Truncating incorrect info tRNS chunk length"); - info_ptr->num_trans = (png_uint_16)num; - } - } - } -#endif - -} - -void /* PRIVATE */ -png_handle_IEND(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) -{ - png_debug(1, "in png_handle_IEND\n"); - - if (!(png_ptr->mode & PNG_HAVE_IHDR) || !(png_ptr->mode & PNG_HAVE_IDAT)) - { - png_error(png_ptr, "No image in file"); - } - - png_ptr->mode |= (PNG_AFTER_IDAT | PNG_HAVE_IEND); - - if (length != 0) - { - png_warning(png_ptr, "Incorrect IEND chunk length"); - } - png_crc_finish(png_ptr, length); - - info_ptr =info_ptr; /* quiet compiler warnings about unused info_ptr */ -} - -#if defined(PNG_READ_gAMA_SUPPORTED) -void /* PRIVATE */ -png_handle_gAMA(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) -{ - png_fixed_point igamma; -#ifdef PNG_FLOATING_POINT_SUPPORTED - float file_gamma; -#endif - png_byte buf[4]; - - png_debug(1, "in png_handle_gAMA\n"); - - if (!(png_ptr->mode & PNG_HAVE_IHDR)) - png_error(png_ptr, "Missing IHDR before gAMA"); - else if (png_ptr->mode & PNG_HAVE_IDAT) - { - png_warning(png_ptr, "Invalid gAMA after IDAT"); - png_crc_finish(png_ptr, length); - return; - } - else if (png_ptr->mode & PNG_HAVE_PLTE) - /* Should be an error, but we can cope with it */ - png_warning(png_ptr, "Out of place gAMA chunk"); - - if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_gAMA) -#if defined(PNG_READ_sRGB_SUPPORTED) - && !(info_ptr->valid & PNG_INFO_sRGB) -#endif - ) - { - png_warning(png_ptr, "Duplicate gAMA chunk"); - png_crc_finish(png_ptr, length); - return; - } - - if (length != 4) - { - png_warning(png_ptr, "Incorrect gAMA chunk length"); - png_crc_finish(png_ptr, length); - return; - } - - png_crc_read(png_ptr, buf, 4); - if (png_crc_finish(png_ptr, 0)) - return; - - igamma = (png_fixed_point)png_get_uint_32(buf); - /* check for zero gamma */ - if (igamma == 0) - { - png_warning(png_ptr, - "Ignoring gAMA chunk with gamma=0"); - return; - } - -#if defined(PNG_READ_sRGB_SUPPORTED) - if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_sRGB)) - if (PNG_OUT_OF_RANGE(igamma, 45500L, 500)) - { - png_warning(png_ptr, - "Ignoring incorrect gAMA value when sRGB is also present"); -#ifndef PNG_NO_CONSOLE_IO - fprintf(stderr, "gamma = (%d/100000)\n", (int)igamma); -#endif - return; - } -#endif /* PNG_READ_sRGB_SUPPORTED */ - -#ifdef PNG_FLOATING_POINT_SUPPORTED - file_gamma = (float)igamma / (float)100000.0; -# ifdef PNG_READ_GAMMA_SUPPORTED - png_ptr->gamma = file_gamma; -# endif - png_set_gAMA(png_ptr, info_ptr, file_gamma); -#endif -#ifdef PNG_FIXED_POINT_SUPPORTED - png_set_gAMA_fixed(png_ptr, info_ptr, igamma); -#endif -} -#endif - -#if defined(PNG_READ_sBIT_SUPPORTED) -void /* PRIVATE */ -png_handle_sBIT(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) -{ - png_size_t truelen; - png_byte buf[4]; - - png_debug(1, "in png_handle_sBIT\n"); - - buf[0] = buf[1] = buf[2] = buf[3] = 0; - - if (!(png_ptr->mode & PNG_HAVE_IHDR)) - png_error(png_ptr, "Missing IHDR before sBIT"); - else if (png_ptr->mode & PNG_HAVE_IDAT) - { - png_warning(png_ptr, "Invalid sBIT after IDAT"); - png_crc_finish(png_ptr, length); - return; - } - else if (png_ptr->mode & PNG_HAVE_PLTE) - { - /* Should be an error, but we can cope with it */ - png_warning(png_ptr, "Out of place sBIT chunk"); - } - if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_sBIT)) - { - png_warning(png_ptr, "Duplicate sBIT chunk"); - png_crc_finish(png_ptr, length); - return; - } - - if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) - truelen = 3; - else - truelen = (png_size_t)png_ptr->channels; - - if (length != truelen || length > 4) - { - png_warning(png_ptr, "Incorrect sBIT chunk length"); - 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 - -#if defined(PNG_READ_cHRM_SUPPORTED) -void /* PRIVATE */ -png_handle_cHRM(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) -{ - png_byte buf[4]; -#ifdef PNG_FLOATING_POINT_SUPPORTED - float white_x, white_y, red_x, red_y, green_x, green_y, blue_x, blue_y; -#endif - png_fixed_point int_x_white, int_y_white, int_x_red, int_y_red, int_x_green, - int_y_green, int_x_blue, int_y_blue; - - png_uint_32 uint_x, uint_y; - - png_debug(1, "in png_handle_cHRM\n"); - - if (!(png_ptr->mode & PNG_HAVE_IHDR)) - png_error(png_ptr, "Missing IHDR before cHRM"); - else if (png_ptr->mode & PNG_HAVE_IDAT) - { - png_warning(png_ptr, "Invalid cHRM after IDAT"); - png_crc_finish(png_ptr, length); - return; - } - else if (png_ptr->mode & PNG_HAVE_PLTE) - /* Should be an error, but we can cope with it */ - png_warning(png_ptr, "Missing PLTE before cHRM"); - - if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_cHRM) -#if defined(PNG_READ_sRGB_SUPPORTED) - && !(info_ptr->valid & PNG_INFO_sRGB) -#endif - ) - { - png_warning(png_ptr, "Duplicate cHRM chunk"); - png_crc_finish(png_ptr, length); - return; - } - - if (length != 32) - { - png_warning(png_ptr, "Incorrect cHRM chunk length"); - png_crc_finish(png_ptr, length); - return; - } - - png_crc_read(png_ptr, buf, 4); - uint_x = png_get_uint_32(buf); - - png_crc_read(png_ptr, buf, 4); - uint_y = png_get_uint_32(buf); - - if (uint_x > 80000L || uint_y > 80000L || - uint_x + uint_y > 100000L) - { - png_warning(png_ptr, "Invalid cHRM white point"); - png_crc_finish(png_ptr, 24); - return; - } - int_x_white = (png_fixed_point)uint_x; - int_y_white = (png_fixed_point)uint_y; - - png_crc_read(png_ptr, buf, 4); - uint_x = png_get_uint_32(buf); - - png_crc_read(png_ptr, buf, 4); - uint_y = png_get_uint_32(buf); - - if (uint_x + uint_y > 100000L) - { - png_warning(png_ptr, "Invalid cHRM red point"); - png_crc_finish(png_ptr, 16); - return; - } - int_x_red = (png_fixed_point)uint_x; - int_y_red = (png_fixed_point)uint_y; - - png_crc_read(png_ptr, buf, 4); - uint_x = png_get_uint_32(buf); - - png_crc_read(png_ptr, buf, 4); - uint_y = png_get_uint_32(buf); - - if (uint_x + uint_y > 100000L) - { - png_warning(png_ptr, "Invalid cHRM green point"); - png_crc_finish(png_ptr, 8); - return; - } - int_x_green = (png_fixed_point)uint_x; - int_y_green = (png_fixed_point)uint_y; - - png_crc_read(png_ptr, buf, 4); - uint_x = png_get_uint_32(buf); - - png_crc_read(png_ptr, buf, 4); - uint_y = png_get_uint_32(buf); - - if (uint_x + uint_y > 100000L) - { - png_warning(png_ptr, "Invalid cHRM blue point"); - png_crc_finish(png_ptr, 0); - return; - } - int_x_blue = (png_fixed_point)uint_x; - int_y_blue = (png_fixed_point)uint_y; - -#ifdef PNG_FLOATING_POINT_SUPPORTED - white_x = (float)int_x_white / (float)100000.0; - white_y = (float)int_y_white / (float)100000.0; - red_x = (float)int_x_red / (float)100000.0; - red_y = (float)int_y_red / (float)100000.0; - green_x = (float)int_x_green / (float)100000.0; - green_y = (float)int_y_green / (float)100000.0; - blue_x = (float)int_x_blue / (float)100000.0; - blue_y = (float)int_y_blue / (float)100000.0; -#endif - -#if defined(PNG_READ_sRGB_SUPPORTED) - if ((info_ptr != NULL) && (info_ptr->valid & PNG_INFO_sRGB)) - { - if (PNG_OUT_OF_RANGE(int_x_white, 31270, 1000) || - PNG_OUT_OF_RANGE(int_y_white, 32900, 1000) || - PNG_OUT_OF_RANGE(int_x_red, 64000L, 1000) || - PNG_OUT_OF_RANGE(int_y_red, 33000, 1000) || - PNG_OUT_OF_RANGE(int_x_green, 30000, 1000) || - PNG_OUT_OF_RANGE(int_y_green, 60000L, 1000) || - PNG_OUT_OF_RANGE(int_x_blue, 15000, 1000) || - PNG_OUT_OF_RANGE(int_y_blue, 6000, 1000)) - { - png_warning(png_ptr, - "Ignoring incorrect cHRM value when sRGB is also present"); -#ifndef PNG_NO_CONSOLE_IO -#ifdef PNG_FLOATING_POINT_SUPPORTED - fprintf(stderr,"wx=%f, wy=%f, rx=%f, ry=%f\n", - white_x, white_y, red_x, red_y); - fprintf(stderr,"gx=%f, gy=%f, bx=%f, by=%f\n", - green_x, green_y, blue_x, blue_y); -#else - fprintf(stderr,"wx=%ld, wy=%ld, rx=%ld, ry=%ld\n", - int_x_white, int_y_white, int_x_red, int_y_red); - fprintf(stderr,"gx=%ld, gy=%ld, bx=%ld, by=%ld\n", - int_x_green, int_y_green, int_x_blue, int_y_blue); -#endif -#endif /* PNG_NO_CONSOLE_IO */ - } - png_crc_finish(png_ptr, 0); - return; - } -#endif /* PNG_READ_sRGB_SUPPORTED */ - -#ifdef PNG_FLOATING_POINT_SUPPORTED - png_set_cHRM(png_ptr, info_ptr, - white_x, white_y, red_x, red_y, green_x, green_y, blue_x, blue_y); -#endif -#ifdef PNG_FIXED_POINT_SUPPORTED - png_set_cHRM_fixed(png_ptr, info_ptr, - int_x_white, int_y_white, int_x_red, int_y_red, int_x_green, - int_y_green, int_x_blue, int_y_blue); -#endif - if (png_crc_finish(png_ptr, 0)) - return; -} -#endif - -#if defined(PNG_READ_sRGB_SUPPORTED) -void /* PRIVATE */ -png_handle_sRGB(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) -{ - int intent; - png_byte buf[1]; - - png_debug(1, "in png_handle_sRGB\n"); - - if (!(png_ptr->mode & PNG_HAVE_IHDR)) - png_error(png_ptr, "Missing IHDR before sRGB"); - else if (png_ptr->mode & PNG_HAVE_IDAT) - { - png_warning(png_ptr, "Invalid sRGB after IDAT"); - png_crc_finish(png_ptr, length); - return; - } - else if (png_ptr->mode & PNG_HAVE_PLTE) - /* Should be an error, but we can cope with it */ - png_warning(png_ptr, "Out of place sRGB chunk"); - - if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_sRGB)) - { - png_warning(png_ptr, "Duplicate sRGB chunk"); - png_crc_finish(png_ptr, length); - return; - } - - if (length != 1) - { - png_warning(png_ptr, "Incorrect sRGB chunk length"); - png_crc_finish(png_ptr, length); - return; - } - - png_crc_read(png_ptr, buf, 1); - if (png_crc_finish(png_ptr, 0)) - return; - - intent = buf[0]; - /* check for bad intent */ - if (intent >= PNG_sRGB_INTENT_LAST) - { - png_warning(png_ptr, "Unknown sRGB intent"); - return; - } - -#if defined(PNG_READ_gAMA_SUPPORTED) && defined(PNG_READ_GAMMA_SUPPORTED) - if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_gAMA)) - { - png_fixed_point igamma; -#ifdef PNG_FIXED_POINT_SUPPORTED - igamma=info_ptr->int_gamma; -#else -# ifdef PNG_FLOATING_POINT_SUPPORTED - igamma=(png_fixed_point)(info_ptr->gamma * 100000.); -# endif -#endif - if (PNG_OUT_OF_RANGE(igamma, 45500L, 500)) - { - png_warning(png_ptr, - "Ignoring incorrect gAMA value when sRGB is also present"); -#ifndef PNG_NO_CONSOLE_IO -# ifdef PNG_FIXED_POINT_SUPPORTED - fprintf(stderr,"incorrect gamma=(%d/100000)\n",(int)png_ptr->int_gamma); -# else -# ifdef PNG_FLOATING_POINT_SUPPORTED - fprintf(stderr,"incorrect gamma=%f\n",png_ptr->gamma); -# endif -# endif -#endif - } - } -#endif /* PNG_READ_gAMA_SUPPORTED */ - -#ifdef PNG_READ_cHRM_SUPPORTED -#ifdef PNG_FIXED_POINT_SUPPORTED - if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_cHRM)) - if (PNG_OUT_OF_RANGE(info_ptr->int_x_white, 31270, 1000) || - PNG_OUT_OF_RANGE(info_ptr->int_y_white, 32900, 1000) || - PNG_OUT_OF_RANGE(info_ptr->int_x_red, 64000L, 1000) || - PNG_OUT_OF_RANGE(info_ptr->int_y_red, 33000, 1000) || - PNG_OUT_OF_RANGE(info_ptr->int_x_green, 30000, 1000) || - PNG_OUT_OF_RANGE(info_ptr->int_y_green, 60000L, 1000) || - PNG_OUT_OF_RANGE(info_ptr->int_x_blue, 15000, 1000) || - PNG_OUT_OF_RANGE(info_ptr->int_y_blue, 6000, 1000)) - { - png_warning(png_ptr, - "Ignoring incorrect cHRM value when sRGB is also present"); - } -#endif /* PNG_FIXED_POINT_SUPPORTED */ -#endif /* PNG_READ_cHRM_SUPPORTED */ - - png_set_sRGB_gAMA_and_cHRM(png_ptr, info_ptr, intent); -} -#endif /* PNG_READ_sRGB_SUPPORTED */ - -#if defined(PNG_READ_iCCP_SUPPORTED) -void /* PRIVATE */ -png_handle_iCCP(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) -/* Note: this does not properly handle chunks that are > 64K under DOS */ -{ - png_charp chunkdata; - png_byte compression_type; - png_bytep pC; - png_charp profile; - png_uint_32 skip = 0; - png_uint_32 profile_size, profile_length; - png_size_t slength, prefix_length, data_length; - - png_debug(1, "in png_handle_iCCP\n"); - - if (!(png_ptr->mode & PNG_HAVE_IHDR)) - png_error(png_ptr, "Missing IHDR before iCCP"); - else if (png_ptr->mode & PNG_HAVE_IDAT) - { - png_warning(png_ptr, "Invalid iCCP after IDAT"); - png_crc_finish(png_ptr, length); - return; - } - else if (png_ptr->mode & PNG_HAVE_PLTE) - /* Should be an error, but we can cope with it */ - png_warning(png_ptr, "Out of place iCCP chunk"); - - if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_iCCP)) - { - png_warning(png_ptr, "Duplicate iCCP chunk"); - png_crc_finish(png_ptr, length); - return; - } - -#ifdef PNG_MAX_MALLOC_64K - if (length > (png_uint_32)65535L) - { - png_warning(png_ptr, "iCCP chunk too large to fit in memory"); - skip = length - (png_uint_32)65535L; - length = (png_uint_32)65535L; - } -#endif - - chunkdata = (png_charp)png_malloc(png_ptr, length + 1); - slength = (png_size_t)length; - png_crc_read(png_ptr, (png_bytep)chunkdata, slength); - - if (png_crc_finish(png_ptr, skip)) - { - png_free(png_ptr, chunkdata); - return; - } - - chunkdata[slength] = 0x00; - - for (profile = chunkdata; *profile; profile++) - /* empty loop to find end of name */ ; - - ++profile; - - /* there should be at least one zero (the compression type byte) - following the separator, and we should be on it */ - if ( profile >= chunkdata + slength - 1) - { - png_free(png_ptr, chunkdata); - png_warning(png_ptr, "Malformed iCCP chunk"); - return; - } - - /* compression_type should always be zero */ - compression_type = *profile++; - if (compression_type) - { - png_warning(png_ptr, "Ignoring nonzero compression type in iCCP chunk"); - compression_type=0x00; /* Reset it to zero (libpng-1.0.6 through 1.0.8 - wrote nonzero) */ - } - - prefix_length = profile - chunkdata; - chunkdata = png_decompress_chunk(png_ptr, compression_type, chunkdata, - slength, prefix_length, &data_length); - - profile_length = data_length - prefix_length; - - if ( prefix_length > data_length || profile_length < 4) - { - png_free(png_ptr, chunkdata); - png_warning(png_ptr, "Profile size field missing from iCCP chunk"); - return; - } - - /* Check the profile_size recorded in the first 32 bits of the ICC profile */ - pC = (png_bytep)(chunkdata+prefix_length); - profile_size = ((*(pC ))<<24) | - ((*(pC+1))<<16) | - ((*(pC+2))<< 8) | - ((*(pC+3)) ); - - if(profile_size < profile_length) - profile_length = profile_size; - - if(profile_size > profile_length) - { - png_free(png_ptr, chunkdata); - png_warning(png_ptr, "Ignoring truncated iCCP profile."); - return; - } - - png_set_iCCP(png_ptr, info_ptr, chunkdata, compression_type, - chunkdata + prefix_length, profile_length); - png_free(png_ptr, chunkdata); -} -#endif /* PNG_READ_iCCP_SUPPORTED */ - -#if defined(PNG_READ_sPLT_SUPPORTED) -void /* PRIVATE */ -png_handle_sPLT(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) -/* Note: this does not properly handle chunks that are > 64K under DOS */ -{ - png_bytep chunkdata; - png_bytep entry_start; - png_sPLT_t new_palette; -#ifdef PNG_NO_POINTER_INDEXING - png_sPLT_entryp pp; -#endif - int data_length, entry_size, i; - png_uint_32 skip = 0; - png_size_t slength; - - png_debug(1, "in png_handle_sPLT\n"); - - if (!(png_ptr->mode & PNG_HAVE_IHDR)) - png_error(png_ptr, "Missing IHDR before sPLT"); - else if (png_ptr->mode & PNG_HAVE_IDAT) - { - png_warning(png_ptr, "Invalid sPLT after IDAT"); - png_crc_finish(png_ptr, length); - return; - } - -#ifdef PNG_MAX_MALLOC_64K - if (length > (png_uint_32)65535L) - { - png_warning(png_ptr, "sPLT chunk too large to fit in memory"); - skip = length - (png_uint_32)65535L; - length = (png_uint_32)65535L; - } -#endif - - chunkdata = (png_bytep)png_malloc(png_ptr, length + 1); - slength = (png_size_t)length; - png_crc_read(png_ptr, (png_bytep)chunkdata, slength); - - if (png_crc_finish(png_ptr, skip)) - { - png_free(png_ptr, chunkdata); - return; - } - - chunkdata[slength] = 0x00; - - for (entry_start = chunkdata; *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 > chunkdata + slength - 2) - { - png_free(png_ptr, chunkdata); - png_warning(png_ptr, "malformed sPLT chunk"); - return; - } - - new_palette.depth = *entry_start++; - entry_size = (new_palette.depth == 8 ? 6 : 10); - data_length = (slength - (entry_start - chunkdata)); - - /* integrity-check the data length */ - if (data_length % entry_size) - { - png_free(png_ptr, chunkdata); - png_warning(png_ptr, "sPLT chunk has bad length"); - return; - } - - new_palette.nentries = (png_int_32) ( data_length / entry_size); - if ((png_uint_32) new_palette.nentries > (png_uint_32) (PNG_SIZE_MAX / - png_sizeof(png_sPLT_entry))) - { - png_warning(png_ptr, "sPLT chunk too long"); - return; - } - new_palette.entries = (png_sPLT_entryp)png_malloc_warn( - png_ptr, new_palette.nentries * png_sizeof(png_sPLT_entry)); - if (new_palette.entries == NULL) - { - png_warning(png_ptr, "sPLT chunk requires too much memory"); - return; - } - -#ifndef PNG_NO_POINTER_INDEXING - for (i = 0; i < new_palette.nentries; i++) - { - png_sPLT_entryp 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->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)chunkdata; - - png_set_sPLT(png_ptr, info_ptr, &new_palette, 1); - - png_free(png_ptr, chunkdata); - png_free(png_ptr, new_palette.entries); -} -#endif /* PNG_READ_sPLT_SUPPORTED */ - -#if defined(PNG_READ_tRNS_SUPPORTED) -void /* PRIVATE */ -png_handle_tRNS(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) -{ - png_byte readbuf[PNG_MAX_PALETTE_LENGTH]; - int bit_mask; - - png_debug(1, "in png_handle_tRNS\n"); - - /* For non-indexed color, mask off any bits in the tRNS value that - * exceed the bit depth. Some creators were writing extra bits there. - * This is not needed for indexed color. */ - bit_mask = (1 << png_ptr->bit_depth) - 1; - - if (!(png_ptr->mode & PNG_HAVE_IHDR)) - png_error(png_ptr, "Missing IHDR before tRNS"); - else if (png_ptr->mode & PNG_HAVE_IDAT) - { - png_warning(png_ptr, "Invalid tRNS after IDAT"); - png_crc_finish(png_ptr, length); - return; - } - else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_tRNS)) - { - png_warning(png_ptr, "Duplicate tRNS chunk"); - png_crc_finish(png_ptr, length); - return; - } - - if (png_ptr->color_type == PNG_COLOR_TYPE_GRAY) - { - png_byte buf[2]; - - if (length != 2) - { - png_warning(png_ptr, "Incorrect tRNS chunk length"); - png_crc_finish(png_ptr, length); - return; - } - - png_crc_read(png_ptr, buf, 2); - png_ptr->num_trans = 1; - png_ptr->trans_values.gray = png_get_uint_16(buf) & bit_mask; - } - else if (png_ptr->color_type == PNG_COLOR_TYPE_RGB) - { - png_byte buf[6]; - - if (length != 6) - { - png_warning(png_ptr, "Incorrect tRNS chunk length"); - png_crc_finish(png_ptr, length); - return; - } - png_crc_read(png_ptr, buf, (png_size_t)length); - png_ptr->num_trans = 1; - png_ptr->trans_values.red = png_get_uint_16(buf) & bit_mask; - png_ptr->trans_values.green = png_get_uint_16(buf + 2) & bit_mask; - png_ptr->trans_values.blue = png_get_uint_16(buf + 4) & bit_mask; - } - else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) - { - if (!(png_ptr->mode & PNG_HAVE_PLTE)) - { - /* Should be an error, but we can cope with it. */ - png_warning(png_ptr, "Missing PLTE before tRNS"); - } - if (length > (png_uint_32)png_ptr->num_palette || - length > PNG_MAX_PALETTE_LENGTH) - { - png_warning(png_ptr, "Incorrect tRNS chunk length"); - png_crc_finish(png_ptr, length); - return; - } - if (length == 0) - { - png_warning(png_ptr, "Zero length tRNS chunk"); - png_crc_finish(png_ptr, length); - return; - } - png_crc_read(png_ptr, readbuf, (png_size_t)length); - png_ptr->num_trans = (png_uint_16)length; - } - else - { - png_warning(png_ptr, "tRNS chunk not allowed with alpha channel"); - png_crc_finish(png_ptr, length); - return; - } - - if (png_crc_finish(png_ptr, 0)) - { - png_ptr->num_trans = 0; - return; - } - - png_set_tRNS(png_ptr, info_ptr, readbuf, png_ptr->num_trans, - &(png_ptr->trans_values)); -} -#endif - -#if defined(PNG_READ_bKGD_SUPPORTED) -void /* PRIVATE */ -png_handle_bKGD(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) -{ - png_size_t truelen; - png_byte buf[6]; - - png_debug(1, "in png_handle_bKGD\n"); - - if (!(png_ptr->mode & PNG_HAVE_IHDR)) - png_error(png_ptr, "Missing IHDR before bKGD"); - else if (png_ptr->mode & PNG_HAVE_IDAT) - { - png_warning(png_ptr, "Invalid bKGD after IDAT"); - png_crc_finish(png_ptr, length); - return; - } - else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE && - !(png_ptr->mode & PNG_HAVE_PLTE)) - { - png_warning(png_ptr, "Missing PLTE before bKGD"); - png_crc_finish(png_ptr, length); - return; - } - else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_bKGD)) - { - png_warning(png_ptr, "Duplicate bKGD chunk"); - png_crc_finish(png_ptr, length); - 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_warning(png_ptr, "Incorrect bKGD chunk length"); - png_crc_finish(png_ptr, length); - 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) - { - png_ptr->background.index = buf[0]; - if(info_ptr->num_palette) - { - if(buf[0] > info_ptr->num_palette) - { - png_warning(png_ptr, "Incorrect bKGD chunk index value"); - return; - } - png_ptr->background.red = - (png_uint_16)png_ptr->palette[buf[0]].red; - png_ptr->background.green = - (png_uint_16)png_ptr->palette[buf[0]].green; - png_ptr->background.blue = - (png_uint_16)png_ptr->palette[buf[0]].blue; - } - } - else if (!(png_ptr->color_type & PNG_COLOR_MASK_COLOR)) /* GRAY */ - { - png_ptr->background.red = - png_ptr->background.green = - png_ptr->background.blue = - png_ptr->background.gray = png_get_uint_16(buf); - } - else - { - png_ptr->background.red = png_get_uint_16(buf); - png_ptr->background.green = png_get_uint_16(buf + 2); - png_ptr->background.blue = png_get_uint_16(buf + 4); - } - - png_set_bKGD(png_ptr, info_ptr, &(png_ptr->background)); -} -#endif - -#if defined(PNG_READ_hIST_SUPPORTED) -void /* PRIVATE */ -png_handle_hIST(png_structp png_ptr, png_infop 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\n"); - - if (!(png_ptr->mode & PNG_HAVE_IHDR)) - png_error(png_ptr, "Missing IHDR before hIST"); - else if (png_ptr->mode & PNG_HAVE_IDAT) - { - png_warning(png_ptr, "Invalid hIST after IDAT"); - png_crc_finish(png_ptr, length); - return; - } - else if (!(png_ptr->mode & PNG_HAVE_PLTE)) - { - png_warning(png_ptr, "Missing PLTE before hIST"); - png_crc_finish(png_ptr, length); - return; - } - else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_hIST)) - { - png_warning(png_ptr, "Duplicate hIST chunk"); - png_crc_finish(png_ptr, length); - return; - } - - num = length / 2 ; - if (num != (unsigned int) png_ptr->num_palette || num > - (unsigned int) PNG_MAX_PALETTE_LENGTH) - { - png_warning(png_ptr, "Incorrect hIST chunk length"); - png_crc_finish(png_ptr, length); - 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 - -#if defined(PNG_READ_pHYs_SUPPORTED) -void /* PRIVATE */ -png_handle_pHYs(png_structp png_ptr, png_infop 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\n"); - - if (!(png_ptr->mode & PNG_HAVE_IHDR)) - png_error(png_ptr, "Missing IHDR before pHYs"); - else if (png_ptr->mode & PNG_HAVE_IDAT) - { - png_warning(png_ptr, "Invalid pHYs after IDAT"); - png_crc_finish(png_ptr, length); - return; - } - else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_pHYs)) - { - png_warning(png_ptr, "Duplicate pHYs chunk"); - png_crc_finish(png_ptr, length); - return; - } - - if (length != 9) - { - png_warning(png_ptr, "Incorrect pHYs chunk length"); - png_crc_finish(png_ptr, length); - 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 - -#if defined(PNG_READ_oFFs_SUPPORTED) -void /* PRIVATE */ -png_handle_oFFs(png_structp png_ptr, png_infop 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\n"); - - if (!(png_ptr->mode & PNG_HAVE_IHDR)) - png_error(png_ptr, "Missing IHDR before oFFs"); - else if (png_ptr->mode & PNG_HAVE_IDAT) - { - png_warning(png_ptr, "Invalid oFFs after IDAT"); - png_crc_finish(png_ptr, length); - return; - } - else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_oFFs)) - { - png_warning(png_ptr, "Duplicate oFFs chunk"); - png_crc_finish(png_ptr, length); - return; - } - - if (length != 9) - { - png_warning(png_ptr, "Incorrect oFFs chunk length"); - png_crc_finish(png_ptr, length); - 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 - -#if defined(PNG_READ_pCAL_SUPPORTED) -/* read the pCAL chunk (described in the PNG Extensions document) */ -void /* PRIVATE */ -png_handle_pCAL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) -{ - png_charp purpose; - png_int_32 X0, X1; - png_byte type, nparams; - png_charp buf, units, endptr; - png_charpp params; - png_size_t slength; - int i; - - png_debug(1, "in png_handle_pCAL\n"); - - if (!(png_ptr->mode & PNG_HAVE_IHDR)) - png_error(png_ptr, "Missing IHDR before pCAL"); - else if (png_ptr->mode & PNG_HAVE_IDAT) - { - png_warning(png_ptr, "Invalid pCAL after IDAT"); - png_crc_finish(png_ptr, length); - return; - } - else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_pCAL)) - { - png_warning(png_ptr, "Duplicate pCAL chunk"); - png_crc_finish(png_ptr, length); - return; - } - - png_debug1(2, "Allocating and reading pCAL chunk data (%lu bytes)\n", - length + 1); - purpose = (png_charp)png_malloc_warn(png_ptr, length + 1); - if (purpose == NULL) - { - png_warning(png_ptr, "No memory for pCAL purpose."); - return; - } - slength = (png_size_t)length; - png_crc_read(png_ptr, (png_bytep)purpose, slength); - - if (png_crc_finish(png_ptr, 0)) - { - png_free(png_ptr, purpose); - return; - } - - purpose[slength] = 0x00; /* null terminate the last string */ - - png_debug(3, "Finding end of pCAL purpose string\n"); - for (buf = purpose; *buf; buf++) - /* empty loop */ ; - - endptr = purpose + slength; - - /* We need to have at least 12 bytes after the purpose string - in order to get the parameter information. */ - if (endptr <= buf + 12) - { - png_warning(png_ptr, "Invalid pCAL data"); - png_free(png_ptr, purpose); - return; - } - - png_debug(3, "Reading pCAL X0, X1, type, nparams, and units\n"); - 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\n"); - /* 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_warning(png_ptr, "Invalid pCAL parameters for equation type"); - png_free(png_ptr, purpose); - return; - } - else if (type >= PNG_EQUATION_LAST) - { - png_warning(png_ptr, "Unrecognized equation type for pCAL chunk"); - } - - for (buf = units; *buf; buf++) - /* Empty loop to move past the units string. */ ; - - png_debug(3, "Allocating pCAL parameters array\n"); - params = (png_charpp)png_malloc_warn(png_ptr, (png_uint_32)(nparams - *png_sizeof(png_charp))) ; - if (params == NULL) - { - png_free(png_ptr, purpose); - png_warning(png_ptr, "No memory for pCAL params."); - return; - } - - /* Get pointers to the start of each parameter string. */ - for (i = 0; i < (int)nparams; i++) - { - buf++; /* Skip the null string terminator from previous parameter. */ - - png_debug1(3, "Reading pCAL parameter %d\n", i); - for (params[i] = buf; buf <= endptr && *buf != 0x00; buf++) - /* Empty loop to move past each parameter string */ ; - - /* Make sure we haven't run out of data yet */ - if (buf > endptr) - { - png_warning(png_ptr, "Invalid pCAL data"); - png_free(png_ptr, purpose); - png_free(png_ptr, params); - return; - } - } - - png_set_pCAL(png_ptr, info_ptr, purpose, X0, X1, type, nparams, - units, params); - - png_free(png_ptr, purpose); - png_free(png_ptr, params); -} -#endif - -#if defined(PNG_READ_sCAL_SUPPORTED) -/* read the sCAL chunk */ -void /* PRIVATE */ -png_handle_sCAL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) -{ - png_charp buffer, ep; -#ifdef PNG_FLOATING_POINT_SUPPORTED - double width, height; - png_charp vp; -#else -#ifdef PNG_FIXED_POINT_SUPPORTED - png_charp swidth, sheight; -#endif -#endif - png_size_t slength; - - png_debug(1, "in png_handle_sCAL\n"); - - if (!(png_ptr->mode & PNG_HAVE_IHDR)) - png_error(png_ptr, "Missing IHDR before sCAL"); - else if (png_ptr->mode & PNG_HAVE_IDAT) - { - png_warning(png_ptr, "Invalid sCAL after IDAT"); - png_crc_finish(png_ptr, length); - return; - } - else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_sCAL)) - { - png_warning(png_ptr, "Duplicate sCAL chunk"); - png_crc_finish(png_ptr, length); - return; - } - - png_debug1(2, "Allocating and reading sCAL chunk data (%lu bytes)\n", - length + 1); - buffer = (png_charp)png_malloc_warn(png_ptr, length + 1); - if (buffer == NULL) - { - png_warning(png_ptr, "Out of memory while processing sCAL chunk"); - return; - } - slength = (png_size_t)length; - png_crc_read(png_ptr, (png_bytep)buffer, slength); - - if (png_crc_finish(png_ptr, 0)) - { - png_free(png_ptr, buffer); - return; - } - - buffer[slength] = 0x00; /* null terminate the last string */ - - ep = buffer + 1; /* skip unit byte */ - -#ifdef PNG_FLOATING_POINT_SUPPORTED - width = png_strtod(png_ptr, ep, &vp); - if (*vp) - { - png_warning(png_ptr, "malformed width string in sCAL chunk"); - return; - } -#else -#ifdef PNG_FIXED_POINT_SUPPORTED - swidth = (png_charp)png_malloc_warn(png_ptr, png_strlen(ep) + 1); - if (swidth == NULL) - { - png_warning(png_ptr, "Out of memory while processing sCAL chunk width"); - return; - } - png_memcpy(swidth, ep, (png_size_t)png_strlen(ep)); -#endif -#endif - - for (ep = buffer; *ep; ep++) - /* empty loop */ ; - ep++; - - if (buffer + slength < ep) - { - png_warning(png_ptr, "Truncated sCAL chunk"); -#if defined(PNG_FIXED_POINT_SUPPORTED) && \ - !defined(PNG_FLOATING_POINT_SUPPORTED) - png_free(png_ptr, swidth); -#endif - png_free(png_ptr, buffer); - return; - } - -#ifdef PNG_FLOATING_POINT_SUPPORTED - height = png_strtod(png_ptr, ep, &vp); - if (*vp) - { - png_warning(png_ptr, "malformed height string in sCAL chunk"); - return; - } -#else -#ifdef PNG_FIXED_POINT_SUPPORTED - sheight = (png_charp)png_malloc_warn(png_ptr, png_strlen(ep) + 1); - if (swidth == NULL) - { - png_warning(png_ptr, "Out of memory while processing sCAL chunk height"); - return; - } - png_memcpy(sheight, ep, (png_size_t)png_strlen(ep)); -#endif -#endif - - if (buffer + slength < ep -#ifdef PNG_FLOATING_POINT_SUPPORTED - || width <= 0. || height <= 0. -#endif - ) - { - png_warning(png_ptr, "Invalid sCAL data"); - png_free(png_ptr, buffer); -#if defined(PNG_FIXED_POINT_SUPPORTED) && !defined(PNG_FLOATING_POINT_SUPPORTED) - png_free(png_ptr, swidth); - png_free(png_ptr, sheight); -#endif - return; - } - - -#ifdef PNG_FLOATING_POINT_SUPPORTED - png_set_sCAL(png_ptr, info_ptr, buffer[0], width, height); -#else -#ifdef PNG_FIXED_POINT_SUPPORTED - png_set_sCAL_s(png_ptr, info_ptr, buffer[0], swidth, sheight); -#endif -#endif - - png_free(png_ptr, buffer); -#if defined(PNG_FIXED_POINT_SUPPORTED) && !defined(PNG_FLOATING_POINT_SUPPORTED) - png_free(png_ptr, swidth); - png_free(png_ptr, sheight); -#endif -} -#endif - -#if defined(PNG_READ_tIME_SUPPORTED) -void /* PRIVATE */ -png_handle_tIME(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) -{ - png_byte buf[7]; - png_time mod_time; - - png_debug(1, "in png_handle_tIME\n"); - - if (!(png_ptr->mode & PNG_HAVE_IHDR)) - png_error(png_ptr, "Out of place tIME chunk"); - else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_tIME)) - { - png_warning(png_ptr, "Duplicate tIME chunk"); - png_crc_finish(png_ptr, length); - return; - } - - if (png_ptr->mode & PNG_HAVE_IDAT) - png_ptr->mode |= PNG_AFTER_IDAT; - - if (length != 7) - { - png_warning(png_ptr, "Incorrect tIME chunk length"); - png_crc_finish(png_ptr, length); - 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 - -#if defined(PNG_READ_tEXt_SUPPORTED) -/* Note: this does not properly handle chunks that are > 64K under DOS */ -void /* PRIVATE */ -png_handle_tEXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) -{ - png_textp text_ptr; - png_charp key; - png_charp text; - png_uint_32 skip = 0; - png_size_t slength; - int ret; - - png_debug(1, "in png_handle_tEXt\n"); - - if (!(png_ptr->mode & PNG_HAVE_IHDR)) - png_error(png_ptr, "Missing IHDR before tEXt"); - - if (png_ptr->mode & PNG_HAVE_IDAT) - png_ptr->mode |= PNG_AFTER_IDAT; - -#ifdef PNG_MAX_MALLOC_64K - if (length > (png_uint_32)65535L) - { - png_warning(png_ptr, "tEXt chunk too large to fit in memory"); - skip = length - (png_uint_32)65535L; - length = (png_uint_32)65535L; - } -#endif - - key = (png_charp)png_malloc_warn(png_ptr, length + 1); - if (key == NULL) - { - png_warning(png_ptr, "No memory to process text chunk."); - return; - } - slength = (png_size_t)length; - png_crc_read(png_ptr, (png_bytep)key, slength); - - if (png_crc_finish(png_ptr, skip)) - { - png_free(png_ptr, key); - return; - } - - key[slength] = 0x00; - - for (text = key; *text; text++) - /* empty loop to find end of key */ ; - - if (text != key + slength) - text++; - - text_ptr = (png_textp)png_malloc_warn(png_ptr, - (png_uint_32)png_sizeof(png_text)); - if (text_ptr == NULL) - { - png_warning(png_ptr, "Not enough memory to process text chunk."); - png_free(png_ptr, key); - return; - } - text_ptr->compression = PNG_TEXT_COMPRESSION_NONE; - text_ptr->key = key; -#ifdef PNG_iTXt_SUPPORTED - text_ptr->lang = NULL; - text_ptr->lang_key = NULL; - text_ptr->itxt_length = 0; -#endif - text_ptr->text = text; - text_ptr->text_length = png_strlen(text); - - ret=png_set_text_2(png_ptr, info_ptr, text_ptr, 1); - - png_free(png_ptr, key); - png_free(png_ptr, text_ptr); - if (ret) - png_warning(png_ptr, "Insufficient memory to process text chunk."); -} -#endif - -#if defined(PNG_READ_zTXt_SUPPORTED) -/* note: this does not correctly handle chunks that are > 64K under DOS */ -void /* PRIVATE */ -png_handle_zTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) -{ - png_textp text_ptr; - png_charp chunkdata; - png_charp text; - int comp_type; - int ret; - png_size_t slength, prefix_len, data_len; - - png_debug(1, "in png_handle_zTXt\n"); - if (!(png_ptr->mode & PNG_HAVE_IHDR)) - png_error(png_ptr, "Missing IHDR before zTXt"); - - if (png_ptr->mode & PNG_HAVE_IDAT) - png_ptr->mode |= PNG_AFTER_IDAT; - -#ifdef PNG_MAX_MALLOC_64K - /* We will no doubt have problems with chunks even half this size, but - there is no hard and fast rule to tell us where to stop. */ - if (length > (png_uint_32)65535L) - { - png_warning(png_ptr,"zTXt chunk too large to fit in memory"); - png_crc_finish(png_ptr, length); - return; - } -#endif - - chunkdata = (png_charp)png_malloc_warn(png_ptr, length + 1); - if (chunkdata == NULL) - { - png_warning(png_ptr,"Out of memory processing zTXt chunk."); - return; - } - slength = (png_size_t)length; - png_crc_read(png_ptr, (png_bytep)chunkdata, slength); - if (png_crc_finish(png_ptr, 0)) - { - png_free(png_ptr, chunkdata); - return; - } - - chunkdata[slength] = 0x00; - - for (text = chunkdata; *text; text++) - /* empty loop */ ; - - /* zTXt must have some text after the chunkdataword */ - if (text >= chunkdata + slength - 2) - { - png_warning(png_ptr, "Truncated zTXt chunk"); - png_free(png_ptr, chunkdata); - return; - } - else - { - comp_type = *(++text); - if (comp_type != PNG_TEXT_COMPRESSION_zTXt) - { - png_warning(png_ptr, "Unknown compression type in zTXt chunk"); - comp_type = PNG_TEXT_COMPRESSION_zTXt; - } - text++; /* skip the compression_method byte */ - } - prefix_len = text - chunkdata; - - chunkdata = (png_charp)png_decompress_chunk(png_ptr, comp_type, chunkdata, - (png_size_t)length, prefix_len, &data_len); - - text_ptr = (png_textp)png_malloc_warn(png_ptr, - (png_uint_32)png_sizeof(png_text)); - if (text_ptr == NULL) - { - png_warning(png_ptr,"Not enough memory to process zTXt chunk."); - png_free(png_ptr, chunkdata); - return; - } - text_ptr->compression = comp_type; - text_ptr->key = chunkdata; -#ifdef PNG_iTXt_SUPPORTED - text_ptr->lang = NULL; - text_ptr->lang_key = NULL; - text_ptr->itxt_length = 0; -#endif - text_ptr->text = chunkdata + prefix_len; - text_ptr->text_length = data_len; - - ret=png_set_text_2(png_ptr, info_ptr, text_ptr, 1); - - png_free(png_ptr, text_ptr); - png_free(png_ptr, chunkdata); - if (ret) - png_error(png_ptr, "Insufficient memory to store zTXt chunk."); -} -#endif - -#if defined(PNG_READ_iTXt_SUPPORTED) -/* note: this does not correctly handle chunks that are > 64K under DOS */ -void /* PRIVATE */ -png_handle_iTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) -{ - png_textp text_ptr; - png_charp chunkdata; - png_charp key, lang, text, lang_key; - int comp_flag; - int comp_type = 0; - int ret; - png_size_t slength, prefix_len, data_len; - - png_debug(1, "in png_handle_iTXt\n"); - - if (!(png_ptr->mode & PNG_HAVE_IHDR)) - png_error(png_ptr, "Missing IHDR before iTXt"); - - if (png_ptr->mode & PNG_HAVE_IDAT) - png_ptr->mode |= PNG_AFTER_IDAT; - -#ifdef PNG_MAX_MALLOC_64K - /* We will no doubt have problems with chunks even half this size, but - there is no hard and fast rule to tell us where to stop. */ - if (length > (png_uint_32)65535L) - { - png_warning(png_ptr,"iTXt chunk too large to fit in memory"); - png_crc_finish(png_ptr, length); - return; - } -#endif - - chunkdata = (png_charp)png_malloc_warn(png_ptr, length + 1); - if (chunkdata == NULL) - { - png_warning(png_ptr, "No memory to process iTXt chunk."); - return; - } - slength = (png_size_t)length; - png_crc_read(png_ptr, (png_bytep)chunkdata, slength); - if (png_crc_finish(png_ptr, 0)) - { - png_free(png_ptr, chunkdata); - return; - } - - chunkdata[slength] = 0x00; - - for (lang = chunkdata; *lang; lang++) - /* empty loop */ ; - lang++; /* skip NUL separator */ - - /* iTXt must have a language tag (possibly empty), two compression bytes, - translated keyword (possibly empty), and possibly some text after the - keyword */ - - if (lang >= chunkdata + slength - 3) - { - png_warning(png_ptr, "Truncated iTXt chunk"); - png_free(png_ptr, chunkdata); - return; - } - else - { - comp_flag = *lang++; - comp_type = *lang++; - } - - for (lang_key = lang; *lang_key; lang_key++) - /* empty loop */ ; - lang_key++; /* skip NUL separator */ - - if (lang_key >= chunkdata + slength) - { - png_warning(png_ptr, "Truncated iTXt chunk"); - png_free(png_ptr, chunkdata); - return; - } - - for (text = lang_key; *text; text++) - /* empty loop */ ; - text++; /* skip NUL separator */ - if (text >= chunkdata + slength) - { - png_warning(png_ptr, "Malformed iTXt chunk"); - png_free(png_ptr, chunkdata); - return; - } - - prefix_len = text - chunkdata; - - key=chunkdata; - if (comp_flag) - chunkdata = png_decompress_chunk(png_ptr, comp_type, chunkdata, - (size_t)length, prefix_len, &data_len); - else - data_len=png_strlen(chunkdata + prefix_len); - text_ptr = (png_textp)png_malloc_warn(png_ptr, - (png_uint_32)png_sizeof(png_text)); - if (text_ptr == NULL) - { - png_warning(png_ptr,"Not enough memory to process iTXt chunk."); - png_free(png_ptr, chunkdata); - return; - } - text_ptr->compression = (int)comp_flag + 1; - text_ptr->lang_key = chunkdata+(lang_key-key); - text_ptr->lang = chunkdata+(lang-key); - text_ptr->itxt_length = data_len; - text_ptr->text_length = 0; - text_ptr->key = chunkdata; - text_ptr->text = chunkdata + prefix_len; - - ret=png_set_text_2(png_ptr, info_ptr, text_ptr, 1); - - png_free(png_ptr, text_ptr); - png_free(png_ptr, chunkdata); - if (ret) - png_error(png_ptr, "Insufficient memory to store iTXt chunk."); -} -#endif - -/* This function is called when we haven't found a handler for a - chunk. If there isn't a problem with the chunk itself (ie bad - chunk name, CRC, or a critical chunk), the chunk is silently ignored - -- unless the PNG_FLAG_UNKNOWN_CHUNKS_SUPPORTED flag is on in which - case it will be saved away to be written out later. */ -void /* PRIVATE */ -png_handle_unknown(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) -{ - png_uint_32 skip = 0; - - png_debug(1, "in png_handle_unknown\n"); - - if (png_ptr->mode & PNG_HAVE_IDAT) - { -#ifdef PNG_USE_LOCAL_ARRAYS - PNG_CONST PNG_IDAT; -#endif - if (png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) /* not an IDAT */ - png_ptr->mode |= PNG_AFTER_IDAT; - } - - png_check_chunk_name(png_ptr, png_ptr->chunk_name); - - if (!(png_ptr->chunk_name[0] & 0x20)) - { -#if defined(PNG_READ_UNKNOWN_CHUNKS_SUPPORTED) - if(png_handle_as_unknown(png_ptr, png_ptr->chunk_name) != - PNG_HANDLE_CHUNK_ALWAYS -#if defined(PNG_READ_USER_CHUNKS_SUPPORTED) - && png_ptr->read_user_chunk_fn == NULL -#endif - ) -#endif - png_chunk_error(png_ptr, "unknown critical chunk"); - } - -#if defined(PNG_READ_UNKNOWN_CHUNKS_SUPPORTED) - if ((png_ptr->flags & PNG_FLAG_KEEP_UNKNOWN_CHUNKS) || - (png_ptr->read_user_chunk_fn != NULL)) - { -#ifdef PNG_MAX_MALLOC_64K - if (length > (png_uint_32)65535L) - { - png_warning(png_ptr, "unknown chunk too large to fit in memory"); - skip = length - (png_uint_32)65535L; - length = (png_uint_32)65535L; - } -#endif - png_strncpy((png_charp)png_ptr->unknown_chunk.name, - (png_charp)png_ptr->chunk_name, 5); - png_ptr->unknown_chunk.data = (png_bytep)png_malloc(png_ptr, length); - png_ptr->unknown_chunk.size = (png_size_t)length; - png_crc_read(png_ptr, (png_bytep)png_ptr->unknown_chunk.data, length); -#if defined(PNG_READ_USER_CHUNKS_SUPPORTED) - if(png_ptr->read_user_chunk_fn != NULL) - { - /* callback to user unknown chunk handler */ - int ret; - ret = (*(png_ptr->read_user_chunk_fn)) - (png_ptr, &png_ptr->unknown_chunk); - if (ret < 0) - png_chunk_error(png_ptr, "error in user chunk"); - if (ret == 0) - { - if (!(png_ptr->chunk_name[0] & 0x20)) - if(png_handle_as_unknown(png_ptr, png_ptr->chunk_name) != - PNG_HANDLE_CHUNK_ALWAYS) - png_chunk_error(png_ptr, "unknown critical chunk"); - png_set_unknown_chunks(png_ptr, info_ptr, - &png_ptr->unknown_chunk, 1); - } - } -#else - png_set_unknown_chunks(png_ptr, info_ptr, &png_ptr->unknown_chunk, 1); -#endif - png_free(png_ptr, png_ptr->unknown_chunk.data); - png_ptr->unknown_chunk.data = NULL; - } - else -#endif - skip = length; - - png_crc_finish(png_ptr, skip); - -#if !defined(PNG_READ_USER_CHUNKS_SUPPORTED) - info_ptr = info_ptr; /* quiet compiler warnings about unused info_ptr */ -#endif -} - -/* 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. */ - -#define isnonalpha(c) ((c) < 65 || (c) > 122 || ((c) > 90 && (c) < 97)) - -void /* PRIVATE */ -png_check_chunk_name(png_structp png_ptr, png_bytep chunk_name) -{ - png_debug(1, "in png_check_chunk_name\n"); - if (isnonalpha(chunk_name[0]) || isnonalpha(chunk_name[1]) || - isnonalpha(chunk_name[2]) || isnonalpha(chunk_name[3])) - { - png_chunk_error(png_ptr, "invalid chunk type"); - } -} - -/* 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 mask value. - The mask value describes which pixels are to be combined with - the row. The pattern always repeats every 8 pixels, so just 8 - bits are needed. A one indicates the pixel is to be combined, - a zero indicates the pixel is to be skipped. This is in addition - to any alpha or transparency value associated with the pixel. If - you want all pixels to be combined, pass 0xff (255) in mask. */ - -void /* PRIVATE */ -png_combine_row(png_structp png_ptr, png_bytep row, int mask) -{ - png_debug(1,"in png_combine_row\n"); - if (mask == 0xff) - { - png_memcpy(row, png_ptr->row_buf + 1, - PNG_ROWBYTES(png_ptr->row_info.pixel_depth, png_ptr->width)); - } - else - { - switch (png_ptr->row_info.pixel_depth) - { - case 1: - { - png_bytep sp = png_ptr->row_buf + 1; - png_bytep dp = row; - int s_inc, s_start, s_end; - int m = 0x80; - int shift; - png_uint_32 i; - png_uint_32 row_width = png_ptr->width; - -#if defined(PNG_READ_PACKSWAP_SUPPORTED) - if (png_ptr->transformations & PNG_PACKSWAP) - { - s_start = 0; - s_end = 7; - s_inc = 1; - } - else -#endif - { - s_start = 7; - s_end = 0; - s_inc = -1; - } - - shift = s_start; - - for (i = 0; i < row_width; i++) - { - if (m & mask) - { - int value; - - value = (*sp >> shift) & 0x01; - *dp &= (png_byte)((0x7f7f >> (7 - shift)) & 0xff); - *dp |= (png_byte)(value << shift); - } - - if (shift == s_end) - { - shift = s_start; - sp++; - dp++; - } - else - shift += s_inc; - - if (m == 1) - m = 0x80; - else - m >>= 1; - } - break; - } - case 2: - { - png_bytep sp = png_ptr->row_buf + 1; - png_bytep dp = row; - int s_start, s_end, s_inc; - int m = 0x80; - int shift; - png_uint_32 i; - png_uint_32 row_width = png_ptr->width; - int value; - -#if defined(PNG_READ_PACKSWAP_SUPPORTED) - if (png_ptr->transformations & PNG_PACKSWAP) - { - s_start = 0; - s_end = 6; - s_inc = 2; - } - else -#endif - { - s_start = 6; - s_end = 0; - s_inc = -2; - } - - shift = s_start; - - for (i = 0; i < row_width; i++) - { - if (m & mask) - { - value = (*sp >> shift) & 0x03; - *dp &= (png_byte)((0x3f3f >> (6 - shift)) & 0xff); - *dp |= (png_byte)(value << shift); - } - - if (shift == s_end) - { - shift = s_start; - sp++; - dp++; - } - else - shift += s_inc; - if (m == 1) - m = 0x80; - else - m >>= 1; - } - break; - } - case 4: - { - png_bytep sp = png_ptr->row_buf + 1; - png_bytep dp = row; - int s_start, s_end, s_inc; - int m = 0x80; - int shift; - png_uint_32 i; - png_uint_32 row_width = png_ptr->width; - int value; - -#if defined(PNG_READ_PACKSWAP_SUPPORTED) - if (png_ptr->transformations & PNG_PACKSWAP) - { - s_start = 0; - s_end = 4; - s_inc = 4; - } - else -#endif - { - s_start = 4; - s_end = 0; - s_inc = -4; - } - shift = s_start; - - for (i = 0; i < row_width; i++) - { - if (m & mask) - { - value = (*sp >> shift) & 0xf; - *dp &= (png_byte)((0xf0f >> (4 - shift)) & 0xff); - *dp |= (png_byte)(value << shift); - } - - if (shift == s_end) - { - shift = s_start; - sp++; - dp++; - } - else - shift += s_inc; - if (m == 1) - m = 0x80; - else - m >>= 1; - } - break; - } - default: - { - png_bytep sp = png_ptr->row_buf + 1; - png_bytep dp = row; - png_size_t pixel_bytes = (png_ptr->row_info.pixel_depth >> 3); - png_uint_32 i; - png_uint_32 row_width = png_ptr->width; - png_byte m = 0x80; - - - for (i = 0; i < row_width; i++) - { - if (m & mask) - { - png_memcpy(dp, sp, pixel_bytes); - } - - sp += pixel_bytes; - dp += pixel_bytes; - - if (m == 1) - m = 0x80; - else - m >>= 1; - } - break; - } - } - } -} - -#ifdef PNG_READ_INTERLACING_SUPPORTED -/* OLD pre-1.0.9 interface: -void png_do_read_interlace(png_row_infop row_info, png_bytep row, int pass, - png_uint_32 transformations) - */ -void /* PRIVATE */ -png_do_read_interlace(png_structp png_ptr) -{ - png_row_infop row_info = &(png_ptr->row_info); - png_bytep row = png_ptr->row_buf + 1; - int pass = png_ptr->pass; - png_uint_32 transformations = png_ptr->transformations; -#ifdef PNG_USE_LOCAL_ARRAYS - /* arrays to facilitate easy interlacing - use pass (0 - 6) as index */ - /* offset to next interlace block */ - PNG_CONST int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1}; -#endif - - png_debug(1,"in png_do_read_interlace\n"); - 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; - -#if defined(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++) - { - *dp &= (png_byte)((0x7f7f >> (7 - dshift)) & 0xff); - *dp |= (png_byte)(v << dshift); - 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; - -#if defined(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++) - { - *dp &= (png_byte)((0x3f3f >> (6 - dshift)) & 0xff); - *dp |= (png_byte)(v << dshift); - 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]; - -#if defined(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) & 0xf); - int j; - - for (j = 0; j < jstop; j++) - { - *dp &= (png_byte)((0xf0f >> (4 - dshift)) & 0xff); - *dp |= (png_byte)(v << dshift); - 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; - - png_memcpy(v, sp, pixel_bytes); - for (j = 0; j < jstop; j++) - { - png_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); - } -#if !defined(PNG_READ_PACKSWAP_SUPPORTED) - transformations = transformations; /* silence compiler warning */ -#endif -} -#endif /* PNG_READ_INTERLACING_SUPPORTED */ - -void /* PRIVATE */ -png_read_filter_row(png_structp, png_row_infop row_info, png_bytep row, - png_bytep prev_row, int filter) -{ - png_debug(1, "in png_read_filter_row\n"); - png_debug2(2,"row = %lu, filter = %d\n", png_ptr->row_number, filter); - switch (filter) - { - case PNG_FILTER_VALUE_NONE: - break; - case PNG_FILTER_VALUE_SUB: - { - png_uint_32 i; - png_uint_32 istop = row_info->rowbytes; - png_uint_32 bpp = (row_info->pixel_depth + 7) >> 3; - png_bytep rp = row + bpp; - png_bytep lp = row; - - for (i = bpp; i < istop; i++) - { - *rp = (png_byte)(((int)(*rp) + (int)(*lp++)) & 0xff); - rp++; - } - break; - } - case PNG_FILTER_VALUE_UP: - { - png_uint_32 i; - png_uint_32 istop = row_info->rowbytes; - png_bytep rp = row; - png_bytep pp = prev_row; - - for (i = 0; i < istop; i++) - { - *rp = (png_byte)(((int)(*rp) + (int)(*pp++)) & 0xff); - rp++; - } - break; - } - case PNG_FILTER_VALUE_AVG: - { - png_uint_32 i; - png_bytep rp = row; - png_bytep pp = prev_row; - png_bytep lp = row; - png_uint_32 bpp = (row_info->pixel_depth + 7) >> 3; - png_uint_32 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++ + *lp++) / 2 ) & 0xff); - rp++; - } - break; - } - case PNG_FILTER_VALUE_PAETH: - { - png_uint_32 i; - png_bytep rp = row; - png_bytep pp = prev_row; - png_bytep lp = row; - png_bytep cp = prev_row; - png_uint_32 bpp = (row_info->pixel_depth + 7) >> 3; - png_uint_32 istop=row_info->rowbytes - bpp; - - for (i = 0; i < bpp; i++) - { - *rp = (png_byte)(((int)(*rp) + (int)(*pp++)) & 0xff); - rp++; - } - - for (i = 0; i < istop; i++) /* use leftover rp,pp */ - { - int a, b, c, pa, pb, pc, p; - - a = *lp++; - b = *pp++; - c = *cp++; - - 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 (pa <= pb && pa <= pc) - p = a; - else if (pb <= pc) - p = b; - else - p = c; - */ - - p = (pa <= pb && pa <=pc) ? a : (pb <= pc) ? b : c; - - *rp = (png_byte)(((int)(*rp) + p) & 0xff); - rp++; - } - break; - } - default: - png_warning(png_ptr, "Ignoring bad adaptive filter type"); - *row=0; - break; - } -} - -void /* PRIVATE */ -png_read_finish_row(png_structp png_ptr) -{ -#ifdef PNG_USE_LOCAL_ARRAYS - /* arrays to facilitate easy interlacing - use pass (0 - 6) as index */ - - /* start of interlace block */ - PNG_CONST int png_pass_start[7] = {0, 4, 0, 2, 0, 1, 0}; - - /* offset to next interlace block */ - PNG_CONST int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1}; - - /* start of interlace block in the y direction */ - PNG_CONST int png_pass_ystart[7] = {0, 0, 4, 0, 2, 0, 1}; - - /* offset to next interlace block in the y direction */ - PNG_CONST int png_pass_yinc[7] = {8, 8, 8, 4, 4, 2, 2}; -#endif - - png_debug(1, "in png_read_finish_row\n"); - png_ptr->row_number++; - if (png_ptr->row_number < png_ptr->num_rows) - return; - - if (png_ptr->interlaced) - { - png_ptr->row_number = 0; - png_memset_check(png_ptr, 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]; - - png_ptr->irowbytes = PNG_ROWBYTES(png_ptr->pixel_depth, - png_ptr->iwidth) + 1; - - 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]; - if (!(png_ptr->num_rows)) - continue; - } - else /* if (png_ptr->transformations & PNG_INTERLACE) */ - break; - } while (png_ptr->iwidth == 0); - - if (png_ptr->pass < 7) - return; - } - - if (!(png_ptr->flags & PNG_FLAG_ZLIB_FINISHED)) - { -#ifdef PNG_USE_LOCAL_ARRAYS - PNG_CONST PNG_IDAT; -#endif - char extra; - int ret; - - png_ptr->zstream.next_out = (Bytef *)&extra; - png_ptr->zstream.avail_out = (uInt)1; - for(;;) - { - if (!(png_ptr->zstream.avail_in)) - { - while (!png_ptr->idat_size) - { - png_byte chunk_length[4]; - - png_crc_finish(png_ptr, 0); - - png_read_data(png_ptr, chunk_length, 4); - png_ptr->idat_size = png_get_uint_31(png_ptr, chunk_length); - png_reset_crc(png_ptr); - png_crc_read(png_ptr, png_ptr->chunk_name, 4); - if (png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) - png_error(png_ptr, "Not enough image data"); - - } - png_ptr->zstream.avail_in = (uInt)png_ptr->zbuf_size; - png_ptr->zstream.next_in = png_ptr->zbuf; - if (png_ptr->zbuf_size > png_ptr->idat_size) - png_ptr->zstream.avail_in = (uInt)png_ptr->idat_size; - png_crc_read(png_ptr, png_ptr->zbuf, png_ptr->zstream.avail_in); - png_ptr->idat_size -= png_ptr->zstream.avail_in; - } - ret = inflate(&png_ptr->zstream, Z_PARTIAL_FLUSH); - if (ret == Z_STREAM_END) - { - if (!(png_ptr->zstream.avail_out) || png_ptr->zstream.avail_in || - png_ptr->idat_size) - png_warning(png_ptr, "Extra compressed data"); - png_ptr->mode |= PNG_AFTER_IDAT; - png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED; - break; - } - if (ret != Z_OK) - png_error(png_ptr, png_ptr->zstream.msg ? png_ptr->zstream.msg : - "Decompression Error"); - - if (!(png_ptr->zstream.avail_out)) - { - png_warning(png_ptr, "Extra compressed data."); - png_ptr->mode |= PNG_AFTER_IDAT; - png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED; - break; - } - - } - png_ptr->zstream.avail_out = 0; - } - - if (png_ptr->idat_size || png_ptr->zstream.avail_in) - png_warning(png_ptr, "Extra compression data"); - - inflateReset(&png_ptr->zstream); - - png_ptr->mode |= PNG_AFTER_IDAT; -} - -void /* PRIVATE */ -png_read_start_row(png_structp png_ptr) -{ -#ifdef PNG_USE_LOCAL_ARRAYS - /* arrays to facilitate easy interlacing - use pass (0 - 6) as index */ - - /* start of interlace block */ - PNG_CONST int png_pass_start[7] = {0, 4, 0, 2, 0, 1, 0}; - - /* offset to next interlace block */ - PNG_CONST int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1}; - - /* start of interlace block in the y direction */ - PNG_CONST int png_pass_ystart[7] = {0, 0, 4, 0, 2, 0, 1}; - - /* offset to next interlace block in the y direction */ - PNG_CONST int png_pass_yinc[7] = {8, 8, 8, 4, 4, 2, 2}; -#endif - - int max_pixel_depth; - png_uint_32 row_bytes; - - png_debug(1, "in png_read_start_row\n"); - png_ptr->zstream.avail_in = 0; - png_init_read_transformations(png_ptr); - 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]; - - row_bytes = PNG_ROWBYTES(png_ptr->pixel_depth,png_ptr->iwidth) + 1; - - png_ptr->irowbytes = (png_size_t)row_bytes; - if((png_uint_32)png_ptr->irowbytes != row_bytes) - png_error(png_ptr, "Rowbytes overflow in png_read_start_row"); - } - else - { - png_ptr->num_rows = png_ptr->height; - png_ptr->iwidth = png_ptr->width; - png_ptr->irowbytes = png_ptr->rowbytes + 1; - } - max_pixel_depth = png_ptr->pixel_depth; - -#if defined(PNG_READ_PACK_SUPPORTED) - if ((png_ptr->transformations & PNG_PACK) && png_ptr->bit_depth < 8) - max_pixel_depth = 8; -#endif - -#if defined(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 - -#if defined(PNG_READ_FILLER_SUPPORTED) - if (png_ptr->transformations & (PNG_FILLER)) - { - if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) - max_pixel_depth = 32; - else 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) - { - if (max_pixel_depth <= 32) - max_pixel_depth = 32; - else - max_pixel_depth = 64; - } - } -#endif - -#if defined(PNG_READ_GRAY_TO_RGB_SUPPORTED) - if (png_ptr->transformations & PNG_GRAY_TO_RGB) - { - if ( -#if defined(PNG_READ_EXPAND_SUPPORTED) - (png_ptr->num_trans && (png_ptr->transformations & PNG_EXPAND)) || -#endif -#if defined(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 - - /* 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 - png_ptr->big_row_buf = (png_bytep)png_malloc(png_ptr, row_bytes+64); - png_ptr->row_buf = png_ptr->big_row_buf+32; - -#ifdef PNG_MAX_MALLOC_64K - if ((png_uint_32)png_ptr->rowbytes + 1 > (png_uint_32)65536L) - png_error(png_ptr, "This image requires a row greater than 64KB"); -#endif - if ((png_uint_32)png_ptr->rowbytes > (png_uint_32) -2) - png_error(png_ptr, "Row has too many bytes to allocate in memory."); - png_ptr->prev_row = (png_bytep)png_malloc(png_ptr, (png_uint_32)( - png_ptr->rowbytes + 1)); - - png_memset_check(png_ptr, png_ptr->prev_row, 0, png_ptr->rowbytes + 1); - - png_debug1(3, "width = %lu,\n", png_ptr->width); - png_debug1(3, "height = %lu,\n", png_ptr->height); - png_debug1(3, "iwidth = %lu,\n", png_ptr->iwidth); - png_debug1(3, "num_rows = %lu\n", png_ptr->num_rows); - png_debug1(3, "rowbytes = %lu,\n", png_ptr->rowbytes); - png_debug1(3, "irowbytes = %lu,\n", png_ptr->irowbytes); - - png_ptr->flags |= PNG_FLAG_ROW_INIT; -} -#endif /* PNG_READ_SUPPORTED */ diff --git a/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngset.c b/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngset.c deleted file mode 100644 index 2480a161..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngset.c +++ /dev/null @@ -1,1243 +0,0 @@ - -/* pngset.c - storage of image information into info struct - * - * Last changed in libpng 1.2.21 [October 4, 2007] - * For conditions of distribution and use, see copyright notice in png.h - * Copyright (c) 1998-2007 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.) - * - * 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. - */ - -#define PNG_INTERNAL -#include "png.h" - -#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) - -#if defined(PNG_bKGD_SUPPORTED) -void PNGAPI -png_set_bKGD(png_structp png_ptr, png_infop info_ptr, png_color_16p background) -{ - png_debug1(1, "in %s storage function\n", "bKGD"); - if (png_ptr == NULL || info_ptr == NULL) - return; - - png_memcpy(&(info_ptr->background), background, png_sizeof(png_color_16)); - info_ptr->valid |= PNG_INFO_bKGD; -} -#endif - -#if defined(PNG_cHRM_SUPPORTED) -#ifdef PNG_FLOATING_POINT_SUPPORTED -void PNGAPI -png_set_cHRM(png_structp png_ptr, png_infop 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_debug1(1, "in %s storage function\n", "cHRM"); - if (png_ptr == NULL || info_ptr == NULL) - return; - - if (white_x < 0.0 || white_y < 0.0 || - red_x < 0.0 || red_y < 0.0 || - green_x < 0.0 || green_y < 0.0 || - blue_x < 0.0 || blue_y < 0.0) - { - png_warning(png_ptr, - "Ignoring attempt to set negative chromaticity value"); - return; - } - if (white_x > 21474.83 || white_y > 21474.83 || - red_x > 21474.83 || red_y > 21474.83 || - green_x > 21474.83 || green_y > 21474.83 || - blue_x > 21474.83 || blue_y > 21474.83) - { - png_warning(png_ptr, - "Ignoring attempt to set chromaticity value exceeding 21474.83"); - return; - } - - info_ptr->x_white = (float)white_x; - info_ptr->y_white = (float)white_y; - info_ptr->x_red = (float)red_x; - info_ptr->y_red = (float)red_y; - info_ptr->x_green = (float)green_x; - info_ptr->y_green = (float)green_y; - info_ptr->x_blue = (float)blue_x; - info_ptr->y_blue = (float)blue_y; -#ifdef PNG_FIXED_POINT_SUPPORTED - info_ptr->int_x_white = (png_fixed_point)(white_x*100000.+0.5); - info_ptr->int_y_white = (png_fixed_point)(white_y*100000.+0.5); - info_ptr->int_x_red = (png_fixed_point)( red_x*100000.+0.5); - info_ptr->int_y_red = (png_fixed_point)( red_y*100000.+0.5); - info_ptr->int_x_green = (png_fixed_point)(green_x*100000.+0.5); - info_ptr->int_y_green = (png_fixed_point)(green_y*100000.+0.5); - info_ptr->int_x_blue = (png_fixed_point)( blue_x*100000.+0.5); - info_ptr->int_y_blue = (png_fixed_point)( blue_y*100000.+0.5); -#endif - info_ptr->valid |= PNG_INFO_cHRM; -} -#endif -#ifdef PNG_FIXED_POINT_SUPPORTED -void PNGAPI -png_set_cHRM_fixed(png_structp png_ptr, png_infop 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 storage function\n", "cHRM"); - if (png_ptr == NULL || info_ptr == NULL) - return; - - if (white_x < 0 || white_y < 0 || - red_x < 0 || red_y < 0 || - green_x < 0 || green_y < 0 || - blue_x < 0 || blue_y < 0) - { - png_warning(png_ptr, - "Ignoring attempt to set negative chromaticity value"); - return; - } -#ifdef PNG_FLOATING_POINT_SUPPORTED - if (white_x > (double) PNG_UINT_31_MAX || - white_y > (double) PNG_UINT_31_MAX || - red_x > (double) PNG_UINT_31_MAX || - red_y > (double) PNG_UINT_31_MAX || - green_x > (double) PNG_UINT_31_MAX || - green_y > (double) PNG_UINT_31_MAX || - blue_x > (double) PNG_UINT_31_MAX || - blue_y > (double) PNG_UINT_31_MAX) -#else - if (white_x > (png_fixed_point) PNG_UINT_31_MAX/100000L || - white_y > (png_fixed_point) PNG_UINT_31_MAX/100000L || - red_x > (png_fixed_point) PNG_UINT_31_MAX/100000L || - red_y > (png_fixed_point) PNG_UINT_31_MAX/100000L || - green_x > (png_fixed_point) PNG_UINT_31_MAX/100000L || - green_y > (png_fixed_point) PNG_UINT_31_MAX/100000L || - blue_x > (png_fixed_point) PNG_UINT_31_MAX/100000L || - blue_y > (png_fixed_point) PNG_UINT_31_MAX/100000L) -#endif - { - png_warning(png_ptr, - "Ignoring attempt to set chromaticity value exceeding 21474.83"); - return; - } - info_ptr->int_x_white = white_x; - info_ptr->int_y_white = white_y; - info_ptr->int_x_red = red_x; - info_ptr->int_y_red = red_y; - info_ptr->int_x_green = green_x; - info_ptr->int_y_green = green_y; - info_ptr->int_x_blue = blue_x; - info_ptr->int_y_blue = blue_y; -#ifdef PNG_FLOATING_POINT_SUPPORTED - info_ptr->x_white = (float)(white_x/100000.); - info_ptr->y_white = (float)(white_y/100000.); - info_ptr->x_red = (float)( red_x/100000.); - info_ptr->y_red = (float)( red_y/100000.); - info_ptr->x_green = (float)(green_x/100000.); - info_ptr->y_green = (float)(green_y/100000.); - info_ptr->x_blue = (float)( blue_x/100000.); - info_ptr->y_blue = (float)( blue_y/100000.); -#endif - info_ptr->valid |= PNG_INFO_cHRM; -} -#endif -#endif - -#if defined(PNG_gAMA_SUPPORTED) -#ifdef PNG_FLOATING_POINT_SUPPORTED -void PNGAPI -png_set_gAMA(png_structp png_ptr, png_infop info_ptr, double file_gamma) -{ - double gamma; - png_debug1(1, "in %s storage function\n", "gAMA"); - if (png_ptr == NULL || info_ptr == NULL) - return; - - /* Check for overflow */ - if (file_gamma > 21474.83) - { - png_warning(png_ptr, "Limiting gamma to 21474.83"); - gamma=21474.83; - } - else - gamma=file_gamma; - info_ptr->gamma = (float)gamma; -#ifdef PNG_FIXED_POINT_SUPPORTED - info_ptr->int_gamma = (int)(gamma*100000.+.5); -#endif - info_ptr->valid |= PNG_INFO_gAMA; - if(gamma == 0.0) - png_warning(png_ptr, "Setting gamma=0"); -} -#endif -void PNGAPI -png_set_gAMA_fixed(png_structp png_ptr, png_infop info_ptr, png_fixed_point - int_gamma) -{ - png_fixed_point gamma; - - png_debug1(1, "in %s storage function\n", "gAMA"); - if (png_ptr == NULL || info_ptr == NULL) - return; - - if (int_gamma > (png_fixed_point) PNG_UINT_31_MAX) - { - png_warning(png_ptr, "Limiting gamma to 21474.83"); - gamma=PNG_UINT_31_MAX; - } - else - { - if (int_gamma < 0) - { - png_warning(png_ptr, "Setting negative gamma to zero"); - gamma=0; - } - else - gamma=int_gamma; - } -#ifdef PNG_FLOATING_POINT_SUPPORTED - info_ptr->gamma = (float)(gamma/100000.); -#endif -#ifdef PNG_FIXED_POINT_SUPPORTED - info_ptr->int_gamma = gamma; -#endif - info_ptr->valid |= PNG_INFO_gAMA; - if(gamma == 0) - png_warning(png_ptr, "Setting gamma=0"); -} -#endif - -#if defined(PNG_hIST_SUPPORTED) -void PNGAPI -png_set_hIST(png_structp png_ptr, png_infop info_ptr, png_uint_16p hist) -{ - int i; - - png_debug1(1, "in %s storage function\n", "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; - } - -#ifdef PNG_FREE_ME_SUPPORTED - png_free_data(png_ptr, info_ptr, PNG_FREE_HIST, 0); -#endif - /* Changed from info->num_palette to PNG_MAX_PALETTE_LENGTH in version - 1.2.1 */ - png_ptr->hist = (png_uint_16p)png_malloc_warn(png_ptr, - (png_uint_32)(PNG_MAX_PALETTE_LENGTH * png_sizeof (png_uint_16))); - if (png_ptr->hist == NULL) - { - png_warning(png_ptr, "Insufficient memory for hIST chunk data."); - return; - } - - for (i = 0; i < info_ptr->num_palette; i++) - png_ptr->hist[i] = hist[i]; - info_ptr->hist = png_ptr->hist; - info_ptr->valid |= PNG_INFO_hIST; - -#ifdef PNG_FREE_ME_SUPPORTED - info_ptr->free_me |= PNG_FREE_HIST; -#else - png_ptr->flags |= PNG_FLAG_FREE_HIST; -#endif -} -#endif - -void PNGAPI -png_set_IHDR(png_structp png_ptr, png_infop info_ptr, - png_uint_32 width, png_uint_32 height, int bit_depth, - int color_type, int interlace_type, int compression_type, - int filter_type) -{ - png_debug1(1, "in %s storage function\n", "IHDR"); - if (png_ptr == NULL || info_ptr == NULL) - return; - - /* check for width and height valid values */ - if (width == 0 || height == 0) - png_error(png_ptr, "Image width or height is zero in IHDR"); -#ifdef PNG_SET_USER_LIMITS_SUPPORTED - if (width > png_ptr->user_width_max || height > png_ptr->user_height_max) - png_error(png_ptr, "image size exceeds user limits in IHDR"); -#else - if (width > PNG_USER_WIDTH_MAX || height > PNG_USER_HEIGHT_MAX) - png_error(png_ptr, "image size exceeds user limits in IHDR"); -#endif - if (width > PNG_UINT_31_MAX || height > PNG_UINT_31_MAX) - png_error(png_ptr, "Invalid image size in IHDR"); - if ( width > (PNG_UINT_32_MAX - >> 3) /* 8-byte RGBA pixels */ - - 64 /* 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_error(png_ptr, "Invalid bit depth in IHDR"); - - if (color_type < 0 || color_type == 1 || - color_type == 5 || color_type > 6) - png_error(png_ptr, "Invalid color type in IHDR"); - - 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_error(png_ptr, "Invalid color type/bit depth combination in IHDR"); - - if (interlace_type >= PNG_INTERLACE_LAST) - png_error(png_ptr, "Unknown interlace method in IHDR"); - - if (compression_type != PNG_COMPRESSION_TYPE_BASE) - png_error(png_ptr, "Unknown compression method in IHDR"); - -#if defined(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_error(png_ptr, "Unknown filter method in IHDR"); - if(png_ptr->mode&PNG_HAVE_PNG_SIGNATURE) - png_warning(png_ptr, "Invalid filter method in IHDR"); - } -#else - if(filter_type != PNG_FILTER_TYPE_BASE) - png_error(png_ptr, "Unknown filter method in IHDR"); -#endif - - 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; - 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 RGBA pixels */ - - 64 /* bigrowbuf hack */ - - 1 /* filter byte */ - - 7*8 /* rounding of width to multiple of 8 pixels */ - - 8) /* extra max_pixel_depth pad */ - info_ptr->rowbytes = (png_size_t)0; - else - info_ptr->rowbytes = PNG_ROWBYTES(info_ptr->pixel_depth,width); -} - -#if defined(PNG_oFFs_SUPPORTED) -void PNGAPI -png_set_oFFs(png_structp png_ptr, png_infop info_ptr, - png_int_32 offset_x, png_int_32 offset_y, int unit_type) -{ - png_debug1(1, "in %s storage function\n", "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 - -#if defined(PNG_pCAL_SUPPORTED) -void PNGAPI -png_set_pCAL(png_structp png_ptr, png_infop info_ptr, - png_charp purpose, png_int_32 X0, png_int_32 X1, int type, int nparams, - png_charp units, png_charpp params) -{ - png_uint_32 length; - int i; - - png_debug1(1, "in %s storage function\n", "pCAL"); - if (png_ptr == NULL || info_ptr == NULL) - return; - - length = png_strlen(purpose) + 1; - png_debug1(3, "allocating purpose for info (%lu bytes)\n", length); - info_ptr->pcal_purpose = (png_charp)png_malloc_warn(png_ptr, length); - if (info_ptr->pcal_purpose == NULL) - { - png_warning(png_ptr, "Insufficient memory for pCAL purpose."); - return; - } - png_memcpy(info_ptr->pcal_purpose, purpose, (png_size_t)length); - - png_debug(3, "storing X0, X1, type, and nparams in info\n"); - 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 = png_strlen(units) + 1; - png_debug1(3, "allocating units for info (%lu bytes)\n", length); - info_ptr->pcal_units = (png_charp)png_malloc_warn(png_ptr, length); - if (info_ptr->pcal_units == NULL) - { - png_warning(png_ptr, "Insufficient memory for pCAL units."); - return; - } - png_memcpy(info_ptr->pcal_units, units, (png_size_t)length); - - info_ptr->pcal_params = (png_charpp)png_malloc_warn(png_ptr, - (png_uint_32)((nparams + 1) * png_sizeof(png_charp))); - if (info_ptr->pcal_params == NULL) - { - png_warning(png_ptr, "Insufficient memory for pCAL params."); - return; - } - - info_ptr->pcal_params[nparams] = NULL; - - for (i = 0; i < nparams; i++) - { - length = png_strlen(params[i]) + 1; - png_debug2(3, "allocating parameter %d for info (%lu bytes)\n", i, 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; - } - png_memcpy(info_ptr->pcal_params[i], params[i], (png_size_t)length); - } - - info_ptr->valid |= PNG_INFO_pCAL; -#ifdef PNG_FREE_ME_SUPPORTED - info_ptr->free_me |= PNG_FREE_PCAL; -#endif -} -#endif - -#if defined(PNG_READ_sCAL_SUPPORTED) || defined(PNG_WRITE_sCAL_SUPPORTED) -#ifdef PNG_FLOATING_POINT_SUPPORTED -void PNGAPI -png_set_sCAL(png_structp png_ptr, png_infop info_ptr, - int unit, double width, double height) -{ - png_debug1(1, "in %s storage function\n", "sCAL"); - if (png_ptr == NULL || info_ptr == NULL) - return; - - info_ptr->scal_unit = (png_byte)unit; - info_ptr->scal_pixel_width = width; - info_ptr->scal_pixel_height = height; - - info_ptr->valid |= PNG_INFO_sCAL; -} -#else -#ifdef PNG_FIXED_POINT_SUPPORTED -void PNGAPI -png_set_sCAL_s(png_structp png_ptr, png_infop info_ptr, - int unit, png_charp swidth, png_charp sheight) -{ - png_uint_32 length; - - png_debug1(1, "in %s storage function\n", "sCAL"); - if (png_ptr == NULL || info_ptr == NULL) - return; - - info_ptr->scal_unit = (png_byte)unit; - - length = png_strlen(swidth) + 1; - png_debug1(3, "allocating unit for info (%d bytes)\n", length); - info_ptr->scal_s_width = (png_charp)png_malloc_warn(png_ptr, length); - if (info_ptr->scal_s_width == NULL) - { - png_warning(png_ptr, - "Memory allocation failed while processing sCAL."); - } - png_memcpy(info_ptr->scal_s_width, swidth, (png_size_t)length); - - length = png_strlen(sheight) + 1; - png_debug1(3, "allocating unit for info (%d bytes)\n", length); - info_ptr->scal_s_height = (png_charp)png_malloc_warn(png_ptr, length); - if (info_ptr->scal_s_height == NULL) - { - png_free (png_ptr, info_ptr->scal_s_width); - png_warning(png_ptr, - "Memory allocation failed while processing sCAL."); - } - png_memcpy(info_ptr->scal_s_height, sheight, (png_size_t)length); - - info_ptr->valid |= PNG_INFO_sCAL; -#ifdef PNG_FREE_ME_SUPPORTED - info_ptr->free_me |= PNG_FREE_SCAL; -#endif -} -#endif -#endif -#endif - -#if defined(PNG_pHYs_SUPPORTED) -void PNGAPI -png_set_pHYs(png_structp png_ptr, png_infop info_ptr, - png_uint_32 res_x, png_uint_32 res_y, int unit_type) -{ - png_debug1(1, "in %s storage function\n", "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_structp png_ptr, png_infop info_ptr, - png_colorp palette, int num_palette) -{ - - png_debug1(1, "in %s storage function\n", "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; - } - } - - /* - * 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. - */ -#ifdef PNG_FREE_ME_SUPPORTED - png_free_data(png_ptr, info_ptr, PNG_FREE_PLTE, 0); -#endif - - /* 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_colorp)png_malloc(png_ptr, - PNG_MAX_PALETTE_LENGTH * png_sizeof(png_color)); - png_memset(png_ptr->palette, 0, PNG_MAX_PALETTE_LENGTH * - png_sizeof(png_color)); - png_memcpy(png_ptr->palette, palette, num_palette * png_sizeof (png_color)); - info_ptr->palette = png_ptr->palette; - info_ptr->num_palette = png_ptr->num_palette = (png_uint_16)num_palette; - -#ifdef PNG_FREE_ME_SUPPORTED - info_ptr->free_me |= PNG_FREE_PLTE; -#else - png_ptr->flags |= PNG_FLAG_FREE_PLTE; -#endif - - info_ptr->valid |= PNG_INFO_PLTE; -} - -#if defined(PNG_sBIT_SUPPORTED) -void PNGAPI -png_set_sBIT(png_structp png_ptr, png_infop info_ptr, - png_color_8p sig_bit) -{ - png_debug1(1, "in %s storage function\n", "sBIT"); - if (png_ptr == NULL || info_ptr == NULL) - return; - - png_memcpy(&(info_ptr->sig_bit), sig_bit, png_sizeof (png_color_8)); - info_ptr->valid |= PNG_INFO_sBIT; -} -#endif - -#if defined(PNG_sRGB_SUPPORTED) -void PNGAPI -png_set_sRGB(png_structp png_ptr, png_infop info_ptr, int intent) -{ - png_debug1(1, "in %s storage function\n", "sRGB"); - if (png_ptr == NULL || info_ptr == NULL) - return; - - info_ptr->srgb_intent = (png_byte)intent; - info_ptr->valid |= PNG_INFO_sRGB; -} - -void PNGAPI -png_set_sRGB_gAMA_and_cHRM(png_structp png_ptr, png_infop info_ptr, - int intent) -{ -#if defined(PNG_gAMA_SUPPORTED) -#ifdef PNG_FLOATING_POINT_SUPPORTED - float file_gamma; -#endif -#ifdef PNG_FIXED_POINT_SUPPORTED - png_fixed_point int_file_gamma; -#endif -#endif -#if defined(PNG_cHRM_SUPPORTED) -#ifdef PNG_FLOATING_POINT_SUPPORTED - float white_x, white_y, red_x, red_y, green_x, green_y, blue_x, blue_y; -#endif -#ifdef PNG_FIXED_POINT_SUPPORTED - png_fixed_point int_white_x, int_white_y, int_red_x, int_red_y, int_green_x, - int_green_y, int_blue_x, int_blue_y; -#endif -#endif - png_debug1(1, "in %s storage function\n", "sRGB_gAMA_and_cHRM"); - if (png_ptr == NULL || info_ptr == NULL) - return; - - png_set_sRGB(png_ptr, info_ptr, intent); - -#if defined(PNG_gAMA_SUPPORTED) -#ifdef PNG_FLOATING_POINT_SUPPORTED - file_gamma = (float).45455; - png_set_gAMA(png_ptr, info_ptr, file_gamma); -#endif -#ifdef PNG_FIXED_POINT_SUPPORTED - int_file_gamma = 45455L; - png_set_gAMA_fixed(png_ptr, info_ptr, int_file_gamma); -#endif -#endif - -#if defined(PNG_cHRM_SUPPORTED) -#ifdef PNG_FIXED_POINT_SUPPORTED - int_white_x = 31270L; - int_white_y = 32900L; - int_red_x = 64000L; - int_red_y = 33000L; - int_green_x = 30000L; - int_green_y = 60000L; - int_blue_x = 15000L; - int_blue_y = 6000L; - - png_set_cHRM_fixed(png_ptr, info_ptr, - int_white_x, int_white_y, int_red_x, int_red_y, int_green_x, int_green_y, - int_blue_x, int_blue_y); -#endif -#ifdef PNG_FLOATING_POINT_SUPPORTED - white_x = (float).3127; - white_y = (float).3290; - red_x = (float).64; - red_y = (float).33; - green_x = (float).30; - green_y = (float).60; - blue_x = (float).15; - blue_y = (float).06; - - png_set_cHRM(png_ptr, info_ptr, - white_x, white_y, red_x, red_y, green_x, green_y, blue_x, blue_y); -#endif -#endif -} -#endif - - -#if defined(PNG_iCCP_SUPPORTED) -void PNGAPI -png_set_iCCP(png_structp png_ptr, png_infop info_ptr, - png_charp name, int compression_type, - png_charp profile, png_uint_32 proflen) -{ - png_charp new_iccp_name; - png_charp new_iccp_profile; - - png_debug1(1, "in %s storage function\n", "iCCP"); - if (png_ptr == NULL || info_ptr == NULL || name == NULL || profile == NULL) - return; - - new_iccp_name = (png_charp)png_malloc_warn(png_ptr, png_strlen(name)+1); - if (new_iccp_name == NULL) - { - png_warning(png_ptr, "Insufficient memory to process iCCP chunk."); - return; - } - png_strncpy(new_iccp_name, name, png_strlen(name)+1); - new_iccp_profile = (png_charp)png_malloc_warn(png_ptr, proflen); - if (new_iccp_profile == NULL) - { - png_free (png_ptr, new_iccp_name); - png_warning(png_ptr, "Insufficient memory to process iCCP profile."); - return; - } - png_memcpy(new_iccp_profile, profile, (png_size_t)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; - /* Compression is always zero but is here so the API and info structure - * does not have to change if we introduce multiple compression types */ - info_ptr->iccp_compression = (png_byte)compression_type; -#ifdef PNG_FREE_ME_SUPPORTED - info_ptr->free_me |= PNG_FREE_ICCP; -#endif - info_ptr->valid |= PNG_INFO_iCCP; -} -#endif - -#if defined(PNG_TEXT_SUPPORTED) -void PNGAPI -png_set_text(png_structp png_ptr, png_infop info_ptr, png_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_structp png_ptr, png_infop info_ptr, png_textp text_ptr, - int num_text) -{ - int i; - - png_debug1(1, "in %s storage function\n", (png_ptr->chunk_name[0] == '\0' ? - "text" : (png_const_charp)png_ptr->chunk_name)); - - if (png_ptr == NULL || info_ptr == NULL || num_text == 0) - return(0); - - /* Make sure we have enough space in the "text" array in info_struct - * to hold all of the incoming text_ptr objects. - */ - if (info_ptr->num_text + num_text > info_ptr->max_text) - { - if (info_ptr->text != NULL) - { - png_textp old_text; - int old_max; - - old_max = info_ptr->max_text; - info_ptr->max_text = info_ptr->num_text + num_text + 8; - old_text = info_ptr->text; - info_ptr->text = (png_textp)png_malloc_warn(png_ptr, - (png_uint_32)(info_ptr->max_text * png_sizeof (png_text))); - if (info_ptr->text == NULL) - { - png_free(png_ptr, old_text); - return(1); - } - png_memcpy(info_ptr->text, old_text, (png_size_t)(old_max * - png_sizeof(png_text))); - png_free(png_ptr, old_text); - } - else - { - info_ptr->max_text = num_text + 8; - info_ptr->num_text = 0; - info_ptr->text = (png_textp)png_malloc_warn(png_ptr, - (png_uint_32)(info_ptr->max_text * png_sizeof (png_text))); - if (info_ptr->text == NULL) - return(1); -#ifdef PNG_FREE_ME_SUPPORTED - info_ptr->free_me |= PNG_FREE_TEXT; -#endif - } - png_debug1(3, "allocated %d entries for info_ptr->text\n", - info_ptr->max_text); - } - for (i = 0; i < num_text; i++) - { - png_size_t text_length,key_len; - png_size_t lang_len,lang_key_len; - png_textp textp = &(info_ptr->text[info_ptr->num_text]); - - if (text_ptr[i].key == NULL) - continue; - - key_len = png_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 = png_strlen(text_ptr[i].lang); - else - lang_len = 0; - if (text_ptr[i].lang_key != NULL) - lang_key_len = png_strlen(text_ptr[i].lang_key); - else - lang_key_len = 0; - } -#else - { - png_warning(png_ptr, "iTXt chunk not supported."); - 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 = png_strlen(text_ptr[i].text); - textp->compression = text_ptr[i].compression; - } - - textp->key = (png_charp)png_malloc_warn(png_ptr, - (png_uint_32)(key_len + text_length + lang_len + lang_key_len + 4)); - if (textp->key == NULL) - return(1); - png_debug2(2, "Allocated %lu bytes at %x in png_set_text\n", - (png_uint_32)(key_len + lang_len + lang_key_len + text_length + 4), - (int)textp->key); - - png_memcpy(textp->key, text_ptr[i].key, - (png_size_t)(key_len)); - *(textp->key+key_len) = '\0'; -#ifdef PNG_iTXt_SUPPORTED - if (text_ptr[i].compression > 0) - { - textp->lang=textp->key + key_len + 1; - png_memcpy(textp->lang, text_ptr[i].lang, lang_len); - *(textp->lang+lang_len) = '\0'; - textp->lang_key=textp->lang + lang_len + 1; - png_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 -#endif - { -#ifdef PNG_iTXt_SUPPORTED - textp->lang=NULL; - textp->lang_key=NULL; -#endif - textp->text=textp->key + key_len + 1; - } - if(text_length) - png_memcpy(textp->text, text_ptr[i].text, - (png_size_t)(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; -#ifdef PNG_iTXt_SUPPORTED - textp->itxt_length = 0; -#endif - } - info_ptr->num_text++; - png_debug1(3, "transferred text chunk %d\n", info_ptr->num_text); - } - return(0); -} -#endif - -#if defined(PNG_tIME_SUPPORTED) -void PNGAPI -png_set_tIME(png_structp png_ptr, png_infop info_ptr, png_timep mod_time) -{ - png_debug1(1, "in %s storage function\n", "tIME"); - if (png_ptr == NULL || info_ptr == NULL || - (png_ptr->mode & PNG_WROTE_tIME)) - return; - - png_memcpy(&(info_ptr->mod_time), mod_time, png_sizeof (png_time)); - info_ptr->valid |= PNG_INFO_tIME; -} -#endif - -#if defined(PNG_tRNS_SUPPORTED) -void PNGAPI -png_set_tRNS(png_structp png_ptr, png_infop info_ptr, - png_bytep trans, int num_trans, png_color_16p trans_values) -{ - png_debug1(1, "in %s storage function\n", "tRNS"); - if (png_ptr == NULL || info_ptr == NULL) - return; - - if (trans != NULL) - { - /* - * It may not actually be necessary to set png_ptr->trans here; - * we do it for backward compatibility with the way the png_handle_tRNS - * function used to do the allocation. - */ -#ifdef PNG_FREE_ME_SUPPORTED - png_free_data(png_ptr, info_ptr, PNG_FREE_TRNS, 0); -#endif - /* Changed from num_trans to PNG_MAX_PALETTE_LENGTH in version 1.2.1 */ - png_ptr->trans = info_ptr->trans = (png_bytep)png_malloc(png_ptr, - (png_uint_32)PNG_MAX_PALETTE_LENGTH); - if (num_trans <= PNG_MAX_PALETTE_LENGTH) - png_memcpy(info_ptr->trans, trans, (png_size_t)num_trans); -#ifdef PNG_FREE_ME_SUPPORTED - info_ptr->free_me |= PNG_FREE_TRNS; -#else - png_ptr->flags |= PNG_FLAG_FREE_TRNS; -#endif - } - - if (trans_values != NULL) - { - png_memcpy(&(info_ptr->trans_values), trans_values, - png_sizeof(png_color_16)); - if (num_trans == 0) - num_trans = 1; - } - info_ptr->num_trans = (png_uint_16)num_trans; - info_ptr->valid |= PNG_INFO_tRNS; -} -#endif - -#if defined(PNG_sPLT_SUPPORTED) -void PNGAPI -png_set_sPLT(png_structp png_ptr, - png_infop info_ptr, png_sPLT_tp entries, int nentries) -{ - png_sPLT_tp np; - int i; - - if (png_ptr == NULL || info_ptr == NULL) - return; - - np = (png_sPLT_tp)png_malloc_warn(png_ptr, - (info_ptr->splt_palettes_num + nentries) * png_sizeof(png_sPLT_t)); - if (np == NULL) - { - png_warning(png_ptr, "No memory for sPLT palettes."); - return; - } - - png_memcpy(np, info_ptr->splt_palettes, - info_ptr->splt_palettes_num * png_sizeof(png_sPLT_t)); - png_free(png_ptr, info_ptr->splt_palettes); - info_ptr->splt_palettes=NULL; - - for (i = 0; i < nentries; i++) - { - png_sPLT_tp to = np + info_ptr->splt_palettes_num + i; - png_sPLT_tp from = entries + i; - - to->name = (png_charp)png_malloc_warn(png_ptr, - png_strlen(from->name) + 1); - if (to->name == NULL) - { - png_warning(png_ptr, - "Out of memory while processing sPLT chunk"); - } - /* TODO: use png_malloc_warn */ - png_strncpy(to->name, from->name, png_strlen(from->name)+1); - to->entries = (png_sPLT_entryp)png_malloc_warn(png_ptr, - from->nentries * png_sizeof(png_sPLT_entry)); - /* TODO: use png_malloc_warn */ - png_memcpy(to->entries, from->entries, - from->nentries * png_sizeof(png_sPLT_entry)); - if (to->entries == NULL) - { - png_warning(png_ptr, - "Out of memory while processing sPLT chunk"); - png_free(png_ptr,to->name); - to->name = NULL; - } - to->nentries = from->nentries; - to->depth = from->depth; - } - - info_ptr->splt_palettes = np; - info_ptr->splt_palettes_num += nentries; - info_ptr->valid |= PNG_INFO_sPLT; -#ifdef PNG_FREE_ME_SUPPORTED - info_ptr->free_me |= PNG_FREE_SPLT; -#endif -} -#endif /* PNG_sPLT_SUPPORTED */ - -#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) -void PNGAPI -png_set_unknown_chunks(png_structp png_ptr, - png_infop info_ptr, png_unknown_chunkp unknowns, int num_unknowns) -{ - png_unknown_chunkp np; - int i; - - if (png_ptr == NULL || info_ptr == NULL || num_unknowns == 0) - return; - - np = (png_unknown_chunkp)png_malloc_warn(png_ptr, - (info_ptr->unknown_chunks_num + num_unknowns) * - png_sizeof(png_unknown_chunk)); - if (np == NULL) - { - png_warning(png_ptr, - "Out of memory while processing unknown chunk."); - return; - } - - png_memcpy(np, info_ptr->unknown_chunks, - info_ptr->unknown_chunks_num * png_sizeof(png_unknown_chunk)); - png_free(png_ptr, info_ptr->unknown_chunks); - info_ptr->unknown_chunks=NULL; - - for (i = 0; i < num_unknowns; i++) - { - png_unknown_chunkp to = np + info_ptr->unknown_chunks_num + i; - png_unknown_chunkp from = unknowns + i; - - png_strncpy((png_charp)to->name, (png_charp)from->name, 5); - to->data = (png_bytep)png_malloc_warn(png_ptr, from->size); - if (to->data == NULL) - { - png_warning(png_ptr, - "Out of memory while processing unknown chunk."); - } - else - { - png_memcpy(to->data, from->data, from->size); - to->size = from->size; - - /* note our location in the read or write sequence */ - to->location = (png_byte)(png_ptr->mode & 0xff); - } - } - - info_ptr->unknown_chunks = np; - info_ptr->unknown_chunks_num += num_unknowns; -#ifdef PNG_FREE_ME_SUPPORTED - info_ptr->free_me |= PNG_FREE_UNKN; -#endif -} -void PNGAPI -png_set_unknown_chunk_location(png_structp png_ptr, png_infop info_ptr, - int chunk, int location) -{ - if(png_ptr != NULL && info_ptr != NULL && chunk >= 0 && chunk < - (int)info_ptr->unknown_chunks_num) - info_ptr->unknown_chunks[chunk].location = (png_byte)location; -} -#endif - -#if defined(PNG_1_0_X) || defined(PNG_1_2_X) -#if defined(PNG_READ_EMPTY_PLTE_SUPPORTED) || \ - defined(PNG_WRITE_EMPTY_PLTE_SUPPORTED) -void PNGAPI -png_permit_empty_plte (png_structp png_ptr, int empty_plte_permitted) -{ - /* This function is deprecated in favor of png_permit_mng_features() - and will be removed from libpng-1.3.0 */ - png_debug(1, "in png_permit_empty_plte, DEPRECATED.\n"); - if (png_ptr == NULL) - return; - png_ptr->mng_features_permitted = (png_byte) - ((png_ptr->mng_features_permitted & (~(PNG_FLAG_MNG_EMPTY_PLTE))) | - ((empty_plte_permitted & PNG_FLAG_MNG_EMPTY_PLTE))); -} -#endif -#endif - -#if defined(PNG_MNG_FEATURES_SUPPORTED) -png_uint_32 PNGAPI -png_permit_mng_features (png_structp png_ptr, png_uint_32 mng_features) -{ - png_debug(1, "in png_permit_mng_features\n"); - if (png_ptr == NULL) - return (png_uint_32)0; - png_ptr->mng_features_permitted = - (png_byte)(mng_features & PNG_ALL_MNG_FEATURES); - return (png_uint_32)png_ptr->mng_features_permitted; -} -#endif - -#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) -void PNGAPI -png_set_keep_unknown_chunks(png_structp png_ptr, int keep, png_bytep - chunk_list, int num_chunks) -{ - png_bytep new_list, p; - int i, old_num_chunks; - if (png_ptr == NULL) - return; - if (num_chunks == 0) - { - if(keep == PNG_HANDLE_CHUNK_ALWAYS || keep == PNG_HANDLE_CHUNK_IF_SAFE) - png_ptr->flags |= PNG_FLAG_KEEP_UNKNOWN_CHUNKS; - else - png_ptr->flags &= ~PNG_FLAG_KEEP_UNKNOWN_CHUNKS; - - if(keep == PNG_HANDLE_CHUNK_ALWAYS) - png_ptr->flags |= PNG_FLAG_KEEP_UNSAFE_CHUNKS; - else - png_ptr->flags &= ~PNG_FLAG_KEEP_UNSAFE_CHUNKS; - return; - } - if (chunk_list == NULL) - return; - old_num_chunks=png_ptr->num_chunk_list; - new_list=(png_bytep)png_malloc(png_ptr, - (png_uint_32)(5*(num_chunks+old_num_chunks))); - if(png_ptr->chunk_list != NULL) - { - png_memcpy(new_list, png_ptr->chunk_list, - (png_size_t)(5*old_num_chunks)); - png_free(png_ptr, png_ptr->chunk_list); - png_ptr->chunk_list=NULL; - } - png_memcpy(new_list+5*old_num_chunks, chunk_list, - (png_size_t)(5*num_chunks)); - for (p=new_list+5*old_num_chunks+4, i=0; inum_chunk_list=old_num_chunks+num_chunks; - png_ptr->chunk_list=new_list; -#ifdef PNG_FREE_ME_SUPPORTED - png_ptr->free_me |= PNG_FREE_LIST; -#endif -} -#endif - -#if defined(PNG_READ_USER_CHUNKS_SUPPORTED) -void PNGAPI -png_set_read_user_chunk_fn(png_structp 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\n"); - if (png_ptr == NULL) - return; - png_ptr->read_user_chunk_fn = read_user_chunk_fn; - png_ptr->user_chunk_ptr = user_chunk_ptr; -} -#endif - -#if defined(PNG_INFO_IMAGE_SUPPORTED) -void PNGAPI -png_set_rows(png_structp png_ptr, png_infop info_ptr, png_bytepp row_pointers) -{ - png_debug1(1, "in %s storage function\n", "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 - -#ifdef PNG_WRITE_SUPPORTED -void PNGAPI -png_set_compression_buffer_size(png_structp png_ptr, png_uint_32 size) -{ - if (png_ptr == NULL) - return; - if(png_ptr->zbuf) - png_free(png_ptr, png_ptr->zbuf); - png_ptr->zbuf_size = (png_size_t)size; - png_ptr->zbuf = (png_bytep)png_malloc(png_ptr, size); - png_ptr->zstream.next_out = png_ptr->zbuf; - png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; -} -#endif - -void PNGAPI -png_set_invalid(png_structp png_ptr, png_infop info_ptr, int mask) -{ - if (png_ptr && info_ptr) - info_ptr->valid &= ~(mask); -} - - -#ifndef PNG_1_0_X -#ifdef PNG_ASSEMBLER_CODE_SUPPORTED -/* function was added to libpng 1.2.0 and should always exist by default */ -void PNGAPI -png_set_asm_flags (png_structp png_ptr, png_uint_32) -{ -/* Obsolete as of libpng-1.2.20 and will be removed from libpng-1.4.0 */ - if (png_ptr != NULL) - png_ptr->asm_flags = 0; -} - -/* this function was added to libpng 1.2.0 */ -void PNGAPI -png_set_mmx_thresholds (png_structp png_ptr, - png_byte, - png_uint_32) -{ -/* Obsolete as of libpng-1.2.20 and will be removed from libpng-1.4.0 */ - if (png_ptr == NULL) - return; -} -#endif /* ?PNG_ASSEMBLER_CODE_SUPPORTED */ - -#ifdef PNG_SET_USER_LIMITS_SUPPORTED -/* this function was added to libpng 1.2.6 */ -void PNGAPI -png_set_user_limits (png_structp 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; -} -#endif /* ?PNG_SET_USER_LIMITS_SUPPORTED */ - -#endif /* ?PNG_1_0_X */ -#endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */ diff --git a/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngtrans.c b/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngtrans.c deleted file mode 100644 index 8c8faa13..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngtrans.c +++ /dev/null @@ -1,662 +0,0 @@ - -/* pngtrans.c - transforms the data in a row (used by both readers and writers) - * - * Last changed in libpng 1.2.17 May 15, 2007 - * For conditions of distribution and use, see copyright notice in png.h - * Copyright (c) 1998-2007 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.) - */ - -#define PNG_INTERNAL -#include "png.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_structp png_ptr) -{ - png_debug(1, "in png_set_bgr\n"); - 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_structp png_ptr) -{ - png_debug(1, "in png_set_swap\n"); - 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_structp png_ptr) -{ - png_debug(1, "in png_set_packing\n"); - 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_structp png_ptr) -{ - png_debug(1, "in png_set_packswap\n"); - 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_structp png_ptr, png_color_8p true_bits) -{ - png_debug(1, "in png_set_shift\n"); - 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_structp png_ptr) -{ - png_debug(1, "in png_set_interlace handling\n"); - 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_structp png_ptr, png_uint_32 filler, int filler_loc) -{ - png_debug(1, "in png_set_filler\n"); - if(png_ptr == NULL) return; - png_ptr->transformations |= PNG_FILLER; - png_ptr->filler = (png_byte)filler; - if (filler_loc == PNG_FILLER_AFTER) - png_ptr->flags |= PNG_FLAG_FILLER_AFTER; - else - png_ptr->flags &= ~PNG_FLAG_FILLER_AFTER; - - /* This should probably go in the "do_read_filler" routine. - * I attempted to do that in libpng-1.0.1a but that caused problems - * so I restored it in libpng-1.0.2a - */ - - if (png_ptr->color_type == PNG_COLOR_TYPE_RGB) - { - png_ptr->usr_channels = 4; - } - - /* Also I added this in libpng-1.0.2a (what happens when we expand - * a less-than-8-bit grayscale to GA? */ - - if (png_ptr->color_type == PNG_COLOR_TYPE_GRAY && png_ptr->bit_depth >= 8) - { - png_ptr->usr_channels = 2; - } -} - -#if !defined(PNG_1_0_X) -/* Added to libpng-1.2.7 */ -void PNGAPI -png_set_add_alpha(png_structp png_ptr, png_uint_32 filler, int filler_loc) -{ - png_debug(1, "in png_set_add_alpha\n"); - if(png_ptr == NULL) return; - png_set_filler(png_ptr, filler, filler_loc); - png_ptr->transformations |= PNG_ADD_ALPHA; -} -#endif - -#endif - -#if defined(PNG_READ_SWAP_ALPHA_SUPPORTED) || \ - defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED) -void PNGAPI -png_set_swap_alpha(png_structp png_ptr) -{ - png_debug(1, "in png_set_swap_alpha\n"); - 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_structp png_ptr) -{ - png_debug(1, "in png_set_invert_alpha\n"); - 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_structp png_ptr) -{ - png_debug(1, "in png_set_invert_mono\n"); - 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\n"); - /* This test removed from libpng version 1.0.13 and 1.2.0: - * if (row_info->bit_depth == 1 && - */ -#if defined(PNG_USELESS_TESTS_SUPPORTED) - if (row == NULL || row_info == NULL) - return; -#endif - if (row_info->color_type == PNG_COLOR_TYPE_GRAY) - { - png_bytep rp = row; - png_uint_32 i; - png_uint_32 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_uint_32 i; - png_uint_32 istop = row_info->rowbytes; - - for (i = 0; i < istop; i+=2) - { - *rp = (png_byte)(~(*rp)); - rp+=2; - } - } - else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA && - row_info->bit_depth == 16) - { - png_bytep rp = row; - png_uint_32 i; - png_uint_32 istop = row_info->rowbytes; - - for (i = 0; i < istop; i+=4) - { - *rp = (png_byte)(~(*rp)); - *(rp+1) = (png_byte)(~(*(rp+1))); - rp+=4; - } - } -} -#endif - -#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\n"); - if ( -#if defined(PNG_USELESS_TESTS_SUPPORTED) - row != NULL && row_info != NULL && -#endif - 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 - -#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\n"); - if ( -#if defined(PNG_USELESS_TESTS_SUPPORTED) - row != NULL && row_info != NULL && -#endif - row_info->bit_depth < 8) - { - png_bytep rp, end, table; - - end = row + row_info->rowbytes; - - if (row_info->bit_depth == 1) - table = (png_bytep)onebppswaptable; - else if (row_info->bit_depth == 2) - table = (png_bytep)twobppswaptable; - else if (row_info->bit_depth == 4) - table = (png_bytep)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 filler or alpha byte(s) */ -void /* PRIVATE */ -png_do_strip_filler(png_row_infop row_info, png_bytep row, png_uint_32 flags) -{ - png_debug(1, "in png_do_strip_filler\n"); -#if defined(PNG_USELESS_TESTS_SUPPORTED) - if (row != NULL && row_info != NULL) -#endif - { - png_bytep sp=row; - png_bytep dp=row; - png_uint_32 row_width=row_info->width; - png_uint_32 i; - - if ((row_info->color_type == PNG_COLOR_TYPE_RGB || - (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA && - (flags & PNG_FLAG_STRIP_ALPHA))) && - row_info->channels == 4) - { - if (row_info->bit_depth == 8) - { - /* This converts from RGBX or RGBA to RGB */ - if (flags & PNG_FLAG_FILLER_AFTER) - { - dp+=3; sp+=4; - for (i = 1; i < row_width; i++) - { - *dp++ = *sp++; - *dp++ = *sp++; - *dp++ = *sp++; - sp++; - } - } - /* This converts from XRGB or ARGB to RGB */ - else - { - for (i = 0; i < row_width; i++) - { - sp++; - *dp++ = *sp++; - *dp++ = *sp++; - *dp++ = *sp++; - } - } - row_info->pixel_depth = 24; - row_info->rowbytes = row_width * 3; - } - else /* if (row_info->bit_depth == 16) */ - { - if (flags & PNG_FLAG_FILLER_AFTER) - { - /* This converts from RRGGBBXX or RRGGBBAA to RRGGBB */ - sp += 8; dp += 6; - for (i = 1; i < row_width; i++) - { - /* This could be (although png_memcpy is probably slower): - png_memcpy(dp, sp, 6); - sp += 8; - dp += 6; - */ - - *dp++ = *sp++; - *dp++ = *sp++; - *dp++ = *sp++; - *dp++ = *sp++; - *dp++ = *sp++; - *dp++ = *sp++; - sp += 2; - } - } - else - { - /* This converts from XXRRGGBB or AARRGGBB to RRGGBB */ - for (i = 0; i < row_width; i++) - { - /* This could be (although png_memcpy is probably slower): - png_memcpy(dp, sp, 6); - sp += 8; - dp += 6; - */ - - sp+=2; - *dp++ = *sp++; - *dp++ = *sp++; - *dp++ = *sp++; - *dp++ = *sp++; - *dp++ = *sp++; - *dp++ = *sp++; - } - } - row_info->pixel_depth = 48; - row_info->rowbytes = row_width * 6; - } - row_info->channels = 3; - } - else if ((row_info->color_type == PNG_COLOR_TYPE_GRAY || - (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA && - (flags & PNG_FLAG_STRIP_ALPHA))) && - row_info->channels == 2) - { - if (row_info->bit_depth == 8) - { - /* This converts from GX or GA to G */ - if (flags & PNG_FLAG_FILLER_AFTER) - { - for (i = 0; i < row_width; i++) - { - *dp++ = *sp++; - sp++; - } - } - /* This converts from XG or AG to G */ - else - { - for (i = 0; i < row_width; i++) - { - sp++; - *dp++ = *sp++; - } - } - row_info->pixel_depth = 8; - row_info->rowbytes = row_width; - } - else /* if (row_info->bit_depth == 16) */ - { - if (flags & PNG_FLAG_FILLER_AFTER) - { - /* This converts from GGXX or GGAA to GG */ - sp += 4; dp += 2; - for (i = 1; i < row_width; i++) - { - *dp++ = *sp++; - *dp++ = *sp++; - sp += 2; - } - } - else - { - /* This converts from XXGG or AAGG to GG */ - for (i = 0; i < row_width; i++) - { - sp += 2; - *dp++ = *sp++; - *dp++ = *sp++; - } - } - row_info->pixel_depth = 16; - row_info->rowbytes = row_width * 2; - } - row_info->channels = 1; - } - if (flags & PNG_FLAG_STRIP_ALPHA) - row_info->color_type &= ~PNG_COLOR_MASK_ALPHA; - } -} -#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\n"); - if ( -#if defined(PNG_USELESS_TESTS_SUPPORTED) - row != NULL && row_info != NULL && -#endif - (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; - } - } - } - 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 /* PNG_READ_BGR_SUPPORTED or PNG_WRITE_BGR_SUPPORTED */ - -#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ - defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) || \ - defined(PNG_LEGACY_SUPPORTED) -void PNGAPI -png_set_user_transform_info(png_structp png_ptr, png_voidp - user_transform_ptr, int user_transform_depth, int user_transform_channels) -{ - png_debug(1, "in png_set_user_transform_info\n"); - if(png_ptr == NULL) return; -#if defined(PNG_USER_TRANSFORM_PTR_SUPPORTED) - 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; -#else - if(user_transform_ptr || user_transform_depth || user_transform_channels) - png_warning(png_ptr, - "This version of libpng does not support user transform info"); -#endif -} -#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. - */ -png_voidp PNGAPI -png_get_user_transform_ptr(png_structp png_ptr) -{ -#if defined(PNG_USER_TRANSFORM_PTR_SUPPORTED) - if (png_ptr == NULL) return (NULL); - return ((png_voidp)png_ptr->user_transform_ptr); -#else - return (NULL); -#endif -} -#endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */ diff --git a/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngwio.c b/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngwio.c deleted file mode 100644 index 34da2b23..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngwio.c +++ /dev/null @@ -1,234 +0,0 @@ - -/* pngwio.c - functions for data output - * - * Last changed in libpng 1.2.13 November 13, 2006 - * For conditions of distribution and use, see copyright notice in png.h - * Copyright (c) 1998-2006 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 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(...). - */ - -#define PNG_INTERNAL -#include "png.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_structp png_ptr, png_bytep data, png_size_t length) -{ - if (png_ptr->write_data_fn != NULL ) - (*(png_ptr->write_data_fn))(png_ptr, data, length); - else - png_error(png_ptr, "Call to NULL write function"); -} - -#if !defined(PNG_NO_STDIO) -/* 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. */ -#ifndef USE_FAR_KEYWORD -void PNGAPI -png_default_write_data(png_structp png_ptr, png_bytep data, png_size_t length) -{ - png_uint_32 check; - - if(png_ptr == NULL) return; -#if defined(_WIN32_WCE) - if ( !WriteFile((HANDLE)(png_ptr->io_ptr), data, length, &check, NULL) ) - check = 0; -#else - check = fwrite(data, 1, length, (png_FILE_p)(png_ptr->io_ptr)); -#endif - if (check != length) - png_error(png_ptr, "Write Error"); -} -#else -/* this is the model-independent version. Since the standard I/O library - can't handle far buffers in the medium and small models, we have to copy - the data. -*/ - -#define NEAR_BUF_SIZE 1024 -#define MIN(a,b) (a <= b ? a : b) - -void PNGAPI -png_default_write_data(png_structp png_ptr, png_bytep data, png_size_t length) -{ - png_uint_32 check; - png_byte *near_data; /* Needs to be "png_byte *" instead of "png_bytep" */ - png_FILE_p io_ptr; - - if(png_ptr == NULL) return; - /* Check if data really is near. If so, use usual code. */ - near_data = (png_byte *)CVT_PTR_NOCHECK(data); - io_ptr = (png_FILE_p)CVT_PTR(png_ptr->io_ptr); - if ((png_bytep)near_data == data) - { -#if defined(_WIN32_WCE) - if ( !WriteFile(io_ptr, near_data, length, &check, NULL) ) - check = 0; -#else - check = fwrite(near_data, 1, length, io_ptr); -#endif - } - else - { - png_byte buf[NEAR_BUF_SIZE]; - png_size_t written, remaining, err; - check = 0; - remaining = length; - do - { - written = MIN(NEAR_BUF_SIZE, remaining); - png_memcpy(buf, data, written); /* copy far buffer to near buffer */ -#if defined(_WIN32_WCE) - if ( !WriteFile(io_ptr, buf, written, &err, NULL) ) - err = 0; -#else - err = fwrite(buf, 1, written, io_ptr); -#endif - if (err != written) - break; - else - check += err; - data += written; - remaining -= written; - } - while (remaining != 0); - } - if (check != length) - png_error(png_ptr, "Write Error"); -} - -#endif -#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. */ -#if defined(PNG_WRITE_FLUSH_SUPPORTED) -void /* PRIVATE */ -png_flush(png_structp png_ptr) -{ - if (png_ptr->output_flush_fn != NULL) - (*(png_ptr->output_flush_fn))(png_ptr); -} - -#if !defined(PNG_NO_STDIO) -void PNGAPI -png_default_flush(png_structp png_ptr) -{ -#if !defined(_WIN32_WCE) - png_FILE_p io_ptr; -#endif - if(png_ptr == NULL) return; -#if !defined(_WIN32_WCE) - io_ptr = (png_FILE_p)CVT_PTR((png_ptr->io_ptr)); - if (io_ptr != NULL) - fflush(io_ptr); -#endif -} -#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. - 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 ouput, 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. */ -void PNGAPI -png_set_write_fn(png_structp 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; - -#if !defined(PNG_NO_STDIO) - 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 - -#if defined(PNG_WRITE_FLUSH_SUPPORTED) -#if !defined(PNG_NO_STDIO) - 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, - "Attempted to set both read_data_fn and write_data_fn in"); - png_warning(png_ptr, - "the same structure. Resetting read_data_fn to NULL."); - } -} - -#if defined(USE_FAR_KEYWORD) -#if defined(_MSC_VER) -void *png_far_to_near(png_structp png_ptr,png_voidp ptr, int check) -{ - void *near_ptr; - void FAR *far_ptr; - FP_OFF(near_ptr) = FP_OFF(ptr); - far_ptr = (void FAR *)near_ptr; - if(check != 0) - if(FP_SEG(ptr) != FP_SEG(far_ptr)) - png_error(png_ptr,"segment lost in conversion"); - return(near_ptr); -} -# else -void *png_far_to_near(png_structp png_ptr,png_voidp ptr, int check) -{ - void *near_ptr; - void FAR *far_ptr; - near_ptr = (void FAR *)ptr; - far_ptr = (void FAR *)near_ptr; - if(check != 0) - if(far_ptr != ptr) - png_error(png_ptr,"segment lost in conversion"); - return(near_ptr); -} -# endif -# endif -#endif /* PNG_WRITE_SUPPORTED */ diff --git a/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngwrite.c b/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngwrite.c deleted file mode 100644 index 8f9b537a..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngwrite.c +++ /dev/null @@ -1,1514 +0,0 @@ - -/* pngwrite.c - general routines to write a PNG file - * - * Last changed in libpng 1.2.15 January 5, 2007 - * For conditions of distribution and use, see copyright notice in png.h - * Copyright (c) 1998-2007 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.) - */ - -/* get internal access to png.h */ -#define PNG_INTERNAL -#include "png.h" -#ifdef PNG_WRITE_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_structp png_ptr, png_infop info_ptr) -{ - png_debug(1, "in png_write_info_before_PLTE\n"); - if (png_ptr == NULL || info_ptr == NULL) - return; - if (!(png_ptr->mode & PNG_WROTE_INFO_BEFORE_PLTE)) - { - png_write_sig(png_ptr); /* write PNG signature */ -#if defined(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, -#if defined(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. */ -#if defined(PNG_WRITE_gAMA_SUPPORTED) - if (info_ptr->valid & PNG_INFO_gAMA) - { -# ifdef PNG_FLOATING_POINT_SUPPORTED - png_write_gAMA(png_ptr, info_ptr->gamma); -#else -#ifdef PNG_FIXED_POINT_SUPPORTED - png_write_gAMA_fixed(png_ptr, info_ptr->int_gamma); -# endif -#endif - } -#endif -#if defined(PNG_WRITE_sRGB_SUPPORTED) - if (info_ptr->valid & PNG_INFO_sRGB) - png_write_sRGB(png_ptr, (int)info_ptr->srgb_intent); -#endif -#if defined(PNG_WRITE_iCCP_SUPPORTED) - if (info_ptr->valid & PNG_INFO_iCCP) - png_write_iCCP(png_ptr, info_ptr->iccp_name, PNG_COMPRESSION_TYPE_BASE, - info_ptr->iccp_profile, (int)info_ptr->iccp_proflen); -#endif -#if defined(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 -#if defined(PNG_WRITE_cHRM_SUPPORTED) - if (info_ptr->valid & PNG_INFO_cHRM) - { -#ifdef PNG_FLOATING_POINT_SUPPORTED - png_write_cHRM(png_ptr, - info_ptr->x_white, info_ptr->y_white, - info_ptr->x_red, info_ptr->y_red, - info_ptr->x_green, info_ptr->y_green, - info_ptr->x_blue, info_ptr->y_blue); -#else -# ifdef PNG_FIXED_POINT_SUPPORTED - png_write_cHRM_fixed(png_ptr, - info_ptr->int_x_white, info_ptr->int_y_white, - info_ptr->int_x_red, info_ptr->int_y_red, - info_ptr->int_x_green, info_ptr->int_y_green, - info_ptr->int_x_blue, info_ptr->int_y_blue); -# endif -#endif - } -#endif -#if defined(PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED) - if (info_ptr->unknown_chunks_num) - { - png_unknown_chunk *up; - - png_debug(5, "writing extra chunks\n"); - - for (up = info_ptr->unknown_chunks; - up < info_ptr->unknown_chunks + info_ptr->unknown_chunks_num; - up++) - { - int keep=png_handle_as_unknown(png_ptr, up->name); - if (keep != PNG_HANDLE_CHUNK_NEVER && - up->location && !(up->location & PNG_HAVE_PLTE) && - !(up->location & PNG_HAVE_IDAT) && - ((up->name[3] & 0x20) || keep == PNG_HANDLE_CHUNK_ALWAYS || - (png_ptr->flags & PNG_FLAG_KEEP_UNSAFE_CHUNKS))) - { - png_write_chunk(png_ptr, up->name, up->data, up->size); - } - } - } -#endif - png_ptr->mode |= PNG_WROTE_INFO_BEFORE_PLTE; - } -} - -void PNGAPI -png_write_info(png_structp png_ptr, png_infop info_ptr) -{ -#if defined(PNG_WRITE_TEXT_SUPPORTED) || defined(PNG_WRITE_sPLT_SUPPORTED) - int i; -#endif - - png_debug(1, "in png_write_info\n"); - - 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"); - -#if defined(PNG_WRITE_tRNS_SUPPORTED) - if (info_ptr->valid & PNG_INFO_tRNS) - { -#if defined(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[j] = (png_byte)(255 - info_ptr->trans[j]); - } -#endif - png_write_tRNS(png_ptr, info_ptr->trans, &(info_ptr->trans_values), - info_ptr->num_trans, info_ptr->color_type); - } -#endif -#if defined(PNG_WRITE_bKGD_SUPPORTED) - if (info_ptr->valid & PNG_INFO_bKGD) - png_write_bKGD(png_ptr, &(info_ptr->background), info_ptr->color_type); -#endif -#if defined(PNG_WRITE_hIST_SUPPORTED) - if (info_ptr->valid & PNG_INFO_hIST) - png_write_hIST(png_ptr, info_ptr->hist, info_ptr->num_palette); -#endif -#if defined(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 -#if defined(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 -#if defined(PNG_WRITE_sCAL_SUPPORTED) - if (info_ptr->valid & PNG_INFO_sCAL) -#if defined(PNG_FLOATING_POINT_SUPPORTED) && !defined(PNG_NO_STDIO) - png_write_sCAL(png_ptr, (int)info_ptr->scal_unit, - info_ptr->scal_pixel_width, info_ptr->scal_pixel_height); -#else -#ifdef PNG_FIXED_POINT_SUPPORTED - png_write_sCAL_s(png_ptr, (int)info_ptr->scal_unit, - info_ptr->scal_s_width, info_ptr->scal_s_height); -#else - png_warning(png_ptr, - "png_write_sCAL not supported; sCAL chunk not written."); -#endif -#endif -#endif -#if defined(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 -#if defined(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 -#if defined(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 -#if defined(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\n", i, - info_ptr->text[i].compression); - /* an internationalized chunk? */ - if (info_ptr->text[i].compression > 0) - { -#if defined(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) - { -#if defined(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) - { -#if defined(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 -#if defined(PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED) - if (info_ptr->unknown_chunks_num) - { - png_unknown_chunk *up; - - png_debug(5, "writing extra chunks\n"); - - for (up = info_ptr->unknown_chunks; - up < info_ptr->unknown_chunks + info_ptr->unknown_chunks_num; - up++) - { - int keep=png_handle_as_unknown(png_ptr, up->name); - if (keep != PNG_HANDLE_CHUNK_NEVER && - up->location && (up->location & PNG_HAVE_PLTE) && - !(up->location & PNG_HAVE_IDAT) && - ((up->name[3] & 0x20) || keep == PNG_HANDLE_CHUNK_ALWAYS || - (png_ptr->flags & PNG_FLAG_KEEP_UNSAFE_CHUNKS))) - { - png_write_chunk(png_ptr, up->name, up->data, up->size); - } - } - } -#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_structp png_ptr, png_infop info_ptr) -{ - png_debug(1, "in png_write_end\n"); - if (png_ptr == NULL) - return; - if (!(png_ptr->mode & PNG_HAVE_IDAT)) - png_error(png_ptr, "No IDATs written into file"); - - /* see if user wants us to write information chunks */ - if (info_ptr != NULL) - { -#if defined(PNG_WRITE_TEXT_SUPPORTED) - int i; /* local index variable */ -#endif -#if defined(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 -#if defined(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\n", i, - info_ptr->text[i].compression); - /* an internationalized chunk? */ - if (info_ptr->text[i].compression > 0) - { -#if defined(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) - { -#if defined(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) - { -#if defined(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 -#if defined(PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED) - if (info_ptr->unknown_chunks_num) - { - png_unknown_chunk *up; - - png_debug(5, "writing extra chunks\n"); - - for (up = info_ptr->unknown_chunks; - up < info_ptr->unknown_chunks + info_ptr->unknown_chunks_num; - up++) - { - int keep=png_handle_as_unknown(png_ptr, up->name); - if (keep != PNG_HANDLE_CHUNK_NEVER && - up->location && (up->location & PNG_AFTER_IDAT) && - ((up->name[3] & 0x20) || keep == PNG_HANDLE_CHUNK_ALWAYS || - (png_ptr->flags & PNG_FLAG_KEEP_UNSAFE_CHUNKS))) - { - png_write_chunk(png_ptr, up->name, up->data, up->size); - } - } - } -#endif - } - - png_ptr->mode |= PNG_AFTER_IDAT; - - /* write end of PNG file */ - png_write_IEND(png_ptr); -} - -#if defined(PNG_WRITE_tIME_SUPPORTED) -#if !defined(_WIN32_WCE) -/* "time.h" functions are not supported on WindowsCE */ -void PNGAPI -png_convert_from_struct_tm(png_timep ptime, struct tm FAR * ttime) -{ - png_debug(1, "in png_convert_from_struct_tm\n"); - 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\n"); - tbuf = gmtime(&ttime); - png_convert_from_struct_tm(ptime, tbuf); -} -#endif -#endif - -/* Initialize png_ptr structure, and allocate any memory needed */ -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) -{ -#ifdef PNG_USER_MEM_SUPPORTED - return (png_create_write_struct_2(user_png_ver, error_ptr, error_fn, - warn_fn, png_voidp_NULL, png_malloc_ptr_NULL, png_free_ptr_NULL)); -} - -/* Alternate initialize png_ptr structure, and allocate any memory needed */ -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) -{ -#endif /* PNG_USER_MEM_SUPPORTED */ - png_structp png_ptr; -#ifdef PNG_SETJMP_SUPPORTED -#ifdef USE_FAR_KEYWORD - jmp_buf jmpbuf; -#endif -#endif - int i; - png_debug(1, "in png_create_write_struct\n"); -#ifdef PNG_USER_MEM_SUPPORTED - png_ptr = (png_structp)png_create_struct_2(PNG_STRUCT_PNG, - (png_malloc_ptr)malloc_fn, (png_voidp)mem_ptr); -#else - png_ptr = (png_structp)png_create_struct(PNG_STRUCT_PNG); -#endif /* PNG_USER_MEM_SUPPORTED */ - if (png_ptr == NULL) - return (NULL); - - /* added at libpng-1.2.6 */ -#ifdef PNG_SET_USER_LIMITS_SUPPORTED - png_ptr->user_width_max=PNG_USER_WIDTH_MAX; - png_ptr->user_height_max=PNG_USER_HEIGHT_MAX; -#endif - -#ifdef PNG_SETJMP_SUPPORTED -#ifdef USE_FAR_KEYWORD - if (setjmp(jmpbuf)) -#else - if (setjmp(png_ptr->jmpbuf)) -#endif - { - png_free(png_ptr, png_ptr->zbuf); - png_ptr->zbuf=NULL; - png_destroy_struct(png_ptr); - return (NULL); - } -#ifdef USE_FAR_KEYWORD - png_memcpy(png_ptr->jmpbuf,jmpbuf,png_sizeof(jmp_buf)); -#endif -#endif - -#ifdef PNG_USER_MEM_SUPPORTED - png_set_mem_fn(png_ptr, mem_ptr, malloc_fn, free_fn); -#endif /* PNG_USER_MEM_SUPPORTED */ - png_set_error_fn(png_ptr, error_ptr, error_fn, warn_fn); - - i=0; - do - { - if(user_png_ver[i] != png_libpng_ver[i]) - png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH; - } while (png_libpng_ver[i++]); - - 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 digit. - */ - 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[0] == '0' && user_png_ver[2] < '9')) - { -#if !defined(PNG_NO_STDIO) && !defined(_WIN32_WCE) - char msg[80]; - if (user_png_ver) - { - png_snprintf(msg, 80, - "Application was compiled with png.h from libpng-%.20s", - user_png_ver); - png_warning(png_ptr, msg); - } - png_snprintf(msg, 80, - "Application is running with png.c from libpng-%.20s", - png_libpng_ver); - png_warning(png_ptr, msg); -#endif -#ifdef PNG_ERROR_NUMBERS_SUPPORTED - png_ptr->flags=0; -#endif - png_error(png_ptr, - "Incompatible libpng version in application and library"); - } - } - - /* initialize zbuf - compression buffer */ - png_ptr->zbuf_size = PNG_ZBUF_SIZE; - png_ptr->zbuf = (png_bytep)png_malloc(png_ptr, - (png_uint_32)png_ptr->zbuf_size); - - png_set_write_fn(png_ptr, png_voidp_NULL, png_rw_ptr_NULL, - png_flush_ptr_NULL); - -#if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) - png_set_filter_heuristics(png_ptr, PNG_FILTER_HEURISTIC_DEFAULT, - 1, png_doublep_NULL, png_doublep_NULL); -#endif - -#ifdef PNG_SETJMP_SUPPORTED -/* Applications that neglect to set up their own setjmp() and then encounter - a png_error() will longjmp here. Since the jmpbuf is then meaningless we - abort instead of returning. */ -#ifdef USE_FAR_KEYWORD - if (setjmp(jmpbuf)) - PNG_ABORT(); - png_memcpy(png_ptr->jmpbuf,jmpbuf,png_sizeof(jmp_buf)); -#else - if (setjmp(png_ptr->jmpbuf)) - PNG_ABORT(); -#endif -#endif - return (png_ptr); -} - -/* Initialize png_ptr structure, and allocate any memory needed */ -#if defined(PNG_1_0_X) || defined(PNG_1_2_X) -/* Deprecated. */ -#undef png_write_init -void PNGAPI -png_write_init(png_structp png_ptr) -{ - /* We only come here via pre-1.0.7-compiled applications */ - png_write_init_2(png_ptr, "1.0.6 or earlier", 0, 0); -} - -void PNGAPI -png_write_init_2(png_structp png_ptr, png_const_charp user_png_ver, - png_size_t png_struct_size, png_size_t png_info_size) -{ - /* We only come here via pre-1.0.12-compiled applications */ - if(png_ptr == NULL) return; -#if !defined(PNG_NO_STDIO) && !defined(_WIN32_WCE) - if(png_sizeof(png_struct) > png_struct_size || - png_sizeof(png_info) > png_info_size) - { - char msg[80]; - png_ptr->warning_fn=NULL; - if (user_png_ver) - { - png_snprintf(msg, 80, - "Application was compiled with png.h from libpng-%.20s", - user_png_ver); - png_warning(png_ptr, msg); - } - png_snprintf(msg, 80, - "Application is running with png.c from libpng-%.20s", - png_libpng_ver); - png_warning(png_ptr, msg); - } -#endif - if(png_sizeof(png_struct) > png_struct_size) - { - png_ptr->error_fn=NULL; -#ifdef PNG_ERROR_NUMBERS_SUPPORTED - png_ptr->flags=0; -#endif - png_error(png_ptr, - "The png struct allocated by the application for writing is too small."); - } - if(png_sizeof(png_info) > png_info_size) - { - png_ptr->error_fn=NULL; -#ifdef PNG_ERROR_NUMBERS_SUPPORTED - png_ptr->flags=0; -#endif - png_error(png_ptr, - "The info struct allocated by the application for writing is too small."); - } - png_write_init_3(&png_ptr, user_png_ver, png_struct_size); -} -#endif /* PNG_1_0_X || PNG_1_2_X */ - - -void PNGAPI -png_write_init_3(png_structpp ptr_ptr, png_const_charp user_png_ver, - png_size_t png_struct_size) -{ - png_structp png_ptr=*ptr_ptr; -#ifdef PNG_SETJMP_SUPPORTED - jmp_buf tmp_jmp; /* to save current jump buffer */ -#endif - - int i = 0; - - if (png_ptr == NULL) - return; - - do - { - if (user_png_ver[i] != png_libpng_ver[i]) - { -#ifdef PNG_LEGACY_SUPPORTED - png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH; -#else - png_ptr->warning_fn=NULL; - png_warning(png_ptr, - "Application uses deprecated png_write_init() and should be recompiled."); - break; -#endif - } - } while (png_libpng_ver[i++]); - - png_debug(1, "in png_write_init_3\n"); - -#ifdef PNG_SETJMP_SUPPORTED - /* save jump buffer and error functions */ - png_memcpy(tmp_jmp, png_ptr->jmpbuf, png_sizeof (jmp_buf)); -#endif - - if (png_sizeof(png_struct) > png_struct_size) - { - png_destroy_struct(png_ptr); - png_ptr = (png_structp)png_create_struct(PNG_STRUCT_PNG); - *ptr_ptr = png_ptr; - } - - /* reset all variables to 0 */ - png_memset(png_ptr, 0, png_sizeof (png_struct)); - - /* added at libpng-1.2.6 */ -#ifdef PNG_SET_USER_LIMITS_SUPPORTED - png_ptr->user_width_max=PNG_USER_WIDTH_MAX; - png_ptr->user_height_max=PNG_USER_HEIGHT_MAX; -#endif - -#ifdef PNG_SETJMP_SUPPORTED - /* restore jump buffer */ - png_memcpy(png_ptr->jmpbuf, tmp_jmp, png_sizeof (jmp_buf)); -#endif - - png_set_write_fn(png_ptr, png_voidp_NULL, png_rw_ptr_NULL, - png_flush_ptr_NULL); - - /* initialize zbuf - compression buffer */ - png_ptr->zbuf_size = PNG_ZBUF_SIZE; - png_ptr->zbuf = (png_bytep)png_malloc(png_ptr, - (png_uint_32)png_ptr->zbuf_size); - -#if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) - png_set_filter_heuristics(png_ptr, PNG_FILTER_HEURISTIC_DEFAULT, - 1, png_doublep_NULL, png_doublep_NULL); -#endif -} - -/* 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_structp 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\n"); - - 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_structp 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\n"); -#if defined(PNG_WRITE_INTERLACING_SUPPORTED) - /* intialize 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_structp png_ptr, png_bytep row) -{ - if (png_ptr == NULL) - return; - png_debug2(1, "in png_write_row (row %ld, pass %d)\n", - 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); - } - -#if defined(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; - } - } -#endif - - /* set up row info for transformations */ - png_ptr->row_info.color_type = png_ptr->color_type; - png_ptr->row_info.width = png_ptr->usr_width; - png_ptr->row_info.channels = png_ptr->usr_channels; - png_ptr->row_info.bit_depth = png_ptr->usr_bit_depth; - png_ptr->row_info.pixel_depth = (png_byte)(png_ptr->row_info.bit_depth * - png_ptr->row_info.channels); - - png_ptr->row_info.rowbytes = PNG_ROWBYTES(png_ptr->row_info.pixel_depth, - png_ptr->row_info.width); - - png_debug1(3, "row_info->color_type = %d\n", png_ptr->row_info.color_type); - png_debug1(3, "row_info->width = %lu\n", png_ptr->row_info.width); - png_debug1(3, "row_info->channels = %d\n", png_ptr->row_info.channels); - png_debug1(3, "row_info->bit_depth = %d\n", png_ptr->row_info.bit_depth); - png_debug1(3, "row_info->pixel_depth = %d\n", png_ptr->row_info.pixel_depth); - png_debug1(3, "row_info->rowbytes = %lu\n", png_ptr->row_info.rowbytes); - - /* Copy user's row into buffer, leaving room for filter byte. */ - png_memcpy_check(png_ptr, png_ptr->row_buf + 1, row, - png_ptr->row_info.rowbytes); - -#if defined(PNG_WRITE_INTERLACING_SUPPORTED) - /* handle interlacing */ - if (png_ptr->interlaced && png_ptr->pass < 6 && - (png_ptr->transformations & PNG_INTERLACE)) - { - png_do_write_interlace(&(png_ptr->row_info), - png_ptr->row_buf + 1, png_ptr->pass); - /* this should always get caught above, but still ... */ - if (!(png_ptr->row_info.width)) - { - png_write_finish_row(png_ptr); - return; - } - } -#endif - - /* handle other transformations */ - if (png_ptr->transformations) - png_do_write_transformations(png_ptr); - -#if defined(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(&(png_ptr->row_info), png_ptr->row_buf + 1); - } -#endif - - /* Find a filter if necessary, filter the row and write it out. */ - png_write_find_filter(png_ptr, &(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); -} - -#if defined(PNG_WRITE_FLUSH_SUPPORTED) -/* Set the automatic flush interval or 0 to turn flushing off */ -void PNGAPI -png_set_flush(png_structp png_ptr, int nrows) -{ - png_debug(1, "in png_set_flush\n"); - 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_structp png_ptr) -{ - int wrote_IDAT; - - png_debug(1, "in png_write_flush\n"); - if (png_ptr == NULL) - return; - /* We have already written out all of the data */ - if (png_ptr->row_number >= png_ptr->num_rows) - return; - - do - { - int ret; - - /* compress the data */ - ret = deflate(&png_ptr->zstream, Z_SYNC_FLUSH); - wrote_IDAT = 0; - - /* check for compression errors */ - if (ret != Z_OK) - { - if (png_ptr->zstream.msg != NULL) - png_error(png_ptr, png_ptr->zstream.msg); - else - png_error(png_ptr, "zlib error"); - } - - if (!(png_ptr->zstream.avail_out)) - { - /* write the IDAT and reset the zlib output buffer */ - png_write_IDAT(png_ptr, png_ptr->zbuf, - png_ptr->zbuf_size); - png_ptr->zstream.next_out = png_ptr->zbuf; - png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; - wrote_IDAT = 1; - } - } while(wrote_IDAT == 1); - - /* If there is any data left to be output, write it into a new IDAT */ - if (png_ptr->zbuf_size != png_ptr->zstream.avail_out) - { - /* write the IDAT and reset the zlib output buffer */ - png_write_IDAT(png_ptr, png_ptr->zbuf, - png_ptr->zbuf_size - png_ptr->zstream.avail_out); - png_ptr->zstream.next_out = png_ptr->zbuf; - png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; - } - png_ptr->flush_rows = 0; - png_flush(png_ptr); -} -#endif /* PNG_WRITE_FLUSH_SUPPORTED */ - -/* free all memory used by the write */ -void PNGAPI -png_destroy_write_struct(png_structpp png_ptr_ptr, png_infopp info_ptr_ptr) -{ - png_structp png_ptr = NULL; - png_infop info_ptr = NULL; -#ifdef PNG_USER_MEM_SUPPORTED - png_free_ptr free_fn = NULL; - png_voidp mem_ptr = NULL; -#endif - - png_debug(1, "in png_destroy_write_struct\n"); - if (png_ptr_ptr != NULL) - { - png_ptr = *png_ptr_ptr; -#ifdef PNG_USER_MEM_SUPPORTED - free_fn = png_ptr->free_fn; - mem_ptr = png_ptr->mem_ptr; -#endif - } - - if (info_ptr_ptr != NULL) - info_ptr = *info_ptr_ptr; - - if (info_ptr != NULL) - { - png_free_data(png_ptr, info_ptr, PNG_FREE_ALL, -1); - -#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) - if (png_ptr->num_chunk_list) - { - png_free(png_ptr, png_ptr->chunk_list); - png_ptr->chunk_list=NULL; - png_ptr->num_chunk_list=0; - } -#endif - -#ifdef PNG_USER_MEM_SUPPORTED - png_destroy_struct_2((png_voidp)info_ptr, (png_free_ptr)free_fn, - (png_voidp)mem_ptr); -#else - png_destroy_struct((png_voidp)info_ptr); -#endif - *info_ptr_ptr = NULL; - } - - if (png_ptr != NULL) - { - png_write_destroy(png_ptr); -#ifdef PNG_USER_MEM_SUPPORTED - png_destroy_struct_2((png_voidp)png_ptr, (png_free_ptr)free_fn, - (png_voidp)mem_ptr); -#else - png_destroy_struct((png_voidp)png_ptr); -#endif - *png_ptr_ptr = NULL; - } -} - - -/* Free any memory used in png_ptr struct (old method) */ -void /* PRIVATE */ -png_write_destroy(png_structp png_ptr) -{ -#ifdef PNG_SETJMP_SUPPORTED - jmp_buf tmp_jmp; /* save jump buffer */ -#endif - png_error_ptr error_fn; - png_error_ptr warning_fn; - png_voidp error_ptr; -#ifdef PNG_USER_MEM_SUPPORTED - png_free_ptr free_fn; -#endif - - png_debug(1, "in png_write_destroy\n"); - /* free any memory zlib uses */ - deflateEnd(&png_ptr->zstream); - - /* free our memory. png_free checks NULL for us. */ - png_free(png_ptr, png_ptr->zbuf); - png_free(png_ptr, png_ptr->row_buf); - 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); - -#if defined(PNG_TIME_RFC1123_SUPPORTED) - png_free(png_ptr, png_ptr->time_buffer); -#endif - -#if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) - png_free(png_ptr, png_ptr->prev_filters); - png_free(png_ptr, png_ptr->filter_weights); - png_free(png_ptr, png_ptr->inv_filter_weights); - png_free(png_ptr, png_ptr->filter_costs); - png_free(png_ptr, png_ptr->inv_filter_costs); -#endif - -#ifdef PNG_SETJMP_SUPPORTED - /* reset structure */ - png_memcpy(tmp_jmp, png_ptr->jmpbuf, png_sizeof (jmp_buf)); -#endif - - error_fn = png_ptr->error_fn; - warning_fn = png_ptr->warning_fn; - error_ptr = png_ptr->error_ptr; -#ifdef PNG_USER_MEM_SUPPORTED - free_fn = png_ptr->free_fn; -#endif - - png_memset(png_ptr, 0, png_sizeof (png_struct)); - - png_ptr->error_fn = error_fn; - png_ptr->warning_fn = warning_fn; - png_ptr->error_ptr = error_ptr; -#ifdef PNG_USER_MEM_SUPPORTED - png_ptr->free_fn = free_fn; -#endif - -#ifdef PNG_SETJMP_SUPPORTED - png_memcpy(png_ptr->jmpbuf, tmp_jmp, png_sizeof (jmp_buf)); -#endif -} - -/* Allow the application to select one or more row filters to use. */ -void PNGAPI -png_set_filter(png_structp png_ptr, int method, int filters) -{ - png_debug(1, "in png_set_filter\n"); - if (png_ptr == NULL) - return; -#if defined(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)) - { -#ifndef PNG_NO_WRITE_FILTER - case 5: - case 6: - case 7: png_warning(png_ptr, "Unknown row filter for method 0"); -#endif /* PNG_NO_WRITE_FILTER */ - case PNG_FILTER_VALUE_NONE: - png_ptr->do_filter=PNG_FILTER_NONE; break; -#ifndef PNG_NO_WRITE_FILTER - 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_warning(png_ptr, "Unknown row filter for method 0"); -#endif /* PNG_NO_WRITE_FILTER */ - } - - /* 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) - { -#ifndef PNG_NO_WRITE_FILTER - 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_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_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_NO_WRITE_FILTER */ - 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. - */ -#if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) /* GRR 970116 */ -void PNGAPI -png_set_filter_heuristics(png_structp png_ptr, int heuristic_method, - int num_weights, png_doublep filter_weights, - png_doublep filter_costs) -{ - int i; - - png_debug(1, "in png_set_filter_heuristics\n"); - if (png_ptr == NULL) - return; - if (heuristic_method >= PNG_FILTER_HEURISTIC_LAST) - { - png_warning(png_ptr, "Unknown filter heuristic method"); - return; - } - - if (heuristic_method == PNG_FILTER_HEURISTIC_DEFAULT) - { - heuristic_method = PNG_FILTER_HEURISTIC_UNWEIGHTED; - } - - if (num_weights < 0 || filter_weights == NULL || - heuristic_method == PNG_FILTER_HEURISTIC_UNWEIGHTED) - { - num_weights = 0; - } - - png_ptr->num_prev_filters = (png_byte)num_weights; - png_ptr->heuristic_method = (png_byte)heuristic_method; - - if (num_weights > 0) - { - if (png_ptr->prev_filters == NULL) - { - png_ptr->prev_filters = (png_bytep)png_malloc(png_ptr, - (png_uint_32)(png_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; - } - } - - if (png_ptr->filter_weights == NULL) - { - png_ptr->filter_weights = (png_uint_16p)png_malloc(png_ptr, - (png_uint_32)(png_sizeof(png_uint_16) * num_weights)); - - png_ptr->inv_filter_weights = (png_uint_16p)png_malloc(png_ptr, - (png_uint_32)(png_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; - } - } - - 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)((double)PNG_WEIGHT_FACTOR*filter_weights[i]+0.5); - png_ptr->filter_weights[i] = - (png_uint_16)((double)PNG_WEIGHT_FACTOR/filter_weights[i]+0.5); - } - } - } - - /* 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)(png_sizeof(png_uint_16) * PNG_FILTER_VALUE_LAST)); - - png_ptr->inv_filter_costs = (png_uint_16p)png_malloc(png_ptr, - (png_uint_32)(png_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; - } - } - - /* 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 == NULL || filter_costs[i] < 0.0) - { - png_ptr->inv_filter_costs[i] = - png_ptr->filter_costs[i] = PNG_COST_FACTOR; - } - else if (filter_costs[i] >= 1.0) - { - png_ptr->inv_filter_costs[i] = - (png_uint_16)((double)PNG_COST_FACTOR / filter_costs[i] + 0.5); - png_ptr->filter_costs[i] = - (png_uint_16)((double)PNG_COST_FACTOR * filter_costs[i] + 0.5); - } - } -} -#endif /* PNG_WRITE_WEIGHTED_FILTER_SUPPORTED */ - -void PNGAPI -png_set_compression_level(png_structp png_ptr, int level) -{ - png_debug(1, "in png_set_compression_level\n"); - if (png_ptr == NULL) - return; - png_ptr->flags |= PNG_FLAG_ZLIB_CUSTOM_LEVEL; - png_ptr->zlib_level = level; -} - -void PNGAPI -png_set_compression_mem_level(png_structp png_ptr, int mem_level) -{ - png_debug(1, "in png_set_compression_mem_level\n"); - if (png_ptr == NULL) - return; - png_ptr->flags |= PNG_FLAG_ZLIB_CUSTOM_MEM_LEVEL; - png_ptr->zlib_mem_level = mem_level; -} - -void PNGAPI -png_set_compression_strategy(png_structp png_ptr, int strategy) -{ - png_debug(1, "in png_set_compression_strategy\n"); - if (png_ptr == NULL) - return; - png_ptr->flags |= PNG_FLAG_ZLIB_CUSTOM_STRATEGY; - png_ptr->zlib_strategy = strategy; -} - -void PNGAPI -png_set_compression_window_bits(png_structp 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"); - else if (window_bits < 8) - png_warning(png_ptr, "Only compression windows >= 256 supported by PNG"); -#ifndef WBITS_8_OK - /* avoid libpng bug with 256-byte windows */ - if (window_bits == 8) - { - png_warning(png_ptr, "Compression window is being reset to 512"); - window_bits=9; - } -#endif - png_ptr->flags |= PNG_FLAG_ZLIB_CUSTOM_WINDOW_BITS; - png_ptr->zlib_window_bits = window_bits; -} - -void PNGAPI -png_set_compression_method(png_structp png_ptr, int method) -{ - png_debug(1, "in png_set_compression_method\n"); - if (png_ptr == NULL) - return; - if (method != 8) - png_warning(png_ptr, "Only compression method 8 is supported by PNG"); - png_ptr->flags |= PNG_FLAG_ZLIB_CUSTOM_METHOD; - png_ptr->zlib_method = method; -} - -void PNGAPI -png_set_write_status_fn(png_structp png_ptr, png_write_status_ptr write_row_fn) -{ - if (png_ptr == NULL) - return; - png_ptr->write_row_fn = write_row_fn; -} - -#if defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) -void PNGAPI -png_set_write_user_transform_fn(png_structp png_ptr, png_user_transform_ptr - write_user_transform_fn) -{ - png_debug(1, "in png_set_write_user_transform_fn\n"); - if (png_ptr == NULL) - return; - png_ptr->transformations |= PNG_USER_TRANSFORM; - png_ptr->write_user_transform_fn = write_user_transform_fn; -} -#endif - - -#if defined(PNG_INFO_IMAGE_SUPPORTED) -void PNGAPI -png_write_png(png_structp png_ptr, png_infop info_ptr, - int transforms, voidp params) -{ - if (png_ptr == NULL || info_ptr == NULL) - return; -#if defined(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 - - /* Write the file header information. */ - png_write_info(png_ptr, info_ptr); - - /* ------ these transformations don't touch the info structure ------- */ - -#if defined(PNG_WRITE_INVERT_SUPPORTED) - /* invert monochrome pixels */ - if (transforms & PNG_TRANSFORM_INVERT_MONO) - png_set_invert_mono(png_ptr); -#endif - -#if defined(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 - -#if defined(PNG_WRITE_PACK_SUPPORTED) - /* pack pixels into bytes */ - if (transforms & PNG_TRANSFORM_PACKING) - png_set_packing(png_ptr); -#endif - -#if defined(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 - -#if defined(PNG_WRITE_FILLER_SUPPORTED) - /* Get rid of filler (OR ALPHA) bytes, pack XRGB/RGBX/ARGB/RGBA into - * RGB (4 channels -> 3 channels). The second parameter is not used. - */ - if (transforms & PNG_TRANSFORM_STRIP_FILLER) - png_set_filler(png_ptr, 0, PNG_FILLER_BEFORE); -#endif - -#if defined(PNG_WRITE_BGR_SUPPORTED) - /* flip BGR pixels to RGB */ - if (transforms & PNG_TRANSFORM_BGR) - png_set_bgr(png_ptr); -#endif - -#if defined(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 - -#if defined(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 - - /* ----------------------- 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); - - transforms = transforms; /* quiet compiler warnings */ - params = params; -} -#endif -#endif /* PNG_WRITE_SUPPORTED */ diff --git a/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngwtran.c b/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngwtran.c deleted file mode 100644 index 19b29682..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngwtran.c +++ /dev/null @@ -1,572 +0,0 @@ - -/* pngwtran.c - transforms the data in a row for PNG writers - * - * Last changed in libpng 1.2.9 April 14, 2006 - * For conditions of distribution and use, see copyright notice in png.h - * Copyright (c) 1998-2006 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.) - */ - -#define PNG_INTERNAL -#include "png.h" -#ifdef PNG_WRITE_SUPPORTED - -/* Transform the data according to the user's wishes. The order of - * transformations is significant. - */ -void /* PRIVATE */ -png_do_write_transformations(png_structp png_ptr) -{ - png_debug(1, "in png_do_write_transformations\n"); - - if (png_ptr == NULL) - return; - -#if defined(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 */ - &(png_ptr->row_info), /* row_info: */ - /* png_uint_32 width; width of row */ - /* png_uint_32 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 -#if defined(PNG_WRITE_FILLER_SUPPORTED) - if (png_ptr->transformations & PNG_FILLER) - png_do_strip_filler(&(png_ptr->row_info), png_ptr->row_buf + 1, - png_ptr->flags); -#endif -#if defined(PNG_WRITE_PACKSWAP_SUPPORTED) - if (png_ptr->transformations & PNG_PACKSWAP) - png_do_packswap(&(png_ptr->row_info), png_ptr->row_buf + 1); -#endif -#if defined(PNG_WRITE_PACK_SUPPORTED) - if (png_ptr->transformations & PNG_PACK) - png_do_pack(&(png_ptr->row_info), png_ptr->row_buf + 1, - (png_uint_32)png_ptr->bit_depth); -#endif -#if defined(PNG_WRITE_SWAP_SUPPORTED) - if (png_ptr->transformations & PNG_SWAP_BYTES) - png_do_swap(&(png_ptr->row_info), png_ptr->row_buf + 1); -#endif -#if defined(PNG_WRITE_SHIFT_SUPPORTED) - if (png_ptr->transformations & PNG_SHIFT) - png_do_shift(&(png_ptr->row_info), png_ptr->row_buf + 1, - &(png_ptr->shift)); -#endif -#if defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED) - if (png_ptr->transformations & PNG_SWAP_ALPHA) - png_do_write_swap_alpha(&(png_ptr->row_info), png_ptr->row_buf + 1); -#endif -#if defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED) - if (png_ptr->transformations & PNG_INVERT_ALPHA) - png_do_write_invert_alpha(&(png_ptr->row_info), png_ptr->row_buf + 1); -#endif -#if defined(PNG_WRITE_BGR_SUPPORTED) - if (png_ptr->transformations & PNG_BGR) - png_do_bgr(&(png_ptr->row_info), png_ptr->row_buf + 1); -#endif -#if defined(PNG_WRITE_INVERT_SUPPORTED) - if (png_ptr->transformations & PNG_INVERT_MONO) - png_do_invert(&(png_ptr->row_info), png_ptr->row_buf + 1); -#endif -} - -#if defined(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\n"); - if (row_info->bit_depth == 8 && -#if defined(PNG_USELESS_TESTS_SUPPORTED) - row != NULL && row_info != NULL && -#endif - 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; - } - } - 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 - -#if defined(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_color_8p bit_depth) -{ - png_debug(1, "in png_do_shift\n"); -#if defined(PNG_USELESS_TESTS_SUPPORTED) - if (row != NULL && row_info != NULL && -#else - if ( -#endif - 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_uint_32 i; - png_byte mask; - png_uint_32 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++) - { - png_uint_16 v; - int j; - - v = *bp; - *bp = 0; - for (j = shift_start[0]; j > -shift_dec[0]; j -= shift_dec[0]) - { - if (j > 0) - *bp |= (png_byte)((v << j) & 0xff); - else - *bp |= (png_byte)((v >> (-j)) & mask); - } - } - } - 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++) - { - - png_uint_16 v; - int j; - int c = (int)(i%channels); - - v = *bp; - *bp = 0; - for (j = shift_start[c]; j > -shift_dec[c]; j -= shift_dec[c]) - { - if (j > 0) - *bp |= (png_byte)((v << j) & 0xff); - else - *bp |= (png_byte)((v >> (-j)) & 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++) - { - int c = (int)(i%channels); - png_uint_16 value, v; - int j; - - v = (png_uint_16)(((png_uint_16)(*bp) << 8) + *(bp + 1)); - value = 0; - for (j = shift_start[c]; j > -shift_dec[c]; j -= shift_dec[c]) - { - if (j > 0) - value |= (png_uint_16)((v << j) & (png_uint_16)0xffff); - else - value |= (png_uint_16)((v >> (-j)) & (png_uint_16)0xffff); - } - *bp++ = (png_byte)(value >> 8); - *bp++ = (png_byte)(value & 0xff); - } - } - } -} -#endif - -#if defined(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\n"); -#if defined(PNG_USELESS_TESTS_SUPPORTED) - if (row != NULL && row_info != NULL) -#endif - { - if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) - { - /* This converts from ARGB to RGBA */ - if (row_info->bit_depth == 8) - { - 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; - } - } - /* This converts from AARRGGBB to RRGGBBAA */ - else - { - 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]; - } - } - } - else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA) - { - /* This converts from AG to GA */ - if (row_info->bit_depth == 8) - { - 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; - } - } - /* This converts from AAGG to GGAA */ - else - { - 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 - -#if defined(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\n"); -#if defined(PNG_USELESS_TESTS_SUPPORTED) - if (row != NULL && row_info != NULL) -#endif - { - if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) - { - /* This inverts the alpha channel in RGBA */ - if (row_info->bit_depth == 8) - { - 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++)); - } - } - /* This inverts the alpha channel in RRGGBBAA */ - else - { - 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++)); - } - } - } - else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA) - { - /* This inverts the alpha channel in GA */ - if (row_info->bit_depth == 8) - { - 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++)); - } - } - /* This inverts the alpha channel in GGAA */ - else - { - 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 - -#if defined(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\n"); - if ( -#if defined(PNG_USELESS_TESTS_SUPPORTED) - row != NULL && row_info != NULL && -#endif - (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); - } - } - 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_MNG_FEATURES_SUPPORTED */ -#endif /* PNG_WRITE_SUPPORTED */ diff --git a/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngwutil.c b/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngwutil.c deleted file mode 100644 index 352035d4..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngwutil.c +++ /dev/null @@ -1,2792 +0,0 @@ - -/* pngwutil.c - utilities to write a PNG file - * - * Last changed in libpng 1.2.20 Septhember 3, 2007 - * For conditions of distribution and use, see copyright notice in png.h - * Copyright (c) 1998-2007 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.) - */ - -#define PNG_INTERNAL -#include "png.h" -#ifdef PNG_WRITE_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); -} - -/* 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. - */ -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); -} - -/* 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); -} - -/* 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. - */ -void PNGAPI -png_write_chunk(png_structp png_ptr, png_bytep chunk_name, - png_bytep data, png_size_t length) -{ - if(png_ptr == NULL) return; - png_write_chunk_start(png_ptr, chunk_name, (png_uint_32)length); - png_write_chunk_data(png_ptr, data, length); - png_write_chunk_end(png_ptr); -} - -/* 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(). - */ -void PNGAPI -png_write_chunk_start(png_structp png_ptr, png_bytep chunk_name, - png_uint_32 length) -{ - png_byte buf[4]; - png_debug2(0, "Writing %s chunk (%lu bytes)\n", chunk_name, length); - if(png_ptr == NULL) return; - - /* write the length */ - png_save_uint_32(buf, length); - png_write_data(png_ptr, buf, (png_size_t)4); - - /* write the chunk name */ - png_write_data(png_ptr, chunk_name, (png_size_t)4); - /* reset the crc and run it over the chunk name */ - png_reset_crc(png_ptr); - png_calculate_crc(png_ptr, chunk_name, (png_size_t)4); -} - -/* Write the data of a PNG chunk started with png_write_chunk_start(). - * 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_start(). - */ -void PNGAPI -png_write_chunk_data(png_structp png_ptr, png_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_calculate_crc(png_ptr, data, length); - png_write_data(png_ptr, data, length); - } -} - -/* Finish a chunk started with png_write_chunk_start(). */ -void PNGAPI -png_write_chunk_end(png_structp png_ptr) -{ - png_byte buf[4]; - - if(png_ptr == NULL) return; - - /* write the crc */ - png_save_uint_32(buf, png_ptr->crc); - - png_write_data(png_ptr, buf, (png_size_t)4); -} - -/* 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 /* PRIVATE */ -png_write_sig(png_structp png_ptr) -{ - png_byte png_signature[8] = {137, 80, 78, 71, 13, 10, 26, 10}; - /* 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; -} - -#if defined(PNG_WRITE_TEXT_SUPPORTED) || defined(PNG_WRITE_iCCP_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 in order to make the whole mess thread-safe. - */ - -typedef struct -{ - char *input; /* the uncompressed input data */ - int input_len; /* its length */ - int num_output_ptr; /* number of output pointers used */ - int max_output_ptr; /* size of output_ptr */ - png_charpp output_ptr; /* array of pointers to output */ -} compression_state; - -/* compress given text into storage in the png_ptr structure */ -static int /* PRIVATE */ -png_text_compress(png_structp png_ptr, - png_charp text, png_size_t text_len, int compression, - compression_state *comp) -{ - int ret; - - comp->num_output_ptr = 0; - comp->max_output_ptr = 0; - comp->output_ptr = NULL; - comp->input = NULL; - comp->input_len = 0; - - /* we may just want to pass the text right through */ - if (compression == PNG_TEXT_COMPRESSION_NONE) - { - comp->input = text; - comp->input_len = text_len; - return((int)text_len); - } - - if (compression >= PNG_TEXT_COMPRESSION_LAST) - { -#if !defined(PNG_NO_STDIO) && !defined(_WIN32_WCE) - char msg[50]; - png_snprintf(msg, 50, "Unknown compression type %d", compression); - png_warning(png_ptr, msg); -#else - png_warning(png_ptr, "Unknown compression type"); -#endif - } - - /* We can't write the chunk until we find out how much data we have, - * which means we need to run the compressor first and save the - * output. This shouldn't be a problem, as the vast majority of - * comments should be reasonable, but we will set up an array of - * malloc'd pointers to be sure. - * - * If we knew the application was well behaved, we could simplify this - * greatly by assuming we can always malloc an output buffer large - * enough to hold the compressed text ((1001 * text_len / 1000) + 12) - * and malloc this directly. The only time this would be a bad idea is - * if we can't malloc more than 64K and we have 64K of random input - * data, or if the input string is incredibly large (although this - * wouldn't cause a failure, just a slowdown due to swapping). - */ - - /* set up the compression buffers */ - png_ptr->zstream.avail_in = (uInt)text_len; - png_ptr->zstream.next_in = (Bytef *)text; - png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; - png_ptr->zstream.next_out = (Bytef *)png_ptr->zbuf; - - /* this is the same compression loop as in png_write_row() */ - do - { - /* compress the data */ - ret = deflate(&png_ptr->zstream, Z_NO_FLUSH); - if (ret != Z_OK) - { - /* error */ - if (png_ptr->zstream.msg != NULL) - png_error(png_ptr, png_ptr->zstream.msg); - else - png_error(png_ptr, "zlib error"); - } - /* check to see if we need more room */ - if (!(png_ptr->zstream.avail_out)) - { - /* make sure the output array has room */ - if (comp->num_output_ptr >= comp->max_output_ptr) - { - int old_max; - - old_max = comp->max_output_ptr; - comp->max_output_ptr = comp->num_output_ptr + 4; - if (comp->output_ptr != NULL) - { - png_charpp old_ptr; - - old_ptr = comp->output_ptr; - comp->output_ptr = (png_charpp)png_malloc(png_ptr, - (png_uint_32)(comp->max_output_ptr * - png_sizeof (png_charpp))); - png_memcpy(comp->output_ptr, old_ptr, old_max - * png_sizeof (png_charp)); - png_free(png_ptr, old_ptr); - } - else - comp->output_ptr = (png_charpp)png_malloc(png_ptr, - (png_uint_32)(comp->max_output_ptr * - png_sizeof (png_charp))); - } - - /* save the data */ - comp->output_ptr[comp->num_output_ptr] = (png_charp)png_malloc(png_ptr, - (png_uint_32)png_ptr->zbuf_size); - png_memcpy(comp->output_ptr[comp->num_output_ptr], png_ptr->zbuf, - png_ptr->zbuf_size); - comp->num_output_ptr++; - - /* and reset the buffer */ - png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; - png_ptr->zstream.next_out = png_ptr->zbuf; - } - /* continue until we don't have any more to compress */ - } while (png_ptr->zstream.avail_in); - - /* finish the compression */ - do - { - /* tell zlib we are finished */ - ret = deflate(&png_ptr->zstream, Z_FINISH); - - if (ret == Z_OK) - { - /* check to see if we need more room */ - if (!(png_ptr->zstream.avail_out)) - { - /* check to make sure our output array has room */ - if (comp->num_output_ptr >= comp->max_output_ptr) - { - int old_max; - - old_max = comp->max_output_ptr; - comp->max_output_ptr = comp->num_output_ptr + 4; - if (comp->output_ptr != NULL) - { - png_charpp old_ptr; - - old_ptr = comp->output_ptr; - /* This could be optimized to realloc() */ - comp->output_ptr = (png_charpp)png_malloc(png_ptr, - (png_uint_32)(comp->max_output_ptr * - png_sizeof (png_charpp))); - png_memcpy(comp->output_ptr, old_ptr, - old_max * png_sizeof (png_charp)); - png_free(png_ptr, old_ptr); - } - else - comp->output_ptr = (png_charpp)png_malloc(png_ptr, - (png_uint_32)(comp->max_output_ptr * - png_sizeof (png_charp))); - } - - /* save off the data */ - comp->output_ptr[comp->num_output_ptr] = - (png_charp)png_malloc(png_ptr, (png_uint_32)png_ptr->zbuf_size); - png_memcpy(comp->output_ptr[comp->num_output_ptr], png_ptr->zbuf, - png_ptr->zbuf_size); - comp->num_output_ptr++; - - /* and reset the buffer pointers */ - png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; - png_ptr->zstream.next_out = png_ptr->zbuf; - } - } - else if (ret != Z_STREAM_END) - { - /* we got an error */ - if (png_ptr->zstream.msg != NULL) - png_error(png_ptr, png_ptr->zstream.msg); - else - png_error(png_ptr, "zlib error"); - } - } while (ret != Z_STREAM_END); - - /* text length is number of buffers plus last buffer */ - text_len = png_ptr->zbuf_size * comp->num_output_ptr; - if (png_ptr->zstream.avail_out < png_ptr->zbuf_size) - text_len += png_ptr->zbuf_size - (png_size_t)png_ptr->zstream.avail_out; - - return((int)text_len); -} - -/* ship the compressed text out via chunk writes */ -static void /* PRIVATE */ -png_write_compressed_data_out(png_structp png_ptr, compression_state *comp) -{ - int i; - - /* handle the no-compression case */ - if (comp->input) - { - png_write_chunk_data(png_ptr, (png_bytep)comp->input, - (png_size_t)comp->input_len); - return; - } - - /* write saved output buffers, if any */ - for (i = 0; i < comp->num_output_ptr; i++) - { - png_write_chunk_data(png_ptr,(png_bytep)comp->output_ptr[i], - png_ptr->zbuf_size); - png_free(png_ptr, comp->output_ptr[i]); - comp->output_ptr[i]=NULL; - } - if (comp->max_output_ptr != 0) - png_free(png_ptr, comp->output_ptr); - comp->output_ptr=NULL; - /* write anything left in zbuf */ - if (png_ptr->zstream.avail_out < (png_uint_32)png_ptr->zbuf_size) - png_write_chunk_data(png_ptr, png_ptr->zbuf, - png_ptr->zbuf_size - png_ptr->zstream.avail_out); - - /* reset zlib for another zTXt/iTXt or image data */ - deflateReset(&png_ptr->zstream); - png_ptr->zstream.data_type = Z_BINARY; -} -#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_structp 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) -{ -#ifdef PNG_USE_LOCAL_ARRAYS - PNG_IHDR; -#endif - png_byte buf[13]; /* buffer to store the IHDR info */ - - png_debug(1, "in png_write_IHDR\n"); - /* 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: - case 16: png_ptr->channels = 1; break; - default: png_error(png_ptr,"Invalid bit depth for grayscale image"); - } - break; - case PNG_COLOR_TYPE_RGB: - if (bit_depth != 8 && bit_depth != 16) - 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: - if (bit_depth != 8 && bit_depth != 16) - 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 ( -#if defined(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 off 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; -#if defined(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_chunk(png_ptr, png_IHDR, buf, (png_size_t)13); - - /* initialize zlib with PNG info */ - png_ptr->zstream.zalloc = png_zalloc; - png_ptr->zstream.zfree = png_zfree; - png_ptr->zstream.opaque = (voidpf)png_ptr; - 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; - } - if (!(png_ptr->flags & PNG_FLAG_ZLIB_CUSTOM_STRATEGY)) - { - if (png_ptr->do_filter != PNG_FILTER_NONE) - png_ptr->zlib_strategy = Z_FILTERED; - else - png_ptr->zlib_strategy = Z_DEFAULT_STRATEGY; - } - if (!(png_ptr->flags & PNG_FLAG_ZLIB_CUSTOM_LEVEL)) - png_ptr->zlib_level = Z_DEFAULT_COMPRESSION; - if (!(png_ptr->flags & PNG_FLAG_ZLIB_CUSTOM_MEM_LEVEL)) - png_ptr->zlib_mem_level = 8; - if (!(png_ptr->flags & PNG_FLAG_ZLIB_CUSTOM_WINDOW_BITS)) - png_ptr->zlib_window_bits = 15; - if (!(png_ptr->flags & PNG_FLAG_ZLIB_CUSTOM_METHOD)) - png_ptr->zlib_method = 8; - if (deflateInit2(&png_ptr->zstream, png_ptr->zlib_level, - png_ptr->zlib_method, png_ptr->zlib_window_bits, - png_ptr->zlib_mem_level, png_ptr->zlib_strategy) != Z_OK) - png_error(png_ptr, "zlib failed to initialize compressor"); - png_ptr->zstream.next_out = png_ptr->zbuf; - png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; - /* libpng is not interested in zstream.data_type */ - /* set it to a predefined value, to avoid its evaluation inside zlib */ - png_ptr->zstream.data_type = Z_BINARY; - - png_ptr->mode = PNG_HAVE_IHDR; -} - -/* 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_structp png_ptr, png_colorp palette, png_uint_32 num_pal) -{ -#ifdef PNG_USE_LOCAL_ARRAYS - PNG_PLTE; -#endif - png_uint_32 i; - png_colorp pal_ptr; - png_byte buf[3]; - - png_debug(1, "in png_write_PLTE\n"); - if (( -#if defined(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\n", png_ptr->num_palette); - - png_write_chunk_start(png_ptr, png_PLTE, num_pal * 3); -#ifndef PNG_NO_POINTER_INDEXING - 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; -} - -/* write an IDAT chunk */ -void /* PRIVATE */ -png_write_IDAT(png_structp png_ptr, png_bytep data, png_size_t length) -{ -#ifdef PNG_USE_LOCAL_ARRAYS - PNG_IDAT; -#endif - png_debug(1, "in png_write_IDAT\n"); - - /* Optimize the CMF field in the zlib stream. */ - /* This hack of the zlib stream is compliant to the stream specification. */ - if (!(png_ptr->mode & PNG_HAVE_IDAT) && - png_ptr->compression_type == PNG_COMPRESSION_TYPE_BASE) - { - unsigned int z_cmf = data[0]; /* zlib compression method and flags */ - if ((z_cmf & 0x0f) == 8 && (z_cmf & 0xf0) <= 0x70) - { - /* Avoid memory underflows and multiplication overflows. */ - /* The conditions below are practically always satisfied; - however, they still must be checked. */ - if (length >= 2 && - png_ptr->height < 16384 && png_ptr->width < 16384) - { - png_uint_32 uncompressed_idat_size = png_ptr->height * - ((png_ptr->width * - png_ptr->channels * png_ptr->bit_depth + 15) >> 3); - unsigned int z_cinfo = z_cmf >> 4; - unsigned int half_z_window_size = 1 << (z_cinfo + 7); - while (uncompressed_idat_size <= half_z_window_size && - half_z_window_size >= 256) - { - z_cinfo--; - half_z_window_size >>= 1; - } - z_cmf = (z_cmf & 0x0f) | (z_cinfo << 4); - if (data[0] != (png_byte)z_cmf) - { - data[0] = (png_byte)z_cmf; - data[1] &= 0xe0; - data[1] += (png_byte)(0x1f - ((z_cmf << 8) + data[1]) % 0x1f); - } - } - } - else - png_error(png_ptr, - "Invalid zlib compression method or flags in IDAT"); - } - - png_write_chunk(png_ptr, png_IDAT, data, length); - png_ptr->mode |= PNG_HAVE_IDAT; -} - -/* write an IEND chunk */ -void /* PRIVATE */ -png_write_IEND(png_structp png_ptr) -{ -#ifdef PNG_USE_LOCAL_ARRAYS - PNG_IEND; -#endif - png_debug(1, "in png_write_IEND\n"); - png_write_chunk(png_ptr, png_IEND, png_bytep_NULL, - (png_size_t)0); - png_ptr->mode |= PNG_HAVE_IEND; -} - -#if defined(PNG_WRITE_gAMA_SUPPORTED) -/* write a gAMA chunk */ -#ifdef PNG_FLOATING_POINT_SUPPORTED -void /* PRIVATE */ -png_write_gAMA(png_structp png_ptr, double file_gamma) -{ -#ifdef PNG_USE_LOCAL_ARRAYS - PNG_gAMA; -#endif - png_uint_32 igamma; - png_byte buf[4]; - - png_debug(1, "in png_write_gAMA\n"); - /* file_gamma is saved in 1/100,000ths */ - igamma = (png_uint_32)(file_gamma * 100000.0 + 0.5); - png_save_uint_32(buf, igamma); - png_write_chunk(png_ptr, png_gAMA, buf, (png_size_t)4); -} -#endif -#ifdef PNG_FIXED_POINT_SUPPORTED -void /* PRIVATE */ -png_write_gAMA_fixed(png_structp png_ptr, png_fixed_point file_gamma) -{ -#ifdef PNG_USE_LOCAL_ARRAYS - PNG_gAMA; -#endif - png_byte buf[4]; - - png_debug(1, "in png_write_gAMA\n"); - /* file_gamma is saved in 1/100,000ths */ - png_save_uint_32(buf, (png_uint_32)file_gamma); - png_write_chunk(png_ptr, png_gAMA, buf, (png_size_t)4); -} -#endif -#endif - -#if defined(PNG_WRITE_sRGB_SUPPORTED) -/* write a sRGB chunk */ -void /* PRIVATE */ -png_write_sRGB(png_structp png_ptr, int srgb_intent) -{ -#ifdef PNG_USE_LOCAL_ARRAYS - PNG_sRGB; -#endif - png_byte buf[1]; - - png_debug(1, "in png_write_sRGB\n"); - if(srgb_intent >= PNG_sRGB_INTENT_LAST) - png_warning(png_ptr, - "Invalid sRGB rendering intent specified"); - buf[0]=(png_byte)srgb_intent; - png_write_chunk(png_ptr, png_sRGB, buf, (png_size_t)1); -} -#endif - -#if defined(PNG_WRITE_iCCP_SUPPORTED) -/* write an iCCP chunk */ -void /* PRIVATE */ -png_write_iCCP(png_structp png_ptr, png_charp name, int compression_type, - png_charp profile, int profile_len) -{ -#ifdef PNG_USE_LOCAL_ARRAYS - PNG_iCCP; -#endif - png_size_t name_len; - png_charp new_name; - compression_state comp; - int embedded_profile_len = 0; - - png_debug(1, "in png_write_iCCP\n"); - - comp.num_output_ptr = 0; - comp.max_output_ptr = 0; - comp.output_ptr = NULL; - comp.input = NULL; - comp.input_len = 0; - - if (name == NULL || (name_len = png_check_keyword(png_ptr, name, - &new_name)) == 0) - { - png_warning(png_ptr, "Empty keyword in iCCP chunk"); - return; - } - - if (compression_type != PNG_COMPRESSION_TYPE_BASE) - png_warning(png_ptr, "Unknown compression type in iCCP chunk"); - - if (profile == NULL) - profile_len = 0; - - if (profile_len > 3) - embedded_profile_len = - ((*( (png_bytep)profile ))<<24) | - ((*( (png_bytep)profile+1))<<16) | - ((*( (png_bytep)profile+2))<< 8) | - ((*( (png_bytep)profile+3)) ); - - if (profile_len < embedded_profile_len) - { - png_warning(png_ptr, - "Embedded profile length too large in iCCP chunk"); - return; - } - - if (profile_len > embedded_profile_len) - { - png_warning(png_ptr, - "Truncating profile to actual length in iCCP chunk"); - profile_len = embedded_profile_len; - } - - if (profile_len) - profile_len = png_text_compress(png_ptr, profile, (png_size_t)profile_len, - PNG_COMPRESSION_TYPE_BASE, &comp); - - /* make sure we include the NULL after the name and the compression type */ - png_write_chunk_start(png_ptr, png_iCCP, - (png_uint_32)name_len+profile_len+2); - new_name[name_len+1]=0x00; - png_write_chunk_data(png_ptr, (png_bytep)new_name, name_len + 2); - - if (profile_len) - png_write_compressed_data_out(png_ptr, &comp); - - png_write_chunk_end(png_ptr); - png_free(png_ptr, new_name); -} -#endif - -#if defined(PNG_WRITE_sPLT_SUPPORTED) -/* write a sPLT chunk */ -void /* PRIVATE */ -png_write_sPLT(png_structp png_ptr, png_sPLT_tp spalette) -{ -#ifdef PNG_USE_LOCAL_ARRAYS - PNG_sPLT; -#endif - png_size_t name_len; - png_charp new_name; - png_byte entrybuf[10]; - int entry_size = (spalette->depth == 8 ? 6 : 10); - int palette_size = entry_size * spalette->nentries; - png_sPLT_entryp ep; -#ifdef PNG_NO_POINTER_INDEXING - int i; -#endif - - png_debug(1, "in png_write_sPLT\n"); - if (spalette->name == NULL || (name_len = png_check_keyword(png_ptr, - spalette->name, &new_name))==0) - { - png_warning(png_ptr, "Empty keyword in sPLT chunk"); - return; - } - - /* make sure we include the NULL after the name */ - png_write_chunk_start(png_ptr, png_sPLT, - (png_uint_32)(name_len + 2 + palette_size)); - png_write_chunk_data(png_ptr, (png_bytep)new_name, name_len + 1); - png_write_chunk_data(png_ptr, (png_bytep)&spalette->depth, 1); - - /* loop through each palette entry, writing appropriately */ -#ifndef PNG_NO_POINTER_INDEXING - 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, (png_size_t)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); - png_free(png_ptr, new_name); -} -#endif - -#if defined(PNG_WRITE_sBIT_SUPPORTED) -/* write the sBIT chunk */ -void /* PRIVATE */ -png_write_sBIT(png_structp png_ptr, png_color_8p sbit, int color_type) -{ -#ifdef PNG_USE_LOCAL_ARRAYS - PNG_sBIT; -#endif - png_byte buf[4]; - png_size_t size; - - png_debug(1, "in png_write_sBIT\n"); - /* 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_chunk(png_ptr, png_sBIT, buf, size); -} -#endif - -#if defined(PNG_WRITE_cHRM_SUPPORTED) -/* write the cHRM chunk */ -#ifdef PNG_FLOATING_POINT_SUPPORTED -void /* PRIVATE */ -png_write_cHRM(png_structp png_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) -{ -#ifdef PNG_USE_LOCAL_ARRAYS - PNG_cHRM; -#endif - png_byte buf[32]; - png_uint_32 itemp; - - png_debug(1, "in png_write_cHRM\n"); - /* each value is saved in 1/100,000ths */ - if (white_x < 0 || white_x > 0.8 || white_y < 0 || white_y > 0.8 || - white_x + white_y > 1.0) - { - png_warning(png_ptr, "Invalid cHRM white point specified"); -#if !defined(PNG_NO_CONSOLE_IO) - fprintf(stderr,"white_x=%f, white_y=%f\n",white_x, white_y); -#endif - return; - } - itemp = (png_uint_32)(white_x * 100000.0 + 0.5); - png_save_uint_32(buf, itemp); - itemp = (png_uint_32)(white_y * 100000.0 + 0.5); - png_save_uint_32(buf + 4, itemp); - - if (red_x < 0 || red_y < 0 || red_x + red_y > 1.0) - { - png_warning(png_ptr, "Invalid cHRM red point specified"); - return; - } - itemp = (png_uint_32)(red_x * 100000.0 + 0.5); - png_save_uint_32(buf + 8, itemp); - itemp = (png_uint_32)(red_y * 100000.0 + 0.5); - png_save_uint_32(buf + 12, itemp); - - if (green_x < 0 || green_y < 0 || green_x + green_y > 1.0) - { - png_warning(png_ptr, "Invalid cHRM green point specified"); - return; - } - itemp = (png_uint_32)(green_x * 100000.0 + 0.5); - png_save_uint_32(buf + 16, itemp); - itemp = (png_uint_32)(green_y * 100000.0 + 0.5); - png_save_uint_32(buf + 20, itemp); - - if (blue_x < 0 || blue_y < 0 || blue_x + blue_y > 1.0) - { - png_warning(png_ptr, "Invalid cHRM blue point specified"); - return; - } - itemp = (png_uint_32)(blue_x * 100000.0 + 0.5); - png_save_uint_32(buf + 24, itemp); - itemp = (png_uint_32)(blue_y * 100000.0 + 0.5); - png_save_uint_32(buf + 28, itemp); - - png_write_chunk(png_ptr, png_cHRM, buf, (png_size_t)32); -} -#endif -#ifdef PNG_FIXED_POINT_SUPPORTED -void /* PRIVATE */ -png_write_cHRM_fixed(png_structp png_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) -{ -#ifdef PNG_USE_LOCAL_ARRAYS - PNG_cHRM; -#endif - png_byte buf[32]; - - png_debug(1, "in png_write_cHRM\n"); - /* each value is saved in 1/100,000ths */ - if (white_x > 80000L || white_y > 80000L || white_x + white_y > 100000L) - { - png_warning(png_ptr, "Invalid fixed cHRM white point specified"); -#if !defined(PNG_NO_CONSOLE_IO) - fprintf(stderr,"white_x=%ld, white_y=%ld\n",white_x, white_y); -#endif - return; - } - png_save_uint_32(buf, (png_uint_32)white_x); - png_save_uint_32(buf + 4, (png_uint_32)white_y); - - if (red_x + red_y > 100000L) - { - png_warning(png_ptr, "Invalid cHRM fixed red point specified"); - return; - } - png_save_uint_32(buf + 8, (png_uint_32)red_x); - png_save_uint_32(buf + 12, (png_uint_32)red_y); - - if (green_x + green_y > 100000L) - { - png_warning(png_ptr, "Invalid fixed cHRM green point specified"); - return; - } - png_save_uint_32(buf + 16, (png_uint_32)green_x); - png_save_uint_32(buf + 20, (png_uint_32)green_y); - - if (blue_x + blue_y > 100000L) - { - png_warning(png_ptr, "Invalid fixed cHRM blue point specified"); - return; - } - png_save_uint_32(buf + 24, (png_uint_32)blue_x); - png_save_uint_32(buf + 28, (png_uint_32)blue_y); - - png_write_chunk(png_ptr, png_cHRM, buf, (png_size_t)32); -} -#endif -#endif - -#if defined(PNG_WRITE_tRNS_SUPPORTED) -/* write the tRNS chunk */ -void /* PRIVATE */ -png_write_tRNS(png_structp png_ptr, png_bytep trans, png_color_16p tran, - int num_trans, int color_type) -{ -#ifdef PNG_USE_LOCAL_ARRAYS - PNG_tRNS; -#endif - png_byte buf[6]; - - png_debug(1, "in png_write_tRNS\n"); - if (color_type == PNG_COLOR_TYPE_PALETTE) - { - if (num_trans <= 0 || num_trans > (int)png_ptr->num_palette) - { - png_warning(png_ptr,"Invalid number of transparent colors specified"); - return; - } - /* write the chunk out as it is */ - png_write_chunk(png_ptr, png_tRNS, trans, (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_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_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); - if(png_ptr->bit_depth == 8 && (buf[0] | buf[2] | buf[4])) - { - png_warning(png_ptr, - "Ignoring attempt to write 16-bit tRNS chunk when bit_depth is 8"); - return; - } - png_write_chunk(png_ptr, png_tRNS, buf, (png_size_t)6); - } - else - { - png_warning(png_ptr, "Can't write tRNS with an alpha channel"); - } -} -#endif - -#if defined(PNG_WRITE_bKGD_SUPPORTED) -/* write the background chunk */ -void /* PRIVATE */ -png_write_bKGD(png_structp png_ptr, png_color_16p back, int color_type) -{ -#ifdef PNG_USE_LOCAL_ARRAYS - PNG_bKGD; -#endif - png_byte buf[6]; - - png_debug(1, "in png_write_bKGD\n"); - if (color_type == PNG_COLOR_TYPE_PALETTE) - { - if ( -#if defined(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_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); - if(png_ptr->bit_depth == 8 && (buf[0] | buf[2] | buf[4])) - { - png_warning(png_ptr, - "Ignoring attempt to write 16-bit bKGD chunk when bit_depth is 8"); - return; - } - png_write_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_chunk(png_ptr, png_bKGD, buf, (png_size_t)2); - } -} -#endif - -#if defined(PNG_WRITE_hIST_SUPPORTED) -/* write the histogram */ -void /* PRIVATE */ -png_write_hIST(png_structp png_ptr, png_uint_16p hist, int num_hist) -{ -#ifdef PNG_USE_LOCAL_ARRAYS - PNG_hIST; -#endif - int i; - png_byte buf[3]; - - png_debug(1, "in png_write_hIST\n"); - if (num_hist > (int)png_ptr->num_palette) - { - png_debug2(3, "num_hist = %d, num_palette = %d\n", num_hist, - png_ptr->num_palette); - png_warning(png_ptr, "Invalid number of histogram entries specified"); - return; - } - - png_write_chunk_start(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 - -#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 is allocated to hold the corrected keyword and must be freed - * by the calling routine. This avoids problems with trying to write to - * static keywords without having to have duplicate copies of the strings. - */ -png_size_t /* PRIVATE */ -png_check_keyword(png_structp png_ptr, png_charp key, png_charpp new_key) -{ - png_size_t key_len; - png_charp kp, dp; - int kflag; - int kwarn=0; - - png_debug(1, "in png_check_keyword\n"); - *new_key = NULL; - - if (key == NULL || (key_len = png_strlen(key)) == 0) - { - png_warning(png_ptr, "zero length keyword"); - return ((png_size_t)0); - } - - png_debug1(2, "Keyword to be checked is '%s'\n", key); - - *new_key = (png_charp)png_malloc_warn(png_ptr, (png_uint_32)(key_len + 2)); - if (*new_key == NULL) - { - png_warning(png_ptr, "Out of memory while procesing keyword"); - return ((png_size_t)0); - } - - /* Replace non-printing characters with a blank and print a warning */ - for (kp = key, dp = *new_key; *kp != '\0'; kp++, dp++) - { - if ((png_byte)*kp < 0x20 || - ((png_byte)*kp > 0x7E && (png_byte)*kp < 0xA1)) - { -#if !defined(PNG_NO_STDIO) && !defined(_WIN32_WCE) - char msg[40]; - - png_snprintf(msg, 40, - "invalid keyword character 0x%02X", (png_byte)*kp); - png_warning(png_ptr, msg); -#else - png_warning(png_ptr, "invalid character in keyword"); -#endif - *dp = ' '; - } - else - { - *dp = *kp; - } - } - *dp = '\0'; - - /* Remove any trailing white space. */ - kp = *new_key + key_len - 1; - if (*kp == ' ') - { - png_warning(png_ptr, "trailing spaces removed from keyword"); - - while (*kp == ' ') - { - *(kp--) = '\0'; - key_len--; - } - } - - /* Remove any leading white space. */ - kp = *new_key; - if (*kp == ' ') - { - png_warning(png_ptr, "leading spaces removed from keyword"); - - while (*kp == ' ') - { - kp++; - key_len--; - } - } - - png_debug1(2, "Checking for multiple internal spaces in '%s'\n", kp); - - /* Remove multiple internal spaces. */ - for (kflag = 0, dp = *new_key; *kp != '\0'; kp++) - { - if (*kp == ' ' && kflag == 0) - { - *(dp++) = *kp; - kflag = 1; - } - else if (*kp == ' ') - { - key_len--; - kwarn=1; - } - else - { - *(dp++) = *kp; - kflag = 0; - } - } - *dp = '\0'; - if(kwarn) - png_warning(png_ptr, "extra interior spaces removed from keyword"); - - if (key_len == 0) - { - png_free(png_ptr, *new_key); - *new_key=NULL; - png_warning(png_ptr, "Zero length keyword"); - } - - if (key_len > 79) - { - png_warning(png_ptr, "keyword length must be 1 - 79 characters"); - new_key[79] = '\0'; - key_len = 79; - } - - return (key_len); -} -#endif - -#if defined(PNG_WRITE_tEXt_SUPPORTED) -/* write a tEXt chunk */ -void /* PRIVATE */ -png_write_tEXt(png_structp png_ptr, png_charp key, png_charp text, - png_size_t text_len) -{ -#ifdef PNG_USE_LOCAL_ARRAYS - PNG_tEXt; -#endif - png_size_t key_len; - png_charp new_key; - - png_debug(1, "in png_write_tEXt\n"); - if (key == NULL || (key_len = png_check_keyword(png_ptr, key, &new_key))==0) - { - png_warning(png_ptr, "Empty keyword in tEXt chunk"); - return; - } - - if (text == NULL || *text == '\0') - text_len = 0; - else - text_len = png_strlen(text); - - /* make sure we include the 0 after the key */ - png_write_chunk_start(png_ptr, png_tEXt, (png_uint_32)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, (png_bytep)new_key, key_len + 1); - if (text_len) - png_write_chunk_data(png_ptr, (png_bytep)text, text_len); - - png_write_chunk_end(png_ptr); - png_free(png_ptr, new_key); -} -#endif - -#if defined(PNG_WRITE_zTXt_SUPPORTED) -/* write a compressed text chunk */ -void /* PRIVATE */ -png_write_zTXt(png_structp png_ptr, png_charp key, png_charp text, - png_size_t text_len, int compression) -{ -#ifdef PNG_USE_LOCAL_ARRAYS - PNG_zTXt; -#endif - png_size_t key_len; - char buf[1]; - png_charp new_key; - compression_state comp; - - png_debug(1, "in png_write_zTXt\n"); - - comp.num_output_ptr = 0; - comp.max_output_ptr = 0; - comp.output_ptr = NULL; - comp.input = NULL; - comp.input_len = 0; - - if (key == NULL || (key_len = png_check_keyword(png_ptr, key, &new_key))==0) - { - png_warning(png_ptr, "Empty keyword in zTXt chunk"); - return; - } - - if (text == NULL || *text == '\0' || compression==PNG_TEXT_COMPRESSION_NONE) - { - png_write_tEXt(png_ptr, new_key, text, (png_size_t)0); - png_free(png_ptr, new_key); - return; - } - - text_len = png_strlen(text); - - /* compute the compressed data; do it now for the length */ - text_len = png_text_compress(png_ptr, text, text_len, compression, - &comp); - - /* write start of chunk */ - png_write_chunk_start(png_ptr, png_zTXt, (png_uint_32) - (key_len+text_len+2)); - /* write key */ - png_write_chunk_data(png_ptr, (png_bytep)new_key, key_len + 1); - png_free(png_ptr, new_key); - - buf[0] = (png_byte)compression; - /* write compression */ - png_write_chunk_data(png_ptr, (png_bytep)buf, (png_size_t)1); - /* write the compressed data */ - png_write_compressed_data_out(png_ptr, &comp); - - /* close the chunk */ - png_write_chunk_end(png_ptr); -} -#endif - -#if defined(PNG_WRITE_iTXt_SUPPORTED) -/* write an iTXt chunk */ -void /* PRIVATE */ -png_write_iTXt(png_structp png_ptr, int compression, png_charp key, - png_charp lang, png_charp lang_key, png_charp text) -{ -#ifdef PNG_USE_LOCAL_ARRAYS - PNG_iTXt; -#endif - png_size_t lang_len, key_len, lang_key_len, text_len; - png_charp new_lang, new_key; - png_byte cbuf[2]; - compression_state comp; - - png_debug(1, "in png_write_iTXt\n"); - - comp.num_output_ptr = 0; - comp.max_output_ptr = 0; - comp.output_ptr = NULL; - comp.input = NULL; - - if (key == NULL || (key_len = png_check_keyword(png_ptr, key, &new_key))==0) - { - png_warning(png_ptr, "Empty keyword in iTXt chunk"); - return; - } - if (lang == NULL || (lang_len = png_check_keyword(png_ptr, lang, &new_lang))==0) - { - png_warning(png_ptr, "Empty language field in iTXt chunk"); - new_lang = NULL; - lang_len = 0; - } - - if (lang_key == NULL) - lang_key_len = 0; - else - lang_key_len = png_strlen(lang_key); - - if (text == NULL) - text_len = 0; - else - text_len = png_strlen(text); - - /* compute the compressed data; do it now for the length */ - text_len = png_text_compress(png_ptr, text, text_len, compression-2, - &comp); - - - /* make sure we include the compression flag, the compression byte, - * and the NULs after the key, lang, and lang_key parts */ - - png_write_chunk_start(png_ptr, png_iTXt, - (png_uint_32)( - 5 /* comp byte, comp flag, terminators for key, lang and lang_key */ - + key_len - + lang_len - + lang_key_len - + text_len)); - - /* - * 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, (png_bytep)new_key, key_len + 1); - - /* set the compression flag */ - if (compression == PNG_ITXT_COMPRESSION_NONE || \ - compression == PNG_TEXT_COMPRESSION_NONE) - cbuf[0] = 0; - else /* compression == PNG_ITXT_COMPRESSION_zTXt */ - cbuf[0] = 1; - /* set the compression method */ - cbuf[1] = 0; - png_write_chunk_data(png_ptr, cbuf, 2); - - cbuf[0] = 0; - png_write_chunk_data(png_ptr, (new_lang ? (png_bytep)new_lang : cbuf), lang_len + 1); - png_write_chunk_data(png_ptr, (lang_key ? (png_bytep)lang_key : cbuf), lang_key_len + 1); - png_write_compressed_data_out(png_ptr, &comp); - - png_write_chunk_end(png_ptr); - png_free(png_ptr, new_key); - if (new_lang) - png_free(png_ptr, new_lang); -} -#endif - -#if defined(PNG_WRITE_oFFs_SUPPORTED) -/* write the oFFs chunk */ -void /* PRIVATE */ -png_write_oFFs(png_structp png_ptr, png_int_32 x_offset, png_int_32 y_offset, - int unit_type) -{ -#ifdef PNG_USE_LOCAL_ARRAYS - PNG_oFFs; -#endif - png_byte buf[9]; - - png_debug(1, "in png_write_oFFs\n"); - 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_chunk(png_ptr, png_oFFs, buf, (png_size_t)9); -} -#endif -#if defined(PNG_WRITE_pCAL_SUPPORTED) -/* write the pCAL chunk (described in the PNG extensions document) */ -void /* PRIVATE */ -png_write_pCAL(png_structp png_ptr, png_charp purpose, png_int_32 X0, - png_int_32 X1, int type, int nparams, png_charp units, png_charpp params) -{ -#ifdef PNG_USE_LOCAL_ARRAYS - PNG_pCAL; -#endif - png_size_t purpose_len, units_len, total_len; - png_uint_32p params_len; - png_byte buf[10]; - png_charp new_purpose; - int i; - - png_debug1(1, "in png_write_pCAL (%d parameters)\n", nparams); - if (type >= PNG_EQUATION_LAST) - png_warning(png_ptr, "Unrecognized equation type for pCAL chunk"); - - purpose_len = png_check_keyword(png_ptr, purpose, &new_purpose) + 1; - png_debug1(3, "pCAL purpose length = %d\n", (int)purpose_len); - units_len = png_strlen(units) + (nparams == 0 ? 0 : 1); - png_debug1(3, "pCAL units length = %d\n", (int)units_len); - total_len = purpose_len + units_len + 10; - - params_len = (png_uint_32p)png_malloc(png_ptr, (png_uint_32)(nparams - *png_sizeof(png_uint_32))); - - /* 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] = png_strlen(params[i]) + (i == nparams - 1 ? 0 : 1); - png_debug2(3, "pCAL parameter %d length = %lu\n", i, params_len[i]); - total_len += (png_size_t)params_len[i]; - } - - png_debug1(3, "pCAL total length = %d\n", (int)total_len); - png_write_chunk_start(png_ptr, png_pCAL, (png_uint_32)total_len); - png_write_chunk_data(png_ptr, (png_bytep)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_bytep)units, (png_size_t)units_len); - - png_free(png_ptr, new_purpose); - - for (i = 0; i < nparams; i++) - { - png_write_chunk_data(png_ptr, (png_bytep)params[i], - (png_size_t)params_len[i]); - } - - png_free(png_ptr, params_len); - png_write_chunk_end(png_ptr); -} -#endif - -#if defined(PNG_WRITE_sCAL_SUPPORTED) -/* write the sCAL chunk */ -#if defined(PNG_FLOATING_POINT_SUPPORTED) && !defined(PNG_NO_STDIO) -void /* PRIVATE */ -png_write_sCAL(png_structp png_ptr, int unit, double width, double height) -{ -#ifdef PNG_USE_LOCAL_ARRAYS - PNG_sCAL; -#endif - char buf[64]; - png_size_t total_len; - - png_debug(1, "in png_write_sCAL\n"); - - buf[0] = (char)unit; -#if defined(_WIN32_WCE) -/* sprintf() function is not supported on WindowsCE */ - { - wchar_t wc_buf[32]; - size_t wc_len; - swprintf(wc_buf, TEXT("%12.12e"), width); - wc_len = wcslen(wc_buf); - WideCharToMultiByte(CP_ACP, 0, wc_buf, -1, buf + 1, wc_len, NULL, NULL); - total_len = wc_len + 2; - swprintf(wc_buf, TEXT("%12.12e"), height); - wc_len = wcslen(wc_buf); - WideCharToMultiByte(CP_ACP, 0, wc_buf, -1, buf + total_len, wc_len, - NULL, NULL); - total_len += wc_len; - } -#else - png_snprintf(buf + 1, 63, "%12.12e", width); - total_len = 1 + png_strlen(buf + 1) + 1; - png_snprintf(buf + total_len, 64-total_len, "%12.12e", height); - total_len += png_strlen(buf + total_len); -#endif - - png_debug1(3, "sCAL total length = %u\n", (unsigned int)total_len); - png_write_chunk(png_ptr, png_sCAL, (png_bytep)buf, total_len); -} -#else -#ifdef PNG_FIXED_POINT_SUPPORTED -void /* PRIVATE */ -png_write_sCAL_s(png_structp png_ptr, int unit, png_charp width, - png_charp height) -{ -#ifdef PNG_USE_LOCAL_ARRAYS - PNG_sCAL; -#endif - png_byte buf[64]; - png_size_t wlen, hlen, total_len; - - png_debug(1, "in png_write_sCAL_s\n"); - - wlen = png_strlen(width); - hlen = png_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; - png_memcpy(buf + 1, width, wlen + 1); /* append the '\0' here */ - png_memcpy(buf + wlen + 2, height, hlen); /* do NOT append the '\0' here */ - - png_debug1(3, "sCAL total length = %u\n", (unsigned int)total_len); - png_write_chunk(png_ptr, png_sCAL, buf, total_len); -} -#endif -#endif -#endif - -#if defined(PNG_WRITE_pHYs_SUPPORTED) -/* write the pHYs chunk */ -void /* PRIVATE */ -png_write_pHYs(png_structp png_ptr, png_uint_32 x_pixels_per_unit, - png_uint_32 y_pixels_per_unit, - int unit_type) -{ -#ifdef PNG_USE_LOCAL_ARRAYS - PNG_pHYs; -#endif - png_byte buf[9]; - - png_debug(1, "in png_write_pHYs\n"); - 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_chunk(png_ptr, png_pHYs, buf, (png_size_t)9); -} -#endif - -#if defined(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_structp png_ptr, png_timep mod_time) -{ -#ifdef PNG_USE_LOCAL_ARRAYS - PNG_tIME; -#endif - png_byte buf[7]; - - png_debug(1, "in png_write_tIME\n"); - 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_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_structp png_ptr) -{ -#ifdef PNG_WRITE_INTERLACING_SUPPORTED -#ifdef PNG_USE_LOCAL_ARRAYS - /* arrays to facilitate easy interlacing - use pass (0 - 6) as index */ - - /* start of interlace block */ - int png_pass_start[7] = {0, 4, 0, 2, 0, 1, 0}; - - /* offset to next interlace block */ - int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1}; - - /* start of interlace block in the y direction */ - int png_pass_ystart[7] = {0, 0, 4, 0, 2, 0, 1}; - - /* offset to next interlace block in the y direction */ - int png_pass_yinc[7] = {8, 8, 8, 4, 4, 2, 2}; -#endif -#endif - - png_size_t buf_size; - - png_debug(1, "in png_write_start_row\n"); - buf_size = (png_size_t)(PNG_ROWBYTES( - png_ptr->usr_channels*png_ptr->usr_bit_depth,png_ptr->width)+1); - - /* set up row buffer */ - png_ptr->row_buf = (png_bytep)png_malloc(png_ptr, (png_uint_32)buf_size); - png_ptr->row_buf[0] = PNG_FILTER_VALUE_NONE; - -#ifndef PNG_NO_WRITE_FILTERING - /* 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_malloc(png_ptr, (png_uint_32)buf_size); - png_memset(png_ptr->prev_row, 0, 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_NO_WRITE_FILTERING */ - } - -#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; - } - png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; - png_ptr->zstream.next_out = png_ptr->zbuf; -} - -/* Internal use only. Called when finished processing a row of data. */ -void /* PRIVATE */ -png_write_finish_row(png_structp png_ptr) -{ -#ifdef PNG_WRITE_INTERLACING_SUPPORTED -#ifdef PNG_USE_LOCAL_ARRAYS - /* arrays to facilitate easy interlacing - use pass (0 - 6) as index */ - - /* start of interlace block */ - int png_pass_start[7] = {0, 4, 0, 2, 0, 1, 0}; - - /* offset to next interlace block */ - int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1}; - - /* start of interlace block in the y direction */ - int png_pass_ystart[7] = {0, 0, 4, 0, 2, 0, 1}; - - /* offset to next interlace block in the y direction */ - int png_pass_yinc[7] = {8, 8, 8, 4, 4, 2, 2}; -#endif -#endif - - int ret; - - png_debug(1, "in png_write_finish_row\n"); - /* 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) - png_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 */ - do - { - /* tell the compressor we are done */ - ret = deflate(&png_ptr->zstream, Z_FINISH); - /* check for an error */ - if (ret == Z_OK) - { - /* check to see if we need more room */ - if (!(png_ptr->zstream.avail_out)) - { - png_write_IDAT(png_ptr, png_ptr->zbuf, png_ptr->zbuf_size); - png_ptr->zstream.next_out = png_ptr->zbuf; - png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; - } - } - else if (ret != Z_STREAM_END) - { - if (png_ptr->zstream.msg != NULL) - png_error(png_ptr, png_ptr->zstream.msg); - else - png_error(png_ptr, "zlib error"); - } - } while (ret != Z_STREAM_END); - - /* write any extra space */ - if (png_ptr->zstream.avail_out < png_ptr->zbuf_size) - { - png_write_IDAT(png_ptr, png_ptr->zbuf, png_ptr->zbuf_size - - png_ptr->zstream.avail_out); - } - - deflateReset(&png_ptr->zstream); - png_ptr->zstream.data_type = Z_BINARY; -} - -#if defined(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) -{ -#ifdef PNG_USE_LOCAL_ARRAYS - /* arrays to facilitate easy interlacing - use pass (0 - 6) as index */ - - /* start of interlace block */ - int png_pass_start[7] = {0, 4, 0, 2, 0, 1, 0}; - - /* offset to next interlace block */ - int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1}; -#endif - - png_debug(1, "in png_do_write_interlace\n"); - /* we don't have to do anything on the last pass (6) */ -#if defined(PNG_USELESS_TESTS_SUPPORTED) - if (row != NULL && row_info != NULL && pass < 6) -#else - if (pass < 6) -#endif - { - /* 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) - png_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. - */ -#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_structp png_ptr, png_row_infop row_info) -{ - png_bytep best_row; -#ifndef PNG_NO_WRITE_FILTER - png_bytep prev_row, row_buf; - png_uint_32 mins, bpp; - png_byte filter_to_do = png_ptr->do_filter; - png_uint_32 row_bytes = row_info->rowbytes; -#if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) - int num_p_filters = (int)png_ptr->num_prev_filters; -#endif - - png_debug(1, "in png_write_find_filter\n"); - /* 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; -#ifndef PNG_NO_WRITE_FILTER - 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_uint_32 i; - int v; - - for (i = 0, rp = row_buf + 1; i < row_bytes; i++, rp++) - { - v = *rp; - sum += (v < 128) ? v : 256 - v; - } - -#if defined(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_uint_32 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_uint_32 i; - int v; - -#if defined(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; - } - -#if defined(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_uint_32 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_uint_32 i; - int v; - - -#if defined(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; - } - -#if defined(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_uint_32 i; - int v; - -#if defined(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; - } - -#if defined(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_uint_32 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_uint_32 i; - int v; - -#if defined(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; - } - -#if defined(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_NO_WRITE_FILTER */ - /* Do the actual writing of the filtered row data from the chosen filter. */ - - png_write_filtered_row(png_ptr, best_row); - -#ifndef PNG_NO_WRITE_FILTER -#if defined(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_NO_WRITE_FILTER */ -} - - -/* Do the actual writing of a previously filtered row. */ -void /* PRIVATE */ -png_write_filtered_row(png_structp png_ptr, png_bytep filtered_row) -{ - png_debug(1, "in png_write_filtered_row\n"); - png_debug1(2, "filter = %d\n", filtered_row[0]); - /* set up the zlib input buffer */ - - png_ptr->zstream.next_in = filtered_row; - png_ptr->zstream.avail_in = (uInt)png_ptr->row_info.rowbytes + 1; - /* repeat until we have compressed all the data */ - do - { - int ret; /* return of zlib */ - - /* compress the data */ - ret = deflate(&png_ptr->zstream, Z_NO_FLUSH); - /* check for compression errors */ - if (ret != Z_OK) - { - if (png_ptr->zstream.msg != NULL) - png_error(png_ptr, png_ptr->zstream.msg); - else - png_error(png_ptr, "zlib error"); - } - - /* see if it is time to write another IDAT */ - if (!(png_ptr->zstream.avail_out)) - { - /* write the IDAT and reset the zlib output buffer */ - png_write_IDAT(png_ptr, png_ptr->zbuf, png_ptr->zbuf_size); - png_ptr->zstream.next_out = png_ptr->zbuf; - png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; - } - /* repeat until all data has been compressed */ - } while (png_ptr->zstream.avail_in); - - /* 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); - -#if defined(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/src/juce/JuceLibraryCode/modules/juce_graphics/images/juce_Image.cpp b/src/juce/JuceLibraryCode/modules/juce_graphics/images/juce_Image.cpp deleted file mode 100644 index cf49ccbd..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/images/juce_Image.cpp +++ /dev/null @@ -1,639 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce 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() -{ -} - -//============================================================================== -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), dest.lineStride); - - return newImage; -} - -//============================================================================== -NativeImageType::NativeImageType() {} -NativeImageType::~NativeImageType() {} - -int NativeImageType::getTypeID() const -{ - return 1; -} - -//============================================================================== -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() - { - return new LowLevelGraphicsSoftwareRenderer (Image (this)); - } - - void initialiseBitmapData (Image::BitmapData& bitmap, int x, int y, Image::BitmapData::ReadWriteMode) - { - bitmap.data = imageData + x * pixelStride + y * lineStride; - bitmap.pixelFormat = pixelFormat; - bitmap.lineStride = lineStride; - bitmap.pixelStride = pixelStride; - } - - ImagePixelData* clone() - { - SoftwarePixelData* s = new SoftwarePixelData (pixelFormat, width, height, false); - memcpy (s->imageData, imageData, (size_t) (lineStride * height)); - return s; - } - - ImageType* createType() const { return new SoftwareImageType(); } - -private: - HeapBlock imageData; - const int pixelStride, lineStride; - - JUCE_LEAK_DETECTOR (SoftwarePixelData); -}; - -SoftwareImageType::SoftwareImageType() {} -SoftwareImageType::~SoftwareImageType() {} - -ImagePixelData* 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; -} - -//============================================================================== -class SubsectionPixelData : public ImagePixelData -{ -public: - SubsectionPixelData (ImagePixelData* const image_, const Rectangle& area_) - : ImagePixelData (image_->pixelFormat, area_.getWidth(), area_.getHeight()), - image (image_), area (area_) - { - } - - LowLevelGraphicsContext* createLowLevelContext() - { - LowLevelGraphicsContext* g = image->createLowLevelContext(); - g->clipToRectangle (area); - g->setOrigin (area.getX(), area.getY()); - return g; - } - - void initialiseBitmapData (Image::BitmapData& bitmap, int x, int y, Image::BitmapData::ReadWriteMode mode) - { - image->initialiseBitmapData (bitmap, x + area.getX(), y + area.getY(), mode); - } - - ImagePixelData* clone() - { - 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), -area.getX(), -area.getY()); - } - - newImage.getPixelData()->incReferenceCount(); - return newImage.getPixelData(); - } - - ImageType* createType() const { return image->createType(); } - -private: - const ReferenceCountedObjectPtr 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() -{ -} - -Image::Image (ImagePixelData* const instance) - : 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) - : 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 -{ - return Image (image != nullptr ? image->clone() : nullptr); -} - -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.drawImage (*this, 0, 0, newWidth, newHeight, 0, 0, image->width, 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& image, 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 (image.image != nullptr); - jassert (x >= 0 && y >= 0 && w > 0 && h > 0 && x + w <= image.getWidth() && y + h <= image.getHeight()); - - image.image->initialiseBitmapData (*this, x, y, mode); - jassert (data != nullptr && pixelStride > 0 && lineStride != 0); -} - -Image::BitmapData::BitmapData (const Image& image, 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 (image.image != nullptr); - jassert (x >= 0 && y >= 0 && w > 0 && h > 0 && x + w <= image.getWidth() && y + h <= image.getHeight()); - - image.image->initialiseBitmapData (*this, x, y, readOnly); - jassert (data != nullptr && pixelStride > 0 && lineStride != 0); -} - -Image::BitmapData::BitmapData (const Image& image, BitmapData::ReadWriteMode mode) - : width (image.getWidth()), - height (image.getHeight()) -{ - // The BitmapData class must be given a valid image! - jassert (image.image != nullptr); - - image.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, const 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, const 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, const 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/src/juce/JuceLibraryCode/modules/juce_graphics/images/juce_Image.h b/src/juce/JuceLibraryCode/modules/juce_graphics/images/juce_Image.h deleted file mode 100644 index 84f084d3..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/images/juce_Image.h +++ /dev/null @@ -1,518 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_IMAGE_JUCEHEADER__ -#define __JUCE_IMAGE_JUCEHEADER__ - -#include "../colour/juce_Colour.h" -#include "../contexts/juce_GraphicsContext.h" - -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(); - - /** 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& other); - - /** 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&& other) 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, const 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 co-ordinates 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 co-ordinates 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, const Colour& colour); - - /** Changes the opacity of a pixel. - - This only has an effect if the image has an alpha channel and if the - given co-ordinates are inside the image's boundary. - - The multiplier must be in the range 0 to 1.0, and the current alpha - at the given co-ordinates 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 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 co-ordinate 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 co-ordinates 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, const Colour& colour) const noexcept; - - uint8* data; - PixelFormat pixelFormat; - int lineStride, pixelStride, 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 = 0.5f) 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*); - -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; - -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* 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* create (Image::PixelFormat, int width, int height, bool clearImage) const; - int getTypeID() const; -}; - -//============================================================================== -/** - 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* create (Image::PixelFormat, int width, int height, bool clearImage) const; - int getTypeID() const; -}; - - -#endif // __JUCE_IMAGE_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_graphics/images/juce_ImageCache.cpp b/src/juce/JuceLibraryCode/modules/juce_graphics/images/juce_ImageCache.cpp deleted file mode 100644 index a39cfebf..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/images/juce_ImageCache.cpp +++ /dev/null @@ -1,163 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -class ImageCache::Pimpl : public Timer, - public DeletedAtShutdown -{ -public: - Pimpl() - : cacheTimeout (5000) - { - } - - ~Pimpl() - { - clearSingletonInstance(); - } - - Image getFromHashCode (const int64 hashCode) - { - const ScopedLock sl (lock); - - for (int i = images.size(); --i >= 0;) - { - 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() - { - 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(); - } - - struct Item - { - Image image; - int64 hashCode; - uint32 lastUseTime; - }; - - 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) -{ - Pimpl::getInstance()->cacheTimeout = millisecs; -} diff --git a/src/juce/JuceLibraryCode/modules/juce_graphics/images/juce_ImageCache.h b/src/juce/JuceLibraryCode/modules/juce_graphics/images/juce_ImageCache.h deleted file mode 100644 index 8ce7270b..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/images/juce_ImageCache.h +++ /dev/null @@ -1,124 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_IMAGECACHE_JUCEHEADER__ -#define __JUCE_IMAGECACHE_JUCEHEADER__ - -#include "juce_Image.h" - - -//============================================================================== -/** - 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); - - -private: - //============================================================================== - class Pimpl; - friend class Pimpl; - - ImageCache(); - ~ImageCache(); - - JUCE_DECLARE_NON_COPYABLE (ImageCache); -}; - -#endif // __JUCE_IMAGECACHE_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_graphics/images/juce_ImageConvolutionKernel.cpp b/src/juce/JuceLibraryCode/modules/juce_graphics/images/juce_ImageConvolutionKernel.cpp deleted file mode 100644 index 03cbaf37..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/images/juce_ImageConvolutionKernel.cpp +++ /dev/null @@ -1,244 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce 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); - } - } - } -} diff --git a/src/juce/JuceLibraryCode/modules/juce_graphics/images/juce_ImageConvolutionKernel.h b/src/juce/JuceLibraryCode/modules/juce_graphics/images/juce_ImageConvolutionKernel.h deleted file mode 100644 index 2293d3b9..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/images/juce_ImageConvolutionKernel.h +++ /dev/null @@ -1,114 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_IMAGECONVOLUTIONKERNEL_JUCEHEADER__ -#define __JUCE_IMAGECONVOLUTIONKERNEL_JUCEHEADER__ - -#include "juce_Image.h" - - -//============================================================================== -/** - 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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_graphics/images/juce_ImageFileFormat.cpp b/src/juce/JuceLibraryCode/modules/juce_graphics/images/juce_ImageFileFormat.cpp deleted file mode 100644 index 1f6ef55a..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/images/juce_ImageFileFormat.cpp +++ /dev/null @@ -1,88 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -ImageFileFormat* ImageFileFormat::findImageFormatForStream (InputStream& input) -{ - struct DefaultImageFormats - { - PNGImageFormat png; - JPEGImageFormat jpg; - GIFImageFormat gif; - }; - - static DefaultImageFormats defaultImageFormats; - - ImageFileFormat* formats[] = { &defaultImageFormats.png, - &defaultImageFormats.jpg, - &defaultImageFormats.gif }; - - const int64 streamPos = input.getPosition(); - - for (int i = 0; i < numElementsInArray (formats); ++i) - { - const bool found = formats[i]->canUnderstand (input); - input.setPosition (streamPos); - - if (found) - return formats[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/src/juce/JuceLibraryCode/modules/juce_graphics/images/juce_ImageFileFormat.h b/src/juce/JuceLibraryCode/modules/juce_graphics/images/juce_ImageFileFormat.h deleted file mode 100644 index b7cadd10..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/images/juce_ImageFileFormat.h +++ /dev/null @@ -1,209 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_IMAGEFILEFORMAT_JUCEHEADER__ -#define __JUCE_IMAGEFILEFORMAT_JUCEHEADER__ - -#include "juce_Image.h" - - -//============================================================================== -/** - 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. - - @see decodeImage - */ - virtual bool canUnderstand (InputStream& input) = 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 decoders 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); - - //============================================================================== - /** 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(); - bool canUnderstand (InputStream& input); - Image decodeImage (InputStream& input); - bool writeImageToStream (const Image& sourceImage, OutputStream& destStream); -}; - - -//============================================================================== -/** - 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(); - bool canUnderstand (InputStream& input); - Image decodeImage (InputStream& input); - bool writeImageToStream (const Image& sourceImage, OutputStream& destStream); - -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(); - bool canUnderstand (InputStream& input); - Image decodeImage (InputStream& input); - bool writeImageToStream (const Image& sourceImage, OutputStream& destStream); -}; - - -#endif // __JUCE_IMAGEFILEFORMAT_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_graphics/juce_graphics.cpp b/src/juce/JuceLibraryCode/modules/juce_graphics/juce_graphics.cpp deleted file mode 100644 index e5d7646c..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/juce_graphics.cpp +++ /dev/null @@ -1,131 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#if defined (__JUCE_GRAPHICS_MODULE_JUCEHEADER__) && ! 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_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 - -#elif JUCE_IOS - #import - #import - -#elif JUCE_LINUX - #include - #include FT_FREETYPE_H - #undef SIZEOF -#endif - -//============================================================================== -namespace juce -{ - -// START_AUTOINCLUDE colour/*.cpp, geometry/*.cpp, placement/*.cpp, contexts/*.cpp, images/*.cpp, -// image_formats/*.cpp, fonts/*.cpp, effects/*.cpp -#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 "geometry/juce_RectangleList.cpp" -#include "placement/juce_Justification.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_CustomTypeface.cpp" -#include "fonts/juce_Font.cpp" -#include "fonts/juce_GlyphArrangement.cpp" -#include "fonts/juce_TextLayout.cpp" -#include "fonts/juce_Typeface.cpp" -#include "effects/juce_DropShadowEffect.cpp" -#include "effects/juce_GlowEffect.cpp" -// END_AUTOINCLUDE - -//============================================================================== -#if JUCE_MAC || JUCE_IOS - #include "../juce_core/native/juce_osx_ObjCHelpers.h" - #include "../juce_core/native/juce_mac_ObjCSuffix.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" - #if JUCE_DIRECT2D - #include "native/juce_win32_Direct2DGraphicsContext.cpp" - #endif - #include "native/juce_win32_DirectWriteTypeface.cpp" - #include "native/juce_win32_DirectWriteTypeLayout.cpp" - #include "native/juce_win32_Fonts.cpp" - -#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 - -} diff --git a/src/juce/JuceLibraryCode/modules/juce_graphics/juce_graphics.h b/src/juce/JuceLibraryCode/modules/juce_graphics/juce_graphics.h deleted file mode 100644 index cd08b4c1..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/juce_graphics.h +++ /dev/null @@ -1,176 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_GRAPHICS_MODULE_JUCEHEADER__ // %% -#define __JUCE_GRAPHICS_MODULE_JUCEHEADER__ - -#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 1 -#endif - -//============================================================================= -namespace juce -{ - -// START_AUTOINCLUDE colour, geometry, placement, contexts, images, -// image_formats, fonts, effects -#ifndef __JUCE_COLOUR_JUCEHEADER__ - #include "colour/juce_Colour.h" -#endif -#ifndef __JUCE_COLOURGRADIENT_JUCEHEADER__ - #include "colour/juce_ColourGradient.h" -#endif -#ifndef __JUCE_COLOURS_JUCEHEADER__ - #include "colour/juce_Colours.h" -#endif -#ifndef __JUCE_FILLTYPE_JUCEHEADER__ - #include "colour/juce_FillType.h" -#endif -#ifndef __JUCE_PIXELFORMATS_JUCEHEADER__ - #include "colour/juce_PixelFormats.h" -#endif -#ifndef __JUCE_AFFINETRANSFORM_JUCEHEADER__ - #include "geometry/juce_AffineTransform.h" -#endif -#ifndef __JUCE_BORDERSIZE_JUCEHEADER__ - #include "geometry/juce_BorderSize.h" -#endif -#ifndef __JUCE_EDGETABLE_JUCEHEADER__ - #include "geometry/juce_EdgeTable.h" -#endif -#ifndef __JUCE_LINE_JUCEHEADER__ - #include "geometry/juce_Line.h" -#endif -#ifndef __JUCE_PATH_JUCEHEADER__ - #include "geometry/juce_Path.h" -#endif -#ifndef __JUCE_PATHITERATOR_JUCEHEADER__ - #include "geometry/juce_PathIterator.h" -#endif -#ifndef __JUCE_PATHSTROKETYPE_JUCEHEADER__ - #include "geometry/juce_PathStrokeType.h" -#endif -#ifndef __JUCE_POINT_JUCEHEADER__ - #include "geometry/juce_Point.h" -#endif -#ifndef __JUCE_RECTANGLE_JUCEHEADER__ - #include "geometry/juce_Rectangle.h" -#endif -#ifndef __JUCE_RECTANGLELIST_JUCEHEADER__ - #include "geometry/juce_RectangleList.h" -#endif -#ifndef __JUCE_JUSTIFICATION_JUCEHEADER__ - #include "placement/juce_Justification.h" -#endif -#ifndef __JUCE_RECTANGLEPLACEMENT_JUCEHEADER__ - #include "placement/juce_RectanglePlacement.h" -#endif -#ifndef __JUCE_GRAPHICSCONTEXT_JUCEHEADER__ - #include "contexts/juce_GraphicsContext.h" -#endif -#ifndef __JUCE_LOWLEVELGRAPHICSCONTEXT_JUCEHEADER__ - #include "contexts/juce_LowLevelGraphicsContext.h" -#endif -#ifndef __JUCE_LOWLEVELGRAPHICSPOSTSCRIPTRENDERER_JUCEHEADER__ - #include "contexts/juce_LowLevelGraphicsPostScriptRenderer.h" -#endif -#ifndef __JUCE_LOWLEVELGRAPHICSSOFTWARERENDERER_JUCEHEADER__ - #include "contexts/juce_LowLevelGraphicsSoftwareRenderer.h" -#endif -#ifndef __JUCE_IMAGE_JUCEHEADER__ - #include "images/juce_Image.h" -#endif -#ifndef __JUCE_IMAGECACHE_JUCEHEADER__ - #include "images/juce_ImageCache.h" -#endif -#ifndef __JUCE_IMAGECONVOLUTIONKERNEL_JUCEHEADER__ - #include "images/juce_ImageConvolutionKernel.h" -#endif -#ifndef __JUCE_IMAGEFILEFORMAT_JUCEHEADER__ - #include "images/juce_ImageFileFormat.h" -#endif -#ifndef __JUCE_ATTRIBUTEDSTRING_JUCEHEADER__ - #include "fonts/juce_AttributedString.h" -#endif -#ifndef __JUCE_CUSTOMTYPEFACE_JUCEHEADER__ - #include "fonts/juce_CustomTypeface.h" -#endif -#ifndef __JUCE_FONT_JUCEHEADER__ - #include "fonts/juce_Font.h" -#endif -#ifndef __JUCE_GLYPHARRANGEMENT_JUCEHEADER__ - #include "fonts/juce_GlyphArrangement.h" -#endif -#ifndef __JUCE_TEXTLAYOUT_JUCEHEADER__ - #include "fonts/juce_TextLayout.h" -#endif -#ifndef __JUCE_TYPEFACE_JUCEHEADER__ - #include "fonts/juce_Typeface.h" -#endif -#ifndef __JUCE_DROPSHADOWEFFECT_JUCEHEADER__ - #include "effects/juce_DropShadowEffect.h" -#endif -#ifndef __JUCE_GLOWEFFECT_JUCEHEADER__ - #include "effects/juce_GlowEffect.h" -#endif -#ifndef __JUCE_IMAGEEFFECTFILTER_JUCEHEADER__ - #include "effects/juce_ImageEffectFilter.h" -#endif -// END_AUTOINCLUDE - -} - -#endif // __JUCE_GRAPHICS_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_graphics/juce_graphics.mm b/src/juce/JuceLibraryCode/modules/juce_graphics/juce_graphics.mm deleted file mode 100644 index 22772e4c..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/juce_graphics.mm +++ /dev/null @@ -1,26 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#include "juce_graphics.cpp" diff --git a/src/juce/JuceLibraryCode/modules/juce_graphics/juce_module_info b/src/juce/JuceLibraryCode/modules/juce_graphics/juce_module_info deleted file mode 100644 index 05ba43af..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/juce_module_info +++ /dev/null @@ -1,29 +0,0 @@ -{ - "id": "juce_graphics", - "name": "JUCE graphics classes", - "version": "2.0.21", - "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", - "iOSFrameworks": "CoreGraphics CoreText QuartzCore" -} diff --git a/src/juce/JuceLibraryCode/modules/juce_graphics/native/juce_RenderingHelpers.h b/src/juce/JuceLibraryCode/modules/juce_graphics/native/juce_RenderingHelpers.h deleted file mode 100644 index f58638bf..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/native/juce_RenderingHelpers.h +++ /dev/null @@ -1,433 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_RENDERINGHELPERS_JUCEHEADER__ -#define __JUCE_RENDERINGHELPERS_JUCEHEADER__ - -namespace RenderingHelpers -{ - -//============================================================================== -/** Holds either a simple integer translation, or an affine transform. -*/ -class TranslationOrTransform -{ -public: - TranslationOrTransform (int xOffset_, int yOffset_) noexcept - : xOffset (xOffset_), yOffset (yOffset_), isOnlyTranslated (true) - { - } - - TranslationOrTransform (const TranslationOrTransform& other) noexcept - : complexTransform (other.complexTransform), - xOffset (other.xOffset), yOffset (other.yOffset), - isOnlyTranslated (other.isOnlyTranslated) - { - } - - AffineTransform getTransform() const noexcept - { - return isOnlyTranslated ? AffineTransform::translation ((float) xOffset, (float) yOffset) - : complexTransform; - } - - AffineTransform getTransformWith (const AffineTransform& userTransform) const noexcept - { - return isOnlyTranslated ? userTransform.translated ((float) xOffset, (float) yOffset) - : userTransform.followedBy (complexTransform); - } - - void setOrigin (const int x, const int y) noexcept - { - if (isOnlyTranslated) - { - xOffset += x; - yOffset += y; - } - else - { - complexTransform = AffineTransform::translation ((float) x, (float) y) - .followedBy (complexTransform); - } - } - - void addTransform (const AffineTransform& t) noexcept - { - if (isOnlyTranslated - && t.isOnlyTranslation() - && isIntegerTranslation (t)) - { - xOffset += (int) t.getTranslationX(); - yOffset += (int) t.getTranslationY(); - } - else - { - complexTransform = getTransformWith (t); - isOnlyTranslated = false; - } - } - - float getScaleFactor() const noexcept - { - return isOnlyTranslated ? 1.0f : complexTransform.getScaleFactor(); - } - - void moveOriginInDeviceSpace (const int dx, const int dy) noexcept - { - if (isOnlyTranslated) - { - xOffset += dx; - yOffset += dy; - } - else - { - complexTransform = complexTransform.translated ((float) dx, (float) dy); - } - } - - template - Rectangle translated (const Rectangle& r) const noexcept - { - jassert (isOnlyTranslated); - return r.translated (static_cast (xOffset), - static_cast (yOffset)); - } - - Rectangle deviceSpaceToUserSpace (const Rectangle& r) const noexcept - { - return isOnlyTranslated ? r.translated (-xOffset, -yOffset) - : r.toFloat().transformed (complexTransform.inverted()).getSmallestIntegerContainer(); - } - - AffineTransform complexTransform; - int xOffset, yOffset; - bool isOnlyTranslated; - -private: - static inline bool isIntegerTranslation (const AffineTransform& t) noexcept - { - const int tx = (int) (t.getTranslationX() * 256.0f); - const int ty = (int) (t.getTranslationY() * 256.0f); - return ((tx | ty) & 0xf8) == 0; - } -}; - -//============================================================================== -template -class GlyphCache : private DeletedAtShutdown -{ -public: - GlyphCache() - { - addNewGlyphSlots (120); - } - - ~GlyphCache() - { - getSingletonPointer() = nullptr; - } - - static GlyphCache& getInstance() - { - GlyphCache*& g = getSingletonPointer(); - - if (g == nullptr) - g = new GlyphCache(); - - return *g; - } - - //============================================================================== - void drawGlyph (RenderTargetType& target, const Font& font, const int glyphNumber, float x, float y) - { - ++accessCounter; - CachedGlyphType* glyph = nullptr; - - const ScopedReadLock srl (lock); - - for (int i = glyphs.size(); --i >= 0;) - { - CachedGlyphType* const g = glyphs.getUnchecked (i); - - if (g->glyph == glyphNumber && g->font == font) - { - glyph = g; - ++hits; - break; - } - } - - if (glyph == nullptr) - { - ++misses; - const ScopedWriteLock swl (lock); - - if (hits.value + misses.value > glyphs.size() * 16) - { - if (misses.value * 2 > hits.value) - addNewGlyphSlots (32); - - hits.set (0); - misses.set (0); - glyph = glyphs.getLast(); - } - else - { - glyph = findLeastRecentlyUsedGlyph(); - } - - jassert (glyph != nullptr); - glyph->generate (font, glyphNumber); - } - - glyph->lastAccessCount = accessCounter.value; - glyph->draw (target, x, y); - } - -private: - friend class OwnedArray ; - OwnedArray glyphs; - Atomic accessCounter, hits, misses; - ReadWriteLock lock; - - void addNewGlyphSlots (int num) - { - while (--num >= 0) - glyphs.add (new CachedGlyphType()); - } - - CachedGlyphType* findLeastRecentlyUsedGlyph() const noexcept - { - CachedGlyphType* oldest = glyphs.getLast(); - int oldestCounter = oldest->lastAccessCount; - - for (int i = glyphs.size() - 1; --i >= 0;) - { - CachedGlyphType* const glyph = glyphs.getUnchecked(i); - - if (glyph->lastAccessCount <= oldestCounter) - { - 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); -}; - -//============================================================================== -template -class CachedGlyphEdgeTable -{ -public: - CachedGlyphEdgeTable() : glyph (0), lastAccessCount (0) {} - - void draw (RendererType& state, float x, const float y) const - { - if (snapToIntegerCoordinate) - x = std::floor (x + 0.5f); - - if (edgeTable != nullptr) - state.fillEdgeTable (*edgeTable, x, roundToInt (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) - #if JUCE_MAC || JUCE_IOS - .translated (0.0f, -0.5f) - #endif - ); - } - - Font font; - int glyph, lastAccessCount; - bool snapToIntegerCoordinate; - -private: - ScopedPointer edgeTable; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (CachedGlyphEdgeTable); -}; - -//============================================================================== -template -class SavedStateStack -{ -public: - SavedStateStack (StateObjectType* const initialState) noexcept - : currentState (initialState) - {} - - inline StateObjectType* operator->() const noexcept { return currentState; } - inline StateObjectType& operator*() const noexcept { return *currentState; } - - void save() - { - stack.add (new StateObjectType (*currentState)); - } - - void restore() - { - StateObjectType* const top = stack.getLast(); - - if (top != nullptr) - { - 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); -}; - -//============================================================================== -// 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 -}; - -} - -#endif // __JUCE_RENDERINGHELPERS_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_graphics/native/juce_android_Fonts.cpp b/src/juce/JuceLibraryCode/modules/juce_graphics/native/juce_android_Fonts.cpp deleted file mode 100644 index a04c5223..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/native/juce_android_Fonts.cpp +++ /dev/null @@ -1,227 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -//============================================================================== -#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.add (fonts.getReference(i).getFileNameWithoutExtension()); - - return results; -} - -struct DefaultFontNames -{ - DefaultFontNames() - : defaultSans ("sans"), - defaultSerif ("serif"), - defaultFixed ("monospace"), - defaultFallback ("sans") - { - } - - String defaultSans, defaultSerif, defaultFixed, defaultFallback; -}; - -Typeface::Ptr Font::getDefaultTypefaceForFont (const Font& font) -{ - static DefaultFontNames defaultNames; - - String faceName (font.getTypefaceName()); - - if (faceName == Font::getDefaultSansSerifFontName()) faceName = defaultNames.defaultSans; - else if (faceName == Font::getDefaultSerifFontName()) faceName = defaultNames.defaultSerif; - else if (faceName == Font::getDefaultMonospacedFontName()) faceName = defaultNames.defaultFixed; - - Font f (font); - f.setTypefaceName (faceName); - return Typeface::createSystemTypefaceFor (f); -} - -//============================================================================== -class AndroidTypeface : public Typeface -{ -public: - AndroidTypeface (const Font& font) - : Typeface (font.getTypefaceName()), - ascent (0), - descent (0) - { - jint flags = 0; - if (font.isBold()) flags = 1; - if (font.isItalic()) flags += 2; - - JNIEnv* env = getEnv(); - - File fontFile (File ("/system/fonts").getChildFile (name).withFileExtension (".ttf")); - - 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(), flags)); - - 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())); - - const float standardSize = 256.0f; - paint.callVoidMethod (Paint.setTextSize, standardSize); - ascent = std::abs (paint.callFloatMethod (Paint.ascent)) / standardSize; - descent = paint.callFloatMethod (Paint.descent) / standardSize; - - const float height = ascent + descent; - unitsToHeightScaleFactor = 1.0f / 256.0f; - } - - float getAscent() const { return ascent; } - float getDescent() const { return descent; } - - float getStringWidth (const String& text) - { - 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 * unitsToHeightScaleFactor; - } - - void getGlyphPositions (const String& text, Array& glyphs, Array& xOffsets) - { - 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 * unitsToHeightScaleFactor); - } - } - - bool getOutlineForGlyph (int /*glyphNumber*/, Path& /*destPath*/) - { - return false; - } - - EdgeTable* getEdgeTableForGlyph (int glyphNumber, const AffineTransform& t) - { - JNIEnv* env = getEnv(); - - jobject matrix = GraphicsHelpers::createMatrix (env, AffineTransform::scale (unitsToHeightScaleFactor, unitsToHeightScaleFactor).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, unitsToHeightScaleFactor; - -private: - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AndroidTypeface); -}; - -//============================================================================== -Typeface::Ptr Typeface::createSystemTypefaceFor (const Font& font) -{ - return new AndroidTypeface (font); -} - -bool TextLayout::createNativeLayout (const AttributedString&) -{ - return false; -} diff --git a/src/juce/JuceLibraryCode/modules/juce_graphics/native/juce_android_GraphicsContext.cpp b/src/juce/JuceLibraryCode/modules/juce_graphics/native/juce_android_GraphicsContext.cpp deleted file mode 100644 index 0793958b..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/native/juce_android_GraphicsContext.cpp +++ /dev/null @@ -1,61 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce 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* NativeImageType::create (Image::PixelFormat format, int width, int height, bool clearImage) const -{ - return SoftwareImageType().create (format, width, height, clearImage); -} diff --git a/src/juce/JuceLibraryCode/modules/juce_graphics/native/juce_linux_Fonts.cpp b/src/juce/JuceLibraryCode/modules/juce_graphics/native/juce_linux_Fonts.cpp deleted file mode 100644 index 71324414..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/native/juce_linux_Fonts.cpp +++ /dev/null @@ -1,549 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce 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() - { - if (face != 0) - FT_Done_Face (face); - } - - FT_Face face; - FTLibWrapper::Ptr library; - - typedef ReferenceCountedObjectPtr Ptr; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (FTFaceWrapper); -}; - -//============================================================================== -class LinuxFontFileIterator -{ -public: - LinuxFontFileIterator() - : index (0) - { - fontDirs.addTokens (CharPointer_UTF8 (getenv ("JUCE_FONT_PATH")), ";,", String::empty); - fontDirs.removeEmptyStrings (true); - - if (fontDirs.size() == 0) - { - const ScopedPointer fontsInfo (XmlDocument::parse (File ("/etc/fonts/fonts.conf"))); - - if (fontsInfo != nullptr) - { - forEachXmlChildElementWithTagName (*fontsInfo, e, "dir") - { - fontDirs.add (e->getAllSubText().trim()); - } - } - } - - if (fontDirs.size() == 0) - fontDirs.add ("/usr/X11R6/lib/X11/fonts"); - - fontDirs.removeEmptyStrings (true); - } - - bool next() - { - if (iter != nullptr) - { - while (iter->next()) - if (getFile().hasFileExtension ("ttf;pfb;pcf")) - return true; - } - - if (index >= fontDirs.size()) - return false; - - iter = new DirectoryIterator (fontDirs [index++], true); - return next(); - } - - File getFile() const { jassert (iter != nullptr); return iter->getFile(); } - -private: - StringArray fontDirs; - int index; - ScopedPointer iter; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (LinuxFontFileIterator); -}; - -//============================================================================== -class FTTypefaceList : public DeletedAtShutdown -{ -public: - FTTypefaceList() - : library (new FTLibWrapper()) - { - LinuxFontFileIterator fontFileIterator; - - while (fontFileIterator.next()) - { - int faceIndex = 0; - int numFaces = 0; - - do - { - FTFaceWrapper face (library, fontFileIterator.getFile(), 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 (fontFileIterator.getFile(), faceIndex, face)); - } - - ++faceIndex; - } - while (faceIndex < numFaces); - } - } - - ~FTTypefaceList() - { - clearSingletonInstance(); - } - - //============================================================================== - struct KnownTypeface - { - KnownTypeface (const File& file_, const int faceIndex_, const FTFaceWrapper& face) - : file (file_), - family (face.face->family_name), - faceIndex (faceIndex_), - isBold ((face.face->style_flags & FT_STYLE_FLAG_BOLD) != 0), - isItalic ((face.face->style_flags & FT_STYLE_FLAG_ITALIC) != 0), - isMonospaced ((face.face->face_flags & FT_FACE_FLAG_FIXED_WIDTH) != 0), - isSansSerif (isFaceSansSerif (family)) - { - } - - const File file; - const String family; - const int faceIndex; - const bool isBold, isItalic, isMonospaced, isSansSerif; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (KnownTypeface); - }; - - //============================================================================== - FTFaceWrapper::Ptr createFace (const String& fontName, const bool bold, const bool italic) - { - const KnownTypeface* ftFace = matchTypeface (fontName, bold, italic); - - if (ftFace == nullptr) - { - ftFace = matchTypeface (fontName, ! bold, italic); - - if (ftFace == nullptr) - { - ftFace = matchTypeface (fontName, bold, ! italic); - - if (ftFace == nullptr) - ftFace = matchTypeface (fontName, ! bold, ! italic); - } - } - - if (ftFace != nullptr) - { - FTFaceWrapper::Ptr face (new FTFaceWrapper (library, ftFace->file, ftFace->faceIndex)); - - if (face->face != 0) - { - // If there isn't a unicode charmap then select the first one. - if (FT_Select_Charmap (face->face, ft_encoding_unicode) != 0) - FT_Set_Charmap (face->face, face->face->charmaps[0]); - - return face; - } - } - - return nullptr; - } - - //============================================================================== - void getFamilyNames (StringArray& familyNames) const - { - for (int i = 0; i < faces.size(); i++) - familyNames.addIfNotAlreadyThere (faces.getUnchecked(i)->family); - } - - 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; - - const KnownTypeface* matchTypeface (const String& familyName, const bool wantBold, const bool wantItalic) const noexcept - { - for (int i = 0; i < faces.size(); ++i) - { - const KnownTypeface* const face = faces.getUnchecked(i); - - if (face->family == familyName - && face->isBold == wantBold - && face->isItalic == wantItalic) - return face; - } - - return nullptr; - } - - static bool isFaceSansSerif (const String& family) - { - 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.isBold(), font.isItalic())) - { - if (faceWrapper != nullptr) - { - setCharacteristics (font.getTypefaceName(), - faceWrapper->face->ascender / (float) (faceWrapper->face->ascender - faceWrapper->face->descender), - font.isBold(), font.isItalic(), - L' '); - } - else - { - DBG ("Failed to create typeface: " << font.getTypefaceName() << " " - << (font.isBold() ? 'B' : ' ') << (font.isItalic() ? 'I' : ' ')); - } - } - - 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) == 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); -}; - -//============================================================================== -Typeface::Ptr Typeface::createSystemTypefaceFor (const Font& font) -{ - return new FreeTypeTypeface (font); -} - -StringArray Font::findAllTypefaceNames() -{ - StringArray s; - FTTypefaceList::getInstance()->getFamilyNames (s); - s.sort (true); - return s; -} - -//============================================================================== -struct DefaultFontNames -{ - DefaultFontNames() - : defaultSans (getDefaultSansSerifFontName()), - defaultSerif (getDefaultSerifFontName()), - defaultFixed (getDefaultMonospacedFontName()) - { - } - - String defaultSans, defaultSerif, defaultFixed; - -private: - static String pickBestFont (const StringArray& names, const char* const* choicesArray) - { - const StringArray choices (choicesArray); - - int j; - for (j = 0; j < choices.size(); ++j) - if (names.contains (choices[j], true)) - return choices[j]; - - for (j = 0; j < choices.size(); ++j) - for (int i = 0; i < names.size(); ++i) - if (names[i].startsWithIgnoreCase (choices[j])) - return names[i]; - - for (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); - - const char* targets[] = { "Verdana", "Bitstream Vera Sans", "Luxi Sans", "Sans", 0 }; - return pickBestFont (allFonts, targets); - } - - static String getDefaultSerifFontName() - { - StringArray allFonts; - FTTypefaceList::getInstance()->getSerifNames (allFonts); - - const char* targets[] = { "Bitstream Vera Serif", "Times", "Nimbus Roman", "Serif", 0 }; - return pickBestFont (allFonts, targets); - } - - static String getDefaultMonospacedFontName() - { - StringArray allFonts; - FTTypefaceList::getInstance()->getMonospacedNames (allFonts); - - const char* targets[] = { "Bitstream Vera Sans Mono", "Courier", "Sans Mono", "Mono", 0 }; - return pickBestFont (allFonts, targets); - } - - JUCE_DECLARE_NON_COPYABLE (DefaultFontNames); -}; - -Typeface::Ptr Font::getDefaultTypefaceForFont (const Font& font) -{ - static DefaultFontNames defaultNames; - - String faceName (font.getTypefaceName()); - - if (faceName == getDefaultSansSerifFontName()) faceName = defaultNames.defaultSans; - else if (faceName == getDefaultSerifFontName()) faceName = defaultNames.defaultSerif; - else if (faceName == getDefaultMonospacedFontName()) faceName = defaultNames.defaultFixed; - - Font f (font); - f.setTypefaceName (faceName); - return Typeface::createSystemTypefaceFor (f); -} - -bool TextLayout::createNativeLayout (const AttributedString&) -{ - return false; -} diff --git a/src/juce/JuceLibraryCode/modules/juce_graphics/native/juce_mac_CoreGraphicsContext.h b/src/juce/JuceLibraryCode/modules/juce_graphics/native/juce_mac_CoreGraphicsContext.h deleted file mode 100644 index f701ea88..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/native/juce_mac_CoreGraphicsContext.h +++ /dev/null @@ -1,120 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_MAC_COREGRAPHICSCONTEXT_JUCEHEADER__ -#define __JUCE_MAC_COREGRAPHICSCONTEXT_JUCEHEADER__ - -//============================================================================== -class CoreGraphicsContext : public LowLevelGraphicsContext -{ -public: - CoreGraphicsContext (CGContextRef context_, const float flipHeight_); - ~CoreGraphicsContext(); - - //============================================================================== - bool isVectorDevice() const { return false; } - - void setOrigin (int x, int y); - void addTransform (const AffineTransform& transform); - float getScaleFactor(); - bool clipToRectangle (const Rectangle& r); - bool clipToRectangleList (const RectangleList& clipRegion); - void excludeClipRectangle (const Rectangle& r); - void clipToPath (const Path& path, const AffineTransform& transform); - void clipToImageAlpha (const Image& sourceImage, const AffineTransform& transform); - bool clipRegionIntersects (const Rectangle& r); - Rectangle getClipBounds() const; - bool isClipEmpty() const; - - //============================================================================== - void saveState(); - void restoreState(); - void beginTransparencyLayer (float opacity); - void endTransparencyLayer(); - - //============================================================================== - void setFill (const FillType& fillType); - void setOpacity (float newOpacity); - void setInterpolationQuality (Graphics::ResamplingQuality quality); - - //============================================================================== - void fillRect (const Rectangle& r, const bool replaceExistingContents); - void fillCGRect (const CGRect& cgRect, const bool replaceExistingContents); - void fillPath (const Path& path, const AffineTransform& transform); - void drawImage (const Image& sourceImage, const AffineTransform& transform); - - //============================================================================== - void drawLine (const Line& line); - void drawVerticalLine (const int x, float top, float bottom); - void drawHorizontalLine (const int y, float left, float right); - void setFont (const Font& newFont); - const Font& getFont(); - void drawGlyph (int glyphNumber, const AffineTransform& transform); - bool drawTextLayout (const AttributedString& text, const Rectangle&); - -private: - CGContextRef context; - const CGFloat flipHeight; - CGColorSpaceRef rgbColourSpace, greyColourSpace; - CGFunctionCallbacks gradientCallbacks; - mutable Rectangle lastClipRect; - mutable bool lastClipRectIsValid; - - struct SavedState - { - SavedState(); - SavedState (const SavedState& other); - ~SavedState(); - - void setFill (const FillType& newFill); - CGShadingRef getShading (CoreGraphicsContext& owner); - - static void gradientCallback (void* info, const CGFloat* inData, CGFloat* outData); - - FillType fillType; - Font font; - CGFontRef fontRef; - CGAffineTransform fontTransform; - - private: - CGShadingRef shading; - HeapBlock gradientLookupTable; - int numGradientLookupEntries; - }; - - ScopedPointer state; - OwnedArray stateStack; - - void drawGradient(); - void createPath (const Path& path) const; - void createPath (const Path& path, const AffineTransform& transform) const; - void flip() const; - void applyTransform (const AffineTransform& transform) const; - void drawImage (const Image& sourceImage, const AffineTransform& transform, bool fillEntireClipAsTiles); - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (CoreGraphicsContext); -}; - -#endif // __JUCE_MAC_COREGRAPHICSCONTEXT_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_graphics/native/juce_mac_CoreGraphicsContext.mm b/src/juce/JuceLibraryCode/modules/juce_graphics/native/juce_mac_CoreGraphicsContext.mm deleted file mode 100644 index 454d13c1..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/native/juce_mac_CoreGraphicsContext.mm +++ /dev/null @@ -1,871 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#include "juce_mac_CoreGraphicsContext.h" - -//============================================================================== -class CoreGraphicsImage : public ImagePixelData -{ -public: - CoreGraphicsImage (const Image::PixelFormat format, const int width_, const int height_, const bool clearImage) - : ImagePixelData (format, width_, height_) - { - pixelStride = format == Image::RGB ? 3 : ((format == Image::ARGB) ? 4 : 1); - lineStride = (pixelStride * jmax (1, width) + 3) & ~3; - - imageData.allocate (lineStride * jmax (1, height), clearImage); - - CGColorSpaceRef colourSpace = (format == Image::SingleChannel) ? CGColorSpaceCreateDeviceGray() - : CGColorSpaceCreateDeviceRGB(); - - context = CGBitmapContextCreate (imageData, width, height, 8, lineStride, - colourSpace, getCGImageFlags (format)); - - CGColorSpaceRelease (colourSpace); - } - - ~CoreGraphicsImage() - { - CGContextRelease (context); - } - - LowLevelGraphicsContext* createLowLevelContext() - { - return new CoreGraphicsContext (context, height); - } - - void initialiseBitmapData (Image::BitmapData& bitmap, int x, int y, Image::BitmapData::ReadWriteMode) - { - bitmap.data = imageData + x * pixelStride + y * lineStride; - bitmap.pixelFormat = pixelFormat; - bitmap.lineStride = lineStride; - bitmap.pixelStride = pixelStride; - } - - ImagePixelData* clone() - { - CoreGraphicsImage* im = new CoreGraphicsImage (pixelFormat, width, height, false); - memcpy (im->imageData, imageData, lineStride * height); - return im; - } - - ImageType* createType() const { return new NativeImageType(); } - - //============================================================================== - static CGImageRef createImage (const Image& juceImage, const bool forAlpha, - 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, srcData.lineStride * srcData.height, 0); - } - - CGImageRef imageRef = CGImageCreate (srcData.width, srcData.height, - 8, srcData.pixelStride * 8, srcData.lineStride, - colourSpace, getCGImageFlags (juceImage.getFormat()), provider, - 0, true, kCGRenderingIntentDefault); - - CGDataProviderRelease (provider); - return imageRef; - } - - //============================================================================== - CGContextRef context; - HeapBlock imageData; - int pixelStride, lineStride; - -private: - 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* 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 context_, const float flipHeight_) - : context (context_), - flipHeight (flipHeight_), - lastClipRectIsValid (false), - state (new SavedState()) -{ - CGContextRetain (context); - CGContextSaveGState(context); - CGContextSetShouldSmoothFonts (context, true); - CGContextSetShouldAntialias (context, true); - CGContextSetBlendMode (context, kCGBlendModeNormal); - rgbColourSpace = CGColorSpaceCreateDeviceRGB(); - greyColourSpace = CGColorSpaceCreateDeviceGray(); - gradientCallbacks.version = 0; - gradientCallbacks.evaluate = SavedState::gradientCallback; - gradientCallbacks.releaseInfo = 0; - setFont (Font()); -} - -CoreGraphicsContext::~CoreGraphicsContext() -{ - CGContextRestoreGState (context); - CGContextRelease (context); - CGColorSpaceRelease (rgbColourSpace); - CGColorSpaceRelease (greyColourSpace); -} - -//============================================================================== -void CoreGraphicsContext::setOrigin (int x, int y) -{ - CGContextTranslateCTM (context, x, -y); - - if (lastClipRectIsValid) - lastClipRect.translate (-x, -y); -} - -void CoreGraphicsContext::addTransform (const AffineTransform& transform) -{ - applyTransform (AffineTransform::verticalFlip (flipHeight) - .followedBy (transform) - .translated (0, -flipHeight) - .scaled (1.0f, -1.0f)); - lastClipRectIsValid = false; -} - -float CoreGraphicsContext::getScaleFactor() -{ - CGAffineTransform t = CGContextGetCTM (context); - return (float) juce_hypot (t.a + t.c, t.b + t.d); -} - -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::clipToRectangleList (const RectangleList& clipRegion) -{ - if (clipRegion.isEmpty()) - { - CGContextClipToRect (context, CGRectMake (0, 0, 0, 0)); - lastClipRectIsValid = true; - lastClipRect = Rectangle(); - return false; - } - else - { - const int numRects = clipRegion.getNumRectangles(); - - HeapBlock rects (numRects); - for (int i = 0; i < numRects; ++i) - { - const Rectangle& r = clipRegion.getRectangle(i); - rects[i] = CGRectMake (r.getX(), flipHeight - r.getBottom(), r.getWidth(), r.getHeight()); - } - - CGContextClipToRects (context, rects, numRects); - lastClipRectIsValid = false; - return ! isClipEmpty(); - } -} - -void CoreGraphicsContext::excludeClipRectangle (const Rectangle& r) -{ - RectangleList remaining (getClipBounds()); - remaining.subtract (r); - clipToRectangleList (remaining); - lastClipRectIsValid = false; -} - -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, true, greyColourSpace, true); - - flip(); - AffineTransform t (AffineTransform::verticalFlip (sourceImage.getHeight()).followedBy (transform)); - applyTransform (t); - - CGRect r = CGRectMake (0, 0, sourceImage.getWidth(), sourceImage.getHeight()); - 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); - - SavedState* const top = stateStack.getLast(); - - if (top != nullptr) - { - 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::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::createImage (sourceImage, false, rgbColourSpace, false); - - 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 iPhone 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::drawVerticalLine (const int x, float top, float bottom) -{ - if (state->fillType.isColour()) - { - #if MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_5 - CGContextFillRect (context, CGRectMake (x, flipHeight - bottom, 1.0f, bottom - top)); - #else - // On Leopard, unless both co-ordinates are non-integer, it disables anti-aliasing, so nudge - // the x co-ord slightly to trick it.. - CGContextFillRect (context, CGRectMake (x + 1.0f / 256.0f, flipHeight - bottom, 1.0f + 1.0f / 256.0f, bottom - top)); - #endif - } - else - { - fillCGRect (CGRectMake ((float) x, flipHeight - bottom, 1.0f, bottom - top), false); - } -} - -void CoreGraphicsContext::drawHorizontalLine (const int y, float left, float right) -{ - if (state->fillType.isColour()) - { - #if MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_5 - CGContextFillRect (context, CGRectMake (left, flipHeight - (y + 1.0f), right - left, 1.0f)); - #else - // On Leopard, unless both co-ordinates are non-integer, it disables anti-aliasing, so nudge - // the x co-ord slightly to trick it.. - CGContextFillRect (context, CGRectMake (left, flipHeight - (y + (1.0f + 1.0f / 256.0f)), right - left, 1.0f + 1.0f / 256.0f)); - #endif - } - else - { - fillCGRect (CGRectMake (left, flipHeight - (y + 1), right - left, 1.0f), false); - } -} - -void CoreGraphicsContext::setFont (const Font& newFont) -{ - if (state->font != newFont) - { - state->fontRef = 0; - state->font = newFont; - - OSXTypeface* osxTypeface = dynamic_cast (state->font.getTypeface()); - - if (osxTypeface != nullptr) - { - state->fontRef = osxTypeface->fontRef; - CGContextSetFont (context, state->fontRef); - CGContextSetFontSize (context, state->font.getHeight() * osxTypeface->fontHeightToCGSizeFactor); - - 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 (transform.isOnlyTranslation()) - { - CGContextSetTextMatrix (context, state->fontTransform); // have to set this each time, as it's not saved as part of the state - - CGGlyph g = 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 = glyphNumber; - CGContextShowGlyphsAtPoint (context, 0, 0, &g, 1); - - CGContextRestoreGState (context); - } - } - 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, flipHeight); - return true; - #else - return false; - #endif -} - -CoreGraphicsContext::SavedState::SavedState() - : font (1.0f), fontRef (0), fontTransform (CGAffineTransformIdentity), - shading (0), numGradientLookupEntries (0) -{ -} - -CoreGraphicsContext::SavedState::SavedState (const SavedState& other) - : fillType (other.fillType), font (other.font), fontRef (other.fontRef), - fontTransform (other.fontTransform), shading (0), - gradientLookupTable (other.numGradientLookupEntries), - numGradientLookupEntries (other.numGradientLookupEntries) -{ - memcpy (gradientLookupTable, other.gradientLookupTable, sizeof (PixelARGB) * numGradientLookupEntries); -} - -CoreGraphicsContext::SavedState::~SavedState() -{ - if (shading != 0) - CGShadingRelease (shading); -} - -void CoreGraphicsContext::SavedState::setFill (const FillType& newFill) -{ - fillType = newFill; - - if (fillType.isGradient() && shading != 0) - { - CGShadingRelease (shading); - shading = 0; - } -} - -CGShadingRef CoreGraphicsContext::SavedState::getShading (CoreGraphicsContext& owner) -{ - if (shading == 0) - { - ColourGradient& g = *(fillType.gradient); - numGradientLookupEntries = g.createLookupTable (fillType.transform, gradientLookupTable) - 1; - - CGFunctionRef function = CGFunctionCreate (this, 1, 0, 4, 0, &(owner.gradientCallbacks)); - CGPoint p1 (CGPointMake (g.point1.x, g.point1.y)); - - if (g.isRadial) - { - shading = CGShadingCreateRadial (owner.rgbColourSpace, p1, 0, - p1, g.point1.getDistanceFrom (g.point2), - function, true, true); - } - else - { - shading = CGShadingCreateAxial (owner.rgbColourSpace, p1, - CGPointMake (g.point2.x, g.point2.y), - function, true, true); - } - - CGFunctionRelease (function); - } - - return shading; -} - -void CoreGraphicsContext::SavedState::gradientCallback (void* info, const CGFloat* inData, CGFloat* outData) -{ - const SavedState* const s = static_cast (info); - - const int index = roundToInt (s->numGradientLookupEntries * inData[0]); - PixelARGB colour (s->gradientLookupTable [jlimit (0, s->numGradientLookupEntries, index)]); - colour.unpremultiply(); - - outData[0] = colour.getRed() / 255.0f; - outData[1] = colour.getGreen() / 255.0f; - outData[2] = colour.getBlue() / 255.0f; - outData[3] = colour.getAlpha() / 255.0f; -} - -void CoreGraphicsContext::drawGradient() -{ - flip(); - applyTransform (state->fillType.transform); - - CGContextSetInterpolationQuality (context, kCGInterpolationDefault); // (This is required for 10.4, where there's a crash if - // you draw a gradient with high quality interp enabled). - CGContextSetAlpha (context, state->fillType.getOpacity()); - CGContextDrawShading (context, state->getShading (*this)); -} - -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 - UIImage* uiImage = [UIImage imageWithData: [NSData dataWithBytesNoCopy: data.getData() - length: data.getSize() - freeWhenDone: NO]]; - - if (uiImage != nil) - { - 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, CGRectMake (0, 0, image.getWidth(), image.getHeight()), 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, const bool forAlpha, - CGColorSpaceRef colourSpace, const bool mustOutliveSource) -{ - return CoreGraphicsImage::createImage (juceImage, forAlpha, colourSpace, mustOutliveSource); -} - -CGContextRef juce_getImageContext (const Image& image) -{ - CoreGraphicsImage* const cgi = dynamic_cast (image.getPixelData()); - jassert (cgi != nullptr); - return cgi != nullptr ? cgi->context : 0; -} - -#endif diff --git a/src/juce/JuceLibraryCode/modules/juce_graphics/native/juce_mac_CoreGraphicsHelpers.h b/src/juce/JuceLibraryCode/modules/juce_graphics/native/juce_mac_CoreGraphicsHelpers.h deleted file mode 100644 index 290d62f7..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/native/juce_mac_CoreGraphicsHelpers.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_MAC_COREGRAPHICSHELPERS_JUCEHEADER__ -#define __JUCE_MAC_COREGRAPHICSHELPERS_JUCEHEADER__ - - -//============================================================================== -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()); - } -} - -extern CGImageRef juce_createCoreGraphicsImage (const Image&, const bool forAlpha, CGColorSpaceRef, const bool mustOutliveSource); - -extern CGContextRef juce_getImageContext (const Image&); - -#endif // __JUCE_MAC_COREGRAPHICSHELPERS_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_graphics/native/juce_mac_Fonts.mm b/src/juce/JuceLibraryCode/modules/juce_graphics/native/juce_mac_Fonts.mm deleted file mode 100644 index 5fe704c9..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/native/juce_mac_Fonts.mm +++ /dev/null @@ -1,1087 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#if (JUCE_MAC && defined (MAC_OS_X_VERSION_10_5) && MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 \ - && MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_5) \ - || (JUCE_IOS && defined (__IPHONE_3_0) && __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_3_2) - #define JUCE_CORETEXT_AVAILABLE 1 -#endif - -#if JUCE_CORETEXT_AVAILABLE - -namespace CoreTextTypeLayout -{ - static CTFontRef createCTFont (const Font& font, const float fontSize, - const bool applyScaleFactor, bool& needsItalicTransform) - { - CFStringRef cfName = font.getTypefaceName().toCFString(); - CTFontRef ctFontRef = CTFontCreateWithName (cfName, fontSize, nullptr); - CFRelease (cfName); - - if (ctFontRef != nullptr) - { - if (font.isItalic()) - { - CTFontRef newFont = CTFontCreateCopyWithSymbolicTraits (ctFontRef, 0.0f, nullptr, - kCTFontItalicTrait, kCTFontItalicTrait); - - if (newFont != nullptr) - { - CFRelease (ctFontRef); - ctFontRef = newFont; - } - else - { - needsItalicTransform = true; // couldn't find a proper italic version, so fake it with a transform.. - } - } - - if (font.isBold()) - { - CTFontRef newFont = CTFontCreateCopyWithSymbolicTraits (ctFontRef, 0.0f, nullptr, - kCTFontBoldTrait, kCTFontBoldTrait); - if (newFont != nullptr) - { - CFRelease (ctFontRef); - ctFontRef = newFont; - } - } - - if (applyScaleFactor) - { - CGFontRef cgFontRef = CTFontCopyGraphicsFont (ctFontRef, nullptr); - const int totalHeight = std::abs (CGFontGetAscent (cgFontRef)) + std::abs (CGFontGetDescent (cgFontRef)); - const float factor = CGFontGetUnitsPerEm (cgFontRef) / (float) totalHeight; - CGFontRelease (cgFontRef); - - CTFontRef newFont = CTFontCreateCopyWithAttributes (ctFontRef, fontSize * factor, nullptr, nullptr); - CFRelease (ctFontRef); - ctFontRef = newFont; - } - } - - return ctFontRef; - } - - //============================================================================== - struct Advances - { - Advances (CTRunRef run, const CFIndex numGlyphs) - : advances (CTRunGetAdvancesPtr (run)) - { - if (advances == nullptr) - { - local.malloc (numGlyphs); - CTRunGetAdvances (run, CFRangeMake (0, 0), local); - advances = local; - } - } - - const CGSize* advances; - HeapBlock local; - }; - - struct Glyphs - { - Glyphs (CTRunRef run, const int 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 int numGlyphs) - : points (CTRunGetPositionsPtr (run)) - { - if (points == nullptr) - { - local.malloc (numGlyphs); - CTRunGetPositions (run, CFRangeMake (0, 0), local); - points = local; - } - } - - const CGPoint* points; - HeapBlock local; - }; - - //============================================================================== - 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* const attr = text.getAttribute (i); - - if (attr->range.getStart() > CFAttributedStringGetLength (attribString)) - continue; - - Range range (attr->range); - range.setEnd (jmin (range.getEnd(), (int) CFAttributedStringGetLength (attribString))); - - if (attr->getFont() != nullptr) - { - const Font& f = *attr->getFont(); - bool needsItalicTransform = false; - CTFontRef ctFontRef = createCTFont (f, f.getHeight(), true, needsItalicTransform); - - CFAttributedStringSetAttribute (attribString, CFRangeMake (range.getStart(), range.getLength()), - kCTFontAttributeName, ctFontRef); - CFRelease (ctFontRef); - } - - if (attr->getColour() != nullptr) - { - #if JUCE_IOS - const CGFloat components[] = { attr->getColour()->getFloatRed(), - attr->getColour()->getFloatGreen(), - attr->getColour()->getFloatBlue(), - attr->getColour()->getFloatAlpha() }; - CGColorRef colour = CGColorCreate (rgbColourSpace, components); - #else - CGColorRef colour = CGColorCreateGenericRGB (attr->getColour()->getFloatRed(), - attr->getColour()->getFloatGreen(), - attr->getColour()->getFloatBlue(), - attr->getColour()->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, numElementsInArray (settings)); - CFAttributedStringSetAttribute (attribString, CFRangeMake (0, CFAttributedStringGetLength (attribString)), - kCTParagraphStyleAttributeName, ctParagraphStyleRef); - CFRelease (ctParagraphStyleRef); - #if JUCE_IOS - CGColorSpaceRelease (rgbColourSpace); - #endif - return attribString; - } - - static void drawToCGContext (const AttributedString& text, const Rectangle& area, - const CGContextRef& context, const float flipHeight) - { - CFAttributedStringRef attribString = CoreTextTypeLayout::createCFAttributedString (text); - CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString (attribString); - CFRelease (attribString); - - CGMutablePathRef path = CGPathCreateMutable(); - CGRect bounds = CGRectMake ((CGFloat) area.getX(), flipHeight - (CGFloat) area.getBottom(), - (CGFloat) area.getWidth(), (CGFloat) area.getHeight()); - CGPathAddRect (path, nullptr, bounds); - - CTFrameRef frame = CTFramesetterCreateFrame (framesetter, CFRangeMake (0, 0), path, nullptr); - CFRelease (framesetter); - CGPathRelease (path); - - CTFrameDraw (frame, context); - CFRelease (frame); - } - - static void createLayout (TextLayout& glyphLayout, const AttributedString& text) - { - CFAttributedStringRef attribString = CoreTextTypeLayout::createCFAttributedString (text); - CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString (attribString); - CFRelease (attribString); - - CGMutablePathRef path = CGPathCreateMutable(); - const CGRect bounds = CGRectMake (0, 0, glyphLayout.getWidth(), 1.0e6f); - CGPathAddRect (path, nullptr, bounds); - - CTFrameRef frame = CTFramesetterCreateFrame (framesetter, CFRangeMake(0, 0), path, nullptr); - CFRelease (framesetter); - CGPathRelease (path); - - CFArrayRef lines = CTFrameGetLines (frame); - const CFIndex numLines = CFArrayGetCount (lines); - - glyphLayout.ensureStorageAllocated (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); - - CGPoint cgpLineOrigin; - CTFrameGetLineOrigins (frame, CFRangeMake(i, 1), &cgpLineOrigin); - - Point lineOrigin ((float) cgpLineOrigin.x, bounds.size.height - (float) cgpLineOrigin.y); - - CGFloat ascent, descent, leading; - CTLineGetTypographicBounds (line, &ascent, &descent, &leading); - - TextLayout::Line* const glyphLine = new TextLayout::Line (lineStringRange, lineOrigin, - (float) ascent, (float) descent, (float) 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, 1024, nullptr); - CGFontRef cgFontRef = CTFontCopyGraphicsFont (ctFontRef, nullptr); - CFRelease (ctFontRef); - const int totalHeight = std::abs (CGFontGetAscent (cgFontRef)) + std::abs (CGFontGetDescent (cgFontRef)); - const float fontHeightToCGSizeFactor = CGFontGetUnitsPerEm (cgFontRef) / (float) totalHeight; - CGFontRelease (cgFontRef); - - glyphRun->font = Font (String::fromCFString (cfsFontName), - CTFontGetSize (ctRunFont) / fontHeightToCGSizeFactor, 0); // XXX bold/italic flags? - CFRelease (cfsFontName); - } - - CGColorRef cgRunColor; - if (CFDictionaryGetValueIfPresent (runAttributes, kCTForegroundColorAttributeName, (const void**) &cgRunColor) - && CGColorGetNumberOfComponents (cgRunColor) == 4) - { - const CGFloat* const components = CGColorGetComponents (cgRunColor); - - glyphRun->colour = Colour::fromFloatRGBA (components[0], components[1], components[2], components[3]); - } - - const CoreTextTypeLayout::Glyphs glyphs (run, numGlyphs); - const CoreTextTypeLayout::Advances advances (run, numGlyphs); - const CoreTextTypeLayout::Positions positions (run, numGlyphs); - - for (CFIndex k = 0; k < numGlyphs; ++k) - glyphRun->glyphs.add (TextLayout::Glyph (glyphs.glyphs[k], Point (positions.points[k].x, - positions.points[k].y), - advances.advances[k].width)); - } - } - - CFRelease (frame); - } -} - - -//============================================================================== -class OSXTypeface : public Typeface -{ -public: - OSXTypeface (const Font& font) - : Typeface (font.getTypefaceName()), - fontRef (nullptr), - fontHeightToCGSizeFactor (1.0f), - renderingTransform (CGAffineTransformIdentity), - ctFontRef (nullptr), - attributedStringAtts (nullptr), - ascent (0.0f), - unitsToHeightScaleFactor (0.0f) - { - bool needsItalicTransform = false; - ctFontRef = CoreTextTypeLayout::createCTFont (font, 1024.0f, false, needsItalicTransform); - - if (ctFontRef != nullptr) - { - ascent = std::abs ((float) CTFontGetAscent (ctFontRef)); - const float totalSize = ascent + std::abs ((float) CTFontGetDescent (ctFontRef)); - ascent /= totalSize; - - pathTransform = AffineTransform::identity.scale (1.0f / totalSize, 1.0f / totalSize); - - if (needsItalicTransform) - { - pathTransform = pathTransform.sheared (-0.15f, 0.0f); - renderingTransform.c = 0.15f; - } - - fontRef = CTFontCopyGraphicsFont (ctFontRef, nullptr); - - const int totalHeight = abs (CGFontGetAscent (fontRef)) + abs (CGFontGetDescent (fontRef)); - const float ctTotalHeight = abs (CTFontGetAscent (ctFontRef)) + abs (CTFontGetDescent (ctFontRef)); - unitsToHeightScaleFactor = 1.0f / ctTotalHeight; - fontHeightToCGSizeFactor = CGFontGetUnitsPerEm (fontRef) / (float) totalHeight; - - 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 { return ascent; } - float getDescent() const { return 1.0f - ascent; } - - float getStringWidth (const String& text) - { - 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) - { - 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, 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); - } - } - - EdgeTable* getEdgeTableForGlyph (int glyphNumber, const AffineTransform& transform) - { - Path path; - - if (getOutlineForGlyph (glyphNumber, path) && ! path.isEmpty()) - return new EdgeTable (path.getBoundsTransformed (transform).getSmallestIntegerContainer().expanded (1, 0), - path, transform); - - return nullptr; - } - - bool getOutlineForGlyph (int glyphNumber, Path& path) - { - 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; - - float fontHeightToCGSizeFactor; - CGAffineTransform renderingTransform; - -private: - CTFontRef ctFontRef; - 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); -}; - -#else - -//============================================================================== -// The stuff that follows is a mash-up that supports pre-OSX 10.5 and pre-iOS 3.2 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()) - { - JUCE_AUTORELEASEPOOL - renderingTransform = CGAffineTransformIdentity; - - bool needsItalicTransform = false; - -#if JUCE_IOS - NSString* fontName = juceStringToNS (font.getTypefaceName()); - - if (font.isItalic() || font.isBold()) - { - NSArray* familyFonts = [UIFont fontNamesForFamilyName: juceStringToNS (font.getTypefaceName())]; - - for (NSString* i in familyFonts) - { - const String fn (nsStringToJuce (i)); - const String afterDash (fn.fromFirstOccurrenceOf ("-", false, false)); - - const bool probablyBold = afterDash.containsIgnoreCase ("bold") || fn.endsWithIgnoreCase ("bold"); - const bool probablyItalic = afterDash.containsIgnoreCase ("oblique") - || afterDash.containsIgnoreCase ("italic") - || fn.endsWithIgnoreCase ("oblique") - || fn.endsWithIgnoreCase ("italic"); - - if (probablyBold == font.isBold() - && probablyItalic == font.isItalic()) - { - fontName = i; - needsItalicTransform = false; - break; - } - else if (probablyBold && (! probablyItalic) && probablyBold == font.isBold()) - { - fontName = i; - needsItalicTransform = true; // not ideal, so carry on in case we find a better one - } - } - - if (needsItalicTransform) - renderingTransform.c = 0.15f; - } - - fontRef = CGFontCreateWithFontName ((CFStringRef) fontName); - - if (fontRef == 0) - { - // Sometimes, UIFont manages to handle names that CGFontCreateWithFontName fails on... - UIFont* uiFont = [UIFont fontWithName: fontName size: 12]; - fontRef = CGFontCreateWithFontName ((CFStringRef) uiFont.fontName); - } - - const int ascender = abs (CGFontGetAscent (fontRef)); - const float totalHeight = ascender + abs (CGFontGetDescent (fontRef)); - ascent = ascender / totalHeight; - unitsToHeightScaleFactor = 1.0f / totalHeight; - fontHeightToCGSizeFactor = CGFontGetUnitsPerEm (fontRef) / totalHeight; -#else - nsFont = [NSFont fontWithName: juceStringToNS (font.getTypefaceName()) size: 1024]; - - if (font.isItalic()) - { - NSFont* newFont = [[NSFontManager sharedFontManager] convertFont: nsFont - toHaveTrait: NSItalicFontMask]; - - if (newFont == nsFont) - needsItalicTransform = true; // couldn't find a proper italic version, so fake it with a transform.. - - nsFont = newFont; - } - - if (font.isBold()) - nsFont = [[NSFontManager sharedFontManager] convertFont: nsFont toHaveTrait: NSBoldFontMask]; - - [nsFont retain]; - - ascent = std::abs ((float) [nsFont ascender]); - float totalSize = ascent + std::abs ((float) [nsFont descender]); - ascent /= totalSize; - - pathTransform = AffineTransform::identity.scale (1.0f / totalSize, 1.0f / totalSize); - - if (needsItalicTransform) - { - pathTransform = pathTransform.sheared (-0.15f, 0.0f); - renderingTransform.c = 0.15f; - } - - #if SUPPORT_ONLY_10_4_FONTS - ATSFontRef atsFont = ATSFontFindFromName ((CFStringRef) [nsFont fontName], kATSOptionFlagsDefault); - - if (atsFont == 0) - atsFont = ATSFontFindFromPostScriptName ((CFStringRef) [nsFont fontName], kATSOptionFlagsDefault); - - fontRef = CGFontCreateWithPlatformFont (&atsFont); - - const float totalHeight = std::abs ([nsFont ascender]) + std::abs ([nsFont descender]); - unitsToHeightScaleFactor = 1.0f / totalHeight; - fontHeightToCGSizeFactor = 1024.0f / totalHeight; - #else - #if SUPPORT_10_4_FONTS - if (NEW_CGFONT_FUNCTIONS_UNAVAILABLE) - { - ATSFontRef atsFont = ATSFontFindFromName ((CFStringRef) [nsFont fontName], kATSOptionFlagsDefault); - - if (atsFont == 0) - atsFont = ATSFontFindFromPostScriptName ((CFStringRef) [nsFont fontName], kATSOptionFlagsDefault); - - fontRef = CGFontCreateWithPlatformFont (&atsFont); - - const float totalHeight = std::abs ([nsFont ascender]) + std::abs ([nsFont descender]); - unitsToHeightScaleFactor = 1.0f / totalHeight; - fontHeightToCGSizeFactor = 1024.0f / totalHeight; - } - else - #endif - { - fontRef = CGFontCreateWithFontName ((CFStringRef) [nsFont fontName]); - - const int totalHeight = abs (CGFontGetAscent (fontRef)) + abs (CGFontGetDescent (fontRef)); - unitsToHeightScaleFactor = 1.0f / totalHeight; - fontHeightToCGSizeFactor = CGFontGetUnitsPerEm (fontRef) / (float) totalHeight; - } - #endif - -#endif - } - - ~OSXTypeface() - { - #if ! JUCE_IOS - [nsFont release]; - #endif - - if (fontRef != 0) - CGFontRelease (fontRef); - } - - float getAscent() const { return ascent; } - float getDescent() const { return 1.0f - ascent; } - - float getStringWidth (const String& text) - { - 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) - { - 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 - } - - EdgeTable* getEdgeTableForGlyph (int glyphNumber, const AffineTransform& transform) - { - Path path; - - if (getOutlineForGlyph (glyphNumber, path) && ! path.isEmpty()) - return new EdgeTable (path.getBoundsTransformed (transform).getSmallestIntegerContainer().expanded (1, 0), - path, transform); - - return nullptr; - } - - bool getOutlineForGlyph (int glyphNumber, Path& path) - { - #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 fontHeightToCGSizeFactor; - 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 fontRef) - : segCount (0), endCode (0), startCode (0), idDelta (0), - idRangeOffset (0), glyphIndexes (0) - { - CFDataRef cmapTable = CGFontCopyTableForTag (fontRef, '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; - else - 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); -}; - -#endif - -//============================================================================== -Typeface::Ptr Typeface::createSystemTypefaceFor (const Font& font) -{ - return new OSXTypeface (font); -} - -StringArray Font::findAllTypefaceNames() -{ - StringArray names; - - JUCE_AUTORELEASEPOOL - - #if JUCE_IOS - NSArray* fonts = [UIFont familyNames]; - #else - NSArray* fonts = [[NSFontManager sharedFontManager] availableFontFamilies]; - #endif - - for (unsigned int i = 0; i < [fonts count]; ++i) - names.add (nsStringToJuce ((NSString*) [fonts objectAtIndex: i])); - - names.sort (true); - return names; -} - -struct DefaultFontNames -{ - DefaultFontNames() - #if JUCE_IOS - : defaultSans ("Helvetica"), - defaultSerif ("Times New Roman"), - defaultFixed ("Courier New"), - #else - : defaultSans ("Lucida Grande"), - defaultSerif ("Times New Roman"), - defaultFixed ("Monaco"), - #endif - defaultFallback ("Arial Unicode MS") - { - } - - String defaultSans, defaultSerif, defaultFixed, defaultFallback; -}; - -Typeface::Ptr Font::getDefaultTypefaceForFont (const Font& font) -{ - static DefaultFontNames defaultNames; - - String faceName (font.getTypefaceName()); - - if (faceName == Font::getDefaultSansSerifFontName()) faceName = defaultNames.defaultSans; - else if (faceName == Font::getDefaultSerifFontName()) faceName = defaultNames.defaultSerif; - else if (faceName == Font::getDefaultMonospacedFontName()) faceName = defaultNames.defaultFixed; - - Font f (font); - f.setTypefaceName (faceName); - return Typeface::createSystemTypefaceFor (f); -} - -bool TextLayout::createNativeLayout (const AttributedString& text) -{ - #if JUCE_CORETEXT_AVAILABLE - CoreTextTypeLayout::createLayout (*this, text); - return true; - #else - (void) text; - return false; - #endif -} diff --git a/src/juce/JuceLibraryCode/modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.cpp b/src/juce/JuceLibraryCode/modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.cpp deleted file mode 100644 index c6803d50..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.cpp +++ /dev/null @@ -1,908 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -class SharedD2DFactory : public DeletedAtShutdown -{ -public: - SharedD2DFactory() - { - jassertfalse; //xxx Direct2D support isn't ready for use yet! - - D2D1CreateFactory (D2D1_FACTORY_TYPE_SINGLE_THREADED, d2dFactory.resetAndGetPointerAddress()); - DWriteCreateFactory (DWRITE_FACTORY_TYPE_SHARED, __uuidof (IDWriteFactory), (IUnknown**) directWriteFactory.resetAndGetPointerAddress()); - - if (directWriteFactory != nullptr) - directWriteFactory->GetSystemFontCollection (systemFonts.resetAndGetPointerAddress()); - } - - ~SharedD2DFactory() - { - clearSingletonInstance(); - } - - juce_DeclareSingleton (SharedD2DFactory, false); - - ComSmartPtr d2dFactory; - ComSmartPtr directWriteFactory; - ComSmartPtr systemFonts; -}; - -juce_ImplementSingleton (SharedD2DFactory) - - -//============================================================================== -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); - - HRESULT hr = SharedD2DFactory::getInstance()->d2dFactory->CreateHwndRenderTarget (props, propsHwnd, renderingTarget.resetAndGetPointerAddress()); - // xxx check for error - - 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 (int x, int y) - { - currentState->origin.addXY (x, y); - } - - void addTransform (const AffineTransform& transform) - { - //xxx todo - jassertfalse; - } - - float getScaleFactor() - { - jassertfalse; //xxx - return 1.0f; - } - - 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, currentState->origin)); - } - - void clipToImageAlpha (const Image& sourceImage, const AffineTransform& transform) - { - currentState->clipToImage (sourceImage,transform); - } - - bool clipRegionIntersects (const Rectangle& r) - { - const Rectangle r2 (r + currentState->origin); - return currentState->clipRect.intersects (r2); - } - - Rectangle getClipBounds() const - { - // xxx could this take into account complex clip regions? - return currentState->clipRect - currentState->origin; - } - - 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) - { - currentState->createBrush(); - renderingTarget->FillRectangle (rectangleToRectF (r + currentState->origin), currentState->currentBrush); - } - - void fillPath (const Path& p, const AffineTransform& transform) - { - currentState->createBrush(); - ComSmartPtr geometry (pathToPathGeometry (p, transform, currentState->origin)); - - if (renderingTarget != nullptr) - renderingTarget->FillGeometry (geometry, currentState->currentBrush); - } - - void drawImage (const Image& image, const AffineTransform& transform) - { - const int x = currentState->origin.getX(); - const int y = currentState->origin.getY(); - - renderingTarget->SetTransform (transformToMatrix (transform) * D2D1::Matrix3x2F::Translation (x, y)); - - 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 - const Line l (line.getStart() + currentState->origin.toFloat(), - line.getEnd() + currentState->origin.toFloat()); - - currentState->createBrush(); - - renderingTarget->DrawLine (D2D1::Point2F (l.getStartX(), l.getStartY()), - D2D1::Point2F (l.getEndX(), l.getEndY()), - currentState->currentBrush); - } - - void drawVerticalLine (int x, float top, float bottom) - { - // xxx doesn't seem to be correctly aligned, may need nudging by 0.5 to match the software renderer's behaviour - currentState->createBrush(); - - x += currentState->origin.getX(); - const int y = currentState->origin.getY(); - - renderingTarget->DrawLine (D2D1::Point2F (x, y + top), - D2D1::Point2F (x, y + bottom), - currentState->currentBrush); - } - - void drawHorizontalLine (int y, float left, float right) - { - // xxx doesn't seem to be correctly aligned, may need nudging by 0.5 to match the software renderer's behaviour - currentState->createBrush(); - - y += currentState->origin.getY(); - const int x = currentState->origin.getX(); - - renderingTarget->DrawLine (D2D1::Point2F (x + left, y), - D2D1::Point2F (x + right, y), - currentState->currentBrush); - } - - void setFont (const Font& newFont) - { - currentState->setFont (newFont); - } - - const Font& getFont() - { - return currentState->font; - } - - void drawGlyph (int glyphNumber, const AffineTransform& transform) - { - const float x = currentState->origin.getX(); - const float y = currentState->origin.getY(); - - currentState->createBrush(); - currentState->createFont(); - - float kerning = currentState->font.getExtraKerningFactor(); // xxx why does removing this line mess up the kerning?? - float hScale = currentState->font.getHorizontalScale(); - - renderingTarget->SetTransform (D2D1::Matrix3x2F::Scale (hScale, 1) * transformToMatrix (transform) * D2D1::Matrix3x2F::Translation (x, y)); - - float dpiX = 0, dpiY = 0; - SharedD2DFactory::getInstance()->d2dFactory->GetDesktopDpi (&dpiX, &dpiY); - - UINT32 glyphNum = glyphNumber; - UINT16 glyphNum1 = 0; // xxx needs a better name - what is this for? - currentState->currentFontFace->GetGlyphIndices (&glyphNum, 1, &glyphNum1); - - DWRITE_GLYPH_OFFSET offset; - offset.advanceOffset = 0; - offset.ascenderOffset = 0; - float glyphAdvances = 0; - - DWRITE_GLYPH_RUN glyph; - glyph.fontFace = currentState->currentFontFace; - glyph.glyphCount = 1; - glyph.glyphIndices = &glyphNum1; - glyph.isSideways = FALSE; - glyph.glyphAdvances = &glyphAdvances; - glyph.glyphOffsets = &offset; - glyph.fontEmSize = (float) currentState->font.getHeight() * dpiX / 96.0f * (1 + currentState->fontScaling) / 2; - - renderingTarget->DrawGlyphRun (D2D1::Point2F (0, 0), &glyph, currentState->currentBrush); - renderingTarget->SetTransform (D2D1::IdentityMatrix()); - } - - //============================================================================== - class SavedState - { - public: - SavedState (Direct2DLowLevelGraphicsContext& owner_) - : owner (owner_), currentBrush (0), - fontScaling (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; - origin = owner.currentState->origin; - clipRect = owner.currentState->clipRect; - - 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 + origin; - 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() - { - // xxx The font shouldn't be managed by the graphics context. - // The correct way to handle font lifetimes is to use a subclass of Typeface - see - // OSXTypeface and WindowsTypeface classes. D2D support could probably just be added to the - // WindowsTypeface class. - - if (currentFontFace == 0) - { - WindowsTypeface* systemType = dynamic_cast (font.getTypeface()); - fontScaling = systemType->getAscent(); - - BOOL fontFound; - uint32 fontIndex; - - IDWriteFontCollection* fonts = SharedD2DFactory::getInstance()->systemFonts; - - fonts->FindFamilyName (systemType->getName(), &fontIndex, &fontFound); - if (! fontFound) - fontIndex = 0; - - ComSmartPtr fontFam; - fonts->GetFontFamily (fontIndex, fontFam.resetAndGetPointerAddress()); - - ComSmartPtr font; - DWRITE_FONT_WEIGHT weight = this->font.isBold() ? DWRITE_FONT_WEIGHT_BOLD : DWRITE_FONT_WEIGHT_NORMAL; - DWRITE_FONT_STYLE style = this->font.isItalic() ? DWRITE_FONT_STYLE_ITALIC : DWRITE_FONT_STYLE_NORMAL; - fontFam->GetFirstMatchingFont (weight, DWRITE_FONT_STRETCH_NORMAL, style, font.resetAndGetPointerAddress()); - - font->CreateFontFace (localFontFace.resetAndGetPointerAddress()); - currentFontFace = localFontFace; - } - } - - 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) - { - const int x = origin.getX(); - const int y = origin.getY(); - - 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); - - 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 = 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.getX() + x, p1.getY() + 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.getX() + x, p1.getY() + y), - D2D1::Point2F (p2.getX() + x, p2.getY() + y)); - - owner.renderingTarget->CreateLinearGradientBrush (props, brushProps, gradientStops, linearGradient.resetAndGetPointerAddress()); - - currentBrush = linearGradient; - } - } - } - } - - //============================================================================== - //xxx most of these members should probably be private... - - Direct2DLowLevelGraphicsContext& owner; - - Point origin; - - Font font; - float fontScaling; - 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: - HWND hwnd; - ComSmartPtr renderingTarget; - ComSmartPtr colourBrush; - Rectangle bounds; - - SavedState* currentState; - OwnedArray states; - - //============================================================================== - static D2D1_RECT_F rectangleToRectF (const Rectangle& r) - { - return D2D1::RectF ((float) r.getX(), (float) r.getY(), (float) r.getRight(), (float) r.getBottom()); - } - - static const D2D1_COLOR_F colourToD2D (const Colour& c) - { - return D2D1::ColorF::ColorF (c.getFloatRed(), c.getFloatGreen(), c.getFloatBlue(), c.getFloatAlpha()); - } - - static const D2D1_POINT_2F pointTransformed (int x, int y, const AffineTransform& transform = AffineTransform::identity) - { - transform.transformPoint (x, y); - return D2D1::Point2F (x, 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; - SharedD2DFactory::getInstance()->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, int x, int y) - { - 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 + x, it.y1 + y); - - transform.transformPoint (it.x2, it.y2); - seg.point2 = D2D1::Point2F (it.x2 + x, it.y2 + y); - - transform.transformPoint(it.x3, it.y3); - seg.point3 = D2D1::Point2F (it.x3 + x, it.y3 + y); - - sink->AddBezier (seg); - break; - } - - case Path::Iterator::lineTo: - { - transform.transformPoint (it.x1, it.y1); - sink->AddLine (D2D1::Point2F (it.x1 + x, it.y1 + y)); - break; - } - - case Path::Iterator::quadraticTo: - { - D2D1_QUADRATIC_BEZIER_SEGMENT seg; - - transform.transformPoint (it.x1, it.y1); - seg.point1 = D2D1::Point2F (it.x1 + x, it.y1 + y); - - transform.transformPoint (it.x2, it.y2); - seg.point2 = D2D1::Point2F (it.x2 + x, it.y2 + y); - - 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 + x, it.y1 + y), D2D1_FIGURE_BEGIN_FILLED); - break; - } - } - } - } - - static ID2D1PathGeometry* pathToPathGeometry (const Path& path, const AffineTransform& transform, const Point& point) - { - ID2D1PathGeometry* p = nullptr; - SharedD2DFactory::getInstance()->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, point.getX(), point.getY()); - - hr = sink->Close(); - return p; - } - - static const 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/src/juce/JuceLibraryCode/modules/juce_graphics/native/juce_win32_DirectWriteTypeLayout.cpp b/src/juce/JuceLibraryCode/modules/juce_graphics/native/juce_win32_DirectWriteTypeLayout.cpp deleted file mode 100644 index f63bf79f..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/native/juce_win32_DirectWriteTypeLayout.cpp +++ /dev/null @@ -1,357 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -//================================================================================================== -#if JUCE_USE_DIRECTWRITE -namespace DirectWriteTypeLayout -{ - class CustomDirectWriteTextRenderer : public ComBaseClassHelper - { - public: - CustomDirectWriteTextRenderer (IDWriteFontCollection* const fontCollection_) - : fontCollection (fontCollection_), - currentLine (-1), - lastOriginY (-10000.0f) - { - resetReferenceCount(); - } - - JUCE_COMRESULT QueryInterface (REFIID refId, void** result) - { - #if ! JUCE_MINGW - if (refId == __uuidof (IDWritePixelSnapping)) { AddRef(); *result = dynamic_cast (this); return S_OK; } - #else - jassertfalse; // need to find a mingw equivalent of __uuidof to make this possible - #endif - - 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 != 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); // The x value is only correct when dealing with LTR text - } - } - - 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)); - - int styleFlags = 0; - const String fontName (getFontName (glyphRun, styleFlags)); - - 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 = Font (fontName, glyphRun->fontEmSize / fontHeightToEmSizeFactor, styleFlags); - 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: - 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); - } - - String getFontName (DWRITE_GLYPH_RUN const* glyphRun, int& styleFlags) const - { - ComSmartPtr dwFont; - - HRESULT hr = fontCollection->GetFontFromFontFace (glyphRun->fontFace, dwFont.resetAndGetPointerAddress()); - jassert (dwFont != nullptr); - - if (dwFont->GetWeight() == DWRITE_FONT_WEIGHT_BOLD) styleFlags |= Font::bold; - if (dwFont->GetStyle() == DWRITE_FONT_STYLE_ITALIC) styleFlags |= Font::italic; - - ComSmartPtr dwFontFamily; - hr = dwFont->GetFontFamily (dwFontFamily.resetAndGetPointerAddress()); - jassert (dwFontFamily != nullptr); - - // Get the Font Family Names - ComSmartPtr dwFamilyNames; - hr = dwFontFamily->GetFamilyNames (dwFamilyNames.resetAndGetPointerAddress()); - jassert (dwFamilyNames != nullptr); - - UINT32 index = 0; - BOOL exists = false; - hr = dwFamilyNames->FindLocaleName (L"en-us", &index, &exists); - if (! exists) - index = 0; - - UINT32 length = 0; - hr = dwFamilyNames->GetStringLength (index, &length); - - HeapBlock name (length + 1); - hr = dwFamilyNames->GetString (index, name, length + 1); - - return String (name); - } - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (CustomDirectWriteTextRenderer); - }; - - //================================================================================================== - float getFontHeightToEmSizeFactor (const Font& font, IDWriteFontCollection& dwFontCollection) - { - BOOL fontFound = false; - uint32 fontIndex; - dwFontCollection.FindFamilyName (font.getTypefaceName().toWideCharPointer(), &fontIndex, &fontFound); - - if (! fontFound) - fontIndex = 0; - - ComSmartPtr dwFontFamily; - HRESULT hr = dwFontCollection.GetFontFamily (fontIndex, dwFontFamily.resetAndGetPointerAddress()); - - ComSmartPtr dwFont; - hr = dwFontFamily->GetFirstMatchingFont (DWRITE_FONT_WEIGHT_NORMAL, DWRITE_FONT_STRETCH_NORMAL, DWRITE_FONT_STYLE_NORMAL, - dwFont.resetAndGetPointerAddress()); - - ComSmartPtr dwFontFace; - hr = dwFont->CreateFontFace (dwFontFace.resetAndGetPointerAddress()); - - 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! - } - - format->SetTextAlignment (alignment); - format->SetWordWrapping (wrapType); - - // 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); - } - - void addAttributedRange (const AttributedString::Attribute& attr, IDWriteTextLayout* textLayout, - const int textLen, ID2D1DCRenderTarget* const renderTarget, IDWriteFontCollection* const fontCollection) - { - DWRITE_TEXT_RANGE range; - range.startPosition = attr.range.getStart(); - range.length = jmin (attr.range.getLength(), textLen - attr.range.getStart()); - - const Font* const font = attr.getFont(); - - if (font != nullptr) - { - textLayout->SetFontFamilyName (font->getTypefaceName().toWideCharPointer(), range); - - const float fontHeightToEmSizeFactor = getFontHeightToEmSizeFactor (*font, *fontCollection); - textLayout->SetFontSize (font->getHeight() * fontHeightToEmSizeFactor, range); - - if (font->isBold()) textLayout->SetFontWeight (DWRITE_FONT_WEIGHT_BOLD, range); - if (font->isItalic()) textLayout->SetFontStyle (DWRITE_FONT_STYLE_ITALIC, range); - } - - if (attr.getColour() != nullptr) - { - ComSmartPtr d2dBrush; - renderTarget->CreateSolidColorBrush (D2D1::ColorF (D2D1::ColorF (attr.getColour()->getFloatRed(), - attr.getColour()->getFloatGreen(), - attr.getColour()->getFloatBlue(), - attr.getColour()->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); - } - } - - 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()); - - Font defaultFont; - const float defaultFontHeightToEmSizeFactor = getFontHeightToEmSizeFactor (defaultFont, *fontCollection); - - 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); - - const int textLen = text.getText().length(); - - ComSmartPtr dwTextLayout; - hr = directWriteFactory->CreateTextLayout (text.getText().toWideCharPointer(), textLen, - dwTextFormat, layout.getWidth(), - 1.0e7f, dwTextLayout.resetAndGetPointerAddress()); - - const int numAttributes = text.getNumAttributes(); - - for (int i = 0; i < numAttributes; ++i) - addAttributedRange (*text.getAttribute (i), dwTextLayout, textLen, renderTarget, fontCollection); - - UINT32 actualLineCount = 0; - hr = dwTextLayout->GetLineMetrics (nullptr, 0, &actualLineCount); - - layout.ensureStorageAllocated (actualLineCount); - - { - ComSmartPtr textRenderer (new CustomDirectWriteTextRenderer (fontCollection)); - 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) - { - lastLocation = dwLineMetrics[i].length; - layout.getLine(i).stringRange = Range (lastLocation, (int) lastLocation + dwLineMetrics[i].length); - } - } -} -#endif - -bool TextLayout::createNativeLayout (const AttributedString& text) -{ - #if JUCE_USE_DIRECTWRITE - const Direct2DFactories& factories = Direct2DFactories::getInstance(); - - if (factories.d2dFactory != nullptr && factories.systemFonts != nullptr) - { - DirectWriteTypeLayout::createLayout (*this, text, factories.directWriteFactory, - factories.d2dFactory, factories.systemFonts); - return true; - } - #else - (void) text; - #endif - - return false; -} diff --git a/src/juce/JuceLibraryCode/modules/juce_graphics/native/juce_win32_DirectWriteTypeface.cpp b/src/juce/JuceLibraryCode/modules/juce_graphics/native/juce_win32_DirectWriteTypeface.cpp deleted file mode 100644 index 0f1869c7..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/native/juce_win32_DirectWriteTypeface.cpp +++ /dev/null @@ -1,253 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#if JUCE_USE_DIRECTWRITE -class Direct2DFactories -{ -public: - Direct2DFactories() - { - if (direct2dDll.open ("d2d1.dll")) - { - JUCE_DLL_FUNCTION (D2D1CreateFactory, d2d1CreateFactory, HRESULT, direct2dDll, (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_DLL_FUNCTION (DWriteCreateFactory, dWriteCreateFactory, HRESULT, directWriteDll, (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; - } - - static const Direct2DFactories& getInstance() - { - static Direct2DFactories instance; - return instance; - } - - 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()), - 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 certain weight and style flags - ComSmartPtr dwFont; - DWRITE_FONT_WEIGHT dwWeight = font.isBold() ? DWRITE_FONT_WEIGHT_BOLD : DWRITE_FONT_WEIGHT_NORMAL; - DWRITE_FONT_STYLE dwStyle = font.isItalic() ? DWRITE_FONT_STYLE_ITALIC : DWRITE_FONT_STYLE_NORMAL; - - hr = dwFontFamily->GetFirstMatchingFont (dwWeight, DWRITE_FONT_STRETCH_NORMAL, dwStyle, dwFont.resetAndGetPointerAddress()); - hr = dwFont->CreateFontFace (dwFontFace.resetAndGetPointerAddress()); - - 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 = 1.0f / (totalSize / designUnitsPerEm); - const float pathAscent = (((float) dwFontMetrics.ascent) / ((float) designUnitsPerEm)) * 1024.0f; - const float pathDescent = (((float) dwFontMetrics.descent) / ((float) designUnitsPerEm)) * 1024.0f; - const float pathTotalSize = std::abs (pathAscent) + std::abs (pathDescent); - pathTransform = AffineTransform::identity.scale (1.0f / pathTotalSize, 1.0f / pathTotalSize); - } - - float getAscent() const { return ascent; } - float getDescent() const { return 1.0f - ascent; } - - 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]); - } - } - - EdgeTable* getEdgeTableForGlyph (int glyphNumber, const AffineTransform& transform) - { - Path path; - - if (getOutlineForGlyph (glyphNumber, path) && ! path.isEmpty()) - return new EdgeTable (path.getBoundsTransformed (transform).getSmallestIntegerContainer().expanded (1, 0), - path, transform); - - return nullptr; - } - - 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; - } - -private: - ComSmartPtr dwFontFace; - float unitsToHeightScaleFactor, ascent; - int designUnitsPerEm; - AffineTransform pathTransform; - - class PathGeometrySink : public ComBaseClassHelper - { - public: - PathGeometrySink() { resetReferenceCount(); } - - 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/src/juce/JuceLibraryCode/modules/juce_graphics/native/juce_win32_Fonts.cpp b/src/juce/JuceLibraryCode/modules/juce_graphics/native/juce_win32_Fonts.cpp deleted file mode 100644 index 8d692a30..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/native/juce_win32_Fonts.cpp +++ /dev/null @@ -1,427 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -namespace FontEnumerators -{ - 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; - } - - 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; - 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; -} - -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"; - 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; - - String faceName (font.getTypefaceName()); - - if (faceName == Font::getDefaultSansSerifFontName()) faceName = defaultNames.defaultSans; - else if (faceName == Font::getDefaultSerifFontName()) faceName = defaultNames.defaultSerif; - else if (faceName == Font::getDefaultMonospacedFontName()) faceName = defaultNames.defaultFixed; - - Font f (font); - f.setTypefaceName (faceName); - return Typeface::createSystemTypefaceFor (f); -} - -//============================================================================== -class WindowsTypeface : public Typeface -{ -public: - WindowsTypeface (const Font& font) - : Typeface (font.getTypefaceName()), - fontH (0), - previousFontH (0), - dc (CreateCompatibleDC (0)), - ascent (1.0f), - defaultGlyph (-1), - bold (font.isBold()), - italic (font.isItalic()) - { - loadFont(); - - if (GetTextMetrics (dc, &tm)) - { - ascent = tm.tmAscent / (float) tm.tmHeight; - defaultGlyph = getGlyphForChar (dc, tm.tmDefaultChar); - createKerningPairs (dc, (float) tm.tmHeight); - } - } - - ~WindowsTypeface() - { - SelectObject (dc, previousFontH); // Replacing the previous font before deleting the DC avoids a warning in BoundsChecker - DeleteDC (dc); - - if (fontH != 0) - DeleteObject (fontH); - } - - float getAscent() const { return ascent; } - float getDescent() const { return 1.0f - ascent; } - - 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; - float ascent; - int defaultGlyph; - bool bold, italic; - - 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) (italic ? TRUE : FALSE); - lf.lfWeight = 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) - { - lf.lfHeight = -(int) otm.otmEMSquare; - fontH = CreateFontIndirect (&lf); - - SelectObject (dc, fontH); - DeleteObject (standardSizedFont); - } - } - } - } - - 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 - const Direct2DFactories& factories = Direct2DFactories::getInstance(); - - if (factories.systemFonts != nullptr) - return new WindowsDirectWriteTypeface (font, factories.systemFonts); - else - #endif - return new WindowsTypeface (font); -} diff --git a/src/juce/JuceLibraryCode/modules/juce_graphics/placement/juce_Justification.cpp b/src/juce/JuceLibraryCode/modules/juce_graphics/placement/juce_Justification.cpp deleted file mode 100644 index 7692f247..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/placement/juce_Justification.cpp +++ /dev/null @@ -1,45 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -Justification::Justification (const Justification& other) noexcept - : flags (other.flags) -{ -} - -Justification& Justification::operator= (const Justification& other) noexcept -{ - flags = other.flags; - return *this; -} - -int Justification::getOnlyVerticalFlags() const noexcept -{ - return flags & (top | bottom | verticallyCentred); -} - -int Justification::getOnlyHorizontalFlags() const noexcept -{ - return flags & (left | right | horizontallyCentred | horizontallyJustified); -} diff --git a/src/juce/JuceLibraryCode/modules/juce_graphics/placement/juce_Justification.h b/src/juce/JuceLibraryCode/modules/juce_graphics/placement/juce_Justification.h deleted file mode 100644 index d598d90f..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/placement/juce_Justification.h +++ /dev/null @@ -1,189 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_JUSTIFICATION_JUCEHEADER__ -#define __JUCE_JUSTIFICATION_JUCEHEADER__ - -#include "../geometry/juce_Rectangle.h" - - -//============================================================================== -/** - 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 JUCE_API Justification -{ -public: - //============================================================================== - /** Creates a Justification object using a combination of flags. */ - inline Justification (int flags_) noexcept : flags (flags_) {} - - /** Creates a copy of another Justification object. */ - Justification (const Justification& other) noexcept; - - /** Copies another Justification object. */ - Justification& operator= (const Justification& other) noexcept; - - 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; - - /** Returns just the flags from this object that deal with horizontal layout. */ - int getOnlyHorizontalFlags() const noexcept; - - //============================================================================== - /** 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 - { - //============================================================================== - /** 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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_graphics/placement/juce_RectanglePlacement.cpp b/src/juce/JuceLibraryCode/modules/juce_graphics/placement/juce_RectanglePlacement.cpp deleted file mode 100644 index 6281dc7b..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/placement/juce_RectanglePlacement.cpp +++ /dev/null @@ -1,128 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce 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; - } -} - -const 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/src/juce/JuceLibraryCode/modules/juce_graphics/placement/juce_RectanglePlacement.h b/src/juce/JuceLibraryCode/modules/juce_graphics/placement/juce_RectanglePlacement.h deleted file mode 100644 index acc67090..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_graphics/placement/juce_RectanglePlacement.h +++ /dev/null @@ -1,173 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_RECTANGLEPLACEMENT_JUCEHEADER__ -#define __JUCE_RECTANGLEPLACEMENT_JUCEHEADER__ - -#include "../geometry/juce_AffineTransform.h" -#include "../geometry/juce_Rectangle.h" - - -//============================================================================== -/** - 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. */ - inline RectanglePlacement (int flags_) noexcept : flags (flags_) {} - - /** Creates a copy of another RectanglePlacement object. */ - RectanglePlacement (const RectanglePlacement& other) noexcept; - - /** Copies another RectanglePlacement object. */ - RectanglePlacement& operator= (const RectanglePlacement& other) noexcept; - - bool operator== (const RectanglePlacement& other) const noexcept; - bool operator!= (const RectanglePlacement& other) const noexcept; - - //============================================================================== - /** Flag values that can be combined and used in the constructor. */ - enum - { - //============================================================================== - /** 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 co-ordinates 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 transform that should be applied to these source co-ordinates to fit them - into the destination rectangle using the current flags. - */ - template - const 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 co-ordinates to fit them - into the destination rectangle using the current flags. - */ - const AffineTransform getTransformToFit (const Rectangle& source, - const Rectangle& destination) const noexcept; - - -private: - //============================================================================== - int flags; -}; - -#endif // __JUCE_RECTANGLEPLACEMENT_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_gui_basics/application/juce_Application.cpp b/src/juce/JuceLibraryCode/modules/juce_gui_basics/application/juce_Application.cpp deleted file mode 100644 index e0f89619..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_gui_basics/application/juce_Application.cpp +++ /dev/null @@ -1,262 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#if JUCE_MAC - extern void juce_initialiseMacMainMenu(); -#endif - -//============================================================================== -class AppBroadcastCallback : public ActionListener -{ -public: - AppBroadcastCallback() { MessageManager::getInstance()->registerBroadcastListener (this); } - ~AppBroadcastCallback() { MessageManager::getInstance()->deregisterBroadcastListener (this); } - - void actionListenerCallback (const String& message) - { - JUCEApplication* const app = JUCEApplication::getInstance(); - - if (app != 0 && message.startsWith (app->getApplicationName() + "/")) - app->anotherInstanceStarted (message.substring (app->getApplicationName().length() + 1)); - } -}; - -//============================================================================== -JUCEApplication::JUCEApplication() - : appReturnValue (0), - stillInitialising (true) -{ -} - -JUCEApplication::~JUCEApplication() -{ - if (appLock != nullptr) - { - appLock->exit(); - appLock = nullptr; - } -} - -//============================================================================== -bool JUCEApplication::moreThanOneInstanceAllowed() -{ - return true; -} - -void JUCEApplication::anotherInstanceStarted (const String&) -{ -} - -void JUCEApplication::systemRequestedQuit() -{ - quit(); -} - -void JUCEApplication::quit() -{ - MessageManager::getInstance()->stopDispatchLoop(); -} - -void JUCEApplication::setApplicationReturnValue (const int newReturnValue) noexcept -{ - appReturnValue = newReturnValue; -} - -//============================================================================== -void JUCEApplication::unhandledException (const std::exception*, - const String&, - const int) -{ - jassertfalse; -} - -void JUCEApplication::sendUnhandledException (const std::exception* const e, - const char* const sourceFile, - const int lineNumber) -{ - if (JUCEApplicationBase::getInstance() != nullptr) - JUCEApplicationBase::getInstance()->unhandledException (e, sourceFile, lineNumber); -} - -//============================================================================== -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; -} - -//============================================================================== -bool JUCEApplication::initialiseApp (const String& commandLine) -{ - commandLineParameters = commandLine.trim(); - - #if ! (JUCE_IOS || JUCE_ANDROID) - jassert (appLock == nullptr); // initialiseApp must only be called once! - - if (! moreThanOneInstanceAllowed()) - { - appLock = new InterProcessLock ("juceAppLock_" + getApplicationName()); - - if (! appLock->enter(0)) - { - appLock = nullptr; - MessageManager::broadcastMessage (getApplicationName() + "/" + commandLineParameters); - - DBG ("Another instance is running - quitting..."); - return false; - } - } - #endif - - // let the app do its setting-up.. - initialise (commandLineParameters); - - #if JUCE_MAC - juce_initialiseMacMainMenu(); // needs to be called after the app object has created, to get its name - #endif - - #if ! (JUCE_IOS || JUCE_ANDROID) - broadcastCallback = new AppBroadcastCallback(); - #endif - - stillInitialising = false; - return true; -} - -int JUCEApplication::shutdownApp() -{ - jassert (JUCEApplicationBase::getInstance() == this); - - broadcastCallback = nullptr; - - JUCE_TRY - { - // give the app a chance to clean up.. - shutdown(); - } - JUCE_CATCH_EXCEPTION - - return getApplicationReturnValue(); -} - -//============================================================================== -#if ! JUCE_ANDROID -int JUCEApplication::main (const String& commandLine) -{ - ScopedJuceInitialiser_GUI libraryInitialiser; - jassert (createInstance != nullptr); - int returnCode = 0; - - { - const ScopedPointer app (dynamic_cast (createInstance())); - - jassert (app != nullptr); - - if (! app->initialiseApp (commandLine)) - return 0; - - JUCE_TRY - { - // loop until a quit message is received.. - MessageManager::getInstance()->runDispatchLoop(); - } - JUCE_CATCH_EXCEPTION - - returnCode = app->shutdownApp(); - } - - return returnCode; -} - -#if JUCE_IOS - extern int juce_iOSMain (int argc, const char* argv[]); -#endif - -#if ! JUCE_WINDOWS - extern const char* juce_Argv0; -#endif - -#if JUCE_MAC - extern void initialiseNSApplication(); -#endif - -int JUCEApplication::main (int argc, const char* argv[]) -{ - JUCE_AUTORELEASEPOOL - - #if JUCE_MAC - initialiseNSApplication(); - #endif - - #if ! JUCE_WINDOWS - jassert (createInstance != nullptr); - juce_Argv0 = argv[0]; - #endif - - #if JUCE_IOS - return juce_iOSMain (argc, argv); - #else - String cmd; - for (int i = 1; i < argc; ++i) - { - String arg (argv[i]); - if (arg.containsChar (' ') && ! arg.isQuotedString()) - arg = arg.quoted ('"'); - - cmd << arg << ' '; - } - - return JUCEApplication::main (cmd); - #endif -} -#endif diff --git a/src/juce/JuceLibraryCode/modules/juce_gui_basics/application/juce_Application.h b/src/juce/JuceLibraryCode/modules/juce_gui_basics/application/juce_Application.h deleted file mode 100644 index 26165848..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_gui_basics/application/juce_Application.h +++ /dev/null @@ -1,246 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_APPLICATION_JUCEHEADER__ -#define __JUCE_APPLICATION_JUCEHEADER__ - - -//============================================================================== -/** - An instance of this class is used to specify initialisation and shutdown - code for the application. - - An application that wants to run in the JUCE framework needs to declare a - subclass of 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 a suitable platform-specific - main() function. - - e.g. @code - class MyJUCEApp : public JUCEApplication - { - public: - MyJUCEApp() - { - } - - ~MyJUCEApp() - { - } - - void initialise (const String& commandLine) - { - myMainWindow = new MyApplicationWindow(); - myMainWindow->setBounds (100, 100, 400, 500); - myMainWindow->setVisible (true); - } - - void shutdown() - { - myMainWindow = 0; - } - - const String getApplicationName() - { - return "Super JUCE-o-matic"; - } - - const String getApplicationVersion() - { - return "1.0"; - } - - private: - ScopedPointer myMainWindow; - }; - - // this creates wrapper code to actually launch the app properly. - START_JUCE_APPLICATION (MyJUCEApp) - @endcode - - @see MessageManager -*/ -class JUCE_API JUCEApplication : public JUCEApplicationBase, - public ApplicationCommandTarget -{ -protected: - //============================================================================== - /** 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(); - -public: - /** 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. - */ - virtual ~JUCEApplication(); - - //============================================================================== - /** Returns the global instance of the application object being run. */ - static JUCEApplication* getInstance() noexcept { return dynamic_cast (JUCEApplicationBase::getInstance()); } - - //============================================================================== - /** 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; } - - //============================================================================== - /** Returns the application's name. - - An application must implement this to name itself. - */ - 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. - */ - virtual bool moreThanOneInstanceAllowed(); - - /** 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); - - /** 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(); - - /** 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* e, - const String& sourceFilename, - int lineNumber); - - //============================================================================== - /** 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(); - - /** 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 the application's command line parameters. */ - const String& getCommandLineParameters() const noexcept { return commandLineParameters; } - - /** Returns true if this executable is running as an app (as opposed to being a plugin - or other kind of shared library. */ - static inline bool isStandaloneApp() noexcept { return createInstance != nullptr; } - - //============================================================================== - /** @internal */ - ApplicationCommandTarget* getNextCommandTarget(); - /** @internal */ - void getCommandInfo (CommandID, ApplicationCommandInfo&); - /** @internal */ - void getAllCommands (Array &); - /** @internal */ - bool perform (const InvocationInfo&); - - //============================================================================== - #ifndef DOXYGEN - // The following methods are internal calls - not for public use. - static int main (const String& commandLine); - static int main (int argc, const char* argv[]); - static void sendUnhandledException (const std::exception*, const char* sourceFile, int lineNumber); - bool initialiseApp (const String& commandLine); - int shutdownApp(); - #endif - -private: - //============================================================================== - String commandLineParameters; - ScopedPointer appLock; - ScopedPointer broadcastCallback; - int appReturnValue; - bool stillInitialising; - - JUCE_DECLARE_NON_COPYABLE (JUCEApplication); -}; - - -#endif // __JUCE_APPLICATION_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_gui_basics/application/juce_Initialisation.h b/src/juce/JuceLibraryCode/modules/juce_gui_basics/application/juce_Initialisation.h deleted file mode 100644 index ff03508d..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_gui_basics/application/juce_Initialisation.h +++ /dev/null @@ -1,135 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_INITIALISATION_JUCEHEADER__ -#define __JUCE_INITIALISATION_JUCEHEADER__ - - -//============================================================================== -/** 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 an instance of this class is created, it calls initialiseJuce_GUI(), - and when it's deleted, it calls shutdownJuce_GUI(), which lets you easily - make sure that these functions are matched correctly. - - 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. - - @see ScopedJuceInitialiser_NonGUI -*/ -class ScopedJuceInitialiser_GUI -{ -public: - /** The constructor simply calls initialiseJuce_GUI(). */ - ScopedJuceInitialiser_GUI() { initialiseJuce_GUI(); } - - /** The destructor simply calls shutdownJuce_GUI(). */ - ~ScopedJuceInitialiser_GUI() { shutdownJuce_GUI(); } -}; - - -//============================================================================== -/* - To start a JUCE app, use this macro: START_JUCE_APPLICATION (AppSubClass) where - AppSubClass is the name of a class derived from JUCEApplication. - - See the JUCEApplication class documentation (juce_Application.h) for more details. - -*/ -#if JUCE_ANDROID - #define START_JUCE_APPLICATION(AppClass) \ - juce::JUCEApplication* juce_CreateApplication() { return new AppClass(); } - -#elif defined (JUCE_GCC) || defined (__MWERKS__) - - #define START_JUCE_APPLICATION(AppClass) \ - static juce::JUCEApplicationBase* juce_CreateApplication() { return new AppClass(); } \ - int main (int argc, char* argv[]) \ - { \ - juce::JUCEApplication::createInstance = &juce_CreateApplication; \ - return juce::JUCEApplication::main (argc, (const char**) argv); \ - } - -#elif JUCE_WINDOWS - - #ifdef _CONSOLE - #define START_JUCE_APPLICATION(AppClass) \ - static juce::JUCEApplicationBase* juce_CreateApplication() { return new AppClass(); } \ - int main (int, char* argv[]) \ - { \ - juce::JUCEApplication::createInstance = &juce_CreateApplication; \ - return juce::JUCEApplication::main (juce::Process::getCurrentCommandLineParams()); \ - } - #elif ! defined (_AFXDLL) - #ifdef _WINDOWS_ - #define START_JUCE_APPLICATION(AppClass) \ - static juce::JUCEApplicationBase* juce_CreateApplication() { return new AppClass(); } \ - int WINAPI WinMain (HINSTANCE, HINSTANCE, LPSTR, int) \ - { \ - juce::JUCEApplication::createInstance = &juce_CreateApplication; \ - return juce::JUCEApplication::main (juce::Process::getCurrentCommandLineParams()); \ - } - #else - #define START_JUCE_APPLICATION(AppClass) \ - static juce::JUCEApplicationBase* juce_CreateApplication() { return new AppClass(); } \ - int __stdcall WinMain (void*, void*, const char*, int) \ - { \ - juce::JUCEApplication::createInstance = &juce_CreateApplication; \ - return juce::JUCEApplication::main (juce::Process::getCurrentCommandLineParams()); \ - } - #endif - #endif - -#endif - - -#endif // __JUCE_INITIALISATION_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ArrowButton.cpp b/src/juce/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ArrowButton.cpp deleted file mode 100644 index 1a655e08..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ArrowButton.cpp +++ /dev/null @@ -1,71 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -ArrowButton::ArrowButton (const String& name, - float arrowDirectionInRadians, - const Colour& arrowColour) - : Button (name), - colour (arrowColour) -{ - path.lineTo (0.0f, 1.0f); - path.lineTo (1.0f, 0.5f); - path.closeSubPath(); - - path.applyTransform (AffineTransform::rotation (float_Pi * 2.0f * arrowDirectionInRadians, - 0.5f, 0.5f)); - - setComponentEffect (&shadow); - updateShadowAndOffset(); -} - -ArrowButton::~ArrowButton() -{ -} - -void ArrowButton::paintButton (Graphics& g, - bool /*isMouseOverButton*/, - bool /*isButtonDown*/) -{ - g.setColour (colour); - - g.fillPath (path, path.getTransformToScaleToFit ((float) offset, - (float) offset, - (float) (getWidth() - 3), - (float) (getHeight() - 3), - false)); -} - -void ArrowButton::buttonStateChanged() -{ - updateShadowAndOffset(); -} - -void ArrowButton::updateShadowAndOffset() -{ - offset = (isDown()) ? 1 : 0; - - shadow.setShadowProperties ((isDown()) ? 1.2f : 3.0f, - 0.3f, -1, 0); -} diff --git a/src/juce/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ArrowButton.h b/src/juce/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ArrowButton.h deleted file mode 100644 index 54f771f6..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ArrowButton.h +++ /dev/null @@ -1,80 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_ARROWBUTTON_JUCEHEADER__ -#define __JUCE_ARROWBUTTON_JUCEHEADER__ - -#include "juce_Button.h" - - -//============================================================================== -/** - 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, - const Colour& arrowColour); - - /** Destructor. */ - ~ArrowButton(); - - -protected: - //============================================================================== - /** @internal */ - void paintButton (Graphics& g, - bool isMouseOverButton, - bool isButtonDown); - - /** @internal */ - void buttonStateChanged(); - -private: - //============================================================================== - Colour colour; - DropShadowEffect shadow; - Path path; - int offset; - - void updateShadowAndOffset(); - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ArrowButton); -}; - - -#endif // __JUCE_ARROWBUTTON_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_Button.cpp b/src/juce/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_Button.cpp deleted file mode 100644 index f5cffc1c..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_Button.cpp +++ /dev/null @@ -1,691 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -class Button::RepeatTimer : public Timer -{ -public: - RepeatTimer (Button& owner_) : owner (owner_) {} - void timerCallback() { owner.repeatTimerCallback(); } - -private: - Button& owner; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (RepeatTimer); -}; - -//============================================================================== -Button::Button (const String& name) - : Component (name), - text (name), - buttonPressTime (0), - lastRepeatTime (0), - commandManagerToUse (nullptr), - autoRepeatDelay (-1), - autoRepeatSpeed (0), - autoRepeatMinimumDelay (-1), - radioGroupId (0), - commandID (0), - connectedEdgeFlags (0), - buttonState (buttonNormal), - lastToggleState (false), - clickTogglesState (false), - needsToRelease (false), - needsRepainting (false), - isKeyDown (false), - triggerOnMouseDown (false), - generateTooltip (false) -{ - setWantsKeyboardFocus (true); - isOn.addListener (this); -} - -Button::~Button() -{ - isOn.removeListener (this); - - if (commandManagerToUse != nullptr) - commandManagerToUse->removeListener (this); - - repeatTimer = nullptr; - clearShortcuts(); -} - -//============================================================================== -void Button::setButtonText (const String& newText) -{ - if (text != newText) - { - text = newText; - repaint(); - } -} - -void Button::setTooltip (const String& newTooltip) -{ - SettableTooltipClient::setTooltip (newTooltip); - generateTooltip = false; -} - -String Button::getTooltip() -{ - if (generateTooltip && commandManagerToUse != nullptr && commandID != 0) - { - String tt (commandManagerToUse->getDescriptionOfCommand (commandID)); - - 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 << ']'; - } - - return tt; - } - - return SettableTooltipClient::getTooltip(); -} - -void Button::setConnectedEdges (const int connectedEdgeFlags_) -{ - if (connectedEdgeFlags != connectedEdgeFlags_) - { - connectedEdgeFlags = connectedEdgeFlags_; - repaint(); - } -} - -//============================================================================== -void Button::setToggleState (const bool shouldBeOn, - const bool sendChangeNotification) -{ - if (shouldBeOn != lastToggleState) - { - 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(); - - WeakReference deletionWatcher (this); - - if (sendChangeNotification) - { - sendClickMessage (ModifierKeys()); - - if (deletionWatcher == nullptr) - return; - } - - if (lastToggleState) - { - turnOffOtherButtonsInGroup (sendChangeNotification); - - if (deletionWatcher == nullptr) - return; - } - - sendStateMessage(); - } -} - -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::valueChanged (Value& value) -{ - if (value.refersToSameSourceAs (isOn)) - setToggleState (isOn.getValue(), true); -} - -void Button::setRadioGroupId (const int newGroupId) -{ - if (radioGroupId != newGroupId) - { - radioGroupId = newGroupId; - - if (lastToggleState) - turnOffOtherButtonsInGroup (true); - } -} - -void Button::turnOffOtherButtonsInGroup (const bool sendChangeNotification) -{ - Component* const p = getParentComponent(); - - if (p != nullptr && radioGroupId != 0) - { - WeakReference deletionWatcher (this); - - for (int i = p->getNumChildComponents(); --i >= 0;) - { - Component* const c = p->getChildComponent (i); - - if (c != this) - { - Button* const b = dynamic_cast (c); - - if (b != nullptr && b->getRadioGroupId() == radioGroupId) - { - b->setToggleState (false, sendChangeNotification); - - 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& /*modifiers*/) -{ - clicked(); -} - -enum { clickMessageId = 0x2f3f4f99 }; - -void Button::triggerClick() -{ - postCommandMessage (clickMessageId); -} - -void Button::internalClickCallback (const ModifierKeys& modifiers) -{ - if (clickTogglesState) - setToggleState ((radioGroupId != 0) || ! lastToggleState, false); - - sendClickMessage (modifiers); -} - -void Button::flashButtonState() -{ - if (isEnabled()) - { - needsToRelease = true; - setState (buttonDown); - getRepeatTimer().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::addButtonListener (ButtonListener* l) { addListener (l); } -void Button::removeButtonListener (ButtonListener* l) { removeListener (l); } - -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) - getRepeatTimer().startTimer (autoRepeatDelay); - - if (triggerOnMouseDown) - internalClickCallback (e.mods); - } -} - -void Button::mouseUp (const MouseEvent& e) -{ - const bool wasDown = isDown(); - updateState (isMouseOver(), false); - - if (wasDown && isOver() && ! triggerOnMouseDown) - internalClickCallback (e.mods); -} - -void Button::mouseDrag (const MouseEvent&) -{ - const ButtonState oldState = buttonState; - updateState (isMouseOver(), true); - - if (autoRepeatDelay >= 0 && buttonState != oldState && isDown()) - getRepeatTimer().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 (this); - - keySource = newKeySource; - - if (keySource != nullptr) - keySource->addKeyListener (this); - } -} - -//============================================================================== -void Button::setCommandToTrigger (ApplicationCommandManager* const commandManagerToUse_, - const int commandID_, - const bool generateTooltip_) -{ - commandID = commandID_; - generateTooltip = generateTooltip_; - - if (commandManagerToUse != commandManagerToUse_) - { - if (commandManagerToUse != nullptr) - commandManagerToUse->removeListener (this); - - commandManagerToUse = commandManagerToUse_; - - if (commandManagerToUse != nullptr) - commandManagerToUse->addListener (this); - - // 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) - applicationCommandListChanged(); - else - setEnabled (true); -} - -void Button::applicationCommandInvoked (const ApplicationCommandTarget::InvocationInfo& info) -{ - if (info.commandID == commandID - && (info.commandFlags & ApplicationCommandInfo::dontTriggerVisualFeedback) == 0) - { - flashButtonState(); - } -} - -void Button::applicationCommandListChanged() -{ - if (commandManagerToUse != nullptr) - { - ApplicationCommandInfo info (0); - - ApplicationCommandTarget* const target = commandManagerToUse->getTargetForCommand (commandID, info); - - setEnabled (target != nullptr && (info.flags & ApplicationCommandInfo::isDisabled) == 0); - - if (target != nullptr) - setToggleState ((info.flags & ApplicationCommandInfo::isTicked) != 0, 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 (! 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::keyStateChanged (const bool, Component*) -{ - if (! isEnabled()) - return false; - - const bool wasDown = isKeyDown; - isKeyDown = isShortcutPressed(); - - if (autoRepeatDelay >= 0 && (isKeyDown && ! wasDown)) - getRepeatTimer().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&, Component*) -{ - // returning true will avoid forwarding events for keys that we're using as shortcuts - return isShortcutPressed(); -} - -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) - { - getRepeatTimer().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; - getRepeatTimer().startTimer (repeatSpeed); - - internalClickCallback (ModifierKeys::getCurrentModifiers()); - } - else if (! needsToRelease) - { - getRepeatTimer().stopTimer(); - } -} - -Button::RepeatTimer& Button::getRepeatTimer() -{ - if (repeatTimer == nullptr) - repeatTimer = new RepeatTimer (*this); - - return *repeatTimer; -} - -const Identifier Button::Ids::text ("text"); -const Identifier Button::Ids::radioGroup ("radioGroup"); -const Identifier Button::Ids::connectedLeft ("connectedLeft"); -const Identifier Button::Ids::connectedRight ("connectedRight"); -const Identifier Button::Ids::connectedTop ("connectedTop"); -const Identifier Button::Ids::connectedBottom ("connectedBottom"); - -void Button::refreshFromValueTree (const ValueTree& state, ComponentBuilder&) -{ - ComponentBuilder::refreshBasicComponentProperties (*this, state); - - setButtonText (state [Ids::text].toString()); - setRadioGroupId (state [Ids::radioGroup]); - setConnectedEdges (getConnectedFlags (state)); -} - -int Button::getConnectedFlags (const ValueTree& state) -{ - int connected = 0; - if (state [Button::Ids::connectedLeft]) connected |= Button::ConnectedOnLeft; - if (state [Button::Ids::connectedRight]) connected |= Button::ConnectedOnRight; - if (state [Button::Ids::connectedTop]) connected |= Button::ConnectedOnTop; - if (state [Button::Ids::connectedBottom]) connected |= Button::ConnectedOnBottom; - return connected; -} diff --git a/src/juce/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_Button.h b/src/juce/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_Button.h deleted file mode 100644 index 973f9d63..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_Button.h +++ /dev/null @@ -1,518 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_BUTTON_JUCEHEADER__ -#define __JUCE_BUTTON_JUCEHEADER__ - -#include "../components/juce_Component.h" -#include "../keyboard/juce_KeyListener.h" -#include "../commands/juce_ApplicationCommandManager.h" -#include "../windows/juce_TooltipWindow.h" -#include "../layout/juce_ComponentBuilder.h" - - -//============================================================================== -/** - 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, - public ApplicationCommandManagerListener, - public ValueListener, - private KeyListener -{ -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 by the mouse. - - @see isOver - */ - bool isDown() const noexcept; - - /** Returns true if the mouse is currently over the button. - - This will be also be true if the mouse 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 sendChangeNotification if true, a callback will be made to clicked(); if false - the button will be repainted but no notification will - be sent - @see getToggleState, setRadioGroupId - */ - void setToggleState (bool shouldBeOn, - bool sendChangeNotification); - - /** 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() { 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 shouldToggle) 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. - - @see getRadioGroupId - */ - void setRadioGroupId (int newGroupId); - - /** 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* 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 0 for the parameters. - - 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, - int commandID, - bool generateTooltip); - - /** Returns the command ID that was set by setCommandToTrigger(). - */ - int 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& key); - - /** 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& key) 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); - - // (implementation of the TooltipClient method) - String getTooltip(); - - - //============================================================================== - /** 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 (const ButtonState newState); - - - //============================================================================== - struct Ids - { - static const Identifier text, radioGroup, - connectedLeft, connectedRight, connectedTop, connectedBottom; - }; - - void refreshFromValueTree (const ValueTree&, ComponentBuilder&); - static int getConnectedFlags (const ValueTree& state); - - //============================================================================== - // These are deprecated - please use addListener() and removeListener() instead! - JUCE_DEPRECATED (void addButtonListener (Listener*)); - JUCE_DEPRECATED (void removeButtonListener (Listener*)); - -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& modifiers); - /** @internal */ - void handleCommandMessage (int commandId); - /** @internal */ - void mouseEnter (const MouseEvent& e); - /** @internal */ - void mouseExit (const MouseEvent& e); - /** @internal */ - void mouseDown (const MouseEvent& e); - /** @internal */ - void mouseDrag (const MouseEvent& e); - /** @internal */ - void mouseUp (const MouseEvent& e); - /** @internal */ - bool keyPressed (const KeyPress& key); - /** @internal */ - bool keyPressed (const KeyPress& key, Component* originatingComponent); - /** @internal */ - bool keyStateChanged (bool isKeyDown, Component* originatingComponent); - /** @internal */ - void paint (Graphics& g); - /** @internal */ - void parentHierarchyChanged(); - /** @internal */ - void visibilityChanged(); - /** @internal */ - void focusGained (FocusChangeType cause); - /** @internal */ - void focusLost (FocusChangeType cause); - /** @internal */ - void enablementChanged(); - /** @internal */ - void applicationCommandInvoked (const ApplicationCommandTarget::InvocationInfo&); - /** @internal */ - void applicationCommandListChanged(); - /** @internal */ - void valueChanged (Value& value); - -private: - //============================================================================== - Array shortcuts; - WeakReference keySource; - String text; - ListenerList buttonListeners; - - class RepeatTimer; - friend class RepeatTimer; - friend class ScopedPointer ; - ScopedPointer repeatTimer; - uint32 buttonPressTime, lastRepeatTime; - ApplicationCommandManager* commandManagerToUse; - int autoRepeatDelay, autoRepeatSpeed, autoRepeatMinimumDelay; - int radioGroupId, commandID, connectedEdgeFlags; - ButtonState buttonState; - - Value isOn; - bool lastToggleState : 1; - bool clickTogglesState : 1; - bool needsToRelease : 1; - bool needsRepainting : 1; - bool isKeyDown : 1; - bool triggerOnMouseDown : 1; - bool generateTooltip : 1; - - void repeatTimerCallback(); - RepeatTimer& getRepeatTimer(); - - ButtonState updateState(); - ButtonState updateState (bool isOver, bool isDown); - bool isShortcutPressed() const; - void turnOffOtherButtonsInGroup (bool sendChangeNotification); - - void flashButtonState(); - void sendClickMessage (const ModifierKeys& modifiers); - 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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_DrawableButton.cpp b/src/juce/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_DrawableButton.cpp deleted file mode 100644 index 246d1cf6..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_DrawableButton.cpp +++ /dev/null @@ -1,290 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -DrawableButton::DrawableButton (const String& name, - const DrawableButton::ButtonStyle buttonStyle) - : Button (name), - style (buttonStyle), - currentImage (nullptr), - edgeIndent (3) -{ - if (buttonStyle == ImageOnButtonBackground) - { - backgroundOff = Colour (0xffbbbbff); - backgroundOn = Colour (0xff3333ff); - } - else - { - backgroundOff = Colours::transparentBlack; - backgroundOn = Colour (0xaabbbbff); - } -} - -DrawableButton::~DrawableButton() -{ -} - -//============================================================================== -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.. - - if (normal != nullptr) normalImage = normal->createCopy(); - if (over != nullptr) overImage = over->createCopy(); - if (down != nullptr) downImage = down->createCopy(); - if (disabled != nullptr) disabledImage = disabled->createCopy(); - if (normalOn != nullptr) normalImageOn = normalOn->createCopy(); - if (overOn != nullptr) overImageOn = overOn->createCopy(); - if (downOn != nullptr) downImageOn = downOn->createCopy(); - if (disabledOn != nullptr) disabledImageOn = disabledOn->createCopy(); - - buttonStateChanged(); -} - -//============================================================================== -void DrawableButton::setButtonStyle (const DrawableButton::ButtonStyle newStyle) -{ - if (style != newStyle) - { - style = newStyle; - buttonStateChanged(); - } -} - -void DrawableButton::setBackgroundColours (const Colour& toggledOffColour, - const Colour& toggledOnColour) -{ - if (backgroundOff != toggledOffColour - || backgroundOn != toggledOnColour) - { - backgroundOff = toggledOffColour; - backgroundOn = toggledOnColour; - - repaint(); - } -} - -const Colour& DrawableButton::getBackgroundColour() const noexcept -{ - return getToggleState() ? backgroundOn - : backgroundOff; -} - -void DrawableButton::setEdgeIndent (const int numPixelsIndent) -{ - edgeIndent = numPixelsIndent; - repaint(); - resized(); -} - -void DrawableButton::resized() -{ - Button::resized(); - - if (currentImage != nullptr) - { - if (style == ImageRaw) - { - currentImage->setOriginWithOriginalSize (Point()); - } - else - { - Rectangle imageSpace; - - if (style == ImageOnButtonBackground) - { - imageSpace = getLocalBounds().reduced (getWidth() / 4, getHeight() / 4); - } - else - { - const int textH = (style == ImageAboveTextLabel) ? jmin (16, proportionOfHeight (0.25f)) : 0; - - const int indentX = jmin (edgeIndent, proportionOfWidth (0.3f)); - const int indentY = jmin (edgeIndent, proportionOfHeight (0.3f)); - - imageSpace.setBounds (indentX, indentY, - getWidth() - indentX * 2, - getHeight() - indentY * 2 - textH); - } - - currentImage->setTransformToFit (imageSpace.toFloat(), 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); - DrawableButton::resized(); - } - } - - if (currentImage != nullptr) - currentImage->setAlpha (opacity); -} - -void DrawableButton::enablementChanged() -{ - Button::enablementChanged(); - buttonStateChanged(); -} - -void DrawableButton::paintButton (Graphics& g, - bool isMouseOverButton, - bool isButtonDown) -{ - if (style == ImageOnButtonBackground) - { - getLookAndFeel().drawButtonBackground (g, *this, - getBackgroundColour(), - isMouseOverButton, - isButtonDown); - } - else - { - g.fillAll (getBackgroundColour()); - - const int textH = (style == ImageAboveTextLabel) - ? jmin (16, proportionOfHeight (0.25f)) - : 0; - - if (textH > 0) - { - g.setFont ((float) textH); - - g.setColour (findColour (DrawableButton::textColourId) - .withMultipliedAlpha (isEnabled() ? 1.0f : 0.4f)); - - g.drawFittedText (getButtonText(), - 2, getHeight() - textH - 1, - getWidth() - 4, textH, - Justification::centred, 1); - } - } -} - -//============================================================================== -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 -{ - Drawable* d = normalImage; - - if (getToggleState()) - { - if (overImageOn != nullptr) - d = overImageOn; - else if (normalImageOn != nullptr) - d = normalImageOn; - else if (overImage != nullptr) - d = overImage; - } - else - { - if (overImage != nullptr) - d = overImage; - } - - return d; -} - -Drawable* DrawableButton::getDownImage() const noexcept -{ - Drawable* d = normalImage; - - if (getToggleState()) - { - if (downImageOn != nullptr) - d = downImageOn; - else if (overImageOn != nullptr) - d = overImageOn; - else if (normalImageOn != nullptr) - d = normalImageOn; - else if (downImage != nullptr) - d = downImage; - else - d = getOverImage(); - } - else - { - if (downImage != nullptr) - d = downImage; - else - d = getOverImage(); - } - - return d; -} diff --git a/src/juce/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_DrawableButton.h b/src/juce/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_DrawableButton.h deleted file mode 100644 index 5315169f..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_DrawableButton.h +++ /dev/null @@ -1,195 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_DRAWABLEBUTTON_JUCEHEADER__ -#define __JUCE_DRAWABLEBUTTON_JUCEHEADER__ - -#include "juce_Button.h" -#include "../drawables/juce_Drawable.h" - - -//============================================================================== -/** - 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. */ - }; - - //============================================================================== - /** 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 0, 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 0, 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 0, 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 0, 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); - - //============================================================================== - /** Changes the button's background colours. - - The toggledOffColour is the colour to use when the button's toggle state - is off, and toggledOnColour when it's on. - - For an ImageOnly or ImageAboveTextLabel style, the background colour is - used to fill the background of the component. - - For an ImageOnButtonBackground style, the colour is used to draw the - button's lozenge shape and exactly how the colour's used will depend - on the LookAndFeel. - */ - void setBackgroundColours (const Colour& toggledOffColour, - const Colour& toggledOnColour); - - /** Returns the current background colour being used. - - @see setBackgroundColour - */ - const Colour& getBackgroundColour() const noexcept; - - /** Gives the button an optional amount of space around the edge of the drawable. - - This will only apply to ImageFitted or ImageRaw styles, it won't affect the - ones on a button background. If the button is too small for the given gap, a - smaller gap will be used. - - 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; - Drawable* getNormalImage() const noexcept; - Drawable* getOverImage() const noexcept; - Drawable* getDownImage() const noexcept; - - //============================================================================== - /** 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 = 0x1004010, /**< The colour to use for the URL text. */ - }; - -protected: - //============================================================================== - /** @internal */ - void paintButton (Graphics& g, - bool isMouseOverButton, - bool isButtonDown); - /** @internal */ - void buttonStateChanged(); - /** @internal */ - void resized(); - /** @internal */ - void enablementChanged(); - -private: - //============================================================================== - ButtonStyle style; - ScopedPointer normalImage, overImage, downImage, disabledImage; - ScopedPointer normalImageOn, overImageOn, downImageOn, disabledImageOn; - Drawable* currentImage; - Colour backgroundOff, backgroundOn; - int edgeIndent; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DrawableButton); -}; - - -#endif // __JUCE_DRAWABLEBUTTON_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_HyperlinkButton.cpp b/src/juce/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_HyperlinkButton.cpp deleted file mode 100644 index 0f5c3e07..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_HyperlinkButton.cpp +++ /dev/null @@ -1,123 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce 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, - const 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 (getName()) + 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(), - 2, 0, getWidth() - 2, getHeight(), - justification.getOnlyHorizontalFlags() | Justification::verticallyCentred, - true); -} - -const Identifier HyperlinkButton::Ids::tagType ("HYPERLINKBUTTON"); -const Identifier HyperlinkButton::Ids::text ("text"); -const Identifier HyperlinkButton::Ids::url ("url"); - -void HyperlinkButton::refreshFromValueTree (const ValueTree& state, ComponentBuilder&) -{ - ComponentBuilder::refreshBasicComponentProperties (*this, state); - - setButtonText (state [Ids::text].toString()); - setURL (URL (state [Ids::url].toString())); -} diff --git a/src/juce/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_HyperlinkButton.h b/src/juce/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_HyperlinkButton.h deleted file mode 100644 index c2e285fb..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_HyperlinkButton.h +++ /dev/null @@ -1,127 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_HYPERLINKBUTTON_JUCEHEADER__ -#define __JUCE_HYPERLINKBUTTON_JUCEHEADER__ - -#include "juce_Button.h" - - -//============================================================================== -/** - 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, - const 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(); - - //============================================================================== - struct Ids - { - static const Identifier tagType, text, url; - }; - - void refreshFromValueTree (const ValueTree&, ComponentBuilder&); - -protected: - //============================================================================== - /** @internal */ - void clicked(); - /** @internal */ - void colourChanged(); - /** @internal */ - void paintButton (Graphics& g, - bool isMouseOverButton, - bool isButtonDown); - -private: - //============================================================================== - URL url; - Font font; - bool resizeFont; - Justification justification; - - Font getFontToUse() const; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (HyperlinkButton); -}; - -#endif // __JUCE_HYPERLINKBUTTON_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ImageButton.cpp b/src/juce/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ImageButton.cpp deleted file mode 100644 index 957053da..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ImageButton.cpp +++ /dev/null @@ -1,243 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce 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, - const Colour& overlayColourWhenNormal, - const Image& overImage_, - const float imageOpacityWhenOver, - const Colour& overlayColourWhenOver, - const Image& downImage_, - const float imageOpacityWhenDown, - const 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()); -} - -const Identifier ImageButton::Ids::tagType ("IMAGEBUTTON"); -const Identifier ImageButton::Ids::upImage ("upImage"); -const Identifier ImageButton::Ids::overImage ("overImage"); -const Identifier ImageButton::Ids::downImage ("downImage"); -const Identifier ImageButton::Ids::upOverlay ("upOverlay"); -const Identifier ImageButton::Ids::overOverlay ("overOverlay"); -const Identifier ImageButton::Ids::downOverlay ("downOverlay"); -const Identifier ImageButton::Ids::upOpacity ("upOpacity"); -const Identifier ImageButton::Ids::overOpacity ("overOpacity"); -const Identifier ImageButton::Ids::downOpacity ("downOpacity"); - -namespace ImageButtonHelpers -{ - static Colour getColourFromVar (const var& col) - { - return col.isString() ? Colour::fromString (col.toString()) - : Colours::transparentBlack; - } - - static float getOpacityFromVar (const var& v) - { - return v.isVoid() ? 1.0f : static_cast (v); - } -} - -void ImageButton::refreshFromValueTree (const ValueTree& state, ComponentBuilder& builder) -{ - Button::refreshFromValueTree (state, builder); - - const var upImageIdentifier (state [Ids::upImage]), - overImageIdentifier (state [Ids::overImage]), - downImageIdentifier (state [Ids::downImage]); - - ComponentBuilder::ImageProvider* const imageProvider = builder.getImageProvider(); - jassert (imageProvider != nullptr || upImageIdentifier.isVoid()); - - Image newUpImage, newOverImage, newDownImage; - - if (imageProvider != nullptr) - { - newUpImage = imageProvider->getImageForIdentifier (upImageIdentifier); - newOverImage = imageProvider->getImageForIdentifier (overImageIdentifier); - newDownImage = imageProvider->getImageForIdentifier (downImageIdentifier); - } - - using namespace ImageButtonHelpers; - - setImages (false, true, true, - newUpImage, getOpacityFromVar (state[Ids::upOpacity]), getColourFromVar (state[Ids::upOverlay]), - newOverImage, getOpacityFromVar (state[Ids::overOpacity]), getColourFromVar (state[Ids::overOverlay]), - newDownImage, getOpacityFromVar (state[Ids::downOpacity]), getColourFromVar (state[Ids::downOverlay])); -} diff --git a/src/juce/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ImageButton.h b/src/juce/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ImageButton.h deleted file mode 100644 index 6828603f..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ImageButton.h +++ /dev/null @@ -1,164 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_IMAGEBUTTON_JUCEHEADER__ -#define __JUCE_IMAGEBUTTON_JUCEHEADER__ - -#include "juce_Button.h" - - -//============================================================================== -/** - 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 setDrawingOptions(). - - @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, - const Colour& overlayColourWhenNormal, - const Image& overImage, - float imageOpacityWhenOver, - const Colour& overlayColourWhenOver, - const Image& downImage, - float imageOpacityWhenDown, - const 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; - - //============================================================================== - struct Ids - { - static const Identifier tagType, upImage, overImage, downImage, - upOverlay, overOverlay, downOverlay, - upOpacity, overOpacity, downOpacity; - }; - - void refreshFromValueTree (const ValueTree&, ComponentBuilder&); - -protected: - //============================================================================== - /** @internal */ - bool hitTest (int x, int y); - /** @internal */ - void paintButton (Graphics& g, - bool isMouseOverButton, - bool isButtonDown); - -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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ShapeButton.cpp b/src/juce/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ShapeButton.cpp deleted file mode 100644 index 77467195..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ShapeButton.cpp +++ /dev/null @@ -1,118 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -ShapeButton::ShapeButton (const String& text_, - const Colour& normalColour_, - const Colour& overColour_, - const Colour& downColour_) - : Button (text_), - normalColour (normalColour_), - overColour (overColour_), - downColour (downColour_), - maintainShapeProportions (false), - outlineWidth (0.0f) -{ -} - -ShapeButton::~ShapeButton() -{ -} - -void ShapeButton::setColours (const Colour& newNormalColour, - const Colour& newOverColour, - const Colour& newDownColour) -{ - normalColour = newNormalColour; - overColour = newOverColour; - downColour = newDownColour; -} - -void ShapeButton::setOutline (const Colour& newOutlineColour, - const float newOutlineWidth) -{ - outlineColour = newOutlineColour; - outlineWidth = newOutlineWidth; -} - -void ShapeButton::setShape (const Path& newShape, - const bool resizeNowToFitThisShape, - const bool maintainShapeProportions_, - const bool hasShadow) -{ - shape = newShape; - maintainShapeProportions = maintainShapeProportions_; - - shadow.setShadowProperties (3.0f, 0.5f, 0, 0); - setComponentEffect ((hasShadow) ? &shadow : 0); - - if (resizeNowToFitThisShape) - { - Rectangle newBounds (shape.getBounds()); - - if (hasShadow) - newBounds.expand (4.0f, 4.0f); - - shape.applyTransform (AffineTransform::translation (-newBounds.getX(), -newBounds.getY())); - - setSize (1 + (int) (newBounds.getWidth() + outlineWidth), - 1 + (int) (newBounds.getHeight() + outlineWidth)); - } -} - -void ShapeButton::paintButton (Graphics& g, bool isMouseOverButton, bool isButtonDown) -{ - if (! isEnabled()) - { - isMouseOverButton = false; - isButtonDown = false; - } - - g.setColour ((isButtonDown) ? downColour - : (isMouseOverButton) ? overColour - : normalColour); - - int w = getWidth(); - int h = getHeight(); - - if (getComponentEffect() != nullptr) - { - w -= 4; - h -= 4; - } - - const float offset = (outlineWidth * 0.5f) + (isButtonDown ? 1.5f : 0.0f); - - const AffineTransform trans (shape.getTransformToScaleToFit (offset, offset, - w - offset - outlineWidth, - h - offset - outlineWidth, - maintainShapeProportions)); - g.fillPath (shape, trans); - - if (outlineWidth > 0.0f) - { - g.setColour (outlineColour); - g.strokePath (shape, PathStrokeType (outlineWidth), trans); - } -} diff --git a/src/juce/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ShapeButton.h b/src/juce/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ShapeButton.h deleted file mode 100644 index 24674b13..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ShapeButton.h +++ /dev/null @@ -1,108 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_SHAPEBUTTON_JUCEHEADER__ -#define __JUCE_SHAPEBUTTON_JUCEHEADER__ - -#include "juce_Button.h" - - -//============================================================================== -/** - 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, - const Colour& normalColour, - const Colour& overColour, - const 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 (const Colour& normalColour, - const Colour& overColour, - const 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 (const Colour& outlineColour, - float outlineStrokeWidth); - - -protected: - /** @internal */ - void paintButton (Graphics& g, - bool isMouseOverButton, - bool isButtonDown); - -private: - //============================================================================== - Colour normalColour, overColour, downColour, outlineColour; - DropShadowEffect shadow; - Path shape; - bool maintainShapeProportions; - float outlineWidth; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ShapeButton); -}; - - -#endif // __JUCE_SHAPEBUTTON_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_TextButton.cpp b/src/juce/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_TextButton.cpp deleted file mode 100644 index 07b64e4f..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_TextButton.cpp +++ /dev/null @@ -1,71 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -TextButton::TextButton (const String& name, - const String& toolTip) - : Button (name) -{ - setTooltip (toolTip); -} - -TextButton::~TextButton() -{ -} - -void TextButton::paintButton (Graphics& g, - bool isMouseOverButton, - bool isButtonDown) -{ - getLookAndFeel().drawButtonBackground (g, *this, - findColour (getToggleState() ? buttonOnColourId - : buttonColourId), - isMouseOverButton, - isButtonDown); - - getLookAndFeel().drawButtonText (g, *this, - isMouseOverButton, - isButtonDown); -} - -void TextButton::colourChanged() -{ - repaint(); -} - -Font TextButton::getFont() -{ - return Font (jmin (15.0f, getHeight() * 0.6f)); -} - -void TextButton::changeWidthToFitText (const int newHeight) -{ - if (newHeight >= 0) - setSize (jmax (1, getWidth()), newHeight); - - setSize (getFont().getStringWidth (getButtonText()) + getHeight(), - getHeight()); -} - -const Identifier TextButton::Ids::tagType ("TEXTBUTTON"); diff --git a/src/juce/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_TextButton.h b/src/juce/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_TextButton.h deleted file mode 100644 index 03baf61d..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_TextButton.h +++ /dev/null @@ -1,110 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_TEXTBUTTON_JUCEHEADER__ -#define __JUCE_TEXTBUTTON_JUCEHEADER__ - -#include "juce_Button.h" - - -//============================================================================== -/** - 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. - - @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 - - @see Button - */ - TextButton (const String& buttonName = String::empty, - const String& toolTip = String::empty); - - /** 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". */ - }; - - //============================================================================== - /** Resizes the button to fit neatly around its current text. - - If newHeight is >= 0, the button's height will be changed to this - value. If it's less than zero, its height will be unaffected. - */ - void changeWidthToFitText (int newHeight = -1); - - /** This can be overridden to use different fonts than the default one. - - Note that you'll need to set the font's size appropriately, too. - */ - virtual Font getFont(); - - //============================================================================== - struct Ids - { - static const Identifier tagType; - }; - -protected: - /** @internal */ - void paintButton (Graphics& g, bool isMouseOverButton, bool isButtonDown); - /** @internal */ - void colourChanged(); - -private: - //============================================================================== - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (TextButton); -}; - - -#endif // __JUCE_TEXTBUTTON_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ToggleButton.cpp b/src/juce/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ToggleButton.cpp deleted file mode 100644 index 47efb377..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ToggleButton.cpp +++ /dev/null @@ -1,55 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -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(); -} - -const Identifier ToggleButton::Ids::tagType ("TOGGLEBUTTON"); diff --git a/src/juce/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ToggleButton.h b/src/juce/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ToggleButton.h deleted file mode 100644 index 41f511ba..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ToggleButton.h +++ /dev/null @@ -1,97 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_TOGGLEBUTTON_JUCEHEADER__ -#define __JUCE_TOGGLEBUTTON_JUCEHEADER__ - -#include "juce_Button.h" - - -//============================================================================== -/** - 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. - - @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 = String::empty); - - /** 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. */ - }; - - //============================================================================== - struct Ids - { - static const Identifier tagType; - }; - -protected: - /** @internal */ - void paintButton (Graphics& g, - bool isMouseOverButton, - bool isButtonDown); - - /** @internal */ - void colourChanged(); - -private: - //============================================================================== - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ToggleButton); -}; - - -#endif // __JUCE_TOGGLEBUTTON_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ToolbarButton.cpp b/src/juce/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ToolbarButton.cpp deleted file mode 100644 index 599a6280..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ToolbarButton.cpp +++ /dev/null @@ -1,107 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -ToolbarButton::ToolbarButton (const int itemId_, const String& buttonText, - Drawable* const normalImage_, Drawable* const toggledOnImage_) - : ToolbarItemComponent (itemId_, buttonText, true), - normalImage (normalImage_), - toggledOnImage (toggledOnImage_), - 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->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/src/juce/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ToolbarButton.h b/src/juce/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ToolbarButton.h deleted file mode 100644 index 23234d93..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ToolbarButton.h +++ /dev/null @@ -1,100 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_TOOLBARBUTTON_JUCEHEADER__ -#define __JUCE_TOOLBARBUTTON_JUCEHEADER__ - -#include "../widgets/juce_ToolbarItemComponent.h" - - -//============================================================================== -/** - 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 - 0 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 kept 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); - /** @internal */ - void paintButtonArea (Graphics&, int width, int height, bool isMouseOver, bool isMouseDown); - /** @internal */ - void contentAreaChanged (const Rectangle&); - /** @internal */ - void buttonStateChanged(); - /** @internal */ - void resized(); - /** @internal */ - void enablementChanged(); - -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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandID.h b/src/juce/JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandID.h deleted file mode 100644 index 8572305d..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandID.h +++ /dev/null @@ -1,83 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_APPLICATIONCOMMANDID_JUCEHEADER__ -#define __JUCE_APPLICATIONCOMMANDID_JUCEHEADER__ - - -//============================================================================== -/** 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 -{ - /** 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 JUCEApplication::systemRequestedQuit(). - */ - static const CommandID quit = 0x1001; - - /** The command ID that should be used to send a "Delete" command. */ - static const CommandID del = 0x1002; - - /** The command ID that should be used to send a "Cut" command. */ - static const CommandID cut = 0x1003; - - /** The command ID that should be used to send a "Copy to clipboard" command. */ - static const CommandID copy = 0x1004; - - /** The command ID that should be used to send a "Paste from clipboard" command. */ - static const CommandID paste = 0x1005; - - /** The command ID that should be used to send a "Select all" command. */ - static const CommandID selectAll = 0x1006; - - /** The command ID that should be used to send a "Deselect all" command. */ - static const CommandID deselectAll = 0x1007; -} - - -#endif // __JUCE_APPLICATIONCOMMANDID_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.cpp b/src/juce/JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.cpp deleted file mode 100644 index 93751b4c..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.cpp +++ /dev/null @@ -1,62 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -ApplicationCommandInfo::ApplicationCommandInfo (const CommandID commandID_) noexcept - : commandID (commandID_), - 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, const ModifierKeys& modifiers) noexcept -{ - defaultKeypresses.add (KeyPress (keyCode, modifiers, 0)); -} diff --git a/src/juce/JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.h b/src/juce/JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.h deleted file mode 100644 index c1bac5cc..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.h +++ /dev/null @@ -1,194 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_APPLICATIONCOMMANDINFO_JUCEHEADER__ -#define __JUCE_APPLICATIONCOMMANDINFO_JUCEHEADER__ - -#include "../keyboard/juce_KeyPress.h" -#include "juce_ApplicationCommandID.h" - - -//============================================================================== -/** - 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, - const 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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandManager.cpp b/src/juce/JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandManager.cpp deleted file mode 100644 index 96d275c9..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandManager.cpp +++ /dev/null @@ -1,311 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce 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 (getCommandForID (newCommand.commandID) == 0) - { - ApplicationCommandInfo* const newInfo = new ApplicationCommandInfo (newCommand); - newInfo->flags &= ~ApplicationCommandInfo::isTicked; - commands.add (newInfo); - - keyMappings->resetToDefaultMapping (newCommand.commandID); - - triggerAsyncUpdate(); - } - else - { - // trying to re-register the same command with different parameters? - jassert (newCommand.shortName == getCommandForID (newCommand.commandID)->shortName - && (newCommand.description == getCommandForID (newCommand.commandID)->description || newCommand.description.isEmpty()) - && 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))); - } -} - -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(); -} - -//============================================================================== -const ApplicationCommandInfo* ApplicationCommandManager::getCommandForID (const CommandID commandID) const noexcept -{ - for (int i = commands.size(); --i >= 0;) - if (commands.getUnchecked(i)->commandID == commandID) - return commands.getUnchecked(i); - - return nullptr; -} - -String ApplicationCommandManager::getNameOfCommand (const CommandID commandID) const noexcept -{ - const ApplicationCommandInfo* const ci = getCommandForID (commandID); - - return ci != nullptr ? ci->shortName : String::empty; -} - -String ApplicationCommandManager::getDescriptionOfCommand (const CommandID commandID) const noexcept -{ - const ApplicationCommandInfo* const ci = getCommandForID (commandID); - - return ci != nullptr ? (ci->description.isNotEmpty() ? ci->description : ci->shortName) - : String::empty; -} - -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& info_, 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()); - - ApplicationCommandInfo commandInfo (0); - ApplicationCommandTarget* const target = getTargetForCommand (info_.commandID, commandInfo); - - if (target == nullptr) - return false; - - ApplicationCommandTarget::InvocationInfo info (info_); - info.commandFlags = commandInfo.flags; - - sendListenerInvokeCallback (info); - - const bool 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) - 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) - { - TopLevelWindow* const activeWindow = TopLevelWindow::getActiveTopLevelWindow(); - - if (activeWindow != nullptr) - { - c = activeWindow->getPeer()->getLastFocusedSubcomponent(); - - if (c == nullptr) - c = activeWindow; - } - } - - if (c == nullptr && Process::isForegroundProcess()) - { - // getting a bit desperate now - try all desktop comps.. - for (int i = Desktop::getInstance().getNumComponents(); --i >= 0;) - { - ApplicationCommandTarget* const target - = findTargetForComponent (Desktop::getInstance().getComponent (i) - ->getPeer()->getLastFocusedSubcomponent()); - - if (target != nullptr) - return target; - } - } - - if (c != nullptr) - { - ResizableWindow* const resizableWindow = dynamic_cast (c); - - // 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 != nullptr && resizableWindow->getContentComponent() != nullptr) - c = resizableWindow->getContentComponent(); - - ApplicationCommandTarget* const target = findTargetForComponent (c); - - if (target != nullptr) - 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/src/juce/JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandManager.h b/src/juce/JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandManager.h deleted file mode 100644 index 324cd8c2..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandManager.h +++ /dev/null @@ -1,365 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_APPLICATIONCOMMANDMANAGER_JUCEHEADER__ -#define __JUCE_APPLICATIONCOMMANDMANAGER_JUCEHEADER__ - -#include "juce_ApplicationCommandTarget.h" -class KeyPressMappingSet; -class ApplicationCommandManagerListener; -class Desktop; - - -//============================================================================== -/** - 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 0. 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 distict - 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 0 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 0, then getFirstCommandTarget() will by default return the - result of findDefaultComponentTarget(). - - If you use this to set a target, make sure you call setFirstCommandTarget (0) 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 0. - - 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 a ApplicationCommandTarget. - - Returns the first ApplicationCommandTarget that it finds, or 0 if none of them implement - that class. - */ - static ApplicationCommandTarget* findTargetForComponent (Component* component); - - -private: - //============================================================================== - OwnedArray commands; - ListenerList listeners; - ScopedPointer keyMappings; - ApplicationCommandTarget* firstTarget; - - void sendListenerInvokeCallback (const ApplicationCommandTarget::InvocationInfo& info); - void handleAsyncUpdate(); - void globalFocusChanged (Component*); - - #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& info) = 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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.cpp b/src/juce/JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.cpp deleted file mode 100644 index af288d5c..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.cpp +++ /dev/null @@ -1,191 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -class ApplicationCommandTarget::CommandMessage : public MessageManager::MessageBase -{ -public: - CommandMessage (ApplicationCommandTarget* const owner_, const InvocationInfo& info_) - : owner (owner_), info (info_) - { - } - - void messageCallback() - { - ApplicationCommandTarget* const target = owner; - if (target != nullptr) - 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; - } - else - { - const bool success = perform (info); - - jassert (success); // hmm - your target should have been able to perform this command. 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. - return success; - } - } - - return false; -} - -ApplicationCommandTarget* ApplicationCommandTarget::findFirstTargetParentComponent() -{ - Component* c = dynamic_cast (this); - - if (c != nullptr) - 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 commandID_) - : commandID (commandID_), - commandFlags (0), - invocationMethod (direct), - originatingComponent (nullptr), - isKeyDown (false), - millisecsSinceKeyPressed (0) -{ -} diff --git a/src/juce/JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.h b/src/juce/JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.h deleted file mode 100644 index 1833898e..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.h +++ /dev/null @@ -1,249 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_APPLICATIONCOMMANDTARGET_JUCEHEADER__ -#define __JUCE_APPLICATIONCOMMANDTARGET_JUCEHEADER__ - -#include "juce_ApplicationCommandInfo.h" -class Component; - - -//============================================================================== -/** - 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(); - - //============================================================================== - /** - */ - 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 0 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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_gui_basics/commands/juce_KeyPressMappingSet.cpp b/src/juce/JuceLibraryCode/modules/juce_gui_basics/commands/juce_KeyPressMappingSet.cpp deleted file mode 100644 index 6671b1cc..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_gui_basics/commands/juce_KeyPressMappingSet.cpp +++ /dev/null @@ -1,425 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -KeyPressMappingSet::KeyPressMappingSet (ApplicationCommandManager* const commandManager_) - : commandManager (commandManager_) -{ - // A manager is needed to get the descriptions of commands, and will be called when - // a command is invoked. So you can't leave this null.. - jassert (commandManager_ != nullptr); - - Desktop::getInstance().addFocusChangeListener (this); -} - -KeyPressMappingSet::KeyPressMappingSet (const KeyPressMappingSet& other) - : 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; - } - } - - const ApplicationCommandInfo* const ci = commandManager->getCommandForID (commandID); - - if (ci != nullptr) - { - CommandMapping* const cm = new CommandMapping(); - cm->commandID = commandID; - cm->keypresses.add (newKeyPress); - cm->wantsKeyUpDownCallbacks = (ci->flags & ApplicationCommandInfo::wantsKeyUpDownCallbacks) != 0; - - mappings.add (cm); - sendChangeMessage(); - } - } - } -} - -void KeyPressMappingSet::resetToDefaultMappings() -{ - mappings.clear(); - - for (int i = 0; i < commandManager->getNumCommands(); ++i) - { - const ApplicationCommandInfo* const ci = commandManager->getCommandForIndex (i); - - for (int j = 0; j < ci->defaultKeypresses.size(); ++j) - { - addKeyPress (ci->commandID, - ci->defaultKeypresses.getReference (j)); - } - } - - sendChangeMessage(); -} - -void KeyPressMappingSet::resetToDefaultMapping (const CommandID commandID) -{ - clearAllKeyPresses (commandID); - - const ApplicationCommandInfo* const ci = commandManager->getCommandForID (commandID); - - for (int j = 0; j < ci->defaultKeypresses.size(); ++j) - { - addKeyPress (ci->commandID, - ci->defaultKeypresses.getReference (j)); - } -} - -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* const 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")) - { - if (containsMapping (commandId, key)) - removeKeyPress (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); - - int i; - for (i = 0; i < mappings.size(); ++i) - { - const CommandMapping* const 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 (i = 0; i < defaultSet->mappings.size(); ++i) - { - const CommandMapping* const 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* originatingComponent) -{ - bool commandWasDisabled = false; - - for (int i = 0; i < mappings.size(); ++i) - { - CommandMapping* const cm = mappings.getUnchecked(i); - - if (cm->keypresses.contains (key)) - { - const ApplicationCommandInfo* const ci = commandManager->getCommandForID (cm->commandID); - - if (ci != nullptr - && (ci->flags & ApplicationCommandInfo::wantsKeyUpDownCallbacks) == 0) - { - ApplicationCommandInfo info (0); - - if (commandManager->getTargetForCommand (cm->commandID, info) != 0) - { - if ((info.flags & ApplicationCommandInfo::isDisabled) == 0) - { - invokeCommand (cm->commandID, key, true, 0, originatingComponent); - return true; - } - else - { - 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* const 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/src/juce/JuceLibraryCode/modules/juce_gui_basics/commands/juce_KeyPressMappingSet.h b/src/juce/JuceLibraryCode/modules/juce_gui_basics/commands/juce_KeyPressMappingSet.h deleted file mode 100644 index 99d2cae1..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_gui_basics/commands/juce_KeyPressMappingSet.h +++ /dev/null @@ -1,259 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_KEYPRESSMAPPINGSET_JUCEHEADER__ -#define __JUCE_KEYPRESSMAPPINGSET_JUCEHEADER__ - -#include "../keyboard/juce_KeyListener.h" -#include "../commands/juce_ApplicationCommandManager.h" - - -//============================================================================== -/** - Manages and edits a list of keypresses, which it uses to invoke the appropriate - command in a 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, - public 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* commandManager); - - /** Creates an copy of a KeyPressMappingSet. */ - KeyPressMappingSet (const KeyPressMappingSet& other); - - /** 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& key, Component* originatingComponent); - /** @internal */ - bool keyStateChanged (bool isKeyDown, Component* originatingComponent); - /** @internal */ - void globalFocusChanged (Component* focusedComponent); - -private: - //============================================================================== - ApplicationCommandManager* commandManager; - - struct CommandMapping - { - CommandID commandID; - Array keypresses; - bool wantsKeyUpDownCallbacks; - }; - - OwnedArray mappings; - - struct KeyPressTime - { - KeyPress key; - uint32 timeWhenPressed; - }; - - OwnedArray keysDown; - - void handleMessage (const Message& message); - - void invokeCommand (const CommandID commandID, - const KeyPress& keyPress, - const bool isKeyDown, - const int millisecsSinceKeyPressed, - Component* const originatingComponent) const; - - KeyPressMappingSet& operator= (const KeyPressMappingSet&); - JUCE_LEAK_DETECTOR (KeyPressMappingSet); -}; - - -#endif // __JUCE_KEYPRESSMAPPINGSET_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_gui_basics/components/juce_CachedComponentImage.h b/src/juce/JuceLibraryCode/modules/juce_gui_basics/components/juce_CachedComponentImage.h deleted file mode 100644 index dbe7845a..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_gui_basics/components/juce_CachedComponentImage.h +++ /dev/null @@ -1,67 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_CACHEDCOMPONENTIMAGE_JUCEHEADER__ -#define __JUCE_CACHEDCOMPONENTIMAGE_JUCEHEADER__ - -class Component; - - -//============================================================================== -/** - 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. */ - virtual void invalidateAll() = 0; - - /** Invalidates a section of the cached image data. */ - virtual void 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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_gui_basics/components/juce_Component.cpp b/src/juce/JuceLibraryCode/modules/juce_gui_basics/components/juce_Component.cpp deleted file mode 100644 index 3feb3cdf..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_gui_basics/components/juce_Component.cpp +++ /dev/null @@ -1,2937 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#define CHECK_MESSAGE_MANAGER_IS_LOCKED \ - jassert (MessageManager::getInstance()->currentThreadHasLockedMessageManager()); - -#define CHECK_MESSAGE_MANAGER_IS_LOCKED_OR_OFFSCREEN \ - jassert (MessageManager::getInstance()->currentThreadHasLockedMessageManager() || getPeer() == nullptr); - -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; - - { - MouseListenerList* const list = comp.mouseListeners; - - if (list != nullptr) - { - 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 float wheelIncrementX, const float wheelIncrementY) - { - { - MouseListenerList* const list = comp.mouseListeners; - - if (list != nullptr) - { - for (int i = list->listeners.size(); --i >= 0;) - { - list->listeners.getUnchecked(i)->mouseWheelMove (e, wheelIncrementX, wheelIncrementY); - - 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, wheelIncrementX, wheelIncrementY); - - if (checker2.shouldBailOut()) - return; - - i = jmin (i, list->numDeepMouseListeners); - } - } - } - } - -private: - Array listeners; - int numDeepMouseListeners; - - class BailOutChecker2 - { - public: - BailOutChecker2 (Component::BailOutChecker& checker_, Component* const component) - : checker (checker_), safePointer (component) - { - } - - 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 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 (const int colourId) - { - String s; - s.preallocateBytes (32); - s << "jcclr_" << String::toHexString (colourId); - return s; - } - - //============================================================================== - static inline bool hitTest (Component& comp, const Point& localPoint) - { - return isPositiveAndBelow (localPoint.x, comp.getWidth()) - && isPositiveAndBelow (localPoint.y, comp.getHeight()) - && comp.hitTest (localPoint.x, localPoint.y); - } - - static Point convertFromParentSpace (const Component& comp, const Point& pointInParentSpace) - { - if (comp.affineTransform == nullptr) - return pointInParentSpace - comp.getPosition(); - - return pointInParentSpace.toFloat().transformedBy (comp.affineTransform->inverted()).toInt() - comp.getPosition(); - } - - static Rectangle convertFromParentSpace (const Component& comp, const Rectangle& areaInParentSpace) - { - if (comp.affineTransform == nullptr) - return areaInParentSpace - comp.getPosition(); - - return areaInParentSpace.toFloat().transformed (comp.affineTransform->inverted()).getSmallestIntegerContainer() - comp.getPosition(); - } - - static Point convertToParentSpace (const Component& comp, const Point& pointInLocalSpace) - { - if (comp.affineTransform == nullptr) - return pointInLocalSpace + comp.getPosition(); - - return (pointInLocalSpace + comp.getPosition()).toFloat().transformedBy (*comp.affineTransform).toInt(); - } - - static Rectangle convertToParentSpace (const Component& comp, const Rectangle& areaInLocalSpace) - { - if (comp.affineTransform == nullptr) - return areaInLocalSpace + comp.getPosition(); - - return (areaInLocalSpace + comp.getPosition()).toFloat().transformed (*comp.affineTransform).getSmallestIntegerContainer(); - } - - template - static Type convertFromDistantParentSpace (const Component* parent, const Component& target, const Type& 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 Type convertCoordinate (const Component* target, const Component* source, Type p) - { - while (source != nullptr) - { - if (source == target) - return p; - - if (source->isParentOf (target)) - return convertFromDistantParentSpace (source, *target, p); - - if (source->isOnDesktop()) - { - p = source->getPeer()->localToGlobal (p); - source = nullptr; - } - else - { - p = convertToParentSpace (*source, p); - source = source->getParentComponent(); - } - } - - jassert (source == nullptr); - if (target == nullptr) - return p; - - const Component* const topLevelComp = target->getTopLevelComponent(); - - if (topLevelComp->isOnDesktop()) - p = topLevelComp->getPeer()->globalToLocal (p); - else - p = convertFromParentSpace (*topLevelComp, p); - - if (topLevelComp == target) - return p; - - return convertFromDistantParentSpace (topLevelComp, *target, p); - } - - static Rectangle getUnclippedArea (const Component& comp) - { - Rectangle r (comp.getLocalBounds()); - - Component* const p = comp.getParentComponent(); - - if (p != nullptr) - r = r.getIntersection (convertFromParentSpace (comp, getUnclippedArea (*p))); - - return r; - } - - static void clipObscuredRegions (const Component& comp, Graphics& g, const Rectangle& clipRect, const Point& delta) - { - 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); - } - else - { - const Point childPos (child.getPosition()); - clipObscuredRegions (child, g, newClip - childPos, childPos + delta); - } - } - } - } - } - - static void subtractObscuredRegions (const Component& comp, RectangleList& result, - const Point& delta, const Rectangle& clipRect, - const Component* const compToAvoid) - { - for (int i = comp.childComponentList.size(); --i >= 0;) - { - const Component* const c = comp.childComponentList.getUnchecked(i); - - if (c != compToAvoid && c->isVisible()) - { - if (c->isOpaque() && c->componentTransparency == 0) - { - Rectangle childBounds (c->bounds.getIntersection (clipRect)); - childBounds.translate (delta.x, delta.y); - - result.subtract (childBounds); - } - else - { - Rectangle newClip (clipRect.getIntersection (c->bounds)); - newClip.translate (-c->getX(), -c->getY()); - - subtractObscuredRegions (*c, result, c->getPosition() + delta, - newClip, compToAvoid); - } - } - } - } - - static Rectangle getParentOrMainMonitorBounds (const Component& comp) - { - return comp.getParentComponent() != nullptr ? comp.getParentComponent()->getLocalBounds() - : Desktop::getInstance().getMainMonitorArea(); - } -}; - -//============================================================================== -Component::Component() - : parentComponent (nullptr), - lookAndFeel (nullptr), - effect (nullptr), - componentFlags (0), - componentTransparency (0) -{ -} - -Component::Component (const String& name) - : 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. - CHECK_MESSAGE_MANAGER_IS_LOCKED_OR_OFFSCREEN - - if (componentName != name) - { - componentName = name; - - if (flags.hasHeavyweightPeerFlag) - { - ComponentPeer* const peer = getPeer(); - - jassert (peer != nullptr); - if (peer != nullptr) - 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. - CHECK_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) - { - ComponentPeer* const peer = getPeer(); - - jassert (peer != nullptr); - if (peer != nullptr) - { - 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(); - - const ComponentPeer* const peer = getPeer(); - return peer != nullptr && ! peer->isMinimised(); -} - - -//============================================================================== -void* Component::getWindowHandle() const -{ - const ComponentPeer* const peer = getPeer(); - - if (peer != nullptr) - 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. - CHECK_MESSAGE_MANAGER_IS_LOCKED - - if (isOpaque()) - styleWanted &= ~ComponentPeer::windowIsSemiTransparent; - else - styleWanted |= ComponentPeer::windowIsSemiTransparent; - - int currentStyleFlags = 0; - - // 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) - currentStyleFlags = peer->getStyleFlags(); - - if (styleWanted != currentStyleFlags || ! flags.hasHeavyweightPeerFlag) - { - 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* currentConstainer = nullptr; - Rectangle oldNonFullScreenBounds; - - if (peer != nullptr) - { - ScopedPointer oldPeerToDelete (peer); - - wasFullscreen = peer->isFullScreen(); - wasMinimised = peer->isMinimised(); - currentConstainer = peer->getConstrainer(); - oldNonFullScreenBounds = peer->getNonFullScreenBounds(); - - 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->setBounds (topLeft.x, topLeft.y, getWidth(), getHeight(), false); - 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 (currentConstainer); - - 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. - CHECK_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); - else 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) {} - -//============================================================================== -void Component::setOpaque (const bool shouldBeOpaque) -{ - if (shouldBeOpaque != flags.opaqueFlag) - { - flags.opaqueFlag = shouldBeOpaque; - - if (flags.hasHeavyweightPeerFlag) - { - const ComponentPeer* const peer = ComponentPeer::getPeerFor (this); - - if (peer != nullptr) - { - // to make it recreate the heavyweight window - addToDesktop (peer->getStyleFlags()); - } - } - - repaint(); - } -} - -bool Component::isOpaque() const noexcept -{ - return flags.opaqueFlag; -} - -//============================================================================== -class StandardCachedComponentImage : public CachedComponentImage -{ -public: - StandardCachedComponentImage (Component& owner_) noexcept : owner (owner_) {} - - void paint (Graphics& g) - { - const Rectangle bounds (owner.getLocalBounds()); - - if (image.isNull() || image.getBounds() != bounds) - { - image = Image (owner.isOpaque() ? Image::RGB : Image::ARGB, - jmax (1, bounds.getWidth()), jmax (1, bounds.getHeight()), ! owner.isOpaque()); - - validArea.clear(); - } - - { - Graphics imG (image); - LowLevelGraphicsContext* const lg = imG.getInternalContext(); - - for (RectangleList::Iterator i (validArea); i.next();) - lg->excludeClipRectangle (*i.getRectangle()); - - if (! lg->isClipEmpty()) - { - if (! owner.isOpaque()) - { - lg->setFill (Colours::transparentBlack); - lg->fillRect (bounds, true); - lg->setFill (Colours::black); - } - - owner.paintEntireComponent (imG, true); - } - } - - validArea = bounds; - - g.setColour (Colours::black.withAlpha (owner.getAlpha())); - g.drawImageAt (image, 0, 0); - } - - void invalidateAll() { validArea.clear(); } - void invalidate (const Rectangle& area) { validArea.subtract (area); } - void releaseResources() { image = Image::null; } - -private: - Image image; - RectangleList validArea; - Component& owner; - - 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. - CHECK_MESSAGE_MANAGER_IS_LOCKED_OR_OFFSCREEN - - if (flags.hasHeavyweightPeerFlag) - { - ComponentPeer* const peer = getPeer(); - - if (peer != nullptr) - { - 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()) - { - ComponentPeer* const peer = getPeer(); - - jassert (peer != nullptr); - if (peer != nullptr) - { - 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().getMonitorAreaContaining (getScreenBounds().getCentre()); -} - -Point Component::getLocalPoint (const Component* source, const 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 (const 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 (const Point& relativePosition) const -{ - return localPointToGlobal (relativePosition); -} - -Point Component::globalPositionToRelative (const Point& screenPosition) const -{ - return getLocalPoint (nullptr, screenPosition); -} - -Point Component::relativePositionToOtherComponent (const Component* const targetComponent, const 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. - CHECK_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(); - } - - if (flags.hasHeavyweightPeerFlag) - { - ComponentPeer* const peer = getPeer(); - - if (peer != nullptr) - { - if (wasMoved && wasResized) - peer->setBounds (getX(), getY(), getWidth(), getHeight(), false); - else if (wasMoved) - peer->setPosition (getX(), getY()); - else if (wasResized) - peer->setSize (getWidth(), getHeight()); - } - } - - sendMovedResizedMessages (wasMoved, wasResized); - } -} - -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 (const 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, - const 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))); - } -} - -//============================================================================== -bool Component::isTransformed() const noexcept -{ - return affineTransform != nullptr; -} - -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); - } -} - -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 (const Point& point) -{ - if (ComponentHelpers::hitTest (*this, point)) - { - if (parentComponent != nullptr) - return parentComponent->contains (ComponentHelpers::convertToParentSpace (*this, point)); - - if (flags.hasHeavyweightPeerFlag) - { - const ComponentPeer* const peer = getPeer(); - - if (peer != nullptr) - return peer->contains (point, true); - } - } - - return false; -} - -bool Component::reallyContains (const 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 (const 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* const 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. - CHECK_MESSAGE_MANAGER_IS_LOCKED_OR_OFFSCREEN - - jassert (MessageManager::getInstance()->currentThreadHasLockedMessageManager() || ! isShowing()); - - - if (child != nullptr && 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* const child, int zOrder) -{ - if (child != nullptr) - { - child->setVisible (true); - addChildComponent (child, zOrder); - } -} - -void Component::addChildAndSetID (Component* const child, const String& componentID) -{ - if (child != nullptr) - { - child->setComponentID (componentID); - 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. - CHECK_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 (const String& 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. - CHECK_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 target_, const int result_) - : target (target_), result (result_) {} - - void messageCallback() - { - 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) - { - ComponentPeer* const peer = getPeer(); - - if (peer != nullptr) - 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(); - else - cachedImage->invalidate (area); - } - - 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. - CHECK_MESSAGE_MANAGER_IS_LOCKED - - ComponentPeer* const peer = getPeer(); - - if (peer != nullptr) - peer->repaint (area); - } - else - { - if (parentComponent != nullptr) - parentComponent->internalRepaint (ComponentHelpers::convertToParentSpace (*this, area)); - } - } -} - -//============================================================================== -void Component::paint (Graphics&) -{ - // all painting is done in the subclasses - - jassert (! isOpaque()); // if your component's opaque, you've gotta paint it! -} - -void Component::paintOverChildren (Graphics&) -{ - // all painting is done in the subclasses -} - -//============================================================================== -void Component::paintWithinParentContext (Graphics& g) -{ - g.setOrigin (getX(), getY()); - - 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(); - ComponentHelpers::clipObscuredRegions (*this, g, clipBounds, Point()); - - if (! 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 JUCE_DEBUG - flags.isInsidePaintCall = true; - #endif - - if (effect != nullptr) - { - Image effectImage (flags.opaqueFlag ? Image::RGB : Image::ARGB, - getWidth(), getHeight(), ! flags.opaqueFlag); - { - Graphics g2 (effectImage); - paintComponentAndChildren (g2); - } - - effect->applyEffect (effectImage, g, ignoreAlphaLevel ? 1.0f : getAlpha()); - } - 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, - const bool clipImageToComponentBounds) -{ - Rectangle r (areaToGrab); - - if (clipImageToComponentBounds) - r = r.getIntersection (getLocalBounds()); - - Image componentImage (flags.opaqueFlag ? Image::RGB : Image::ARGB, - jmax (1, r.getWidth()), - jmax (1, r.getHeight()), - true); - - Graphics imageContext (componentImage); - imageContext.setOrigin (-r.getX(), -r.getY()); - paintEntireComponent (imageContext, true); - - return componentImage; -} - -void Component::setComponentEffect (ImageEffectFilter* const newEffect) -{ - if (effect != newEffect) - { - effect = newEffect; - repaint(); - } -} - -//============================================================================== -LookAndFeel& Component::getLookAndFeel() const noexcept -{ - const Component* c = this; - - do - { - if (c->lookAndFeel != nullptr) - return *(c->lookAndFeel); - - c = c->parentComponent; - } - while (c != nullptr); - - 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) - { - 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 -{ - const var* const v = properties.getVarPointer (ComponentHelpers::getColourPropertyId (colourId)); - - if (v != nullptr) - 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, const 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& component_) noexcept - : component (component_) -{ -} - -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.toFloat().transformed (*affineTransform).getSmallestIntegerContainer(); -} - -void Component::getVisibleArea (RectangleList& result, const bool includeSiblings) const -{ - result.clear(); - const Rectangle unclipped (ComponentHelpers::getUnclippedArea (*this)); - - if (! unclipped.isEmpty()) - { - result.add (unclipped); - - if (includeSiblings) - { - const Component* const c = getTopLevelComponent(); - - ComponentHelpers::subtractObscuredRegions (*c, result, getLocalPoint (c, Point()), - c->getLocalBounds(), this); - } - - ComponentHelpers::subtractObscuredRegions (*this, result, Point(), unclipped, nullptr); - result.consolidate(); - } -} - -//============================================================================== -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, float wheelIncrementX, float wheelIncrementY) -{ - // the base class just passes this event up to its parent.. - if (parentComponent != nullptr) - parentComponent->mouseWheelMove (e.getEventRelativeTo (parentComponent), - wheelIncrementX, wheelIncrementY); -} - - -//============================================================================== -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. - CHECK_MESSAGE_MANAGER_IS_LOCKED - - 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() -{ - Component* const current = getCurrentlyModalComponent(); - - if (current != nullptr) - current->inputAttemptWhenModal(); -} - -//============================================================================== -void Component::postCommandMessage (const int commandId) -{ - class CustomCommandMessage : public CallbackMessage - { - public: - CustomCommandMessage (Component* const target_, const int commandId_) - : target (target_), commandId (commandId_) {} - - void messageCallback() - { - if (target.get() != nullptr) // (get() required for VS2003 bug) - target->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. - CHECK_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. - CHECK_MESSAGE_MANAGER_IS_LOCKED - - if (mouseListeners != nullptr) - mouseListeners->removeListener (listenerToRemove); -} - -//============================================================================== -void Component::internalMouseEnter (MouseInputSource& source, const Point& relativePos, const 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, const Point& relativePos, const 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, const Point& relativePos, const Time& time) -{ - Desktop& desktop = Desktop::getInstance(); - - BailOutChecker checker (this); - - if (isCurrentlyBlockedByAnotherModalComponent()) - { - 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; - } - } - - 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, const Point& relativePos, const Time& time, const ModifierKeys& oldModifiers) -{ - if (! isCurrentlyBlockedByAnotherModalComponent()) - { - 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, const Point& relativePos, const 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, const Point& relativePos, const 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, const Point& relativePos, - const Time& time, const float amountX, const float amountY) -{ - Desktop& desktop = Desktop::getInstance(); - BailOutChecker checker (this); - - const float wheelIncrementX = amountX / 256.0f; - const float wheelIncrementY = amountY / 256.0f; - - 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, wheelIncrementX, wheelIncrementY); - } - else - { - mouseWheelMove (me, wheelIncrementX, wheelIncrementY); - - if (checker.shouldBailOut()) - return; - - desktop.mouseListeners.callChecked (checker, &MouseListener::mouseWheelMove, me, wheelIncrementX, wheelIncrementY); - - if (! checker.shouldBailOut()) - MouseListenerList::sendWheelEvent (*this, checker, me, wheelIncrementX, wheelIncrementY); - } -} - -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.. - Component* const cm = getCurrentlyModalComponent(); - - if (cm != nullptr && 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 - ComponentPeer* const peer = getPeer(); - - if (peer != nullptr) - { - 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. - CHECK_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. - CHECK_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 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;) - { - Component* const c = getChildComponent (i); - - if (c != nullptr) - { - c->sendEnablementChangeMessage(); - - if (safePointer == nullptr) - return; - } - } -} - -//============================================================================== -bool Component::isMouseOver (const bool includeChildren) const -{ - const Desktop& desktop = Desktop::getInstance(); - - for (int i = desktop.getNumMouseSources(); --i >= 0;) - { - const MouseInputSource* const mi = desktop.getMouseSource(i); - - Component* const c = mi->getComponentUnderMouse(); - - if ((c == this || (includeChildren && isParentOf (c))) - && c->reallyContains (c->getLocalPoint (nullptr, mi->getScreenPosition()), false)) - return true; - } - - return false; -} - -bool Component::isMouseButtonDown() const -{ - const Desktop& desktop = Desktop::getInstance(); - - for (int i = desktop.getNumMouseSources(); --i >= 0;) - { - const MouseInputSource* const mi = desktop.getMouseSource(i); - - if (mi->isDragging() && mi->getComponentUnderMouse() == this) - return true; - } - - return false; -} - -bool Component::isMouseOverOrDragging() const -{ - const Desktop& desktop = Desktop::getInstance(); - - for (int i = desktop.getNumMouseSources(); --i >= 0;) - if (desktop.getMouseSource(i)->getComponentUnderMouse() == this) - 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->removeValue (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/src/juce/JuceLibraryCode/modules/juce_gui_basics/components/juce_Component.h b/src/juce/JuceLibraryCode/modules/juce_gui_basics/components/juce_Component.h deleted file mode 100644 index 517edde3..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_gui_basics/components/juce_Component.h +++ /dev/null @@ -1,2379 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_COMPONENT_JUCEHEADER__ -#define __JUCE_COMPONENT_JUCEHEADER__ - -#include "../mouse/juce_MouseCursor.h" -#include "../mouse/juce_MouseListener.h" -#include "../mouse/juce_MouseEvent.h" -#include "juce_ComponentListener.h" -#include "../keyboard/juce_KeyListener.h" -#include "../keyboard/juce_KeyboardFocusTraverser.h" -#include "juce_ModalComponentManager.h" - -class LookAndFeel; -class MouseInputSource; -class MouseInputSourceInternal; -class ComponentPeer; -class MarkerList; -class RelativeRectangle; -class CachedComponentImage; - - -//============================================================================== -/** - 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(); - - /** 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); - - /** 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 visiblility 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 0 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); - - //============================================================================== - /** 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. - */ - inline 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. - */ - inline int getY() const noexcept { return bounds.getY(); } - - /** Returns the component's width in pixels. */ - inline int getWidth() const noexcept { return bounds.getWidth(); } - - /** Returns the component's height in pixels. */ - inline 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. */ - const 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 the region of this component that's not obscured by other, opaque components. - - The RectangleList that is returned represents the area of this component - which isn't covered by opaque child components. - - If includeSiblings is true, it will also take into account any siblings - that may be overlapping the component. - */ - void getVisibleArea (RectangleList& result, bool includeSiblings) const; - - //============================================================================== - /** Returns this component's x coordinate relative the the screen's top-left origin. - @see getX, localPointToGlobal - */ - int getScreenX() const; - - /** Returns this component's y coordinate relative the 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, - const 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 (const 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 (const 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, - const 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 (const String& 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, and also makes the child visible if it isn't. - - Quite a useful function, this is just 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 all this component's children, and deletes them. - - @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. - - N.B. The dummy parameter is needed to work around a VC6 compiler bug. - */ - template - TargetClass* findParentComponentOfClass (TargetClass* const dummyParameter = nullptr) const - { - (void) dummyParameter; - - for (Component* p = parentComponent; p != nullptr; p = p->parentComponent) - { - TargetClass* const target = dynamic_cast (p); - if (target != nullptr) - 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. - - @see parentHierarchyChanged - */ - 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 (const 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 (const 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 (const 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); - - /** 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, getVisibleArea - */ - 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; - - //============================================================================== - /** 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 this 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 e details about the position and status of the mouse event - @see mouseEnter, mouseExit, mouseDrag, contains - */ - virtual void mouseMove (const MouseEvent& e); - - /** Called when the mouse first enters this 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. - - If you're writing a component that needs to repaint itself when the mouse - enters and exits, it might be quicker to use the setRepaintsOnMouseActivity() - method. - - @param e details about the position and status of the mouse event - @see mouseExit, mouseDrag, mouseMove, contains - */ - virtual void mouseEnter (const MouseEvent& e); - - /** Called when the mouse moves out of this 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. - - If you're writing a component that needs to repaint itself when the mouse - enters and exits, it might be quicker to use the setRepaintsOnMouseActivity() - method. - - @param e details about the position and status of the mouse event - @see mouseEnter, mouseDrag, mouseMove, contains - */ - virtual void mouseExit (const MouseEvent& e); - - /** Called when a mouse button is pressed while it's over this 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. - - Once a button is held down, the mouseDrag method will be called when the - mouse moves, until the button is released. - - @param e details about the position and status of the mouse event - @see mouseUp, mouseDrag, mouseDoubleClick, contains - */ - virtual void mouseDown (const MouseEvent& e); - - /** 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. - - If you want to be able to drag things off the edge of a component - and have the component scroll when you get to the edges, the - beginDragAutoRepeat() method might be useful. - - @param e details about the position and status of the mouse event - @see mouseDown, mouseUp, mouseMove, contains, beginDragAutoRepeat - */ - virtual void mouseDrag (const MouseEvent& e); - - /** 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 e details about the position and status of the mouse event - @see mouseDown, mouseDrag, mouseDoubleClick, contains - */ - virtual void mouseUp (const MouseEvent& e); - - /** Called when a mouse button has been double-clicked in this 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. - - For altering the time limit used to detect double-clicks, - see MouseEvent::setDoubleClickTimeout. - - @param e details about the position and status of the mouse event - @see mouseDown, mouseUp, MouseEvent::setDoubleClickTimeout, - MouseEvent::getDoubleClickTimeout - */ - virtual void mouseDoubleClick (const MouseEvent& e); - - /** 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, the 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. - - @param e details about the position and status of the mouse event - @param wheelIncrementX the speed and direction of the horizontal scroll-wheel - a positive - value means the wheel has been pushed to the right, negative means it - was pushed to the left - @param wheelIncrementY the speed and direction of the vertical scroll-wheel - a positive - value means the wheel has been pushed upwards, negative means it - was pushed downwards - */ - virtual void mouseWheelMove (const MouseEvent& e, - float wheelIncrementX, - float wheelIncrementY); - - //============================================================================== - /** 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 that one of this component's children has been focused or unfocused. - - Essentially this means that 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). - - @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 of 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, const Colour& colour); - - /** 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 0, 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* const 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* const 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(); jassert (getComponent() == nullptr); } - - 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; } - - //============================================================================== - #ifndef DOXYGEN - // These methods are deprecated - use localPointToGlobal, getLocalPoint, getLocalPoint, etc instead. - JUCE_DEPRECATED (Point relativePositionToGlobal (const Point&) const); - JUCE_DEPRECATED (Point globalPositionToRelative (const Point&) const); - JUCE_DEPRECATED (Point relativePositionToOtherComponent (const Component*, const Point&) const); - #endif - -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 class ScopedPointer ; - 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; - #if JUCE_DEBUG - bool isInsidePaintCall : 1; - #endif - }; - - union - { - uint32 componentFlags; - ComponentFlags flags; - }; - - uint8 componentTransparency; - - //============================================================================== - void internalMouseEnter (MouseInputSource&, const Point&, const Time&); - void internalMouseExit (MouseInputSource&, const Point&, const Time&); - void internalMouseDown (MouseInputSource&, const Point&, const Time&); - void internalMouseUp (MouseInputSource&, const Point&, const Time&, const ModifierKeys& oldModifiers); - void internalMouseDrag (MouseInputSource&, const Point&, const Time&); - void internalMouseMove (MouseInputSource&, const Point&, const Time&); - void internalMouseWheel (MouseInputSource&, const Point&, const Time&, float amountX, float amountY); - void internalBroughtToFront(); - void internalFocusGain (const FocusChangeType, const WeakReference&); - void internalFocusGain (const FocusChangeType); - void internalFocusLoss (const 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 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 (const Point&) - void contains (int, int); - #endif - -protected: - //============================================================================== - /** @internal */ - virtual ComponentPeer* createNewPeer (int styleFlags, void* nativeWindowToAttachTo); - #endif -}; - - -#endif // __JUCE_COMPONENT_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_gui_basics/components/juce_ComponentListener.cpp b/src/juce/JuceLibraryCode/modules/juce_gui_basics/components/juce_ComponentListener.cpp deleted file mode 100644 index 169d50eb..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_gui_basics/components/juce_ComponentListener.cpp +++ /dev/null @@ -1,32 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce 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/src/juce/JuceLibraryCode/modules/juce_gui_basics/components/juce_ComponentListener.h b/src/juce/JuceLibraryCode/modules/juce_gui_basics/components/juce_ComponentListener.h deleted file mode 100644 index 7ad0304b..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_gui_basics/components/juce_ComponentListener.h +++ /dev/null @@ -1,113 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_COMPONENTLISTENER_JUCEHEADER__ -#define __JUCE_COMPONENTLISTENER_JUCEHEADER__ - -class Component; - - -//============================================================================== -/** - 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. - - @param component the component whose children were 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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_gui_basics/components/juce_Desktop.cpp b/src/juce/JuceLibraryCode/modules/juce_gui_basics/components/juce_Desktop.cpp deleted file mode 100644 index 4f5e62eb..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_gui_basics/components/juce_Desktop.cpp +++ /dev/null @@ -1,447 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -Desktop::Desktop() - : mouseClickCounter (0), - kioskModeComponent (nullptr), - allowedOrientations (allOrientations) -{ - createMouseInputSources(); - refreshMonitorSizes(); -} - -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; - -//============================================================================== -void Desktop::refreshMonitorSizes() -{ - Array > oldClipped, oldUnclipped; - oldClipped.swapWithArray (monitorCoordsClipped); - oldUnclipped.swapWithArray (monitorCoordsUnclipped); - - getCurrentMonitorPositions (monitorCoordsClipped, true); - getCurrentMonitorPositions (monitorCoordsUnclipped, false); - jassert (monitorCoordsClipped.size() == monitorCoordsUnclipped.size()); - - if (oldClipped != monitorCoordsClipped - || oldUnclipped != monitorCoordsUnclipped) - { - for (int i = ComponentPeer::getNumPeers(); --i >= 0;) - { - ComponentPeer* const p = ComponentPeer::getPeer (i); - if (p != nullptr) - p->handleScreenSizeChange(); - } - } -} - -int Desktop::getNumDisplayMonitors() const noexcept -{ - return monitorCoordsClipped.size(); -} - -Rectangle Desktop::getDisplayMonitorCoordinates (const int index, const bool clippedToWorkArea) const noexcept -{ - return clippedToWorkArea ? monitorCoordsClipped [index] - : monitorCoordsUnclipped [index]; -} - -RectangleList Desktop::getAllMonitorDisplayAreas (const bool clippedToWorkArea) const -{ - RectangleList rl; - - for (int i = 0; i < getNumDisplayMonitors(); ++i) - rl.addWithoutMerging (getDisplayMonitorCoordinates (i, clippedToWorkArea)); - - return rl; -} - -Rectangle Desktop::getMainMonitorArea (const bool clippedToWorkArea) const noexcept -{ - return getDisplayMonitorCoordinates (0, clippedToWorkArea); -} - -Rectangle Desktop::getMonitorAreaContaining (const Point& position, const bool clippedToWorkArea) const -{ - Rectangle best (getMainMonitorArea (clippedToWorkArea)); - double bestDistance = 1.0e10; - - for (int i = getNumDisplayMonitors(); --i >= 0;) - { - const Rectangle rect (getDisplayMonitorCoordinates (i, clippedToWorkArea)); - - if (rect.contains (position)) - return rect; - - const double distance = rect.getCentre().getDistanceFrom (position); - - if (distance < bestDistance) - { - bestDistance = distance; - best = rect; - } - } - - return best; -} - -//============================================================================== -int Desktop::getNumComponents() const noexcept -{ - return desktopComponents.size(); -} - -Component* Desktop::getComponent (const int index) const noexcept -{ - return desktopComponents [index]; -} - -Component* Desktop::findComponentAt (const Point& screenPosition) const -{ - 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(); - - currentLookAndFeel = defaultLookAndFeel; - } - - return *currentLookAndFeel; -} - -void Desktop::setDefaultLookAndFeel (LookAndFeel* newDefaultLookAndFeel) -{ - currentLookAndFeel = newDefaultLookAndFeel; - - for (int i = getNumComponents(); --i >= 0;) - { - Component* const c = getComponent (i); - - if (c != nullptr) - 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.removeValue (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 getInstance().getMainMouseSource().getScreenPosition(); -} - -Point Desktop::getLastMouseDownPosition() -{ - return getInstance().getMainMouseSource().getLastMouseDownPosition(); -} - -int Desktop::getMouseButtonClickCounter() -{ - return getInstance().mouseClickCounter; -} - -void Desktop::incrementMouseClickCounter() noexcept -{ - ++mouseClickCounter; -} - -int Desktop::getNumDraggingMouseSources() const noexcept -{ - int num = 0; - for (int i = mouseSources.size(); --i >= 0;) - if (mouseSources.getUnchecked(i)->isDragging()) - ++num; - - return num; -} - -MouseInputSource* Desktop::getDraggingMouseSource (int index) const noexcept -{ - int num = 0; - for (int i = mouseSources.size(); --i >= 0;) - { - MouseInputSource* const mi = mouseSources.getUnchecked(i); - - if (mi->isDragging()) - { - if (index == num) - return mi; - - ++num; - } - } - - return nullptr; -} - -//============================================================================== -class MouseDragAutoRepeater : public Timer -{ -public: - MouseDragAutoRepeater() {} - - void timerCallback() - { - Desktop& desktop = Desktop::getInstance(); - int numMiceDown = 0; - - for (int i = desktop.getNumMouseSources(); --i >= 0;) - { - MouseInputSource* const source = desktop.getMouseSource(i); - if (source->isDragging()) - { - source->triggerFakeMove(); - ++numMiceDown; - } - } - - if (numMiceDown == 0) - desktop.beginDragAutoRepeat (0); - } - -private: - JUCE_DECLARE_NON_COPYABLE (MouseDragAutoRepeater); -}; - -void Desktop::beginDragAutoRepeat (const int interval) -{ - if (interval > 0) - { - if (dragRepeater == nullptr) - dragRepeater = new MouseDragAutoRepeater(); - - if (dragRepeater->getTimerInterval() != interval) - dragRepeater->startTimer (interval); - } - else - { - dragRepeater = nullptr; - } -} - -//============================================================================== -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 = getMousePosition(); -} - -ListenerList & Desktop::getMouseListeners() -{ - resetTimer(); - return mouseListeners; -} - -void Desktop::addGlobalMouseListener (MouseListener* const listener) -{ - mouseListeners.add (listener); - resetTimer(); -} - -void Desktop::removeGlobalMouseListener (MouseListener* const listener) -{ - mouseListeners.remove (listener); - resetTimer(); -} - -void Desktop::timerCallback() -{ - if (lastFakeMouseMove != getMousePosition()) - sendMouseMove(); -} - -void Desktop::sendMouseMove() -{ - if (! mouseListeners.isEmpty()) - { - startTimer (20); - - lastFakeMouseMove = getMousePosition(); - - Component* const target = findComponentAt (lastFakeMouseMove); - - if (target != nullptr) - { - 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); - } - } -} - -//============================================================================== -void Desktop::setKioskModeComponent (Component* componentToUse, const bool allowMenusAndBars) -{ - 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 (kioskModeComponent != nullptr) - { - setKioskComponent (kioskModeComponent, false, allowMenusAndBars); - - kioskModeComponent->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; -} diff --git a/src/juce/JuceLibraryCode/modules/juce_gui_basics/components/juce_Desktop.h b/src/juce/JuceLibraryCode/modules/juce_gui_basics/components/juce_Desktop.h deleted file mode 100644 index 7be50d5b..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_gui_basics/components/juce_Desktop.h +++ /dev/null @@ -1,412 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_DESKTOP_JUCEHEADER__ -#define __JUCE_DESKTOP_JUCEHEADER__ - -#include "juce_Component.h" -#include "../layout/juce_ComponentAnimator.h" -class MouseInputSource; -class MouseInputSourceInternal; -class MouseListener; - - -//============================================================================== -/** - 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 dektop object, and this method will return it. - */ - static Desktop& JUCE_CALLTYPE getInstance(); - - //============================================================================== - /** Returns a list of the positions of all the monitors available. - - The first rectangle in the list will be the main monitor area. - - If clippedToWorkArea is true, it will exclude any areas like the taskbar on Windows, - or the menu bar on Mac. If clippedToWorkArea is false, the entire monitor area is returned. - */ - RectangleList getAllMonitorDisplayAreas (bool clippedToWorkArea = true) const; - - /** Returns the position and size of the main monitor. - - If clippedToWorkArea is true, it will exclude any areas like the taskbar on Windows, - or the menu bar on Mac. If clippedToWorkArea is false, the entire monitor area is returned. - */ - Rectangle getMainMonitorArea (bool clippedToWorkArea = true) const noexcept; - - /** Returns the position and size of the monitor which contains this co-ordinate. - - If none of the monitors contains the point, this will just return the - main monitor. - - If clippedToWorkArea is true, it will exclude any areas like the taskbar on Windows, - or the menu bar on Mac. If clippedToWorkArea is false, the entire monitor area is returned. - */ - Rectangle getMonitorAreaContaining (const Point& position, bool clippedToWorkArea = true) const; - - - //============================================================================== - /** Returns the mouse position. - - The co-ordinates 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 co-ordinates are relative to the top-left of the main monitor. - */ - static void setMousePosition (const 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. - */ - static int getMouseButtonClickCounter(); - - //============================================================================== - /** 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 0. - */ - 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 0 if the co-ordinates are inside a non-Juce window. - */ - Component* findComponentAt (const 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); - - //============================================================================== - /** Returns the number of MouseInputSource objects the system has at its disposal. - 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. - To find out how many mouse events are currently happening, use getNumDraggingMouseSources(). - @see getMouseSource - */ - int getNumMouseSources() const noexcept { return mouseSources.size(); } - - /** 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 { return mouseSources [index]; } - - /** Returns the main mouse input device that the system is using. - @see getNumMouseSources() - */ - MouseInputSource& getMainMouseSource() const noexcept { return *mouseSources.getUnchecked(0); } - - /** 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; - - //============================================================================== - /** Tells this object to refresh its idea of what the screen resolution is. - - (Called internally by the native code). - */ - void refreshMonitorSizes(); - - /** True if the OS supports semitransparent windows */ - static bool canUseSemiTransparentWindows() noexcept; - -private: - //============================================================================== - static Desktop* instance; - - friend class Component; - friend class ComponentPeer; - friend class MouseInputSource; - friend class MouseInputSourceInternal; - friend class DeletedAtShutdown; - friend class TopLevelWindowManager; - - OwnedArray mouseSources; - void createMouseInputSources(); - - ListenerList mouseListeners; - ListenerList focusListeners; - - Array desktopComponents; - Array > monitorCoordsClipped, monitorCoordsUnclipped; - - Point lastFakeMouseMove; - void sendMouseMove(); - - int mouseClickCounter; - void incrementMouseClickCounter() noexcept; - - ScopedPointer dragRepeater; - - ScopedPointer defaultLookAndFeel; - WeakReference currentLookAndFeel; - - Component* kioskModeComponent; - Rectangle kioskComponentOriginalBounds; - - int allowedOrientations; - - ComponentAnimator animator; - - void timerCallback(); - void resetTimer(); - ListenerList & getMouseListeners(); - - int getNumDisplayMonitors() const noexcept; - Rectangle getDisplayMonitorCoordinates (int index, bool clippedToWorkArea) const noexcept; - static void getCurrentMonitorPositions (Array >&, const bool clipToWorkArea); - - void addDesktopComponent (Component*); - void removeDesktopComponent (Component*); - void componentBroughtToFront (Component*); - - static void setKioskComponent (Component*, bool enableOrDisable, bool allowMenusAndBars); - - void triggerFocusCallback(); - void handleAsyncUpdate(); - - Desktop(); - ~Desktop(); - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Desktop); -}; - - -#endif // __JUCE_DESKTOP_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_gui_basics/components/juce_ModalComponentManager.cpp b/src/juce/JuceLibraryCode/modules/juce_gui_basics/components/juce_ModalComponentManager.cpp deleted file mode 100644 index 923e1446..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_gui_basics/components/juce_ModalComponentManager.cpp +++ /dev/null @@ -1,285 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce 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) {} - - void componentPeerChanged() - { - if (! component->isShowing()) - cancel(); - } - - void componentVisibilityChanged() - { - if (! component->isShowing()) - cancel(); - } - - void componentBeingDeleted (Component& comp) - { - ComponentMovementWatcher::componentBeingDeleted (comp); - - if (component == &comp || comp.isParentOf (component)) - { - autoDelete = false; - cancel(); - } - } - - void cancel() - { - if (isActive) - { - isActive = false; - ModalComponentManager::getInstance()->triggerAsyncUpdate(); - } - } - - Component* component; - OwnedArray callbacks; - int returnValue; - bool isActive, autoDelete; - -private: - JUCE_DECLARE_NON_COPYABLE (ModalItem); -}; - -//============================================================================== -ModalComponentManager::ModalComponentManager() -{ -} - -ModalComponentManager::~ModalComponentManager() -{ - 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; - } - } -} - -#if JUCE_MODAL_LOOPS_PERMITTED -class ModalComponentManager::ReturnValueRetriever : public ModalComponentManager::Callback -{ -public: - ReturnValueRetriever (int& value_, bool& finished_) : value (value_), finished (finished_) {} - - 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()); - - Component* currentlyModal = getModalComponent (0); - - if (currentlyModal == nullptr) - return 0; - - WeakReference prevFocused (Component::getCurrentlyFocusedComponent()); - - int returnValue = 0; - bool finished = false; - attachCallback (currentlyModal, new ReturnValueRetriever (returnValue, finished)); - - JUCE_TRY - { - while (! finished) - { - if (! MessageManager::getInstance()->runDispatchLoopUntil (20)) - break; - } - } - JUCE_CATCH_EXCEPTION - - if (prevFocused != nullptr) - prevFocused->grabKeyboardFocus(); - - return returnValue; -} -#endif diff --git a/src/juce/JuceLibraryCode/modules/juce_gui_basics/components/juce_ModalComponentManager.h b/src/juce/JuceLibraryCode/modules/juce_gui_basics/components/juce_ModalComponentManager.h deleted file mode 100644 index d9430a0b..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_gui_basics/components/juce_ModalComponentManager.h +++ /dev/null @@ -1,365 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_MODALCOMPONENTMANAGER_JUCEHEADER__ -#define __JUCE_MODALCOMPONENTMANAGER_JUCEHEADER__ - - -//============================================================================== -/** - 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 : public AsyncUpdater, - public 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); - - #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(); - -private: - //============================================================================== - class ModalItem; - class ReturnValueRetriever; - - friend class Component; - friend class OwnedArray ; - 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& function_, ParamType& param_) - : function (function_), param (param_) {} - - 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& function_, ParamType1& param1_, ParamType2& param2_) - : function (function_), param1 (param1_), param2 (param2_) {} - - 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& function_, ComponentType* comp_) - : function (function_), comp (comp_) {} - - 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& function_, ComponentType* comp_, ParamType1 param1_) - : function (function_), comp (comp_), param1 (param1_) {} - - 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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_Drawable.cpp b/src/juce/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_Drawable.cpp deleted file mode 100644 index 87b4f6a8..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_Drawable.cpp +++ /dev/null @@ -1,240 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -Drawable::Drawable() -{ - setInterceptsMouseClicks (false, false); - setPaintingIsUnclipped (true); -} - -Drawable::Drawable (const Drawable& other) -{ - setName (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, const 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.x, - originRelativeToComponent.y); -} - -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); -} - -//============================================================================== -void Drawable::setOriginWithOriginalSize (const Point& originWithinParent) -{ - setTransform (AffineTransform::translation (originWithinParent.x, originWithinParent.y)); -} - -void Drawable::setTransformToFit (const Rectangle& area, const 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/src/juce/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_Drawable.h b/src/juce/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_Drawable.h deleted file mode 100644 index 3fbb73d7..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_Drawable.h +++ /dev/null @@ -1,258 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_DRAWABLE_JUCEHEADER__ -#define __JUCE_DRAWABLE_JUCEHEADER__ - -#include "../components/juce_Component.h" -#include "../positioning/juce_RelativeCoordinate.h" -#include "../positioning/juce_RelativeCoordinatePositioner.h" -#include "../layout/juce_ComponentBuilder.h" -class DrawableComposite; - - -//============================================================================== -/** - 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 co-ordinates 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, - const RectanglePlacement& placement, - float opacity) const; - - - //============================================================================== - /** Resets any transformations on this drawable, and positions its origin within - its parent component. - */ - void setOriginWithOriginalSize (const 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, const 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 0. - - 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); - - //============================================================================== - /** 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; - - //============================================================================== - /** 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(); - /** @internal */ - void setBoundsToEnclose (const Rectangle&); - - Point originRelativeToComponent; - - #ifndef DOXYGEN - /** Internal utility class used by Drawables. */ - template - class Positioner : public RelativeCoordinatePositionerBase - { - public: - Positioner (DrawableType& component_) - : RelativeCoordinatePositionerBase (component_), - owner (component_) - {} - - 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& g, float opacity, const AffineTransform& transform); - - Drawable& operator= (const Drawable&); - JUCE_LEAK_DETECTOR (Drawable); -}; - - -#endif // __JUCE_DRAWABLE_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableComposite.cpp b/src/juce/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableComposite.cpp deleted file mode 100644 index 0c307622..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableComposite.cpp +++ /dev/null @@ -1,340 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce 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) - { - const Drawable* const d = dynamic_cast (other.getChildComponent(i)); - - if (d != nullptr) - 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;) - { - const Drawable* const d = dynamic_cast (getChildComponent(i)); - - if (d != nullptr) - r = r.getUnion (d->isTransformed() ? d->getDrawableBounds().transformed (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;) - { - Component* const c = getChildComponent(i); - - if (c != nullptr) - 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 markersX (getMarkerList (true)); - MarkerList::ValueTreeWrapper markersY (getMarkerList (false)); - - return RelativeRectangle (markersX.getMarker (markersX.getMarkerState (0)).position, - markersX.getMarker (markersX.getMarkerState (1)).position, - markersY.getMarker (markersY.getMarkerState (0)).position, - markersY.getMarker (markersY.getMarkerState (1)).position); -} - -void DrawableComposite::ValueTreeWrapper::setContentArea (const RelativeRectangle& newArea, UndoManager* undoManager) -{ - MarkerList::ValueTreeWrapper markersX (getMarkerListCreating (true, nullptr)); - MarkerList::ValueTreeWrapper markersY (getMarkerListCreating (false, nullptr)); - - markersX.setMarker (MarkerList::Marker (contentLeftMarkerName, newArea.left), undoManager); - markersX.setMarker (MarkerList::Marker (contentRightMarkerName, newArea.right), undoManager); - markersY.setMarker (MarkerList::Marker (contentTopMarkerName, newArea.top), undoManager); - markersY.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/src/juce/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableComposite.h b/src/juce/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableComposite.h deleted file mode 100644 index 7b3fa4ef..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableComposite.h +++ /dev/null @@ -1,162 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_DRAWABLECOMPOSITE_JUCEHEADER__ -#define __JUCE_DRAWABLECOMPOSITE_JUCEHEADER__ - -#include "juce_Drawable.h" -#include "../positioning/juce_MarkerList.h" -#include "../positioning/juce_RelativeParallelogram.h" -#include "../positioning/juce_RelativeRectangle.h" - - -//============================================================================== -/** - 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& other); - - /** 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*); - /** @internal */ - void childrenChanged(); - /** @internal */ - void parentHierarchyChanged(); - /** @internal */ - MarkerList* getMarkers (bool xAxis); - - //============================================================================== - /** 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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableImage.cpp b/src/juce/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableImage.cpp deleted file mode 100644 index c0a18eb7..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableImage.cpp +++ /dev/null @@ -1,290 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce 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) -{ -} - -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 (const 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 (const 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/src/juce/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableImage.h b/src/juce/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableImage.h deleted file mode 100644 index f1aa98f3..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableImage.h +++ /dev/null @@ -1,142 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_DRAWABLEIMAGE_JUCEHEADER__ -#define __JUCE_DRAWABLEIMAGE_JUCEHEADER__ - -#include "juce_Drawable.h" -#include "../positioning/juce_RelativeParallelogram.h" - - -//============================================================================== -/** - A drawable object which is a bitmap image. - - @see Drawable -*/ -class JUCE_API DrawableImage : public Drawable -{ -public: - //============================================================================== - DrawableImage(); - DrawableImage (const DrawableImage& other); - - /** 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 (const Colour& newOverlayColour); - - /** Returns the overlay colour. */ - const 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& g); - /** @internal */ - bool hitTest (int x, int y); - /** @internal */ - Drawable* createCopy() const; - /** @internal */ - Rectangle getDrawableBounds() 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 DrawableImage's state into a ValueTree. */ - class ValueTreeWrapper : public Drawable::ValueTreeWrapperBase - { - public: - ValueTreeWrapper (const ValueTree& state); - - var getImageIdentifier() const; - void setImageIdentifier (const var& newIdentifier, UndoManager* undoManager); - Value getImageIdentifierValue (UndoManager* undoManager); - - float getOpacity() const; - void setOpacity (float newOpacity, UndoManager* undoManager); - Value getOpacityValue (UndoManager* undoManager); - - Colour getOverlayColour() const; - void setOverlayColour (const Colour& newColour, UndoManager* undoManager); - Value getOverlayColourValue (UndoManager* undoManager); - - RelativeParallelogram getBoundingBox() const; - void setBoundingBox (const RelativeParallelogram& newBounds, UndoManager* 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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawablePath.cpp b/src/juce/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawablePath.cpp deleted file mode 100644 index 9890d6b2..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawablePath.cpp +++ /dev/null @@ -1,571 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce 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& component_) - : RelativeCoordinatePositionerBase (component_), - owner (component_) - { - } - - 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& relativePath, UndoManager* undoManager) -{ - setUsesNonZeroWinding (relativePath.usesNonZeroWinding, undoManager); - - ValueTree pathTree (getPathState()); - pathTree.removeAllChildren (undoManager); - - for (int i = 0; i < relativePath.elements.size(); ++i) - pathTree.addChild (relativePath.elements.getUnchecked(i)->createTree(), -1, undoManager); -} - -void DrawablePath::ValueTreeWrapper::writeTo (RelativePointPath& relativePath) const -{ - relativePath.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; - - relativePath.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 (const Point& targetPoint, Expression::Scope* scope) const -{ - using namespace DrawablePathHelpers; - const Identifier type (state.getType()); - float bestProp = 0; - - if (type == 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 (type == 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 (type == 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 (const Point& targetPoint, Expression::Scope* scope, UndoManager* undoManager) -{ - ValueTree newTree; - const Identifier type (state.getType()); - - if (type == 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 (type == 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 (type == 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 (type == 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/src/juce/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawablePath.h b/src/juce/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawablePath.h deleted file mode 100644 index 17ff27fd..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawablePath.h +++ /dev/null @@ -1,149 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_DRAWABLEPATH_JUCEHEADER__ -#define __JUCE_DRAWABLEPATH_JUCEHEADER__ - -#include "juce_DrawableShape.h" -#include "../positioning/juce_RelativePointPath.h" - - -//============================================================================== -/** - 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& other); - - /** 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 (const Point& targetPoint, Expression::Scope*, UndoManager*); - void removePoint (UndoManager* undoManager); - float findProportionAlongLine (const 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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableRectangle.cpp b/src/juce/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableRectangle.cpp deleted file mode 100644 index c9aa4bd0..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableRectangle.cpp +++ /dev/null @@ -1,183 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce 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 (0); - recalculateCoordinates (0); - } -} - -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/src/juce/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableRectangle.h b/src/juce/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableRectangle.h deleted file mode 100644 index 1912c203..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableRectangle.h +++ /dev/null @@ -1,107 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_DRAWABLERECTANGLE_JUCEHEADER__ -#define __JUCE_DRAWABLERECTANGLE_JUCEHEADER__ - -#include "juce_DrawableShape.h" -#include "../positioning/juce_RelativeParallelogram.h" - - -//============================================================================== -/** - 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& other); - - /** 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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableShape.cpp b/src/juce/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableShape.cpp deleted file mode 100644 index 03272473..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableShape.cpp +++ /dev/null @@ -1,455 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce 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& component_, const DrawableShape::RelativeFillType& fill_, bool isMainFill_) - : RelativeCoordinatePositionerBase (component_), - owner (component_), - fill (fill_), - isMainFill (isMainFill_) - { - } - - 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(); - else - 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); -} diff --git a/src/juce/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableShape.h b/src/juce/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableShape.h deleted file mode 100644 index 64099ab1..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableShape.h +++ /dev/null @@ -1,184 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_DRAWABLESHAPE_JUCEHEADER__ -#define __JUCE_DRAWABLESHAPE_JUCEHEADER__ - -#include "juce_Drawable.h" -#include "../positioning/juce_RelativeCoordinatePositioner.h" - - -//============================================================================== -/** - 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; - /** @internal */ - void paint (Graphics& g); - /** @internal */ - bool hitTest (int x, int y); - -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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableText.cpp b/src/juce/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableText.cpp deleted file mode 100644 index e2b3ee17..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableText.cpp +++ /dev/null @@ -1,341 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce 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) -{ -} - -DrawableText::~DrawableText() -{ -} - -//============================================================================== -void DrawableText::setText (const String& newText) -{ - if (text != newText) - { - text = newText; - refreshBounds(); - } -} - -void DrawableText::setColour (const 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 (const 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(); -} - -const AffineTransform DrawableText::getArrangementAndTransform (GlyphArrangement& glyphs) const -{ - const float w = Line (resolvedPoints[0], resolvedPoints[1]).getLength(); - const float h = Line (resolvedPoints[0], resolvedPoints[2]).getLength(); - - glyphs.addFittedText (scaledFont, text, 0, 0, w, h, justification, 0x100000); - - return 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); -} - -//============================================================================== -void DrawableText::paint (Graphics& g) -{ - transformContextToCorrectOrigin (g); - - g.setColour (colour); - - GlyphArrangement ga; - const AffineTransform transform (getArrangementAndTransform (ga)); - ga.draw (g, transform); -} - -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 (const Colour& newColour, UndoManager* undoManager) -{ - state.setProperty (colour, newColour.toString(), undoManager); -} - -Justification DrawableText::ValueTreeWrapper::getJustification() const -{ - return Justification ((int) state [justification]); -} - -void DrawableText::ValueTreeWrapper::setJustification (const 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/src/juce/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableText.h b/src/juce/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableText.h deleted file mode 100644 index b3bd73f7..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableText.h +++ /dev/null @@ -1,151 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_DRAWABLETEXT_JUCEHEADER__ -#define __JUCE_DRAWABLETEXT_JUCEHEADER__ - -#include "juce_Drawable.h" -#include "../positioning/juce_RelativeParallelogram.h" - - -//============================================================================== -/** - 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& other); - - /** Destructor. */ - ~DrawableText(); - - //============================================================================== - /** Sets the text to display.*/ - void setText (const String& newText); - - /** Sets the colour of the text. */ - void setColour (const Colour& newColour); - - /** Returns the current text colour. */ - const 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); - - /** Changes the justification of the text within the bounding box. */ - void setJustification (const Justification& newJustification); - - /** 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& g); - /** @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; - - //============================================================================== - /** 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 (const Colour& newColour, UndoManager* undoManager); - - Justification getJustification() const; - void setJustification (const 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(); - const AffineTransform getArrangementAndTransform (GlyphArrangement& glyphs) const; - - DrawableText& operator= (const DrawableText&); - JUCE_LEAK_DETECTOR (DrawableText); -}; - - -#endif // __JUCE_DRAWABLETEXT_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_SVGParser.cpp b/src/juce/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_SVGParser.cpp deleted file mode 100644 index 44457492..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_SVGParser.cpp +++ /dev/null @@ -1,1296 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -class SVGState -{ -public: - //============================================================================== - SVGState (const XmlElement* const topLevel) - : topLevelXml (topLevel), - elementX (0), elementY (0), - width (512), height (512), - viewBoxW (0), viewBoxH (0) - { - } - - //============================================================================== - Drawable* parseSVGElement (const XmlElement& xml) - { - if (! xml.hasTagName ("svg")) - return nullptr; - - DrawableComposite* const drawable = new DrawableComposite(); - - drawable->setName (xml.getStringAttribute ("id")); - - 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; - - if (xml.hasAttribute ("viewBox")) - { - const String viewBoxAtt (xml.getStringAttribute ("viewBox")); - String::CharPointerType viewParams (viewBoxAtt.getCharPointer()); - float vx, vy, vw, vh; - - if (parseCoords (viewParams, vx, vy, true) - && parseCoords (viewParams, vw, vh, true) - && vw > 0 - && vh > 0) - { - newState.viewBoxW = vw; - newState.viewBoxH = vh; - - int placementFlags = 0; - - const String aspect (xml.getStringAttribute ("preserveAspectRatio")); - - if (aspect.containsIgnoreCase ("none")) - { - placementFlags = RectanglePlacement::stretchToFit; - } - else - { - if (aspect.containsIgnoreCase ("slice")) - placementFlags |= RectanglePlacement::fillDestination; - - if (aspect.containsIgnoreCase ("xMin")) - placementFlags |= RectanglePlacement::xLeft; - else if (aspect.containsIgnoreCase ("xMax")) - placementFlags |= RectanglePlacement::xRight; - else - placementFlags |= RectanglePlacement::xMid; - - if (aspect.containsIgnoreCase ("yMin")) - placementFlags |= RectanglePlacement::yTop; - else if (aspect.containsIgnoreCase ("yMax")) - placementFlags |= RectanglePlacement::yBottom; - else - placementFlags |= RectanglePlacement::yMid; - } - - const RectanglePlacement placement (placementFlags); - - newState.transform - = placement.getTransformToFit (Rectangle (vx, vy, vw, vh), - Rectangle (0.0f, 0.0f, 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->resetContentAreaAndBoundingBoxToFitChildren(); - return drawable; - } - -private: - //============================================================================== - const XmlElement* const topLevelXml; - float elementX, elementY, width, height, viewBoxW, viewBoxH; - AffineTransform transform; - String cssStyleText; - - //============================================================================== - void parseSubElements (const XmlElement& xml, DrawableComposite* const parentDrawable) - { - forEachXmlChildElement (xml, e) - { - Drawable* d = nullptr; - - if (e->hasTagName ("g")) d = parseGroupElement (*e); - else if (e->hasTagName ("svg")) d = parseSVGElement (*e); - else if (e->hasTagName ("path")) d = parsePath (*e); - else if (e->hasTagName ("rect")) d = parseRect (*e); - else if (e->hasTagName ("circle")) d = parseCircle (*e); - else if (e->hasTagName ("ellipse")) d = parseEllipse (*e); - else if (e->hasTagName ("line")) d = parseLine (*e); - else if (e->hasTagName ("polyline")) d = parsePolygon (*e, true); - else if (e->hasTagName ("polygon")) d = parsePolygon (*e, false); - else if (e->hasTagName ("text")) d = parseText (*e); - else if (e->hasTagName ("switch")) d = parseSwitch (*e); - else if (e->hasTagName ("style")) parseCSSStyle (*e); - - parentDrawable->addAndMakeVisible (d); - } - } - - DrawableComposite* parseSwitch (const XmlElement& xml) - { - const XmlElement* const group = xml.getChildByName ("g"); - - if (group != nullptr) - return parseGroupElement (*group); - - return nullptr; - } - - DrawableComposite* parseGroupElement (const XmlElement& xml) - { - DrawableComposite* const drawable = new DrawableComposite(); - - drawable->setName (xml.getStringAttribute ("id")); - - 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 XmlElement& xml) const - { - const String dAttribute (xml.getStringAttribute ("d").trimStart()); - String::CharPointerType d (dAttribute.getCharPointer()); - Path path; - - if (getStyleAttribute (&xml, "fill-rule").trim().equalsIgnoreCase ("evenodd")) - path.setUsingNonZeroWinding (false); - - float lastX = 0, lastY = 0; - float lastX2 = 0, lastY2 = 0; - juce_wchar lastCommandChar = 0; - bool isRelative = true; - bool carryOn = true; - - const CharPointer_ASCII validCommandChars ("MmLlHhVvCcSsQqTtAaZz"); - - while (! d.isEmpty()) - { - float x, y, x2, y2, x3, y3; - - if (validCommandChars.indexOf (*d) >= 0) - { - lastCommandChar = d.getAndAdvance(); - isRelative = (lastCommandChar >= 'a' && lastCommandChar <= 'z'); - } - - switch (lastCommandChar) - { - case 'M': - case 'm': - case 'L': - case 'l': - if (parseCoords (d, x, y, false)) - { - if (isRelative) - { - x += lastX; - y += lastY; - } - - if (lastCommandChar == 'M' || lastCommandChar == 'm') - { - path.startNewSubPath (x, y); - lastCommandChar = 'l'; - } - else - path.lineTo (x, y); - - lastX2 = lastX; - lastY2 = lastY; - lastX = x; - lastY = y; - } - else - { - ++d; - } - - break; - - case 'H': - case 'h': - if (parseCoord (d, x, false, true)) - { - if (isRelative) - x += lastX; - - path.lineTo (x, lastY); - - lastX2 = lastX; - lastX = x; - } - else - { - ++d; - } - break; - - case 'V': - case 'v': - if (parseCoord (d, y, false, false)) - { - if (isRelative) - y += lastY; - - path.lineTo (lastX, y); - - lastY2 = lastY; - lastY = y; - } - else - { - ++d; - } - break; - - case 'C': - case 'c': - if (parseCoords (d, x, y, false) - && parseCoords (d, x2, y2, false) - && parseCoords (d, x3, y3, false)) - { - if (isRelative) - { - x += lastX; - y += lastY; - x2 += lastX; - y2 += lastY; - x3 += lastX; - y3 += lastY; - } - - path.cubicTo (x, y, x2, y2, x3, y3); - - lastX2 = x2; - lastY2 = y2; - lastX = x3; - lastY = y3; - } - else - { - ++d; - } - break; - - case 'S': - case 's': - if (parseCoords (d, x, y, false) - && parseCoords (d, x3, y3, false)) - { - if (isRelative) - { - x += lastX; - y += lastY; - x3 += lastX; - y3 += lastY; - } - - x2 = lastX + (lastX - lastX2); - y2 = lastY + (lastY - lastY2); - path.cubicTo (x2, y2, x, y, x3, y3); - - lastX2 = x; - lastY2 = y; - lastX = x3; - lastY = y3; - } - else - { - ++d; - } - break; - - case 'Q': - case 'q': - if (parseCoords (d, x, y, false) - && parseCoords (d, x2, y2, false)) - { - if (isRelative) - { - x += lastX; - y += lastY; - x2 += lastX; - y2 += lastY; - } - - path.quadraticTo (x, y, x2, y2); - - lastX2 = x; - lastY2 = y; - lastX = x2; - lastY = y2; - } - else - { - ++d; - } - break; - - case 'T': - case 't': - if (parseCoords (d, x, y, false)) - { - if (isRelative) - { - x += lastX; - y += lastY; - } - - x2 = lastX + (lastX - lastX2); - y2 = lastY + (lastY - lastY2); - path.quadraticTo (x2, y2, x, y); - - lastX2 = x2; - lastY2 = y2; - lastX = x; - lastY = y; - } - else - { - ++d; - } - break; - - case 'A': - case 'a': - if (parseCoords (d, x, y, 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 (parseCoords (d, x2, y2, false)) - { - if (isRelative) - { - x2 += lastX; - y2 += lastY; - } - - if (lastX != x2 || lastY != y2) - { - double centreX, centreY, startAngle, deltaAngle; - double rx = x, ry = y; - - endpointToCentreParameters (lastX, lastY, x2, y2, - 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 (x2, y2); - } - - lastX2 = lastX; - lastY2 = lastY; - lastX = x2; - lastY = y2; - } - } - } - } - } - else - { - ++d; - } - - break; - - case 'Z': - case 'z': - path.closeSubPath(); - d = d.findEndOfWhitespace(); - break; - - default: - carryOn = false; - break; - } - - if (! carryOn) - break; - } - - return parseShape (xml, path); - } - - Drawable* parseRect (const XmlElement& xml) const - { - Path rect; - - const bool hasRX = xml.hasAttribute ("rx"); - const bool hasRY = xml.hasAttribute ("ry"); - - if (hasRX || hasRY) - { - float rx = getCoordLength (xml.getStringAttribute ("rx"), viewBoxW); - float ry = getCoordLength (xml.getStringAttribute ("ry"), viewBoxH); - - if (! hasRX) - rx = ry; - else if (! hasRY) - ry = rx; - - rect.addRoundedRectangle (getCoordLength (xml.getStringAttribute ("x"), viewBoxW), - getCoordLength (xml.getStringAttribute ("y"), viewBoxH), - getCoordLength (xml.getStringAttribute ("width"), viewBoxW), - getCoordLength (xml.getStringAttribute ("height"), viewBoxH), - rx, ry); - } - else - { - rect.addRectangle (getCoordLength (xml.getStringAttribute ("x"), viewBoxW), - getCoordLength (xml.getStringAttribute ("y"), viewBoxH), - getCoordLength (xml.getStringAttribute ("width"), viewBoxW), - getCoordLength (xml.getStringAttribute ("height"), viewBoxH)); - } - - return parseShape (xml, rect); - } - - Drawable* parseCircle (const XmlElement& xml) const - { - Path circle; - - const float cx = getCoordLength (xml.getStringAttribute ("cx"), viewBoxW); - const float cy = getCoordLength (xml.getStringAttribute ("cy"), viewBoxH); - const float radius = getCoordLength (xml.getStringAttribute ("r"), viewBoxW); - - circle.addEllipse (cx - radius, cy - radius, radius * 2.0f, radius * 2.0f); - - return parseShape (xml, circle); - } - - Drawable* parseEllipse (const XmlElement& xml) const - { - Path ellipse; - - const float cx = getCoordLength (xml.getStringAttribute ("cx"), viewBoxW); - const float cy = getCoordLength (xml.getStringAttribute ("cy"), viewBoxH); - const float radiusX = getCoordLength (xml.getStringAttribute ("rx"), viewBoxW); - const float radiusY = getCoordLength (xml.getStringAttribute ("ry"), viewBoxH); - - ellipse.addEllipse (cx - radiusX, cy - radiusY, radiusX * 2.0f, radiusY * 2.0f); - - return parseShape (xml, ellipse); - } - - Drawable* parseLine (const XmlElement& xml) const - { - Path line; - - const float x1 = getCoordLength (xml.getStringAttribute ("x1"), viewBoxW); - const float y1 = getCoordLength (xml.getStringAttribute ("y1"), viewBoxH); - const float x2 = getCoordLength (xml.getStringAttribute ("x2"), viewBoxW); - const float y2 = getCoordLength (xml.getStringAttribute ("y2"), viewBoxH); - - line.startNewSubPath (x1, y1); - line.lineTo (x2, y2); - - return parseShape (xml, line); - } - - Drawable* parsePolygon (const XmlElement& xml, const bool isPolyline) const - { - const String pointsAtt (xml.getStringAttribute ("points")); - String::CharPointerType points (pointsAtt.getCharPointer()); - Path path; - float x, y; - - if (parseCoords (points, x, y, true)) - { - float firstX = x; - float firstY = y; - float lastX = 0, lastY = 0; - - path.startNewSubPath (x, y); - - while (parseCoords (points, x, y, true)) - { - lastX = x; - lastY = y; - path.lineTo (x, y); - } - - if ((! isPolyline) || (firstX == lastX && firstY == lastY)) - path.closeSubPath(); - } - - return parseShape (xml, path); - } - - //============================================================================== - Drawable* parseShape (const XmlElement& 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(); - dp->setName (xml.getStringAttribute ("id")); - dp->setFill (Colours::transparentBlack); - - path.applyTransform (transform); - dp->setPath (path); - - Path::Iterator iter (path); - - bool containsClosedSubPath = false; - while (iter.next()) - { - if (iter.elementType == Path::Iterator::closePath) - { - containsClosedSubPath = true; - break; - } - } - - dp->setFill (getPathFillType (path, - getStyleAttribute (&xml, "fill"), - getStyleAttribute (&xml, "fill-opacity"), - getStyleAttribute (&xml, "opacity"), - containsClosedSubPath ? 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; - } - - const XmlElement* findLinkedElement (const XmlElement* e) const - { - const String id (e->getStringAttribute ("xlink:href")); - - if (! id.startsWithChar ('#')) - return nullptr; - - return findElementForId (topLevelXml, id.substring (1)); - } - - void addGradientStopsIn (ColourGradient& cg, const XmlElement* const fillXml) const - { - if (fillXml == 0) - return; - - forEachXmlChildElementWithTagName (*fillXml, e, "stop") - { - int index = 0; - Colour col (parseColour (getStyleAttribute (e, "stop-color"), index, Colours::black)); - - const String opacity (getStyleAttribute (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 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()); - - const XmlElement* const fillXml = findElementForId (topLevelXml, id); - - if (fillXml != nullptr - && (fillXml->hasTagName ("linearGradient") - || fillXml->hasTagName ("radialGradient"))) - { - const XmlElement* inheritedFrom = findLinkedElement (fillXml); - - ColourGradient gradient; - - addGradientStopsIn (gradient, inheritedFrom); - 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 (overallOpacity.isNotEmpty()) - gradient.multiplyOpacity (overallOpacity.getFloatValue()); - - jassert (gradient.getNumColours() > 0); - - gradient.isRadial = fillXml->hasTagName ("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); - type.transform = parseTransform (fillXml->getStringAttribute ("gradientTransform")) - .followedBy (transform); - return type; - } - } - - if (fill.equalsIgnoreCase ("none")) - return Colours::transparentBlack; - - int i = 0; - const Colour colour (parseColour (fill, i, defaultColour)); - return colour.withMultipliedAlpha (opacity); - } - - PathStrokeType getStrokeFor (const XmlElement* const xml) const - { - const String strokeWidth (getStyleAttribute (xml, "stroke-width")); - const String cap (getStyleAttribute (xml, "stroke-linecap")); - const String join (getStyleAttribute (xml, "stroke-linejoin")); - - //const String mitreLimit (getStyleAttribute (xml, "stroke-miterlimit")); - //const String dashArray (getStyleAttribute (xml, "stroke-dasharray")); - //const String dashOffset (getStyleAttribute (xml, "stroke-dashoffset")); - - PathStrokeType::JointStyle joinStyle = PathStrokeType::mitered; - PathStrokeType::EndCapStyle capStyle = PathStrokeType::butt; - - if (join.equalsIgnoreCase ("round")) - joinStyle = PathStrokeType::curved; - else if (join.equalsIgnoreCase ("bevel")) - joinStyle = PathStrokeType::beveled; - - if (cap.equalsIgnoreCase ("round")) - capStyle = PathStrokeType::rounded; - else if (cap.equalsIgnoreCase ("square")) - capStyle = PathStrokeType::square; - - float ox = 0.0f, oy = 0.0f; - float x = getCoordLength (strokeWidth, viewBoxW), y = 0.0f; - transform.transformPoints (ox, oy, x, y); - - return PathStrokeType (strokeWidth.isNotEmpty() ? juce_hypot (x - ox, y - oy) : 1.0f, - joinStyle, capStyle); - } - - //============================================================================== - Drawable* parseText (const XmlElement& xml) - { - 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); - - - //xxx not done text yet! - - - forEachXmlChildElement (xml, e) - { - if (e->isTextElement()) - { - const String text (e->getText()); - - Path path; - Drawable* s = parseShape (*e, path); - delete s; // xxx not finished! - } - else if (e->hasTagName ("tspan")) - { - Drawable* s = parseText (*e); - delete s; // xxx not finished! - } - } - - return nullptr; - } - - //============================================================================== - void addTransform (const XmlElement& 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, float& x, float& y, const bool allowUnits) const - { - return parseCoord (s, x, allowUnits, true) - && parseCoord (s, y, allowUnits, false); - } - - float getCoordLength (const String& s, const float sizeForProportions) const - { - 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; - } - - void getCoordList (Array & coords, const String& list, - const 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 XmlElement& xml) - { - cssStyleText = xml.getAllSubText() + "\n" + cssStyleText; - } - - String getStyleAttribute (const XmlElement* xml, const String& attributeName, - const String& defaultValue = String::empty) 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::empty)); - - if (value.isNotEmpty()) - return value; - } - else if (xml->hasAttribute ("class")) - { - const String className ("." + xml->getStringAttribute ("class")); - - int index = cssStyleText.indexOfIgnoreCase (className + " "); - - if (index < 0) - index = cssStyleText.indexOfIgnoreCase (className + "{"); - - if (index >= 0) - { - const int openBracket = cssStyleText.indexOfChar (index, '{'); - - if (openBracket > index) - { - const int closeBracket = cssStyleText.indexOfChar (openBracket, '}'); - - if (closeBracket > openBracket) - { - const String value (getAttributeFromStyleList (cssStyleText.substring (openBracket + 1, closeBracket), attributeName, defaultValue)); - - if (value.isNotEmpty()) - return value; - } - } - } - } - - xml = const_cast (topLevelXml)->findParentElementOf (xml); - - if (xml != nullptr) - return getStyleAttribute (xml, attributeName, defaultValue); - - return defaultValue; - } - - String getInheritedAttribute (const XmlElement* xml, const String& attributeName) const - { - if (xml->hasAttribute (attributeName)) - return xml->getStringAttribute (attributeName); - - xml = const_cast (topLevelXml)->findParentElementOf (xml); - - if (xml != nullptr) - return getInheritedAttribute (xml, attributeName); - - return String::empty; - } - - //============================================================================== - static bool isIdentifierChar (const juce_wchar c) - { - return CharacterFunctions::isLetter (c) || c == '-'; - } - - static String getAttributeFromStyleList (const String& list, const String& 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& s, String& value, const bool allowUnits) - { - while (s.isWhitespace() || *s == ',') - ++s; - - String::CharPointerType start (s); - int numChars = 0; - - if (s.isDigit() || *s == '.' || *s == '-') - { - ++numChars; - ++s; - } - - while (s.isDigit() || *s == '.') - { - ++numChars; - ++s; - } - - if ((*s == 'e' || *s == 'E') - && ((s + 1).isDigit() || s[1] == '-' || s[1] == '+')) - { - s += 2; - numChars += 2; - - while (s.isDigit()) - { - ++numChars; - ++s; - } - } - - if (allowUnits) - { - while (s.isLetter()) - { - ++numChars; - ++s; - } - } - - if (numChars == 0) - return false; - - value = String (start, (size_t) numChars); - - while (s.isWhitespace() || *s == ',') - ++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)); - else - return Colour ((uint8) ((hex [0] << 4) + hex [1]), - (uint8) ((hex [2] << 4) + hex [3]), - (uint8) ((hex [4] << 4) + hex [5])); - } - else 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 const AffineTransform parseTransform (String t) - { - AffineTransform result; - - while (t.isNotEmpty()) - { - StringArray tokens; - tokens.addTokens (t.fromFirstOccurrenceOf ("(", false, false) - .upToFirstOccurrenceOf (")", false, false), - ", ", String::empty); - - tokens.removeEmptyStrings (true); - - float numbers [6]; - - for (int i = 0; i < 6; ++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")) - { - jassert (tokens.size() == 2); - trans = AffineTransform::translation (numbers[0], numbers[1]); - } - else if (t.startsWithIgnoreCase ("scale")) - { - if (tokens.size() == 1) - trans = AffineTransform::scale (numbers[0], numbers[0]); - else - trans = AffineTransform::scale (numbers[0], numbers[1]); - } - else if (t.startsWithIgnoreCase ("rotate")) - { - if (tokens.size() != 3) - trans = AffineTransform::rotation (numbers[0] / (180.0f / float_Pi)); - else - trans = AffineTransform::rotation (numbers[0] / (180.0f / float_Pi), - numbers[1], numbers[2]); - } - else if (t.startsWithIgnoreCase ("skewX")) - { - trans = AffineTransform (1.0f, std::tan (numbers[0] * (float_Pi / 180.0f)), 0.0f, - 0.0f, 1.0f, 0.0f); - } - else if (t.startsWithIgnoreCase ("skewY")) - { - trans = AffineTransform (1.0f, 0.0f, 0.0f, - std::tan (numbers[0] * (float_Pi / 180.0f)), 1.0f, 0.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) - { - const double midX = (x1 - x2) * 0.5; - const double midY = (y1 - y2) * 0.5; - - const double cosAngle = cos (angle); - const double sinAngle = 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; - rx2 = rx * rx; - ry2 = ry * ry; - 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); - } - - static const XmlElement* findElementForId (const XmlElement* const parent, const String& id) - { - forEachXmlChildElement (*parent, e) - { - if (e->compareAttribute ("id", id)) - return e; - - const XmlElement* const found = findElementForId (e, id); - - if (found != nullptr) - return found; - } - - return nullptr; - } - - SVGState& operator= (const SVGState&); -}; - - -//============================================================================== -Drawable* Drawable::createFromSVG (const XmlElement& svgDocument) -{ - SVGState state (&svgDocument); - return state.parseSVGElement (svgDocument); -} diff --git a/src/juce/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.cpp b/src/juce/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.cpp deleted file mode 100644 index addfcc32..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.cpp +++ /dev/null @@ -1,72 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce 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/src/juce/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.h b/src/juce/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.h deleted file mode 100644 index 5d0cf4a1..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.h +++ /dev/null @@ -1,116 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_DIRECTORYCONTENTSDISPLAYCOMPONENT_JUCEHEADER__ -#define __JUCE_DIRECTORYCONTENTSDISPLAYCOMPONENT_JUCEHEADER__ - -#include "../components/juce_Component.h" -#include "juce_DirectoryContentsList.h" -#include "juce_FileBrowserListener.h" - - -//============================================================================== -/** - 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_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.cpp b/src/juce/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.cpp deleted file mode 100644 index 8b0adc8f..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.cpp +++ /dev/null @@ -1,267 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -DirectoryContentsList::DirectoryContentsList (const FileFilter* const fileFilter_, - TimeSliceThread& thread_) - : fileFilter (fileFilter_), - thread (thread_), - 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; -} - -//============================================================================== -const File& DirectoryContentsList::getDirectory() const -{ - return root; -} - -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; - - // (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); - } -} - -//============================================================================== -int DirectoryContentsList::getNumFiles() const -{ - return files.size(); -} - -bool DirectoryContentsList::getFileInfo (const int index, - FileInfo& result) const -{ - const ScopedLock sl (fileListLock); - const FileInfo* const info = files [index]; - - if (info != nullptr) - { - result = *info; - return true; - } - - return false; -} - -File DirectoryContentsList::getFile (const int index) const -{ - const ScopedLock sl (fileListLock); - const FileInfo* const info = files [index]; - - if (info != nullptr) - return root.getChildFile (info->filename); - - return File::nonexistent; -} - -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; - } - else - { - fileFindHandle = nullptr; - } - } - - return false; -} - -int DirectoryContentsList::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.compareIgnoreCase (second->filename); -} - -bool DirectoryContentsList::addFile (const File& file, - const bool isDir, - const int64 fileSize, - const Time& modTime, - const Time& creationTime, - const bool isReadOnly) -{ - 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; - - const ScopedLock sl (fileListLock); - - for (int i = files.size(); --i >= 0;) - if (files.getUnchecked(i)->filename == info->filename) - return false; - - files.addSorted (*this, info.release()); - return true; - } - - return false; -} diff --git a/src/juce/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.h b/src/juce/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.h deleted file mode 100644 index 48367be5..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.h +++ /dev/null @@ -1,218 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_DIRECTORYCONTENTSLIST_JUCEHEADER__ -#define __JUCE_DIRECTORYCONTENTSLIST_JUCEHEADER__ - -#include "juce_FileFilter.h" - - -//============================================================================== -/** - 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, - public 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 0, 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(); - - - //============================================================================== - /** 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 the directory that's currently being used. */ - const File& getDirectory() const; - - /** 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; - - //============================================================================== - /** 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; - - /** 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 { return fileFilter; } - - /** Returns true if the list contains the specified file. */ - bool contains (const File&) const; - - //============================================================================== - /** @internal */ - int useTimeSlice(); - /** @internal */ - TimeSliceThread& getTimeSliceThread() { return thread; } - /** @internal */ - static int compareElements (const DirectoryContentsList::FileInfo* first, - const DirectoryContentsList::FileInfo* second); - -private: - File root; - const FileFilter* fileFilter; - TimeSliceThread& thread; - int fileTypeFlags; - - CriticalSection fileListLock; - OwnedArray files; - - ScopedPointer fileFindHandle; - bool volatile shouldStop; - - void stopSearching(); - void changed(); - bool checkNextFile (bool& hasChanged); - bool addFile (const File& file, bool isDir, - const int64 fileSize, const Time& modTime, - const Time& creationTime, bool isReadOnly); - void setTypeFlags (int newFlags); - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DirectoryContentsList); -}; - - -#endif // __JUCE_DIRECTORYCONTENTSLIST_JUCEHEADER__ diff --git a/src/juce/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.cpp b/src/juce/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.cpp deleted file mode 100644 index c418f099..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.cpp +++ /dev/null @@ -1,569 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce 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 (¤tPathBox); - 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 -{ - if (isSaveMode()) - return ! getSelectedFile (0).isDirectory(); - else - return getSelectedFile (0).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, true); - - 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() ? TRANS("Save") : TRANS("Open"); -} - -void FileBrowserComponent::setFilenameBoxLabel (const String& name) -{ - fileLabel.setText (name, false); -} - -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::getRoots (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 ("Documents"); - rootPaths.add (File::getSpecialLocation (File::userDesktopDirectory).getFullPathName()); - rootNames.add ("Desktop"); - - #elif JUCE_MAC - rootPaths.add (File::getSpecialLocation (File::userHomeDirectory).getFullPathName()); - rootNames.add ("Home folder"); - rootPaths.add (File::getSpecialLocation (File::userDocumentsDirectory).getFullPathName()); - rootNames.add ("Documents"); - rootPaths.add (File::getSpecialLocation (File::userDesktopDirectory).getFullPathName()); - rootNames.add ("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 ("Home folder"); - rootPaths.add (File::getSpecialLocation (File::userDesktopDirectory).getFullPathName()); - rootNames.add ("Desktop"); - #endif -} diff --git a/src/juce/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.h b/src/juce/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.h deleted file mode 100644 index 0478b37c..00000000 --- a/src/juce/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.h +++ /dev/null @@ -1,252 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -#ifndef __JUCE_FILEBROWSERCOMPONENT_JUCEHEADER__ -#define __JUCE_FILEBROWSERCOMPONENT_JUCEHEADER__ - -#include "juce_DirectoryContentsDisplayComponent.h" -#include "juce_FilePreviewComponent.h" -#include "../widgets/juce_TextEditor.h" -#include "../widgets/juce_ComboBox.h" -#include "../buttons/juce_DrawableButton.h" - - -//============================================================================== -/** - 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. */ - }; - - //============================================================================== - /** 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); - - - //============================================================================== - /** @internal */ - void resized(); - /** @internal */ - void buttonClicked (Button*); - /** @internal */ - void comboBoxChanged (ComboBox*); - /** @internal */ - void textEditorTextChanged (TextEditor&); - /** @internal */ - void textEditorReturnKeyPressed (TextEditor&); - /** @internal */ - void textEditorEscapeKeyPressed (TextEditor&); - /** @internal */ - void textEditorFocusLost (TextEditor&); - /** @internal */ - bool keyPressed (const KeyPress&); - /** @internal */ - void selectionChanged(); - /** @internal */ - void fileClicked (const File&, const MouseEvent&); - /** @internal */ - void fileDoubleClicked (const File&); - /** @internal */ - void browserRootChanged (const File&); - /** @internal */ - bool isFileSuitable (const File&) const; - /** @internal */ - bool isDirectorySuitable (const File&) const; - - /** @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. - Use an empty string to indicate a section break. - */ - 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