@@ -2,8 +2,8 @@ | |||||
set -e | set -e | ||||
JUCE_MODULES_DIR="/home/falktx/FOSS/GIT-mine/DISTRHO/libs/juce/source/modules/" | |||||
CARLA_MODULES_DIR="/home/falktx/FOSS/GIT-mine/Carla/source/modules/" | |||||
JUCE_MODULES_DIR="/home/falktx/Personal/FOSS/GIT/distrho/DISTRHO/libs/juce/source/modules/" | |||||
CARLA_MODULES_DIR="/home/falktx/Personal/FOSS/GIT/falktx/Carla/source/modules/" | |||||
MODULES=("juce_audio_basics juce_audio_devices juce_audio_formats juce_audio_processors juce_core juce_data_structures juce_events juce_graphics juce_gui_basics juce_gui_extra") | MODULES=("juce_audio_basics juce_audio_devices juce_audio_formats juce_audio_processors juce_core juce_data_structures juce_events juce_graphics juce_gui_basics juce_gui_extra") | ||||
@@ -229,7 +229,7 @@ namespace FloatVectorHelpers | |||||
static Type findMinOrMax (const Type* src, int num, const bool isMinimum) noexcept | static Type findMinOrMax (const Type* src, int num, const bool isMinimum) noexcept | ||||
{ | { | ||||
const int numLongOps = num / Mode::numParallel; | |||||
int numLongOps = num / Mode::numParallel; | |||||
#if JUCE_USE_SSE_INTRINSICS | #if JUCE_USE_SSE_INTRINSICS | ||||
if (numLongOps > 1 && isSSE2Available()) | if (numLongOps > 1 && isSSE2Available()) | ||||
@@ -246,7 +246,7 @@ namespace FloatVectorHelpers | |||||
if (isMinimum) | if (isMinimum) | ||||
{ | { | ||||
for (int i = 1; i < numLongOps; ++i) | |||||
while (--numLongOps > 0) | |||||
{ | { | ||||
src += Mode::numParallel; | src += Mode::numParallel; | ||||
val = Mode::min (val, Mode::loadA (src)); | val = Mode::min (val, Mode::loadA (src)); | ||||
@@ -254,7 +254,7 @@ namespace FloatVectorHelpers | |||||
} | } | ||||
else | else | ||||
{ | { | ||||
for (int i = 1; i < numLongOps; ++i) | |||||
while (--numLongOps > 0) | |||||
{ | { | ||||
src += Mode::numParallel; | src += Mode::numParallel; | ||||
val = Mode::max (val, Mode::loadA (src)); | val = Mode::max (val, Mode::loadA (src)); | ||||
@@ -268,7 +268,7 @@ namespace FloatVectorHelpers | |||||
if (isMinimum) | if (isMinimum) | ||||
{ | { | ||||
for (int i = 1; i < numLongOps; ++i) | |||||
while (--numLongOps > 0) | |||||
{ | { | ||||
src += Mode::numParallel; | src += Mode::numParallel; | ||||
val = Mode::min (val, Mode::loadU (src)); | val = Mode::min (val, Mode::loadU (src)); | ||||
@@ -276,7 +276,7 @@ namespace FloatVectorHelpers | |||||
} | } | ||||
else | else | ||||
{ | { | ||||
for (int i = 1; i < numLongOps; ++i) | |||||
while (--numLongOps > 0) | |||||
{ | { | ||||
src += Mode::numParallel; | src += Mode::numParallel; | ||||
val = Mode::max (val, Mode::loadU (src)); | val = Mode::max (val, Mode::loadU (src)); | ||||
@@ -288,6 +288,7 @@ namespace FloatVectorHelpers | |||||
: Mode::max (val); | : Mode::max (val); | ||||
num &= (Mode::numParallel - 1); | num &= (Mode::numParallel - 1); | ||||
src += Mode::numParallel; | |||||
for (int i = 0; i < num; ++i) | for (int i = 0; i < num; ++i) | ||||
result = isMinimum ? jmin (result, src[i]) | result = isMinimum ? jmin (result, src[i]) | ||||
@@ -302,7 +303,7 @@ namespace FloatVectorHelpers | |||||
static Range<Type> findMinAndMax (const Type* src, int num) noexcept | static Range<Type> findMinAndMax (const Type* src, int num) noexcept | ||||
{ | { | ||||
const int numLongOps = num / Mode::numParallel; | |||||
int numLongOps = num / Mode::numParallel; | |||||
#if JUCE_USE_SSE_INTRINSICS | #if JUCE_USE_SSE_INTRINSICS | ||||
if (numLongOps > 1 && isSSE2Available()) | if (numLongOps > 1 && isSSE2Available()) | ||||
@@ -318,7 +319,7 @@ namespace FloatVectorHelpers | |||||
mn = Mode::loadA (src); | mn = Mode::loadA (src); | ||||
mx = mn; | mx = mn; | ||||
for (int i = 1; i < numLongOps; ++i) | |||||
while (--numLongOps > 0) | |||||
{ | { | ||||
src += Mode::numParallel; | src += Mode::numParallel; | ||||
const ParallelType v = Mode::loadA (src); | const ParallelType v = Mode::loadA (src); | ||||
@@ -332,7 +333,7 @@ namespace FloatVectorHelpers | |||||
mn = Mode::loadU (src); | mn = Mode::loadU (src); | ||||
mx = mn; | mx = mn; | ||||
for (int i = 1; i < numLongOps; ++i) | |||||
while (--numLongOps > 0) | |||||
{ | { | ||||
src += Mode::numParallel; | src += Mode::numParallel; | ||||
const ParallelType v = Mode::loadU (src); | const ParallelType v = Mode::loadU (src); | ||||
@@ -345,6 +346,8 @@ namespace FloatVectorHelpers | |||||
Mode::max (mx)); | Mode::max (mx)); | ||||
num &= 3; | num &= 3; | ||||
src += Mode::numParallel; | |||||
for (int i = 0; i < num; ++i) | for (int i = 0; i < num; ++i) | ||||
result = result.getUnionWith (src[i]); | result = result.getUnionWith (src[i]); | ||||
@@ -1758,7 +1758,7 @@ private: | |||||
//============================================================================== | //============================================================================== | ||||
VST3ModuleHandle::Ptr module; | VST3ModuleHandle::Ptr module; | ||||
friend class VST3HostContext; | |||||
friend VST3HostContext; | |||||
ComSmartPtr<VST3HostContext> host; | ComSmartPtr<VST3HostContext> host; | ||||
// Information objects: | // Information objects: | ||||
@@ -272,6 +272,7 @@ extern JUCE_API void JUCE_CALLTYPE logAssertion (const char* file, int line) noe | |||||
#include "zip/juce_GZIPDecompressorInputStream.h" | #include "zip/juce_GZIPDecompressorInputStream.h" | ||||
#include "zip/juce_ZipFile.h" | #include "zip/juce_ZipFile.h" | ||||
#include "containers/juce_PropertySet.h" | #include "containers/juce_PropertySet.h" | ||||
#include "memory/juce_SharedResourcePointer.h" | |||||
} | } | ||||
@@ -329,17 +329,17 @@ public: | |||||
//============================================================================== | //============================================================================== | ||||
/** Returns the object that this pointer references. | /** Returns the object that this pointer references. | ||||
The pointer returned may be zero, of course. | |||||
The pointer returned may be null, of course. | |||||
*/ | */ | ||||
operator ReferencedType*() const noexcept { return referencedObject; } | operator ReferencedType*() const noexcept { return referencedObject; } | ||||
/** Returns the object that this pointer references. | /** Returns the object that this pointer references. | ||||
The pointer returned may be zero, of course. | |||||
The pointer returned may be null, of course. | |||||
*/ | */ | ||||
ReferencedType* get() const noexcept { return referencedObject; } | ReferencedType* get() const noexcept { return referencedObject; } | ||||
/** Returns the object that this pointer references. | /** Returns the object that this pointer references. | ||||
The pointer returned may be zero, of course. | |||||
The pointer returned may be null, of course. | |||||
*/ | */ | ||||
ReferencedType* getObject() const noexcept { return referencedObject; } | ReferencedType* getObject() const noexcept { return referencedObject; } | ||||
@@ -29,7 +29,7 @@ | |||||
#ifndef JUCE_WIN32_COMSMARTPTR_H_INCLUDED | #ifndef JUCE_WIN32_COMSMARTPTR_H_INCLUDED | ||||
#define JUCE_WIN32_COMSMARTPTR_H_INCLUDED | #define JUCE_WIN32_COMSMARTPTR_H_INCLUDED | ||||
#if ! defined (_MSC_VER) //|| defined (__uuidof)) | |||||
#if ! (defined (_MSC_VER) || defined (__uuidof)) | |||||
template<typename Type> struct UUIDGetter { static CLSID get() { jassertfalse; return CLSID(); } }; | template<typename Type> struct UUIDGetter { static CLSID get() { jassertfalse; return CLSID(); } }; | ||||
#define __uuidof(x) UUIDGetter<x>::get() | #define __uuidof(x) UUIDGetter<x>::get() | ||||
#endif | #endif | ||||
@@ -890,20 +890,22 @@ namespace EdgeTableFillers | |||||
forcedinline void copyRow (DestPixelType* dest, SrcPixelType const* src, int width) const noexcept | forcedinline void copyRow (DestPixelType* dest, SrcPixelType const* src, int width) const noexcept | ||||
{ | { | ||||
if (srcData.pixelStride == 3 && destData.pixelStride == 3) | |||||
const int destStride = destData.pixelStride; | |||||
const int srcStride = srcData.pixelStride; | |||||
if (destStride == srcStride | |||||
&& srcData.pixelFormat == Image::RGB | |||||
&& destData.pixelFormat == Image::RGB) | |||||
{ | { | ||||
memcpy (dest, src, sizeof (PixelRGB) * (size_t) width); | |||||
memcpy (dest, src, (size_t) (width * srcStride)); | |||||
} | } | ||||
else | else | ||||
{ | { | ||||
const int destStride = destData.pixelStride; | |||||
const int srcStride = srcData.pixelStride; | |||||
do | do | ||||
{ | { | ||||
dest->blend (*src); | dest->blend (*src); | ||||
dest = addBytesToPointer (dest, destStride); | dest = addBytesToPointer (dest, destStride); | ||||
src = addBytesToPointer (src, srcStride); | |||||
src = addBytesToPointer (src, srcStride); | |||||
} while (--width > 0); | } while (--width > 0); | ||||
} | } | ||||
} | } | ||||
@@ -37,10 +37,9 @@ public: | |||||
D2D1_RENDER_TARGET_PROPERTIES props = D2D1::RenderTargetProperties(); | D2D1_RENDER_TARGET_PROPERTIES props = D2D1::RenderTargetProperties(); | ||||
D2D1_HWND_RENDER_TARGET_PROPERTIES propsHwnd = D2D1::HwndRenderTargetProperties (hwnd, size); | D2D1_HWND_RENDER_TARGET_PROPERTIES propsHwnd = D2D1::HwndRenderTargetProperties (hwnd, size); | ||||
const Direct2DFactories& factories = Direct2DFactories::getInstance(); | |||||
if (factories.d2dFactory != nullptr) | |||||
if (factories->d2dFactory != nullptr) | |||||
{ | { | ||||
HRESULT hr = factories.d2dFactory->CreateHwndRenderTarget (props, propsHwnd, renderingTarget.resetAndGetPointerAddress()); | |||||
HRESULT hr = factories->d2dFactory->CreateHwndRenderTarget (props, propsHwnd, renderingTarget.resetAndGetPointerAddress()); | |||||
jassert (SUCCEEDED (hr)); (void) hr; | jassert (SUCCEEDED (hr)); (void) hr; | ||||
hr = renderingTarget->CreateSolidColorBrush (D2D1::ColorF::ColorF (0.0f, 0.0f, 0.0f, 1.0f), colourBrush.resetAndGetPointerAddress()); | hr = renderingTarget->CreateSolidColorBrush (D2D1::ColorF::ColorF (0.0f, 0.0f, 0.0f, 1.0f), colourBrush.resetAndGetPointerAddress()); | ||||
} | } | ||||
@@ -287,9 +286,8 @@ public: | |||||
{ | { | ||||
renderingTarget->SetTransform (transformToMatrix (currentState->transform)); | renderingTarget->SetTransform (transformToMatrix (currentState->transform)); | ||||
const Direct2DFactories& factories = Direct2DFactories::getInstance(); | |||||
DirectWriteTypeLayout::drawToD2DContext (text, area, renderingTarget, factories.directWriteFactory, | |||||
factories.d2dFactory, factories.systemFonts); | |||||
DirectWriteTypeLayout::drawToD2DContext (text, area, renderingTarget, factories->directWriteFactory, | |||||
factories->d2dFactory, factories->systemFonts); | |||||
renderingTarget->SetTransform (D2D1::IdentityMatrix()); | renderingTarget->SetTransform (D2D1::IdentityMatrix()); | ||||
return true; | return true; | ||||
@@ -695,6 +693,7 @@ public: | |||||
//============================================================================== | //============================================================================== | ||||
private: | private: | ||||
SharedResourcePointer<Direct2DFactories> factories; | |||||
HWND hwnd; | HWND hwnd; | ||||
ComSmartPtr <ID2D1HwndRenderTarget> renderingTarget; | ComSmartPtr <ID2D1HwndRenderTarget> renderingTarget; | ||||
ComSmartPtr <ID2D1SolidColorBrush> colourBrush; | ComSmartPtr <ID2D1SolidColorBrush> colourBrush; | ||||
@@ -733,7 +732,7 @@ private: | |||||
static ID2D1PathGeometry* rectListToPathGeometry (const RectangleList<int>& clipRegion) | static ID2D1PathGeometry* rectListToPathGeometry (const RectangleList<int>& clipRegion) | ||||
{ | { | ||||
ID2D1PathGeometry* p = nullptr; | ID2D1PathGeometry* p = nullptr; | ||||
Direct2DFactories::getInstance().d2dFactory->CreatePathGeometry (&p); | |||||
factories->d2dFactory->CreatePathGeometry (&p); | |||||
ComSmartPtr <ID2D1GeometrySink> sink; | ComSmartPtr <ID2D1GeometrySink> sink; | ||||
HRESULT hr = p->Open (sink.resetAndGetPointerAddress()); // xxx handle error | HRESULT hr = p->Open (sink.resetAndGetPointerAddress()); // xxx handle error | ||||
@@ -811,7 +810,7 @@ private: | |||||
static ID2D1PathGeometry* pathToPathGeometry (const Path& path, const AffineTransform& transform) | static ID2D1PathGeometry* pathToPathGeometry (const Path& path, const AffineTransform& transform) | ||||
{ | { | ||||
ID2D1PathGeometry* p = nullptr; | ID2D1PathGeometry* p = nullptr; | ||||
Direct2DFactories::getInstance().d2dFactory->CreatePathGeometry (&p); | |||||
factories->d2dFactory->CreatePathGeometry (&p); | |||||
ComSmartPtr <ID2D1GeometrySink> sink; | ComSmartPtr <ID2D1GeometrySink> sink; | ||||
HRESULT hr = p->Open (sink.resetAndGetPointerAddress()); | HRESULT hr = p->Open (sink.resetAndGetPointerAddress()); | ||||
@@ -389,9 +389,9 @@ namespace DirectWriteTypeLayout | |||||
bool TextLayout::createNativeLayout (const AttributedString& text) | bool TextLayout::createNativeLayout (const AttributedString& text) | ||||
{ | { | ||||
#if JUCE_USE_DIRECTWRITE | #if JUCE_USE_DIRECTWRITE | ||||
const Direct2DFactories& factories = Direct2DFactories::getInstance(); | |||||
SharedResourcePointer<Direct2DFactories> factories; | |||||
if (factories.d2dFactory != nullptr && factories.systemFonts != nullptr) | |||||
if (factories->d2dFactory != nullptr && factories->systemFonts != nullptr) | |||||
{ | { | ||||
#if JUCE_64BIT | #if JUCE_64BIT | ||||
// There's a mysterious bug in 64-bit Windows that causes garbage floating-point | // There's a mysterious bug in 64-bit Windows that causes garbage floating-point | ||||
@@ -402,13 +402,13 @@ bool TextLayout::createNativeLayout (const AttributedString& text) | |||||
{ | { | ||||
hasBeenCalled = true; | hasBeenCalled = true; | ||||
TextLayout dummy; | TextLayout dummy; | ||||
DirectWriteTypeLayout::createLayout (dummy, text, factories.directWriteFactory, | |||||
factories.d2dFactory, factories.systemFonts); | |||||
DirectWriteTypeLayout::createLayout (dummy, text, factories->directWriteFactory, | |||||
factories->d2dFactory, factories->systemFonts); | |||||
} | } | ||||
#endif | #endif | ||||
DirectWriteTypeLayout::createLayout (*this, text, factories.directWriteFactory, | |||||
factories.d2dFactory, factories.systemFonts); | |||||
DirectWriteTypeLayout::createLayout (*this, text, factories->directWriteFactory, | |||||
factories->d2dFactory, factories->systemFonts); | |||||
return true; | return true; | ||||
} | } | ||||
#else | #else | ||||
@@ -107,15 +107,9 @@ public: | |||||
systemFonts = nullptr; | systemFonts = nullptr; | ||||
} | } | ||||
static const Direct2DFactories& getInstance() | |||||
{ | |||||
static Direct2DFactories instance; | |||||
return instance; | |||||
} | |||||
ComSmartPtr <ID2D1Factory> d2dFactory; | |||||
ComSmartPtr <IDWriteFactory> directWriteFactory; | |||||
ComSmartPtr <IDWriteFontCollection> systemFonts; | |||||
ComSmartPtr<ID2D1Factory> d2dFactory; | |||||
ComSmartPtr<IDWriteFactory> directWriteFactory; | |||||
ComSmartPtr<IDWriteFontCollection> systemFonts; | |||||
private: | private: | ||||
DynamicLibrary direct2dDll, directWriteDll; | DynamicLibrary direct2dDll, directWriteDll; | ||||
@@ -255,6 +249,7 @@ public: | |||||
IDWriteFontFace* getIDWriteFontFace() const noexcept { return dwFontFace; } | IDWriteFontFace* getIDWriteFontFace() const noexcept { return dwFontFace; } | ||||
private: | private: | ||||
SharedResourcePointer<Direct2DFactories> factories; | |||||
ComSmartPtr<IDWriteFontFace> dwFontFace; | ComSmartPtr<IDWriteFontFace> dwFontFace; | ||||
float unitsToHeightScaleFactor, heightToPointsFactor, ascent; | float unitsToHeightScaleFactor, heightToPointsFactor, ascent; | ||||
int designUnitsPerEm; | int designUnitsPerEm; | ||||
@@ -176,17 +176,17 @@ StringArray Font::findAllTypefaceNames() | |||||
StringArray results; | StringArray results; | ||||
#if JUCE_USE_DIRECTWRITE | #if JUCE_USE_DIRECTWRITE | ||||
const Direct2DFactories& factories = Direct2DFactories::getInstance(); | |||||
SharedResourcePointer<Direct2DFactories> factories; | |||||
if (factories.systemFonts != nullptr) | |||||
if (factories->systemFonts != nullptr) | |||||
{ | { | ||||
ComSmartPtr<IDWriteFontFamily> fontFamily; | ComSmartPtr<IDWriteFontFamily> fontFamily; | ||||
uint32 fontFamilyCount = 0; | uint32 fontFamilyCount = 0; | ||||
fontFamilyCount = factories.systemFonts->GetFontFamilyCount(); | |||||
fontFamilyCount = factories->systemFonts->GetFontFamilyCount(); | |||||
for (uint32 i = 0; i < fontFamilyCount; ++i) | for (uint32 i = 0; i < fontFamilyCount; ++i) | ||||
{ | { | ||||
HRESULT hr = factories.systemFonts->GetFontFamily (i, fontFamily.resetAndGetPointerAddress()); | |||||
HRESULT hr = factories->systemFonts->GetFontFamily (i, fontFamily.resetAndGetPointerAddress()); | |||||
if (SUCCEEDED (hr)) | if (SUCCEEDED (hr)) | ||||
results.addIfNotAlreadyThere (getFontFamilyName (fontFamily)); | results.addIfNotAlreadyThere (getFontFamilyName (fontFamily)); | ||||
@@ -226,20 +226,20 @@ StringArray Font::findAllTypefaceStyles (const String& family) | |||||
StringArray results; | StringArray results; | ||||
#if JUCE_USE_DIRECTWRITE | #if JUCE_USE_DIRECTWRITE | ||||
const Direct2DFactories& factories = Direct2DFactories::getInstance(); | |||||
SharedResourcePointer<Direct2DFactories> factories; | |||||
if (factories.systemFonts != nullptr) | |||||
if (factories->systemFonts != nullptr) | |||||
{ | { | ||||
BOOL fontFound = false; | BOOL fontFound = false; | ||||
uint32 fontIndex = 0; | uint32 fontIndex = 0; | ||||
HRESULT hr = factories.systemFonts->FindFamilyName (family.toWideCharPointer(), &fontIndex, &fontFound); | |||||
HRESULT hr = factories->systemFonts->FindFamilyName (family.toWideCharPointer(), &fontIndex, &fontFound); | |||||
if (! fontFound) | if (! fontFound) | ||||
fontIndex = 0; | fontIndex = 0; | ||||
// Get the font family using the search results | // 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 | // Fonts like: Times New Roman, Times New Roman Bold, Times New Roman Italic are all in the same font family | ||||
ComSmartPtr<IDWriteFontFamily> fontFamily; | ComSmartPtr<IDWriteFontFamily> fontFamily; | ||||
hr = factories.systemFonts->GetFontFamily (fontIndex, fontFamily.resetAndGetPointerAddress()); | |||||
hr = factories->systemFonts->GetFontFamily (fontIndex, fontFamily.resetAndGetPointerAddress()); | |||||
// Get the font faces | // Get the font faces | ||||
ComSmartPtr<IDWriteFont> dwFont; | ComSmartPtr<IDWriteFont> dwFont; | ||||
@@ -619,11 +619,11 @@ const MAT2 WindowsTypeface::identityMatrix = { { 0, 1 }, { 0, 0 }, { 0, 0 }, { 0 | |||||
Typeface::Ptr Typeface::createSystemTypefaceFor (const Font& font) | Typeface::Ptr Typeface::createSystemTypefaceFor (const Font& font) | ||||
{ | { | ||||
#if JUCE_USE_DIRECTWRITE | #if JUCE_USE_DIRECTWRITE | ||||
const Direct2DFactories& factories = Direct2DFactories::getInstance(); | |||||
SharedResourcePointer<Direct2DFactories> factories; | |||||
if (factories.systemFonts != nullptr) | |||||
if (factories->systemFonts != nullptr) | |||||
{ | { | ||||
ScopedPointer<WindowsDirectWriteTypeface> wtf (new WindowsDirectWriteTypeface (font, factories.systemFonts)); | |||||
ScopedPointer<WindowsDirectWriteTypeface> wtf (new WindowsDirectWriteTypeface (font, factories->systemFonts)); | |||||
if (wtf->loadedOk()) | if (wtf->loadedOk()) | ||||
return wtf.release(); | return wtf.release(); | ||||
@@ -30,6 +30,8 @@ Viewport::Viewport (const String& name) | |||||
showHScrollbar (true), | showHScrollbar (true), | ||||
showVScrollbar (true), | showVScrollbar (true), | ||||
deleteContent (true), | deleteContent (true), | ||||
allowScrollingWithoutScrollbarV (false), | |||||
allowScrollingWithoutScrollbarH (false), | |||||
verticalScrollBar (true), | verticalScrollBar (true), | ||||
horizontalScrollBar (false) | horizontalScrollBar (false) | ||||
{ | { | ||||
@@ -234,31 +236,23 @@ void Viewport::updateVisibleArea() | |||||
Point<int> visibleOrigin (-contentBounds.getPosition()); | Point<int> visibleOrigin (-contentBounds.getPosition()); | ||||
if (hBarVisible) | |||||
{ | |||||
horizontalScrollBar.setBounds (0, contentArea.getHeight(), contentArea.getWidth(), scrollbarWidth); | |||||
horizontalScrollBar.setRangeLimits (0.0, contentBounds.getWidth()); | |||||
horizontalScrollBar.setCurrentRange (visibleOrigin.x, contentArea.getWidth()); | |||||
horizontalScrollBar.setSingleStepSize (singleStepX); | |||||
horizontalScrollBar.cancelPendingUpdate(); | |||||
} | |||||
else if (canShowHBar) | |||||
{ | |||||
horizontalScrollBar.setBounds (0, contentArea.getHeight(), contentArea.getWidth(), scrollbarWidth); | |||||
horizontalScrollBar.setRangeLimits (0.0, contentBounds.getWidth()); | |||||
horizontalScrollBar.setCurrentRange (visibleOrigin.x, contentArea.getWidth()); | |||||
horizontalScrollBar.setSingleStepSize (singleStepX); | |||||
horizontalScrollBar.cancelPendingUpdate(); | |||||
if (canShowHBar && ! hBarVisible) | |||||
visibleOrigin.setX (0); | visibleOrigin.setX (0); | ||||
} | |||||
if (vBarVisible) | |||||
{ | |||||
verticalScrollBar.setBounds (contentArea.getWidth(), 0, scrollbarWidth, contentArea.getHeight()); | |||||
verticalScrollBar.setRangeLimits (0.0, contentBounds.getHeight()); | |||||
verticalScrollBar.setCurrentRange (visibleOrigin.y, contentArea.getHeight()); | |||||
verticalScrollBar.setSingleStepSize (singleStepY); | |||||
verticalScrollBar.cancelPendingUpdate(); | |||||
} | |||||
else if (canShowVBar) | |||||
{ | |||||
verticalScrollBar.setBounds (contentArea.getWidth(), 0, scrollbarWidth, contentArea.getHeight()); | |||||
verticalScrollBar.setRangeLimits (0.0, contentBounds.getHeight()); | |||||
verticalScrollBar.setCurrentRange (visibleOrigin.y, contentArea.getHeight()); | |||||
verticalScrollBar.setSingleStepSize (singleStepY); | |||||
verticalScrollBar.cancelPendingUpdate(); | |||||
if (canShowVBar && ! vBarVisible) | |||||
visibleOrigin.setY (0); | visibleOrigin.setY (0); | ||||
} | |||||
// Force the visibility *after* setting the ranges to avoid flicker caused by edge conditions in the numbers. | // Force the visibility *after* setting the ranges to avoid flicker caused by edge conditions in the numbers. | ||||
horizontalScrollBar.setVisible (hBarVisible); | horizontalScrollBar.setVisible (hBarVisible); | ||||
@@ -301,8 +295,13 @@ void Viewport::setSingleStepSizes (const int stepX, const int stepY) | |||||
} | } | ||||
void Viewport::setScrollBarsShown (const bool showVerticalScrollbarIfNeeded, | void Viewport::setScrollBarsShown (const bool showVerticalScrollbarIfNeeded, | ||||
const bool showHorizontalScrollbarIfNeeded) | |||||
const bool showHorizontalScrollbarIfNeeded, | |||||
const bool allowVerticalScrollingWithoutScrollbar, | |||||
const bool allowHorizontalScrollingWithoutScrollbar) | |||||
{ | { | ||||
allowScrollingWithoutScrollbarV = allowVerticalScrollingWithoutScrollbar; | |||||
allowScrollingWithoutScrollbarH = allowHorizontalScrollingWithoutScrollbar; | |||||
if (showVScrollbar != showVerticalScrollbarIfNeeded | if (showVScrollbar != showVerticalScrollbarIfNeeded | ||||
|| showHScrollbar != showHorizontalScrollbarIfNeeded) | || showHScrollbar != showHorizontalScrollbarIfNeeded) | ||||
{ | { | ||||
@@ -347,47 +346,44 @@ void Viewport::mouseWheelMove (const MouseEvent& e, const MouseWheelDetails& whe | |||||
Component::mouseWheelMove (e, wheel); | Component::mouseWheelMove (e, wheel); | ||||
} | } | ||||
static float rescaleMouseWheelDistance (float distance, int singleStepSize) noexcept | |||||
{ | |||||
if (distance == 0) | |||||
return 0; | |||||
distance *= 14.0f * singleStepSize; | |||||
return distance < 0 ? jmin (distance, -1.0f) | |||||
: jmax (distance, 1.0f); | |||||
} | |||||
bool Viewport::useMouseWheelMoveIfNeeded (const MouseEvent& e, const MouseWheelDetails& wheel) | bool Viewport::useMouseWheelMoveIfNeeded (const MouseEvent& e, const MouseWheelDetails& wheel) | ||||
{ | { | ||||
if (! (e.mods.isAltDown() || e.mods.isCtrlDown() || e.mods.isCommandDown())) | if (! (e.mods.isAltDown() || e.mods.isCtrlDown() || e.mods.isCommandDown())) | ||||
{ | { | ||||
const bool hasVertBar = verticalScrollBar.isVisible(); | |||||
const bool hasHorzBar = horizontalScrollBar.isVisible(); | |||||
const bool canScrollVert = (allowScrollingWithoutScrollbarV || verticalScrollBar.isVisible()); | |||||
const bool canScrollHorz = (allowScrollingWithoutScrollbarH || horizontalScrollBar.isVisible()); | |||||
if (hasHorzBar || hasVertBar) | |||||
if (canScrollHorz || canScrollVert) | |||||
{ | { | ||||
float wheelIncrementX = wheel.deltaX; | |||||
float wheelIncrementY = wheel.deltaY; | |||||
if (wheelIncrementX != 0) | |||||
{ | |||||
wheelIncrementX *= 14.0f * singleStepX; | |||||
wheelIncrementX = (wheelIncrementX < 0) ? jmin (wheelIncrementX, -1.0f) | |||||
: jmax (wheelIncrementX, 1.0f); | |||||
} | |||||
if (wheelIncrementY != 0) | |||||
{ | |||||
wheelIncrementY *= 14.0f * singleStepY; | |||||
wheelIncrementY = (wheelIncrementY < 0) ? jmin (wheelIncrementY, -1.0f) | |||||
: jmax (wheelIncrementY, 1.0f); | |||||
} | |||||
float wheelIncrementX = rescaleMouseWheelDistance (wheel.deltaX, singleStepX); | |||||
float wheelIncrementY = rescaleMouseWheelDistance (wheel.deltaY, singleStepY); | |||||
Point<int> pos (getViewPosition()); | Point<int> pos (getViewPosition()); | ||||
if (wheelIncrementX != 0 && wheelIncrementY != 0 && hasHorzBar && hasVertBar) | |||||
if (wheelIncrementX != 0 && wheelIncrementY != 0 && canScrollHorz && canScrollVert) | |||||
{ | { | ||||
pos.setX (pos.x - roundToInt (wheelIncrementX)); | pos.setX (pos.x - roundToInt (wheelIncrementX)); | ||||
pos.setY (pos.y - roundToInt (wheelIncrementY)); | pos.setY (pos.y - roundToInt (wheelIncrementY)); | ||||
} | } | ||||
else if (hasHorzBar && (wheelIncrementX != 0 || e.mods.isShiftDown() || ! hasVertBar)) | |||||
else if (canScrollHorz && (wheelIncrementX != 0 || e.mods.isShiftDown() || ! canScrollVert)) | |||||
{ | { | ||||
if (wheelIncrementX == 0 && ! hasVertBar) | |||||
if (wheelIncrementX == 0 && ! canScrollVert) | |||||
wheelIncrementX = wheelIncrementY; | wheelIncrementX = wheelIncrementY; | ||||
pos.setX (pos.x - roundToInt (wheelIncrementX)); | pos.setX (pos.x - roundToInt (wheelIncrementX)); | ||||
} | } | ||||
else if (hasVertBar && wheelIncrementY != 0) | |||||
else if (canScrollVert && wheelIncrementY != 0) | |||||
{ | { | ||||
pos.setY (pos.y - roundToInt (wheelIncrementY)); | pos.setY (pos.y - roundToInt (wheelIncrementY)); | ||||
} | } | ||||
@@ -191,9 +191,15 @@ public: | |||||
If set to false, the scrollbars won't ever appear. When true (the default) | If set to false, the scrollbars won't ever appear. When true (the default) | ||||
they will appear only when needed. | they will appear only when needed. | ||||
The allowVerticalScrollingWithoutScrollbar parameters allow you to enable | |||||
mouse-wheel scrolling even when there the scrollbars are hidden. When the | |||||
scrollbars are visible, these parameters are ignored. | |||||
*/ | */ | ||||
void setScrollBarsShown (bool showVerticalScrollbarIfNeeded, | void setScrollBarsShown (bool showVerticalScrollbarIfNeeded, | ||||
bool showHorizontalScrollbarIfNeeded); | |||||
bool showHorizontalScrollbarIfNeeded, | |||||
bool allowVerticalScrollingWithoutScrollbar = false, | |||||
bool allowHorizontalScrollingWithoutScrollbar = false); | |||||
/** True if the vertical scrollbar is enabled. | /** True if the vertical scrollbar is enabled. | ||||
@see setScrollBarsShown | @see setScrollBarsShown | ||||
@@ -258,9 +264,9 @@ private: | |||||
int scrollBarThickness; | int scrollBarThickness; | ||||
int singleStepX, singleStepY; | int singleStepX, singleStepY; | ||||
bool showHScrollbar, showVScrollbar, deleteContent; | bool showHScrollbar, showVScrollbar, deleteContent; | ||||
bool allowScrollingWithoutScrollbarV, allowScrollingWithoutScrollbarH; | |||||
Component contentHolder; | Component contentHolder; | ||||
ScrollBar verticalScrollBar; | |||||
ScrollBar horizontalScrollBar; | |||||
ScrollBar verticalScrollBar, horizontalScrollBar; | |||||
Point<int> viewportPosToCompPos (Point<int>) const; | Point<int> viewportPosToCompPos (Point<int>) const; | ||||
void updateVisibleArea(); | void updateVisibleArea(); | ||||
@@ -62,7 +62,7 @@ public: | |||||
gapAroundColourSpaceComponent indicates how much of a gap to put around the | gapAroundColourSpaceComponent indicates how much of a gap to put around the | ||||
colourspace and hue selector components. | colourspace and hue selector components. | ||||
*/ | */ | ||||
ColourSelector (int sectionsToShow = (showAlphaChannel | showColourAtTop | showSliders | showColourspace), | |||||
ColourSelector (int flags = (showAlphaChannel | showColourAtTop | showSliders | showColourspace), | |||||
int edgeGap = 4, | int edgeGap = 4, | ||||
int gapAroundColourSpaceComponent = 7); | int gapAroundColourSpaceComponent = 7); | ||||
@@ -79,8 +79,7 @@ public: | |||||
*/ | */ | ||||
Colour getCurrentColour() const; | Colour getCurrentColour() const; | ||||
/** Changes the colour that is currently being shown. | |||||
*/ | |||||
/** Changes the colour that is currently being shown. */ | |||||
void setCurrentColour (Colour newColour); | void setCurrentColour (Colour newColour); | ||||
//============================================================================== | //============================================================================== | ||||
@@ -22,7 +22,6 @@ | |||||
============================================================================== | ============================================================================== | ||||
*/ | */ | ||||
struct NSViewResizeWatcher | struct NSViewResizeWatcher | ||||
{ | { | ||||
NSViewResizeWatcher() : callback (nil) {} | NSViewResizeWatcher() : callback (nil) {} | ||||