| @@ -204,7 +204,8 @@ private: | |||
| const float* s = buffer.getSampleData (0, 0); | |||
| const int spikeDriftAllowed = 5; | |||
| Array <int> spikesFound (100); | |||
| Array <int> spikesFound; | |||
| spikesFound.ensureStorageAllocated (100); | |||
| double runningAverage = 0; | |||
| int lastSpike = 0; | |||
| @@ -38,8 +38,7 @@ BEGIN_JUCE_NAMESPACE | |||
| //============================================================================== | |||
| ApplicationCommandManager::ApplicationCommandManager() | |||
| : listeners (8), | |||
| firstTarget (0) | |||
| : firstTarget (0) | |||
| { | |||
| keyMappings = new KeyPressMappingSet (this); | |||
| @@ -166,7 +165,7 @@ const StringArray ApplicationCommandManager::getCommandCategories() const throw( | |||
| const Array <CommandID> ApplicationCommandManager::getCommandsInCategory (const String& categoryName) const throw() | |||
| { | |||
| Array <CommandID> results (4); | |||
| Array <CommandID> results; | |||
| for (int i = 0; i < commands.size(); ++i) | |||
| if (commands.getUnchecked(i)->categoryName == categoryName) | |||
| @@ -37,8 +37,7 @@ BEGIN_JUCE_NAMESPACE | |||
| //============================================================================== | |||
| AudioFormatManager::AudioFormatManager() | |||
| : knownFormats (4), | |||
| defaultFormatIndex (0) | |||
| : defaultFormatIndex (0) | |||
| { | |||
| } | |||
| @@ -42,8 +42,7 @@ class SharedBufferingAudioSourceThread : public DeletedAtShutdown, | |||
| { | |||
| public: | |||
| SharedBufferingAudioSourceThread() | |||
| : Thread ("Audio Buffer"), | |||
| sources (8) | |||
| : Thread ("Audio Buffer") | |||
| { | |||
| } | |||
| @@ -64,9 +64,6 @@ AudioDeviceManager::AudioDeviceManager() | |||
| inputLevelMeasurementEnabledCount (0), | |||
| inputLevel (0), | |||
| tempBuffer (2, 2), | |||
| enabledMidiInputs (4), | |||
| midiCallbacks (4), | |||
| midiCallbackDevices (4), | |||
| defaultMidiOutput (0), | |||
| cpuUsageMs (0), | |||
| timeToCpuScale (0) | |||
| @@ -32,24 +32,20 @@ BEGIN_JUCE_NAMESPACE | |||
| //============================================================================== | |||
| MidiBuffer::MidiBuffer() throw() | |||
| : data (32), | |||
| bytesUsed (0) | |||
| : bytesUsed (0) | |||
| { | |||
| } | |||
| MidiBuffer::MidiBuffer (const MidiMessage& message) throw() | |||
| : data (32), | |||
| bytesUsed (0) | |||
| : bytesUsed (0) | |||
| { | |||
| addEvent (message, 0); | |||
| } | |||
| MidiBuffer::MidiBuffer (const MidiBuffer& other) throw() | |||
| : data (32), | |||
| bytesUsed (other.bytesUsed) | |||
| : bytesUsed (other.bytesUsed), | |||
| data (other.data) | |||
| { | |||
| data.ensureAllocatedSize (bytesUsed); | |||
| memcpy (data.elements, other.data.elements, bytesUsed); | |||
| } | |||
| const MidiBuffer& MidiBuffer::operator= (const MidiBuffer& other) throw() | |||
| @@ -57,10 +53,7 @@ const MidiBuffer& MidiBuffer::operator= (const MidiBuffer& other) throw() | |||
| if (this != &other) | |||
| { | |||
| bytesUsed = other.bytesUsed; | |||
| data.ensureAllocatedSize (bytesUsed); | |||
| if (bytesUsed > 0) | |||
| memcpy (data.elements, other.data.elements, bytesUsed); | |||
| data = other.data; | |||
| } | |||
| return *this; | |||
| @@ -68,8 +61,7 @@ const MidiBuffer& MidiBuffer::operator= (const MidiBuffer& other) throw() | |||
| void MidiBuffer::swap (MidiBuffer& other) | |||
| { | |||
| swapVariables <uint8*> (data.elements, other.data.elements); | |||
| swapVariables <int> (data.numAllocated, other.data.numAllocated); | |||
| data.swapWith (other.data); | |||
| swapVariables <int> (bytesUsed, other.bytesUsed); | |||
| } | |||
| @@ -85,12 +77,12 @@ void MidiBuffer::clear() throw() | |||
| void MidiBuffer::clear (const int startSample, | |||
| const int numSamples) throw() | |||
| { | |||
| uint8* const start = findEventAfter (data.elements, startSample - 1); | |||
| uint8* const start = findEventAfter (data, startSample - 1); | |||
| uint8* const end = findEventAfter (start, startSample + numSamples - 1); | |||
| if (end > start) | |||
| { | |||
| const size_t bytesToMove = (size_t) (bytesUsed - (end - data.elements)); | |||
| const size_t bytesToMove = (size_t) (bytesUsed - (end - (uint8*) data.getData())); | |||
| if (bytesToMove > 0) | |||
| memmove (start, end, bytesToMove); | |||
| @@ -144,10 +136,11 @@ void MidiBuffer::addEvent (const uint8* const newData, | |||
| if (numBytes > 0) | |||
| { | |||
| data.ensureAllocatedSize (bytesUsed + numBytes + 6); | |||
| int spaceNeeded = bytesUsed + numBytes + 6; | |||
| data.ensureSize ((spaceNeeded + spaceNeeded / 2 + 8) & ~7); | |||
| uint8* d = findEventAfter (data.elements, sampleNumber); | |||
| const size_t bytesToMove = (size_t) (bytesUsed - (d - data.elements)); | |||
| uint8* d = findEventAfter ((uint8*) data.getData(), sampleNumber); | |||
| const size_t bytesToMove = (size_t) (bytesUsed - (d - (uint8*) data.getData())); | |||
| if (bytesToMove > 0) | |||
| memmove (d + numBytes + 6, | |||
| @@ -173,13 +166,13 @@ void MidiBuffer::addEvents (const MidiBuffer& otherBuffer, | |||
| Iterator i (otherBuffer); | |||
| i.setNextSamplePosition (startSample); | |||
| const uint8* data; | |||
| int size, position; | |||
| const uint8* eventData; | |||
| int eventSize, position; | |||
| while (i.getNextEvent (data, size, position) | |||
| while (i.getNextEvent (eventData, eventSize, position) | |||
| && (position < startSample + numSamples || numSamples < 0)) | |||
| { | |||
| addEvent (data, size, position + sampleDeltaToAdd); | |||
| addEvent (eventData, eventSize, position + sampleDeltaToAdd); | |||
| } | |||
| } | |||
| @@ -191,8 +184,8 @@ bool MidiBuffer::isEmpty() const throw() | |||
| int MidiBuffer::getNumEvents() const throw() | |||
| { | |||
| int n = 0; | |||
| const uint8* d = data.elements; | |||
| const uint8* const end = data.elements + bytesUsed; | |||
| const uint8* d = (uint8*) data.getData(); | |||
| const uint8* const end = d + bytesUsed; | |||
| while (d < end) | |||
| { | |||
| @@ -206,7 +199,7 @@ int MidiBuffer::getNumEvents() const throw() | |||
| int MidiBuffer::getFirstEventTime() const throw() | |||
| { | |||
| return (bytesUsed > 0) ? *(const int*) data.elements : 0; | |||
| return (bytesUsed > 0) ? *(const int*) data.getData() : 0; | |||
| } | |||
| int MidiBuffer::getLastEventTime() const throw() | |||
| @@ -214,7 +207,7 @@ int MidiBuffer::getLastEventTime() const throw() | |||
| if (bytesUsed == 0) | |||
| return 0; | |||
| const uint8* d = data.elements; | |||
| const uint8* d = (uint8*) data.getData(); | |||
| const uint8* const endData = d + bytesUsed; | |||
| for (;;) | |||
| @@ -230,7 +223,7 @@ int MidiBuffer::getLastEventTime() const throw() | |||
| uint8* MidiBuffer::findEventAfter (uint8* d, const int samplePosition) const throw() | |||
| { | |||
| const uint8* const endData = data.elements + bytesUsed; | |||
| const uint8* const endData = ((uint8*) data.getData()) + bytesUsed; | |||
| while (d < endData && *(int*) d <= samplePosition) | |||
| { | |||
| @@ -244,7 +237,7 @@ uint8* MidiBuffer::findEventAfter (uint8* d, const int samplePosition) const thr | |||
| //============================================================================== | |||
| MidiBuffer::Iterator::Iterator (const MidiBuffer& buffer_) throw() | |||
| : buffer (buffer_), | |||
| data (buffer_.data.elements) | |||
| data ((uint8*) buffer_.data.getData()) | |||
| { | |||
| } | |||
| @@ -255,8 +248,8 @@ MidiBuffer::Iterator::~Iterator() throw() | |||
| //============================================================================== | |||
| void MidiBuffer::Iterator::setNextSamplePosition (const int samplePosition) throw() | |||
| { | |||
| data = buffer.data.elements; | |||
| const uint8* dataEnd = buffer.data.elements + buffer.bytesUsed; | |||
| data = buffer.data; | |||
| const uint8* dataEnd = ((uint8*) buffer.data.getData()) + buffer.bytesUsed; | |||
| while (data < dataEnd && *(int*) data < samplePosition) | |||
| { | |||
| @@ -269,7 +262,7 @@ bool MidiBuffer::Iterator::getNextEvent (const uint8* &midiData, | |||
| int& numBytes, | |||
| int& samplePosition) throw() | |||
| { | |||
| if (data >= buffer.data.elements + buffer.bytesUsed) | |||
| if (data >= ((uint8*) buffer.data.getData()) + buffer.bytesUsed) | |||
| return false; | |||
| samplePosition = *(int*) data; | |||
| @@ -285,7 +278,7 @@ bool MidiBuffer::Iterator::getNextEvent (const uint8* &midiData, | |||
| bool MidiBuffer::Iterator::getNextEvent (MidiMessage& result, | |||
| int& samplePosition) throw() | |||
| { | |||
| if (data >= buffer.data.elements + buffer.bytesUsed) | |||
| if (data >= ((uint8*) buffer.data.getData()) + buffer.bytesUsed) | |||
| return false; | |||
| samplePosition = *(int*) data; | |||
| @@ -26,7 +26,7 @@ | |||
| #ifndef __JUCE_MIDIBUFFER_JUCEHEADER__ | |||
| #define __JUCE_MIDIBUFFER_JUCEHEADER__ | |||
| #include "../../containers/juce_ArrayAllocationBase.h" | |||
| #include "../../containers/juce_MemoryBlock.h" | |||
| #include "juce_MidiMessage.h" | |||
| @@ -226,7 +226,7 @@ public: | |||
| private: | |||
| friend class MidiBuffer::Iterator; | |||
| ArrayAllocationBase <uint8> data; | |||
| MemoryBlock data; | |||
| int bytesUsed; | |||
| uint8* findEventAfter (uint8* d, const int samplePosition) const throw(); | |||
| @@ -33,7 +33,6 @@ BEGIN_JUCE_NAMESPACE | |||
| //============================================================================== | |||
| MidiKeyboardState::MidiKeyboardState() | |||
| : listeners (2) | |||
| { | |||
| zeromem (noteStates, sizeof (noteStates)); | |||
| } | |||
| @@ -298,7 +298,8 @@ void MidiMessageSequence::createControllerUpdatesForTime (const int channelNumbe | |||
| { | |||
| bool doneProg = false; | |||
| bool donePitchWheel = false; | |||
| Array <int> doneControllers (32); | |||
| Array <int> doneControllers; | |||
| doneControllers.ensureStorageAllocated (32); | |||
| for (int i = list.size(); --i >= 0;) | |||
| { | |||
| @@ -72,9 +72,7 @@ void SynthesiserVoice::clearCurrentNote() | |||
| //============================================================================== | |||
| Synthesiser::Synthesiser() | |||
| : voices (2), | |||
| sounds (2), | |||
| sampleRate (0), | |||
| : sampleRate (0), | |||
| lastNoteOnCounter (0), | |||
| shouldStealNotes (true) | |||
| { | |||
| @@ -56,15 +56,9 @@ class Array | |||
| { | |||
| public: | |||
| //============================================================================== | |||
| /** Creates an empty array. | |||
| @param granularity this is the size of increment by which the internal storage | |||
| used by the array will grow. Only change it from the default if you know the | |||
| array is going to be very big and needs to be able to grow efficiently. | |||
| */ | |||
| Array (const int granularity = juceDefaultArrayGranularity) throw() | |||
| : data (granularity), | |||
| numUsed (0) | |||
| /** Creates an empty array. */ | |||
| Array() throw() | |||
| : numUsed (0) | |||
| { | |||
| } | |||
| @@ -72,7 +66,6 @@ public: | |||
| @param other the array to copy | |||
| */ | |||
| Array (const Array<ElementType, TypeOfCriticalSectionToUse>& other) throw() | |||
| : data (other.data.granularity) | |||
| { | |||
| other.lockArray(); | |||
| numUsed = other.numUsed; | |||
| @@ -86,8 +79,7 @@ public: | |||
| @param values the array to copy from | |||
| */ | |||
| Array (const ElementType* values) throw() | |||
| : data (juceDefaultArrayGranularity), | |||
| numUsed (0) | |||
| : numUsed (0) | |||
| { | |||
| while (*values != 0) | |||
| add (*values++); | |||
| @@ -99,8 +91,7 @@ public: | |||
| @param numValues the number of values in the array | |||
| */ | |||
| Array (const ElementType* values, int numValues) throw() | |||
| : data (juceDefaultArrayGranularity), | |||
| numUsed (numValues) | |||
| : numUsed (numValues) | |||
| { | |||
| data.setAllocatedSize (numValues); | |||
| memcpy (data.elements, values, numValues * sizeof (ElementType)); | |||
| @@ -121,7 +112,6 @@ public: | |||
| other.lockArray(); | |||
| lock.enter(); | |||
| data.granularity = other.data.granularity; | |||
| data.ensureAllocatedSize (other.size()); | |||
| numUsed = other.numUsed; | |||
| memcpy (data.elements, other.data.elements, numUsed * sizeof (ElementType)); | |||
| @@ -977,19 +967,7 @@ public: | |||
| void minimiseStorageOverheads() throw() | |||
| { | |||
| lock.enter(); | |||
| if (numUsed == 0) | |||
| { | |||
| data.setAllocatedSize (0); | |||
| } | |||
| else | |||
| { | |||
| const int newAllocation = data.granularity * (numUsed / data.granularity + 1); | |||
| if (newAllocation < data.numAllocated) | |||
| data.setAllocatedSize (newAllocation); | |||
| } | |||
| data.shrinkToNoMoreThan (numUsed); | |||
| lock.exit(); | |||
| } | |||
| @@ -1001,7 +979,9 @@ public: | |||
| */ | |||
| void ensureStorageAllocated (const int minNumElements) throw() | |||
| { | |||
| lock.enter(); | |||
| data.ensureAllocatedSize (minNumElements); | |||
| lock.exit(); | |||
| } | |||
| //============================================================================== | |||
| @@ -27,14 +27,6 @@ | |||
| #define __JUCE_ARRAYALLOCATIONBASE_JUCEHEADER__ | |||
| //============================================================================== | |||
| /** The default size of chunk in which arrays increase their storage. | |||
| Used by ArrayAllocationBase and its subclasses. | |||
| */ | |||
| const int juceDefaultArrayGranularity = 8; | |||
| //============================================================================== | |||
| /** | |||
| Implements some basic array storage allocation functions. | |||
| @@ -49,17 +41,11 @@ class ArrayAllocationBase | |||
| { | |||
| public: | |||
| //============================================================================== | |||
| /** Creates an empty array. | |||
| @param granularity_ this is the size of increment by which the internal storage | |||
| will be increased. | |||
| */ | |||
| ArrayAllocationBase (const int granularity_) throw() | |||
| /** Creates an empty array. */ | |||
| ArrayAllocationBase() throw() | |||
| : elements (0), | |||
| numAllocated (0), | |||
| granularity (granularity_) | |||
| numAllocated (0) | |||
| { | |||
| jassert (granularity > 0); | |||
| } | |||
| /** Destructor. */ | |||
| @@ -114,25 +100,21 @@ public: | |||
| void ensureAllocatedSize (int minNumElements) throw() | |||
| { | |||
| if (minNumElements > numAllocated) | |||
| { | |||
| // for arrays with small granularity that get big, start | |||
| // increasing the size in bigger jumps | |||
| if (minNumElements > (granularity << 6)) | |||
| { | |||
| minNumElements += (minNumElements / granularity); | |||
| if (minNumElements > (granularity << 8)) | |||
| minNumElements += granularity << 6; | |||
| else | |||
| minNumElements += granularity << 5; | |||
| } | |||
| setAllocatedSize ((minNumElements + minNumElements / 2 + 8) & ~7); | |||
| } | |||
| setAllocatedSize (granularity * (minNumElements / granularity + 1)); | |||
| } | |||
| /** Minimises the amount of storage allocated so that it's no more than | |||
| the given number of elements. | |||
| */ | |||
| void shrinkToNoMoreThan (int maxNumElements) throw() | |||
| { | |||
| if (maxNumElements < numAllocated) | |||
| setAllocatedSize (maxNumElements); | |||
| } | |||
| //============================================================================== | |||
| ElementType* elements; | |||
| int numAllocated, granularity; | |||
| int numAllocated; | |||
| private: | |||
| ArrayAllocationBase (const ArrayAllocationBase&); | |||
| @@ -145,6 +145,12 @@ void MemoryBlock::ensureSize (const int minimumSize, | |||
| setSize (minimumSize, initialiseToZero); | |||
| } | |||
| void MemoryBlock::swapWith (MemoryBlock& other) throw() | |||
| { | |||
| swapVariables (size, other.size); | |||
| data.swapWith (other.data); | |||
| } | |||
| //============================================================================== | |||
| void MemoryBlock::fillWith (const uint8 value) throw() | |||
| { | |||
| @@ -151,6 +151,11 @@ public: | |||
| void append (const void* const data, | |||
| const int numBytes) throw(); | |||
| /** 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) throw(); | |||
| //============================================================================== | |||
| /** Copies data into this MemoryBlock from a memory address. | |||
| @@ -58,15 +58,9 @@ class OwnedArray | |||
| { | |||
| public: | |||
| //============================================================================== | |||
| /** Creates an empty array. | |||
| @param granularity this is the size of increment by which the internal storage | |||
| used by the array will grow. Only change it from the default if you know the | |||
| array is going to be very big and needs to be able to grow efficiently. | |||
| */ | |||
| OwnedArray (const int granularity = juceDefaultArrayGranularity) throw() | |||
| : data (granularity), | |||
| numUsed (0) | |||
| /** Creates an empty array. */ | |||
| OwnedArray() throw() | |||
| : numUsed (0) | |||
| { | |||
| } | |||
| @@ -674,19 +668,7 @@ public: | |||
| void minimiseStorageOverheads() throw() | |||
| { | |||
| lock.enter(); | |||
| if (numUsed == 0) | |||
| { | |||
| data.setAllocatedSize (0); | |||
| } | |||
| else | |||
| { | |||
| const int newAllocation = data.granularity * (numUsed / data.granularity + 1); | |||
| if (newAllocation < data.numAllocated) | |||
| data.setAllocatedSize (newAllocation); | |||
| } | |||
| data.shrinkToNoMoreThan (numUsed); | |||
| lock.exit(); | |||
| } | |||
| @@ -698,7 +680,9 @@ public: | |||
| */ | |||
| void ensureStorageAllocated (const int minNumElements) throw() | |||
| { | |||
| lock.enter(); | |||
| data.ensureAllocatedSize (minNumElements); | |||
| lock.exit(); | |||
| } | |||
| //============================================================================== | |||
| @@ -51,22 +51,15 @@ class ReferenceCountedArray | |||
| public: | |||
| //============================================================================== | |||
| /** Creates an empty array. | |||
| @param granularity this is the size of increment by which the internal storage | |||
| used by the array will grow. Only change it from the default if you know the | |||
| array is going to be very big and needs to be able to grow efficiently. | |||
| @see ReferenceCountedObject, Array, OwnedArray | |||
| */ | |||
| ReferenceCountedArray (const int granularity = juceDefaultArrayGranularity) throw() | |||
| : data (granularity), | |||
| numUsed (0) | |||
| ReferenceCountedArray() throw() | |||
| : numUsed (0) | |||
| { | |||
| } | |||
| /** Creates a copy of another array */ | |||
| ReferenceCountedArray (const ReferenceCountedArray<ObjectClass, TypeOfCriticalSectionToUse>& other) throw() | |||
| : data (other.data.granularity) | |||
| { | |||
| other.lockArray(); | |||
| numUsed = other.numUsed; | |||
| @@ -93,7 +86,6 @@ public: | |||
| clear(); | |||
| data.granularity = other.granularity; | |||
| data.ensureAllocatedSize (other.numUsed); | |||
| numUsed = other.numUsed; | |||
| memcpy (data.elements, other.data.elements, numUsed * sizeof (ObjectClass*)); | |||
| @@ -738,19 +730,7 @@ public: | |||
| void minimiseStorageOverheads() throw() | |||
| { | |||
| lock.enter(); | |||
| if (numUsed == 0) | |||
| { | |||
| data.setAllocatedSize (0); | |||
| } | |||
| else | |||
| { | |||
| const int newAllocation = data.granularity * (numUsed / data.granularity + 1); | |||
| if (newAllocation < data.numAllocated) | |||
| data.setAllocatedSize (newAllocation); | |||
| } | |||
| data.shrinkToNoMoreThan (numUsed); | |||
| lock.exit(); | |||
| } | |||
| @@ -62,15 +62,9 @@ class SortedSet | |||
| { | |||
| public: | |||
| //============================================================================== | |||
| /** Creates an empty set. | |||
| @param granularity this is the size of increment by which the internal storage | |||
| used by the array will grow. Only change it from the default if you know the | |||
| array is going to be very big and needs to be able to grow efficiently. | |||
| */ | |||
| SortedSet (const int granularity = juceDefaultArrayGranularity) throw() | |||
| : data (granularity), | |||
| numUsed (0) | |||
| /** Creates an empty set. */ | |||
| SortedSet() throw() | |||
| : numUsed (0) | |||
| { | |||
| } | |||
| @@ -78,7 +72,6 @@ public: | |||
| @param other the set to copy | |||
| */ | |||
| SortedSet (const SortedSet<ElementType, TypeOfCriticalSectionToUse>& other) throw() | |||
| : data (other.data.granularity) | |||
| { | |||
| other.lockSet(); | |||
| numUsed = other.numUsed; | |||
| @@ -102,7 +95,6 @@ public: | |||
| other.lockSet(); | |||
| lock.enter(); | |||
| data.granularity = other.data.granularity; | |||
| data.ensureAllocatedSize (other.size()); | |||
| numUsed = other.numUsed; | |||
| memcpy (data.elements, other.data.elements, numUsed * sizeof (ElementType)); | |||
| @@ -572,19 +564,7 @@ public: | |||
| void minimiseStorageOverheads() throw() | |||
| { | |||
| lock.enter(); | |||
| if (numUsed == 0) | |||
| { | |||
| data.setAllocatedSize (0); | |||
| } | |||
| else | |||
| { | |||
| const int newAllocation = data.granularity * (numUsed / data.granularity + 1); | |||
| if (newAllocation < data.numAllocated) | |||
| data.setAllocatedSize (newAllocation); | |||
| } | |||
| data.shrinkToNoMoreThan (numUsed); | |||
| lock.exit(); | |||
| } | |||
| @@ -145,6 +145,11 @@ void Value::setValue (const var& newValue) | |||
| value->setValue (newValue); | |||
| } | |||
| const String Value::toString() const | |||
| { | |||
| return value->getValue().toString(); | |||
| } | |||
| const Value& Value::operator= (const var& newValue) | |||
| { | |||
| value->setValue (newValue); | |||
| @@ -76,6 +76,12 @@ public: | |||
| /** Returns the current value. */ | |||
| operator const var() const; | |||
| /** Returns the value as a string. | |||
| This is alternative to writing things like "myValue.getValue().toString()". | |||
| */ | |||
| const String toString() const; | |||
| /** Sets the current value. | |||
| You can also use operator= to set the value. | |||
| @@ -193,7 +193,7 @@ inline void swapVariables (Type& variable1, Type& variable2) | |||
| variable2 = tempVal; | |||
| } | |||
| /** Handy macro for getting the number of elements in a simple const C array. | |||
| /** Handy function for getting the number of elements in a simple const C array. | |||
| E.g. | |||
| @code | |||
| @@ -202,7 +202,8 @@ inline void swapVariables (Type& variable1, Type& variable2) | |||
| int numElements = numElementsInArray (myArray) // returns 3 | |||
| @endcode | |||
| */ | |||
| #define numElementsInArray(a) ((int) (sizeof (a) / sizeof ((a)[0]))) | |||
| template <typename Type> | |||
| inline int numElementsInArray (Type& array) { return (int) (sizeof (array) / sizeof (array[0])); } | |||
| //============================================================================== | |||
| // Some useful maths functions that aren't always present with all compilers and build settings. | |||
| @@ -200,15 +200,17 @@ | |||
| //============================================================================== | |||
| /** Clears a block of memory. */ | |||
| #define zeromem(memory, numBytes) memset (memory, 0, numBytes) | |||
| inline void zeromem (void* memory, int numBytes) { memset (memory, 0, numBytes); } | |||
| /** Clears a reference to a local structure. */ | |||
| #define zerostruct(structure) memset (&structure, 0, sizeof (structure)) | |||
| template <typename Type> | |||
| inline void zerostruct (Type& structure) { memset (&structure, 0, sizeof (structure)); } | |||
| /** A handy macro that calls delete on a pointer if it's non-zero, and | |||
| then sets the pointer to null. | |||
| /** A handy function that calls delete on a pointer if it's non-zero, and then sets | |||
| the pointer to null. | |||
| */ | |||
| #define deleteAndZero(pointer) { delete (pointer); (pointer) = 0; } | |||
| template <typename Type> | |||
| inline void deleteAndZero (Type& pointer) { delete pointer; pointer = 0; } | |||
| @@ -203,20 +203,12 @@ | |||
| forcedinline void myfunction (int x) | |||
| @endcode | |||
| */ | |||
| #ifdef JUCE_DEBUG | |||
| #ifndef JUCE_DEBUG | |||
| #define forcedinline __forceinline | |||
| #else | |||
| #define forcedinline inline | |||
| #endif | |||
| /** A platform-independent way of stopping the compiler inlining a function. | |||
| Use the syntax: @code | |||
| juce_noinline void myfunction (int x) | |||
| @endcode | |||
| */ | |||
| #define juce_noinline | |||
| #else | |||
| /** A platform-independent way of forcing an inline function. | |||
| @@ -230,14 +222,6 @@ | |||
| #define forcedinline inline | |||
| #endif | |||
| /** A platform-independent way of stopping the compiler inlining a function. | |||
| Use the syntax: @code | |||
| juce_noinline void myfunction (int x) | |||
| @endcode | |||
| */ | |||
| #define juce_noinline __attribute__((noinline)) | |||
| #endif | |||
| #endif // __JUCE_PLATFORMDEFS_JUCEHEADER__ | |||
| @@ -60,6 +60,11 @@ void JUCE_PUBLIC_FUNCTION initialiseJuce_NonGUI() | |||
| #ifdef JUCE_DEBUG | |||
| { | |||
| char a1[7]; | |||
| jassert (numElementsInArray(a1) == 7); | |||
| int a2[3]; | |||
| jassert (numElementsInArray(a2) == 3); | |||
| // Some simple test code to keep an eye on things and make sure these functions | |||
| // work ok on all platforms. Let me know if any of these assertions fail! | |||
| int n = 1; | |||
| @@ -70,10 +70,10 @@ | |||
| #ifdef _DEBUG | |||
| #define JUCE_DEBUG 1 | |||
| #endif | |||
| #ifdef __MINGW32__ | |||
| #define JUCE_MINGW 1 | |||
| #endif | |||
| #ifdef __MINGW32__ | |||
| #define JUCE_MINGW 1 | |||
| #endif | |||
| /** If defined, this indicates that the processor is little-endian. */ | |||
| #define JUCE_LITTLE_ENDIAN 1 | |||
| @@ -36,10 +36,8 @@ BEGIN_JUCE_NAMESPACE | |||
| //============================================================================== | |||
| Button::Button (const String& name) | |||
| : Component (name), | |||
| shortcuts (2), | |||
| keySource (0), | |||
| text (name), | |||
| buttonListeners (2), | |||
| buttonPressTime (0), | |||
| lastTimeCallbackTime (0), | |||
| commandManagerToUse (0), | |||
| @@ -38,7 +38,6 @@ Label::Label (const String& componentName, | |||
| text (labelText), | |||
| font (15.0f), | |||
| justification (Justification::centredLeft), | |||
| listeners (2), | |||
| ownerComponent (0), | |||
| horizontalBorderSize (3), | |||
| verticalBorderSize (1), | |||
| @@ -91,7 +91,6 @@ private: | |||
| //============================================================================== | |||
| Slider::Slider (const String& name) | |||
| : Component (name), | |||
| listeners (2), | |||
| lastCurrentValue (0), | |||
| lastValueMin (0), | |||
| lastValueMax (0), | |||
| @@ -64,8 +64,7 @@ private: | |||
| //============================================================================== | |||
| TableHeaderComponent::TableHeaderComponent() | |||
| : listeners (2), | |||
| columnsChanged (false), | |||
| : columnsChanged (false), | |||
| columnsResized (false), | |||
| sortChanged (false), | |||
| menuActive (true), | |||
| @@ -79,17 +79,17 @@ public: | |||
| const Colour& colour_, | |||
| const tchar passwordCharacter) | |||
| : font (font_), | |||
| colour (colour_), | |||
| atoms (64) | |||
| colour (colour_) | |||
| { | |||
| initialiseAtoms (text, passwordCharacter); | |||
| } | |||
| UniformTextSection (const UniformTextSection& other) | |||
| : font (other.font), | |||
| colour (other.colour), | |||
| atoms (64) | |||
| colour (other.colour) | |||
| { | |||
| atoms.ensureStorageAllocated (other.atoms.size()); | |||
| for (int i = 0; i < other.atoms.size(); ++i) | |||
| atoms.add (new TextAtom (*(const TextAtom*) other.atoms.getUnchecked(i))); | |||
| } | |||
| @@ -141,6 +141,8 @@ public: | |||
| } | |||
| } | |||
| atoms.ensureStorageAllocated (atoms.size() + other.atoms.size() - i); | |||
| while (i < other.atoms.size()) | |||
| { | |||
| atoms.add (other.getAtom(i)); | |||
| @@ -990,10 +992,8 @@ TextEditor::TextEditor (const String& name, | |||
| currentFont (14.0f), | |||
| totalNumChars (0), | |||
| caretPosition (0), | |||
| sections (8), | |||
| passwordCharacter (passwordCharacter_), | |||
| dragType (notDragging), | |||
| listeners (2) | |||
| dragType (notDragging) | |||
| { | |||
| setOpaque (true); | |||
| @@ -1086,7 +1086,6 @@ enum TreeViewOpenness | |||
| TreeViewItem::TreeViewItem() | |||
| : ownerView (0), | |||
| parentItem (0), | |||
| subItems (8), | |||
| y (0), | |||
| itemHeight (0), | |||
| totalHeight (0), | |||
| @@ -33,8 +33,7 @@ BEGIN_JUCE_NAMESPACE | |||
| //============================================================================== | |||
| DirectoryContentsDisplayComponent::DirectoryContentsDisplayComponent (DirectoryContentsList& listToShow) | |||
| : fileList (listToShow), | |||
| listeners (2) | |||
| : fileList (listToShow) | |||
| { | |||
| } | |||
| @@ -44,7 +44,6 @@ FileBrowserComponent::FileBrowserComponent (int flags_, | |||
| : FileFilter (String::empty), | |||
| fileFilter (fileFilter_), | |||
| flags (flags_), | |||
| listeners (2), | |||
| previewComp (previewComp_), | |||
| thread ("Juce FileBrowser") | |||
| { | |||
| @@ -46,8 +46,8 @@ BEGIN_JUCE_NAMESPACE | |||
| Component* Component::componentUnderMouse = 0; | |||
| Component* Component::currentlyFocusedComponent = 0; | |||
| static Array <Component*> modalComponentStack (4), modalComponentReturnValueKeys (4); | |||
| static Array <int> modalReturnValues (4); | |||
| static Array <Component*> modalComponentStack, modalComponentReturnValueKeys; | |||
| static Array <int> modalReturnValues; | |||
| static const int customCommandMessage = 0x7fff0001; | |||
| static const int exitModalStateMessage = 0x7fff0002; | |||
| @@ -108,7 +108,6 @@ Component::Component() throw() | |||
| : parentComponent_ (0), | |||
| componentUID (++nextComponentUID), | |||
| numDeepMouseListeners (0), | |||
| childComponentList_ (16), | |||
| lookAndFeel_ (0), | |||
| effect_ (0), | |||
| bufferedImage_ (0), | |||
| @@ -125,7 +124,6 @@ Component::Component (const String& name) throw() | |||
| parentComponent_ (0), | |||
| componentUID (++nextComponentUID), | |||
| numDeepMouseListeners (0), | |||
| childComponentList_ (16), | |||
| lookAndFeel_ (0), | |||
| effect_ (0), | |||
| bufferedImage_ (0), | |||
| @@ -2163,7 +2161,7 @@ void Component::parentSizeChanged() | |||
| void Component::addComponentListener (ComponentListener* const newListener) throw() | |||
| { | |||
| if (componentListeners_ == 0) | |||
| componentListeners_ = new VoidArray (4); | |||
| componentListeners_ = new VoidArray(); | |||
| componentListeners_->addIfNotAlreadyThere (newListener); | |||
| } | |||
| @@ -2243,7 +2241,7 @@ void Component::addMouseListener (MouseListener* const newListener, | |||
| checkMessageManagerIsLocked | |||
| if (mouseListeners_ == 0) | |||
| mouseListeners_ = new VoidArray (4); | |||
| mouseListeners_ = new VoidArray(); | |||
| if (! mouseListeners_->contains (newListener)) | |||
| { | |||
| @@ -3509,7 +3507,7 @@ const Rectangle Component::getParentMonitorArea() const throw() | |||
| void Component::addKeyListener (KeyListener* const newListener) throw() | |||
| { | |||
| if (keyListeners_ == 0) | |||
| keyListeners_ = new VoidArray (4); | |||
| keyListeners_ = new VoidArray(); | |||
| keyListeners_->addIfNotAlreadyThere (newListener); | |||
| } | |||
| @@ -40,11 +40,7 @@ extern void juce_updateMultiMonitorInfo (Array <Rectangle>& monitorCoords, | |||
| static Desktop* juce_desktopInstance = 0; | |||
| Desktop::Desktop() throw() | |||
| : mouseListeners (2), | |||
| desktopComponents (4), | |||
| monitorCoordsClipped (2), | |||
| monitorCoordsUnclipped (2), | |||
| lastMouseX (0), | |||
| : lastMouseX (0), | |||
| lastMouseY (0), | |||
| kioskModeComponent (0) | |||
| { | |||
| @@ -34,7 +34,6 @@ BEGIN_JUCE_NAMESPACE | |||
| ComponentMovementWatcher::ComponentMovementWatcher (Component* const component_) | |||
| : component (component_), | |||
| lastPeer (0), | |||
| registeredParentComps (4), | |||
| reentrant (false) | |||
| { | |||
| jassert (component != 0); // can't use this with a null pointer.. | |||
| @@ -98,8 +98,7 @@ ScrollBar::ScrollBar (const bool vertical_, | |||
| isDraggingThumb (false), | |||
| alwaysVisible (false), | |||
| upButton (0), | |||
| downButton (0), | |||
| listeners (2) | |||
| downButton (0) | |||
| { | |||
| setButtonVisibility (buttonsAreVisible); | |||
| @@ -1281,15 +1281,13 @@ private: | |||
| //============================================================================== | |||
| PopupMenu::PopupMenu() | |||
| : items (8), | |||
| lookAndFeel (0), | |||
| : lookAndFeel (0), | |||
| separatorPending (false) | |||
| { | |||
| } | |||
| PopupMenu::PopupMenu (const PopupMenu& other) | |||
| : items (8), | |||
| lookAndFeel (other.lookAndFeel), | |||
| : lookAndFeel (other.lookAndFeel), | |||
| separatorPending (false) | |||
| { | |||
| items.ensureStorageAllocated (other.items.size()); | |||
| @@ -40,7 +40,7 @@ void juce_deleteMouseCursor (void* const cursorHandle, const bool isStandard) th | |||
| //============================================================================== | |||
| static CriticalSection activeCursorListLock; | |||
| static VoidArray activeCursors (2); | |||
| static VoidArray activeCursors; | |||
| //============================================================================== | |||
| class SharedMouseCursorInternal : public ReferenceCountedObject | |||
| @@ -674,6 +674,7 @@ private: | |||
| return y; | |||
| } | |||
| public: | |||
| //============================================================================== | |||
| class ChannelSelectorListBox : public ListBox, | |||
| public ListBoxModel | |||
| @@ -930,6 +931,7 @@ private: | |||
| const ChannelSelectorListBox& operator= (const ChannelSelectorListBox&); | |||
| }; | |||
| private: | |||
| ChannelSelectorListBox* inputChanList; | |||
| ChannelSelectorListBox* outputChanList; | |||
| @@ -95,8 +95,6 @@ MidiKeyboardComponent::MidiKeyboardComponent (MidiKeyboardState& state_, | |||
| canScroll (true), | |||
| mouseDragging (false), | |||
| useMousePositionForVelocity (true), | |||
| keyPresses (4), | |||
| keyPressNotes (16), | |||
| keyMappingOctave (6), | |||
| octaveNumForMiddleC (3) | |||
| { | |||
| @@ -53,7 +53,7 @@ extern bool juce_MouseHasMovedSignificantlySincePressed; | |||
| static const int fakeMouseMoveMessage = 0x7fff00ff; | |||
| static VoidArray heavyweightPeers (4); | |||
| static VoidArray heavyweightPeers; | |||
| //============================================================================== | |||
| @@ -45,8 +45,7 @@ class TopLevelWindowManager : public Timer, | |||
| public: | |||
| //============================================================================== | |||
| TopLevelWindowManager() | |||
| : windows (8), | |||
| currentActive (0) | |||
| : currentActive (0) | |||
| { | |||
| } | |||
| @@ -32,7 +32,6 @@ BEGIN_JUCE_NAMESPACE | |||
| //============================================================================== | |||
| ColourGradient::ColourGradient() throw() | |||
| : colours (4) | |||
| { | |||
| #ifdef JUCE_DEBUG | |||
| x1 = 987654.0f; | |||
| @@ -50,8 +49,7 @@ ColourGradient::ColourGradient (const Colour& colour1, | |||
| y1 (y1_), | |||
| x2 (x2_), | |||
| y2 (y2_), | |||
| isRadial (isRadial_), | |||
| colours (4) | |||
| isRadial (isRadial_) | |||
| { | |||
| colours.add (0); | |||
| colours.add (colour1.getARGB()); | |||
| @@ -35,20 +35,16 @@ BEGIN_JUCE_NAMESPACE | |||
| static const Graphics::ResamplingQuality defaultQuality = Graphics::mediumResamplingQuality; | |||
| //============================================================================== | |||
| #define MINIMUM_COORD -0x3fffffff | |||
| #define MAXIMUM_COORD 0x3fffffff | |||
| #undef ASSERT_COORDS_ARE_SENSIBLE_NUMBERS | |||
| #define ASSERT_COORDS_ARE_SENSIBLE_NUMBERS(x, y, w, h) \ | |||
| jassert ((int) x >= MINIMUM_COORD \ | |||
| && (int) x <= MAXIMUM_COORD \ | |||
| && (int) y >= MINIMUM_COORD \ | |||
| && (int) y <= MAXIMUM_COORD \ | |||
| && (int) w >= MINIMUM_COORD \ | |||
| && (int) w <= MAXIMUM_COORD \ | |||
| && (int) h >= MINIMUM_COORD \ | |||
| && (int) h <= MAXIMUM_COORD); | |||
| template <typename Type> | |||
| static 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() | |||
| @@ -62,7 +58,7 @@ LowLevelGraphicsContext::~LowLevelGraphicsContext() | |||
| //============================================================================== | |||
| Graphics::Graphics (Image& imageToDrawOnto) throw() | |||
| : context (imageToDrawOnto.createLowLevelContext()), | |||
| ownsContext (true), | |||
| contextToDelete (context), | |||
| saveStatePending (false) | |||
| { | |||
| resetToDefaultState(); | |||
| @@ -70,7 +66,6 @@ Graphics::Graphics (Image& imageToDrawOnto) throw() | |||
| Graphics::Graphics (LowLevelGraphicsContext* const internalContext) throw() | |||
| : context (internalContext), | |||
| ownsContext (false), | |||
| saveStatePending (false) | |||
| { | |||
| resetToDefaultState(); | |||
| @@ -78,8 +73,6 @@ Graphics::Graphics (LowLevelGraphicsContext* const internalContext) throw() | |||
| Graphics::~Graphics() throw() | |||
| { | |||
| if (ownsContext) | |||
| delete context; | |||
| } | |||
| //============================================================================== | |||
| @@ -325,7 +318,7 @@ void Graphics::fillRect (int x, | |||
| int height) const throw() | |||
| { | |||
| // passing in a silly number can cause maths problems in rendering! | |||
| ASSERT_COORDS_ARE_SENSIBLE_NUMBERS (x, y, width, height); | |||
| jassert (areCoordsSensibleNumbers (x, y, width, height)); | |||
| context->fillRect (Rectangle (x, y, width, height), false); | |||
| } | |||
| @@ -341,7 +334,7 @@ void Graphics::fillRect (const float x, | |||
| const float height) const throw() | |||
| { | |||
| // passing in a silly number can cause maths problems in rendering! | |||
| ASSERT_COORDS_ARE_SENSIBLE_NUMBERS (x, y, width, height); | |||
| jassert (areCoordsSensibleNumbers (x, y, width, height)); | |||
| Path p; | |||
| p.addRectangle (x, y, width, height); | |||
| @@ -397,7 +390,7 @@ void Graphics::drawRect (const int x, | |||
| const int lineThickness) const throw() | |||
| { | |||
| // passing in a silly number can cause maths problems in rendering! | |||
| ASSERT_COORDS_ARE_SENSIBLE_NUMBERS (x, y, width, height); | |||
| 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); | |||
| @@ -412,7 +405,7 @@ void Graphics::drawRect (const float x, | |||
| const float lineThickness) const throw() | |||
| { | |||
| // passing in a silly number can cause maths problems in rendering! | |||
| ASSERT_COORDS_ARE_SENSIBLE_NUMBERS (x, y, width, height); | |||
| jassert (areCoordsSensibleNumbers (x, y, width, height)); | |||
| Path p; | |||
| p.addRectangle (x, y, width, lineThickness); | |||
| @@ -441,7 +434,7 @@ void Graphics::drawBevel (const int x, | |||
| const bool sharpEdgeOnOutside) const throw() | |||
| { | |||
| // passing in a silly number can cause maths problems in rendering! | |||
| ASSERT_COORDS_ARE_SENSIBLE_NUMBERS (x, y, width, height); | |||
| jassert (areCoordsSensibleNumbers (x, y, width, height)); | |||
| if (clipRegionIntersects (x, y, width, height)) | |||
| { | |||
| @@ -476,7 +469,7 @@ void Graphics::fillEllipse (const float x, | |||
| const float height) const throw() | |||
| { | |||
| // passing in a silly number can cause maths problems in rendering! | |||
| ASSERT_COORDS_ARE_SENSIBLE_NUMBERS (x, y, width, height); | |||
| jassert (areCoordsSensibleNumbers (x, y, width, height)); | |||
| Path p; | |||
| p.addEllipse (x, y, width, height); | |||
| @@ -490,7 +483,7 @@ void Graphics::drawEllipse (const float x, | |||
| const float lineThickness) const throw() | |||
| { | |||
| // passing in a silly number can cause maths problems in rendering! | |||
| ASSERT_COORDS_ARE_SENSIBLE_NUMBERS (x, y, width, height); | |||
| jassert (areCoordsSensibleNumbers (x, y, width, height)); | |||
| Path p; | |||
| p.addEllipse (x, y, width, height); | |||
| @@ -504,7 +497,7 @@ void Graphics::fillRoundedRectangle (const float x, | |||
| const float cornerSize) const throw() | |||
| { | |||
| // passing in a silly number can cause maths problems in rendering! | |||
| ASSERT_COORDS_ARE_SENSIBLE_NUMBERS (x, y, width, height); | |||
| jassert (areCoordsSensibleNumbers (x, y, width, height)); | |||
| Path p; | |||
| p.addRoundedRectangle (x, y, width, height, cornerSize); | |||
| @@ -529,7 +522,7 @@ void Graphics::drawRoundedRectangle (const float x, | |||
| const float lineThickness) const throw() | |||
| { | |||
| // passing in a silly number can cause maths problems in rendering! | |||
| ASSERT_COORDS_ARE_SENSIBLE_NUMBERS (x, y, width, height); | |||
| jassert (areCoordsSensibleNumbers (x, y, width, height)); | |||
| Path p; | |||
| p.addRoundedRectangle (x, y, width, height, cornerSize); | |||
| @@ -723,7 +716,7 @@ void Graphics::drawImageWithin (const Image* const imageToDraw, | |||
| const bool fillAlphaChannelWithCurrentBrush) const throw() | |||
| { | |||
| // passing in a silly number can cause maths problems in rendering! | |||
| ASSERT_COORDS_ARE_SENSIBLE_NUMBERS (destX, destY, destW, destH); | |||
| jassert (areCoordsSensibleNumbers (destX, destY, destW, destH)); | |||
| if (imageToDraw != 0) | |||
| { | |||
| @@ -757,8 +750,8 @@ void Graphics::drawImage (const Image* const imageToDraw, | |||
| const bool fillAlphaChannelWithCurrentBrush) const throw() | |||
| { | |||
| // passing in a silly number can cause maths problems in rendering! | |||
| ASSERT_COORDS_ARE_SENSIBLE_NUMBERS (dx, dy, dw, dh); | |||
| ASSERT_COORDS_ARE_SENSIBLE_NUMBERS (sx, sy, sw, sh); | |||
| jassert (areCoordsSensibleNumbers (dx, dy, dw, dh)); | |||
| jassert (areCoordsSensibleNumbers (sx, sy, sw, sh)); | |||
| if (context->clipRegionIntersects (Rectangle (dx, dy, dw, dh))) | |||
| { | |||
| @@ -717,7 +717,7 @@ public: | |||
| private: | |||
| //============================================================================== | |||
| LowLevelGraphicsContext* const context; | |||
| const bool ownsContext; | |||
| ScopedPointer <LowLevelGraphicsContext> contextToDelete; | |||
| bool saveStatePending; | |||
| void saveStateIfPending() throw(); | |||
| @@ -443,10 +443,9 @@ void LowLevelGraphicsPostScriptRenderer::writeImage (const Image& im, | |||
| pixel = Colours::transparentWhite; | |||
| } | |||
| char colourString [16]; | |||
| sprintf (colourString, "%x%x%x", pixel.getRed(), pixel.getGreen(), pixel.getBlue()); | |||
| const uint8 pixelValues[3] = { pixel.getRed(), pixel.getGreen(), pixel.getBlue() }; | |||
| out << (const char*) colourString; | |||
| out << String::toHexString (pixelValues, 3, 0); | |||
| charsOnLine += 3; | |||
| if (charsOnLine > 100) | |||
| @@ -1341,10 +1341,10 @@ private: | |||
| //============================================================================== | |||
| LowLevelGraphicsSoftwareRenderer::LowLevelGraphicsSoftwareRenderer (Image& image_) | |||
| : image (image_), | |||
| stateStack (20) | |||
| : image (image_) | |||
| { | |||
| currentState = new LLGCSavedState (image_.getBounds(), 0, 0, Font(), FillType(), Graphics::mediumResamplingQuality); | |||
| currentState = new LLGCSavedState (image_.getBounds(), 0, 0, Font(), | |||
| FillType(), Graphics::mediumResamplingQuality); | |||
| } | |||
| LowLevelGraphicsSoftwareRenderer::~LowLevelGraphicsSoftwareRenderer() | |||
| @@ -341,8 +341,7 @@ class TypefaceCache : public DeletedAtShutdown | |||
| { | |||
| public: | |||
| TypefaceCache (int numToCache = 10) throw() | |||
| : counter (1), | |||
| faces (2) | |||
| : counter (1) | |||
| { | |||
| while (--numToCache >= 0) | |||
| faces.add (new CachedFace()); | |||
| @@ -109,8 +109,8 @@ void PositionedGlyph::moveBy (const float deltaX, | |||
| //============================================================================== | |||
| GlyphArrangement::GlyphArrangement() | |||
| : glyphs (128) | |||
| { | |||
| glyphs.ensureStorageAllocated (128); | |||
| } | |||
| GlyphArrangement::GlyphArrangement (const GlyphArrangement& other) | |||
| @@ -93,22 +93,21 @@ public: | |||
| //============================================================================== | |||
| TextLayout::TextLayout() throw() | |||
| : tokens (64), | |||
| totalLines (0) | |||
| : totalLines (0) | |||
| { | |||
| tokens.ensureStorageAllocated (64); | |||
| } | |||
| TextLayout::TextLayout (const String& text, | |||
| const Font& font) throw() | |||
| : tokens (64), | |||
| totalLines (0) | |||
| : totalLines (0) | |||
| { | |||
| tokens.ensureStorageAllocated (64); | |||
| appendText (text, font); | |||
| } | |||
| TextLayout::TextLayout (const TextLayout& other) throw() | |||
| : tokens (64), | |||
| totalLines (0) | |||
| : totalLines (0) | |||
| { | |||
| *this = other; | |||
| } | |||
| @@ -49,8 +49,7 @@ static const int defaultGranularity = 32; | |||
| //============================================================================== | |||
| Path::Path() throw() | |||
| : data (defaultGranularity), | |||
| numElements (0), | |||
| : numElements (0), | |||
| pathXMin (0), | |||
| pathXMax (0), | |||
| pathYMin (0), | |||
| @@ -64,8 +63,7 @@ Path::~Path() throw() | |||
| } | |||
| Path::Path (const Path& other) throw() | |||
| : data (defaultGranularity), | |||
| numElements (other.numElements), | |||
| : numElements (other.numElements), | |||
| pathXMin (other.pathXMin), | |||
| pathXMax (other.pathXMax), | |||
| pathYMin (other.pathYMin), | |||
| @@ -32,9 +32,9 @@ | |||
| namespace jpeglibNamespace | |||
| { | |||
| #if JUCE_INCLUDE_JPEGLIB_CODE | |||
| #if JUCE_MINGW | |||
| typedef unsigned char boolean; | |||
| #endif | |||
| #if JUCE_MINGW | |||
| typedef unsigned char boolean; | |||
| #endif | |||
| extern "C" | |||
| { | |||
| #define JPEG_INTERNALS | |||
| @@ -49,7 +49,6 @@ static int cacheTimeout = 5000; | |||
| ImageCache::ImageCache() | |||
| : images (4) | |||
| { | |||
| } | |||
| @@ -985,17 +985,6 @@ bool File::appendText (const String& text, | |||
| return false; | |||
| } | |||
| bool File::printf (const tchar* pf, ...) const | |||
| { | |||
| va_list list; | |||
| va_start (list, pf); | |||
| String text; | |||
| text.vprintf (pf, list); | |||
| return appendData ((const char*) text, text.length()); | |||
| } | |||
| bool File::replaceWithText (const String& textToWrite, | |||
| const bool asUnicode, | |||
| const bool writeUnicodeHeaderBytes) const | |||
| @@ -575,7 +575,7 @@ public: | |||
| @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, printf, appendData, appendText | |||
| @see createInputStream, appendData, appendText | |||
| */ | |||
| FileOutputStream* createOutputStream (const int bufferSize = 0x8000) const; | |||
| @@ -602,14 +602,6 @@ public: | |||
| const String loadFileAsString() const; | |||
| //============================================================================== | |||
| /** Writes text to the end of the file. | |||
| This will try to do a printf to the file. | |||
| @returns false if it can't write to the file for some reason | |||
| */ | |||
| bool printf (const tchar* format, ...) 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. | |||
| @@ -416,12 +416,6 @@ const String juce_getOutputFromCommand (const String& command) | |||
| } | |||
| //============================================================================== | |||
| #if JUCE_64BIT | |||
| #define filedesc ((long long) internal) | |||
| #else | |||
| #define filedesc ((int) internal) | |||
| #endif | |||
| InterProcessLock::InterProcessLock (const String& name_) | |||
| : internal (0), | |||
| name (name_), | |||
| @@ -436,7 +430,7 @@ InterProcessLock::InterProcessLock (const String& name_) | |||
| temp.create(); | |||
| internal = (void*) open (temp.getFullPathName().toUTF8(), O_RDWR); | |||
| internal = open (temp.getFullPathName().toUTF8(), O_RDWR); | |||
| } | |||
| InterProcessLock::~InterProcessLock() | |||
| @@ -444,7 +438,7 @@ InterProcessLock::~InterProcessLock() | |||
| while (reentrancyLevel > 0) | |||
| this->exit(); | |||
| close (filedesc); | |||
| close (internal); | |||
| } | |||
| bool InterProcessLock::enter (const int timeOutMillisecs) | |||
| @@ -464,7 +458,7 @@ bool InterProcessLock::enter (const int timeOutMillisecs) | |||
| for (;;) | |||
| { | |||
| const int result = fcntl (filedesc, F_SETLK, &fl); | |||
| const int result = fcntl (internal, F_SETLK, &fl); | |||
| if (result >= 0) | |||
| { | |||
| @@ -498,7 +492,7 @@ void InterProcessLock::exit() | |||
| for (;;) | |||
| { | |||
| const int result = fcntl (filedesc, F_SETLKW, &fl); | |||
| const int result = fcntl (internal, F_SETLKW, &fl); | |||
| if (result >= 0 || errno != EINTR) | |||
| break; | |||
| @@ -504,7 +504,7 @@ private: | |||
| { | |||
| NSString* route = (NSString*) audioRoute; | |||
| //printf ("audio route: %s\n", [route cString]); | |||
| //DBG ("audio route: " + nsStringToJuce (route)); | |||
| if ([route hasPrefix: @"Receiver"]) | |||
| { | |||
| @@ -406,7 +406,7 @@ void* juce_findFileStart (const String& directory, const String& wildCard, Strin | |||
| if (e != 0) | |||
| { | |||
| FindFileStruct* ff = new FindFileStruct(); | |||
| ScopedPointer <FindFileStruct> ff (new FindFileStruct()); | |||
| ff->enumerator = [e retain]; | |||
| ff->parentDir = directory; | |||
| ff->wildCard = wildCard; | |||
| @@ -415,10 +415,9 @@ void* juce_findFileStart (const String& directory, const String& wildCard, Strin | |||
| ff->parentDir += File::separator; | |||
| if (juce_findFileNext (ff, firstResultFile, isDir, isHidden, fileSize, modTime, creationTime, isReadOnly)) | |||
| return ff; | |||
| return ff.release(); | |||
| [e release]; | |||
| delete ff; | |||
| } | |||
| return 0; | |||
| @@ -426,9 +425,8 @@ void* juce_findFileStart (const String& directory, const String& wildCard, Strin | |||
| void juce_findFileClose (void* handle) | |||
| { | |||
| FindFileStruct* ff = (FindFileStruct*) handle; | |||
| ScopedPointer <FindFileStruct> ff ((FindFileStruct*) handle); | |||
| [ff->enumerator release]; | |||
| delete ff; | |||
| } | |||
| //============================================================================== | |||
| @@ -178,7 +178,7 @@ public: | |||
| { | |||
| makeInactive(); | |||
| [renderContext clearDrawable]; | |||
| delete viewHolder; | |||
| viewHolder = 0; | |||
| } | |||
| bool makeActive() const throw() | |||
| @@ -250,7 +250,7 @@ public: | |||
| private: | |||
| OpenGLPixelFormat pixelFormat; | |||
| NSViewComponentInternal* viewHolder; | |||
| ScopedPointer <NSViewComponentInternal> viewHolder; | |||
| //============================================================================== | |||
| WindowedGLContext (const WindowedGLContext&); | |||
| @@ -1723,7 +1723,6 @@ class ASIOAudioIODeviceType : public AudioIODeviceType | |||
| public: | |||
| ASIOAudioIODeviceType() | |||
| : AudioIODeviceType (T("ASIO")), | |||
| classIds (2), | |||
| hasScanned (false) | |||
| { | |||
| CoInitialize (0); | |||
| @@ -171,7 +171,7 @@ public: | |||
| HRESULT __stdcall GetWindowContext (LPOLEINPLACEFRAME* lplpFrame, LPOLEINPLACEUIWINDOW* lplpDoc, LPRECT, LPRECT, LPOLEINPLACEFRAMEINFO lpFrameInfo) | |||
| { | |||
| frame->AddRef(); | |||
| // frame->AddRef(); // MS docs are unclear about whether this is needed, but it seems to lead to a memory leak.. | |||
| *lplpFrame = frame; | |||
| *lplpDoc = 0; | |||
| lpFrameInfo->fMDIApp = FALSE; | |||
| @@ -960,8 +960,6 @@ public: | |||
| isStarted (false), | |||
| outputDeviceIndex (outputDeviceIndex_), | |||
| inputDeviceIndex (inputDeviceIndex_), | |||
| inChans (4), | |||
| outChans (4), | |||
| numInputBuffers (0), | |||
| numOutputBuffers (0), | |||
| totalSamplesOut (0), | |||
| @@ -32,16 +32,16 @@ | |||
| static const unsigned int specialId = WM_APP + 0x4400; | |||
| static const unsigned int broadcastId = WM_APP + 0x4403; | |||
| static const unsigned int specialCallbackId = WM_APP + 0x4402; | |||
| static const TCHAR* const messageWindowName = _T("JUCEWindow"); | |||
| HWND juce_messageWindowHandle = 0; | |||
| extern long improbableWindowNumber; // defined in windowing.cpp | |||
| #ifndef WM_APPCOMMAND | |||
| #define WM_APPCOMMAND 0x0319 | |||
| #endif | |||
| #ifndef WM_APPCOMMAND | |||
| #define WM_APPCOMMAND 0x0319 | |||
| #endif | |||
| //============================================================================== | |||
| @@ -415,7 +415,7 @@ struct MidiOutHandle | |||
| juce_UseDebuggingNewOperator | |||
| }; | |||
| static VoidArray handles (4); | |||
| static Array <MidiOutHandle*> midiOutputHandles; | |||
| //============================================================================== | |||
| const StringArray MidiOutput::getDevices() | |||
| @@ -485,9 +485,9 @@ MidiOutput* MidiOutput::openDevice (int index) | |||
| } | |||
| } | |||
| for (i = handles.size(); --i >= 0;) | |||
| for (i = midiOutputHandles.size(); --i >= 0;) | |||
| { | |||
| MidiOutHandle* const han = (MidiOutHandle*) handles.getUnchecked(i); | |||
| MidiOutHandle* const han = midiOutputHandles.getUnchecked(i); | |||
| if (han != 0 && han->deviceId == deviceId) | |||
| { | |||
| @@ -510,7 +510,7 @@ MidiOutput* MidiOutput::openDevice (int index) | |||
| han->deviceId = deviceId; | |||
| han->refCount = 1; | |||
| han->handle = h; | |||
| handles.add (han); | |||
| midiOutputHandles.add (han); | |||
| MidiOutput* const out = new MidiOutput(); | |||
| out->internal = (void*) han; | |||
| @@ -533,10 +533,10 @@ MidiOutput::~MidiOutput() | |||
| { | |||
| MidiOutHandle* const h = (MidiOutHandle*) internal; | |||
| if (handles.contains ((void*) h) && --(h->refCount) == 0) | |||
| if (midiOutputHandles.contains (h) && --(h->refCount) == 0) | |||
| { | |||
| midiOutClose (h->handle); | |||
| handles.removeValue ((void*) h); | |||
| midiOutputHandles.removeValue (h); | |||
| delete h; | |||
| } | |||
| } | |||
| @@ -72,7 +72,7 @@ static HKEY findKeyForPath (String name, | |||
| const String PlatformUtilities::getRegistryValue (const String& regValuePath, | |||
| const String& defaultValue) | |||
| { | |||
| String valueName, s; | |||
| String valueName, result (defaultValue); | |||
| HKEY k = findKeyForPath (regValuePath, false, valueName); | |||
| if (k != 0) | |||
| @@ -82,14 +82,17 @@ const String PlatformUtilities::getRegistryValue (const String& regValuePath, | |||
| DWORD type = REG_SZ; | |||
| if (RegQueryValueEx (k, valueName, 0, &type, (LPBYTE) buffer, &bufferSize) == ERROR_SUCCESS) | |||
| s = buffer; | |||
| else | |||
| s = defaultValue; | |||
| { | |||
| if (type == REG_SZ) | |||
| result = buffer; | |||
| else if (type == REG_DWORD) | |||
| result = String ((int) *(DWORD*) buffer); | |||
| } | |||
| RegCloseKey (k); | |||
| } | |||
| return s; | |||
| return result; | |||
| } | |||
| void PlatformUtilities::setRegistryValue (const String& regValuePath, | |||
| @@ -715,10 +715,7 @@ void XmlElement::setAttribute (const tchar* const attributeName, | |||
| void XmlElement::setAttribute (const tchar* const attributeName, | |||
| const double number) throw() | |||
| { | |||
| tchar buffer [40]; | |||
| CharacterFunctions::printf (buffer, numElementsInArray (buffer), T("%.9g"), number); | |||
| setAttribute (attributeName, buffer); | |||
| setAttribute (attributeName, String (number)); | |||
| } | |||
| void XmlElement::removeAttribute (const tchar* const attributeName) throw() | |||
| @@ -73,7 +73,14 @@ public: | |||
| private: | |||
| //============================================================================== | |||
| #if JUCE_WINDOWS | |||
| void* internal; | |||
| #elif JUCE_64BIT | |||
| long long internal; | |||
| #else | |||
| int internal; | |||
| #endif | |||
| String name; | |||
| int reentrancyLevel; | |||
| @@ -43,7 +43,7 @@ void juce_CloseThreadHandle (void* handle); | |||
| #endif | |||
| //============================================================================== | |||
| static VoidArray runningThreads (4); | |||
| static VoidArray runningThreads; | |||
| static CriticalSection runningThreadsLock; | |||
| //============================================================================== | |||
| @@ -34,7 +34,7 @@ BEGIN_JUCE_NAMESPACE | |||
| //============================================================================== | |||
| static VoidArray objectsToDelete (16); | |||
| static VoidArray objectsToDelete; | |||
| static CriticalSection lock; | |||
| //============================================================================== | |||