1
0
Fork 0
mirror of https://github.com/juce-framework/JUCE.git synced 2026-01-17 00:44:19 +00:00

Changed SparseSet to work with Range objects. Fixed array sorting bug.

This commit is contained in:
Julian Storer 2010-04-26 12:00:36 +01:00
parent 21006fbd0a
commit 9c5651fb8e
14 changed files with 251 additions and 310 deletions

View file

@ -435,45 +435,42 @@
#pragma warning (pop)
#endif
template <class T>
template <class ComClass>
class ComSmartPtr
{
public:
ComSmartPtr() throw() : p (0) {}
ComSmartPtr (T* const p_) : p (p_) { if (p_ != 0) p_->AddRef(); }
ComSmartPtr (const ComSmartPtr<T>& p_) : p (p_.p) { if (p != 0) p->AddRef(); }
~ComSmartPtr() { if (p != 0) p->Release(); }
ComSmartPtr() throw() : p (0) {}
ComSmartPtr (ComClass* const p_) : p (p_) { if (p_ != 0) p_->AddRef(); }
ComSmartPtr (const ComSmartPtr<ComClass>& p_) : p (p_.p) { if (p != 0) p->AddRef(); }
~ComSmartPtr() { if (p != 0) p->Release(); }
operator T*() const throw() { return p; }
T& operator*() const throw() { return *p; }
T** operator&() throw() { return &p; }
T* operator->() const throw() { return p; }
operator ComClass*() const throw() { return p; }
ComClass& operator*() const throw() { return *p; }
ComClass** operator&() throw() { return &p; }
ComClass* operator->() const throw() { return p; }
T* operator= (T* const newP)
ComClass* operator= (ComClass* const newP)
{
if (newP != 0)
newP->AddRef();
if (p != 0)
p->Release();
if (newP != 0) newP->AddRef();
if (p != 0) p->Release();
p = newP;
return newP;
}
T* operator= (const ComSmartPtr<T>& newP) { return operator= (newP.p); }
ComClass* operator= (const ComSmartPtr<ComClass>& newP) { return operator= (newP.p); }
HRESULT CoCreateInstance (REFCLSID rclsid, DWORD dwClsContext)
HRESULT CoCreateInstance (REFCLSID rclsid, DWORD dwClsContext = CLSCTX_INPROC_SERVER)
{
#ifndef __MINGW32__
operator= (0);
return ::CoCreateInstance (rclsid, 0, dwClsContext, __uuidof(T), (void**) &p);
return ::CoCreateInstance (rclsid, 0, dwClsContext, __uuidof (ComClass), (void**) &p);
#else
return S_FALSE;
#endif
}
T* p;
private:
ComClass* p;
};
template <class ComClass>
@ -12155,6 +12152,12 @@ const String& StringArray::operator[] (const int index) const throw()
return String::empty;
}
String& StringArray::getReference (const int index) throw()
{
jassert (((unsigned int) index) < (unsigned int) strings.size());
return strings.getReference (index);
}
void StringArray::add (const String& newString)
{
strings.add (newString);
@ -46807,7 +46810,7 @@ public:
{
if (isEnabled() && owner.getModel() != 0 && ! (e.mouseWasClicked() || isDragging))
{
const SparseSet <int> selectedRows (owner.getSelectedRows());
const SparseSet<int> selectedRows (owner.getSelectedRows());
if (selectedRows.size() > 0)
{
@ -47097,7 +47100,7 @@ void ListBox::updateContent()
if (selected [selected.size() - 1] >= totalItems)
{
selected.removeRange (totalItems, std::numeric_limits<int>::max() - totalItems);
selected.removeRange (Range <int> (totalItems, std::numeric_limits<int>::max()));
lastRowSelected = getSelectedRow (0);
selectionChanged = true;
}
@ -47132,7 +47135,7 @@ void ListBox::selectRowInternal (const int row,
if (deselectOthersFirst)
selected.clear();
selected.addRange (row, 1);
selected.addRange (Range<int> (row, row + 1));
if (getHeight() == 0 || getWidth() == 0)
dontScroll = true;
@ -47181,7 +47184,7 @@ void ListBox::deselectRow (const int row)
{
if (selected.contains (row))
{
selected.removeRange (row, 1);
selected.removeRange (Range <int> (row, row + 1));
if (row == lastRowSelected)
lastRowSelected = getSelectedRow (0);
@ -47195,7 +47198,7 @@ void ListBox::setSelectedRows (const SparseSet<int>& setOfRowsToBeSelected,
const bool sendNotificationEventToModel)
{
selected = setOfRowsToBeSelected;
selected.removeRange (totalItems, std::numeric_limits<int>::max() - totalItems);
selected.removeRange (Range <int> (totalItems, std::numeric_limits<int>::max()));
if (! isRowSelected (lastRowSelected))
lastRowSelected = getSelectedRow (0);
@ -47219,10 +47222,10 @@ void ListBox::selectRangeOfRows (int firstRow, int lastRow)
firstRow = jlimit (0, jmax (0, numRows), firstRow);
lastRow = jlimit (0, jmax (0, numRows), lastRow);
selected.addRange (jmin (firstRow, lastRow),
abs (firstRow - lastRow) + 1);
selected.addRange (Range <int> (jmin (firstRow, lastRow),
jmax (firstRow, lastRow) + 1));
selected.removeRange (lastRow, 1);
selected.removeRange (Range <int> (lastRow, lastRow + 1));
}
selectRowInternal (lastRow, false, false, true);
@ -50202,7 +50205,7 @@ public:
{
if (isEnabled() && owner.getModel() != 0 && ! (e.mouseWasClicked() || isDragging))
{
const SparseSet <int> selectedRows (owner.getSelectedRows());
const SparseSet<int> selectedRows (owner.getSelectedRows());
if (selectedRows.size() > 0)
{
@ -90835,7 +90838,7 @@ void Image::createSolidAreaMask (RectangleList& result, const float alphaThresho
if (hasAlphaChannel())
{
const uint8 threshold = (uint8) jlimit (0, 255, roundToInt (alphaThreshold * 255.0f));
SparseSet <int> pixelsOnRow;
SparseSet<int> pixelsOnRow;
const BitmapData srcData (*this, 0, 0, getWidth(), getHeight());
@ -90849,7 +90852,7 @@ void Image::createSolidAreaMask (RectangleList& result, const float alphaThresho
for (int x = 0; x < imageWidth; ++x)
{
if (((const PixelARGB*) lineData)->getAlpha() >= threshold)
pixelsOnRow.addRange (x, 1);
pixelsOnRow.addRange (Range<int> (x, x + 1));
lineData += srcData.pixelStride;
}
@ -90859,7 +90862,7 @@ void Image::createSolidAreaMask (RectangleList& result, const float alphaThresho
for (int x = 0; x < imageWidth; ++x)
{
if (*lineData >= threshold)
pixelsOnRow.addRange (x, 1);
pixelsOnRow.addRange (Range<int> (x, x + 1));
lineData += srcData.pixelStride;
}
@ -90867,10 +90870,8 @@ void Image::createSolidAreaMask (RectangleList& result, const float alphaThresho
for (int i = 0; i < pixelsOnRow.getNumRanges(); ++i)
{
int x, w;
if (pixelsOnRow.getRange (i, x, w))
result.add (Rectangle<int> (x, y, w, 1));
const Range<int> range (pixelsOnRow.getRange (i));
result.add (Rectangle<int> (range.getStart(), y, range.getLength(), 1));
}
result.consolidate();
@ -212224,7 +212225,7 @@ const File File::getLinkedTarget() const
return result;
ComSmartPtr <IShellLink> shellLink;
if (SUCCEEDED (shellLink.CoCreateInstance (CLSID_ShellLink, CLSCTX_INPROC_SERVER)))
if (SUCCEEDED (shellLink.CoCreateInstance (CLSID_ShellLink)))
{
ComSmartPtr <IPersistFile> persistFile;
if (SUCCEEDED (shellLink->QueryInterface (IID_IPersistFile, (LPVOID*) &persistFile)))
@ -226110,7 +226111,7 @@ private:
bool createDevices()
{
ComSmartPtr <IMMDeviceEnumerator> enumerator;
if (! OK (enumerator.CoCreateInstance (__uuidof (MMDeviceEnumerator), CLSCTX_INPROC_SERVER)))
if (! OK (enumerator.CoCreateInstance (__uuidof (MMDeviceEnumerator))))
return false;
ComSmartPtr <IMMDeviceCollection> deviceCollection;
@ -226170,7 +226171,7 @@ public:
inputDeviceIds.clear();
ComSmartPtr <IMMDeviceEnumerator> enumerator;
if (! OK (enumerator.CoCreateInstance (__uuidof (MMDeviceEnumerator), CLSCTX_INPROC_SERVER)))
if (! OK (enumerator.CoCreateInstance (__uuidof (MMDeviceEnumerator))))
return;
const String defaultRenderer = getDefaultEndpoint (enumerator, false);
@ -226352,7 +226353,7 @@ public:
activeImage (0),
loadingImage (0)
{
HRESULT hr = graphBuilder.CoCreateInstance (CLSID_FilterGraph, CLSCTX_INPROC);
HRESULT hr = graphBuilder.CoCreateInstance (CLSID_FilterGraph);
if (FAILED (hr))
return;
@ -226383,7 +226384,7 @@ public:
if (FAILED (hr))
return;
hr = smartTee.CoCreateInstance (CLSID_SmartTee, CLSCTX_INPROC_SERVER);
hr = smartTee.CoCreateInstance (CLSID_SmartTee);
if (FAILED (hr))
return;
@ -226395,7 +226396,7 @@ public:
return;
ComSmartPtr <IBaseFilter> sampleGrabberBase;
hr = sampleGrabberBase.CoCreateInstance (CLSID_SampleGrabber, CLSCTX_INPROC_SERVER);
hr = sampleGrabberBase.CoCreateInstance (CLSID_SampleGrabber);
if (FAILED (hr))
return;
@ -226434,7 +226435,7 @@ public:
height = pVih->bmiHeader.biHeight;
ComSmartPtr <IBaseFilter> nullFilter;
hr = nullFilter.CoCreateInstance (CLSID_NullRenderer, CLSCTX_INPROC_SERVER);
hr = nullFilter.CoCreateInstance (CLSID_NullRenderer);
hr = graphBuilder->AddFilter (nullFilter, _T("Null Renderer"));
if (connectFilters (sampleGrabberBase, nullFilter)
@ -226562,7 +226563,7 @@ public:
firstRecordedTime = Time();
recordNextFrameTime = true;
HRESULT hr = asfWriter.CoCreateInstance (CLSID_WMAsfWriter, CLSCTX_INPROC_SERVER);
HRESULT hr = asfWriter.CoCreateInstance (CLSID_WMAsfWriter);
if (SUCCEEDED (hr))
{
@ -227029,7 +227030,7 @@ static ComSmartPtr <IBaseFilter> enumerateCameras (StringArray* const names,
ComSmartPtr <IBaseFilter> result;
ComSmartPtr <ICreateDevEnum> pDevEnum;
HRESULT hr = pDevEnum.CoCreateInstance (CLSID_SystemDeviceEnum, CLSCTX_INPROC);
HRESULT hr = pDevEnum.CoCreateInstance (CLSID_SystemDeviceEnum);
if (SUCCEEDED (hr))
{
@ -227100,7 +227101,7 @@ CameraDevice* CameraDevice::openDevice (int index,
int maxWidth, int maxHeight)
{
ComSmartPtr <ICaptureGraphBuilder2> captureGraphBuilder;
HRESULT hr = captureGraphBuilder.CoCreateInstance (CLSID_CaptureGraphBuilder2, CLSCTX_INPROC);
HRESULT hr = captureGraphBuilder.CoCreateInstance (CLSID_CaptureGraphBuilder2);
if (SUCCEEDED (hr))
{