Browse Source

Added a class Graphics::ScopedSaveState. Fixed a window dragging problem in win32, some VC6 compile errors, and made the jucer makefile builder use the target binary folder.

tags/2021-05-28
Julian Storer 15 years ago
parent
commit
a37d5041dd
21 changed files with 167 additions and 125 deletions
  1. +8
    -1
      extras/Jucer (experimental)/Source/Project/jucer_ProjectExport_Make.h
  2. +55
    -60
      juce_amalgamated.cpp
  3. +23
    -2
      juce_amalgamated.h
  4. +1
    -1
      src/audio/audio_file_formats/juce_AudioFormatWriter.cpp
  5. +1
    -1
      src/audio/plugins/formats/juce_VSTPluginFormat.cpp
  6. +4
    -0
      src/core/juce_MathsFunctions.h
  7. +1
    -1
      src/core/juce_StandardHeader.h
  8. +2
    -3
      src/gui/components/controls/juce_TableHeaderComponent.cpp
  9. +2
    -2
      src/gui/components/controls/juce_TableListBox.cpp
  10. +5
    -7
      src/gui/components/controls/juce_TextEditor.cpp
  11. +2
    -3
      src/gui/components/controls/juce_ToolbarItemComponent.cpp
  12. +5
    -9
      src/gui/components/controls/juce_TreeView.cpp
  13. +2
    -4
      src/gui/components/juce_Component.cpp
  14. +2
    -3
      src/gui/components/menus/juce_MenuBarComponent.cpp
  15. +5
    -6
      src/gui/components/mouse/juce_MouseInputSource.cpp
  16. +0
    -4
      src/gui/components/windows/juce_AlertWindow.cpp
  17. +9
    -11
      src/gui/components/windows/juce_ComponentPeer.cpp
  18. +12
    -0
      src/gui/graphics/contexts/juce_Graphics.cpp
  19. +20
    -1
      src/gui/graphics/contexts/juce_Graphics.h
  20. +2
    -2
      src/gui/graphics/drawables/juce_Drawable.cpp
  21. +6
    -4
      src/native/windows/juce_win32_CameraDevice.cpp

+ 8
- 1
extras/Jucer (experimental)/Source/Project/jucer_ProjectExport_Make.h View File

@@ -211,12 +211,19 @@ private:
{ {
const String buildDirName ("build"); const String buildDirName ("build");
const String intermediatesDirName (buildDirName + "/intermediate/" + config.getName().toString()); const String intermediatesDirName (buildDirName + "/intermediate/" + config.getName().toString());
String outputDir (buildDirName);
if (config.getTargetBinaryRelativePath().toString().isNotEmpty())
{
RelativePath binaryPath (config.getTargetBinaryRelativePath().toString(), RelativePath::projectFolder);
outputDir = binaryPath.rebased (project.getFile().getParentDirectory(), getTargetFolder(), RelativePath::buildTargetFolder).toUnixStyle();
}
out << "ifeq ($(CONFIG)," << escapeSpaces (config.getName().toString()) << ")" << newLine; out << "ifeq ($(CONFIG)," << escapeSpaces (config.getName().toString()) << ")" << newLine;
out << " BINDIR := " << escapeSpaces (buildDirName) << newLine out << " BINDIR := " << escapeSpaces (buildDirName) << newLine
<< " LIBDIR := " << escapeSpaces (buildDirName) << newLine << " LIBDIR := " << escapeSpaces (buildDirName) << newLine
<< " OBJDIR := " << escapeSpaces (intermediatesDirName) << newLine << " OBJDIR := " << escapeSpaces (intermediatesDirName) << newLine
<< " OUTDIR := " << escapeSpaces (buildDirName) << newLine;
<< " OUTDIR := " << escapeSpaces (outputDir) << newLine;
writeCppFlags (out, config); writeCppFlags (out, config);


+ 55
- 60
juce_amalgamated.cpp View File

@@ -21666,7 +21666,7 @@ public:
void setThumbnail (AudioThumbnail* thumb) void setThumbnail (AudioThumbnail* thumb)
{ {
if (thumb != 0) if (thumb != 0)
thumb->reset (buffer.getNumChannels(), writer->sampleRate);
thumb->reset (buffer.getNumChannels(), writer->getSampleRate());


const ScopedLock sl (thumbnailLock); const ScopedLock sl (thumbnailLock);
thumbnailToUpdate = thumb; thumbnailToUpdate = thumb;
@@ -33165,7 +33165,7 @@ namespace
} }
} }


typedef AEffect* (*MainCall) (audioMasterCallback);
typedef AEffect* (VSTCALLBACK *MainCall) (audioMasterCallback);


static VstIntPtr VSTCALLBACK audioMaster (AEffect* effect, VstInt32 opcode, VstInt32 index, VstIntPtr value, void* ptr, float opt); static VstIntPtr VSTCALLBACK audioMaster (AEffect* effect, VstInt32 opcode, VstInt32 index, VstIntPtr value, void* ptr, float opt);


@@ -42117,8 +42117,6 @@ void Component::internalMouseUp (MouseInputSource& source, const Point<int>& rel
{ {
if (flags.mouseDownFlag) if (flags.mouseDownFlag)
{ {
Desktop& desktop = Desktop::getInstance();

flags.mouseDownFlag = false; flags.mouseDownFlag = false;


BailOutChecker checker (this); BailOutChecker checker (this);
@@ -42138,6 +42136,7 @@ void Component::internalMouseUp (MouseInputSource& source, const Point<int>& rel
if (checker.shouldBailOut()) if (checker.shouldBailOut())
return; return;


Desktop& desktop = Desktop::getInstance();
desktop.resetTimer(); desktop.resetTimer();
desktop.mouseListeners.callChecked (checker, &MouseListener::mouseUp, me); desktop.mouseListeners.callChecked (checker, &MouseListener::mouseUp, me);


@@ -42164,8 +42163,6 @@ void Component::internalMouseDrag (MouseInputSource& source, const Point<int>& r
{ {
if (flags.mouseDownFlag) if (flags.mouseDownFlag)
{ {
Desktop& desktop = Desktop::getInstance();

flags.mouseOverFlag = reallyContains (relativePos, false); flags.mouseOverFlag = reallyContains (relativePos, false);


BailOutChecker checker (this); BailOutChecker checker (this);
@@ -42182,6 +42179,7 @@ void Component::internalMouseDrag (MouseInputSource& source, const Point<int>& r
if (checker.shouldBailOut()) if (checker.shouldBailOut())
return; return;


Desktop& desktop = Desktop::getInstance();
desktop.resetTimer(); desktop.resetTimer();
desktop.mouseListeners.callChecked (checker, &MouseListener::mouseDrag, me); desktop.mouseListeners.callChecked (checker, &MouseListener::mouseDrag, me);


@@ -51383,7 +51381,8 @@ void TableHeaderComponent::paint (Graphics& g)
|| dragOverlayComp == 0 || dragOverlayComp == 0
|| ! dragOverlayComp->isVisible())) || ! dragOverlayComp->isVisible()))
{ {
g.saveState();
Graphics::ScopedSaveState ss (g);

g.setOrigin (x, 0); g.setOrigin (x, 0);
g.reduceClipRegion (0, 0, ci->width, getHeight()); g.reduceClipRegion (0, 0, ci->width, getHeight());


@@ -51391,8 +51390,6 @@ void TableHeaderComponent::paint (Graphics& g)
ci->id == columnIdUnderMouse, ci->id == columnIdUnderMouse,
ci->id == columnIdUnderMouse && isMouseButtonDown(), ci->id == columnIdUnderMouse && isMouseButtonDown(),
ci->propertyFlags); ci->propertyFlags);

g.restoreState();
} }


x += ci->width; x += ci->width;
@@ -51807,11 +51804,11 @@ public:
const int columnId = header.getColumnIdOfIndex (i, true); const int columnId = header.getColumnIdOfIndex (i, true);
const Rectangle<int> columnRect (header.getColumnPosition(i).withHeight (getHeight())); const Rectangle<int> columnRect (header.getColumnPosition(i).withHeight (getHeight()));


g.saveState();
Graphics::ScopedSaveState ss (g);

g.reduceClipRegion (columnRect); g.reduceClipRegion (columnRect);
g.setOrigin (columnRect.getX(), 0); g.setOrigin (columnRect.getX(), 0);
model->paintCell (g, row, columnId, columnRect.getWidth(), columnRect.getHeight(), isSelected); model->paintCell (g, row, columnId, columnRect.getWidth(), columnRect.getHeight(), isSelected);
g.restoreState();
} }
} }
} }
@@ -53771,12 +53768,6 @@ void TextEditor::insertTextAtCaret (const String& newText_)
if (allowedCharacters.isNotEmpty()) if (allowedCharacters.isNotEmpty())
newText = newText.retainCharacters (allowedCharacters); newText = newText.retainCharacters (allowedCharacters);


if ((! returnKeyStartsNewLine) && newText == "\n")
{
returnPressed();
return;
}

if (! isMultiLine()) if (! isMultiLine())
newText = newText.replaceCharacters ("\r\n", " "); newText = newText.replaceCharacters ("\r\n", " ");
else else
@@ -54207,7 +54198,11 @@ bool TextEditor::keyPressed (const KeyPress& key)
else if (key == KeyPress::returnKey) else if (key == KeyPress::returnKey)
{ {
newTransaction(); newTransaction();
insertTextAtCaret ("\n");

if (returnKeyStartsNewLine)
insertTextAtCaret ("\n");
else
returnPressed();
} }
else if (key.isKeyCode (KeyPress::escapeKey)) else if (key.isKeyCode (KeyPress::escapeKey))
{ {
@@ -55772,13 +55767,12 @@ void ToolbarItemComponent::paintButton (Graphics& g, const bool over, const bool


if (! contentArea.isEmpty()) if (! contentArea.isEmpty())
{ {
g.saveState();
Graphics::ScopedSaveState ss (g);

g.reduceClipRegion (contentArea); g.reduceClipRegion (contentArea);
g.setOrigin (contentArea.getX(), contentArea.getY()); g.setOrigin (contentArea.getX(), contentArea.getY());


paintButtonArea (g, contentArea.getWidth(), contentArea.getHeight(), over, down); paintButtonArea (g, contentArea.getWidth(), contentArea.getHeight(), over, down);

g.restoreState();
} }
} }


@@ -57310,14 +57304,12 @@ void TreeViewItem::paintRecursively (Graphics& g, int width)
const int itemW = itemWidth < 0 ? width - indent : itemWidth; const int itemW = itemWidth < 0 ? width - indent : itemWidth;


{ {
g.saveState();
Graphics::ScopedSaveState ss (g);
g.setOrigin (indent, 0); g.setOrigin (indent, 0);


if (g.reduceClipRegion (drawsInLeftMargin ? -indent : 0, 0, if (g.reduceClipRegion (drawsInLeftMargin ? -indent : 0, 0,
drawsInLeftMargin ? itemW + indent : itemW, itemHeight)) drawsInLeftMargin ? itemW + indent : itemW, itemHeight))
paintItem (g, itemW, itemHeight); paintItem (g, itemW, itemHeight);

g.restoreState();
} }


g.setColour (ownerView->findColour (TreeView::linesColourId)); g.setColour (ownerView->findColour (TreeView::linesColourId));
@@ -57369,15 +57361,14 @@ void TreeViewItem::paintRecursively (Graphics& g, int width)


if (mightContainSubItems()) if (mightContainSubItems())
{ {
g.saveState();
Graphics::ScopedSaveState ss (g);

g.setOrigin (depth * indentWidth, 0); g.setOrigin (depth * indentWidth, 0);
g.reduceClipRegion (0, 0, indentWidth, itemHeight); g.reduceClipRegion (0, 0, indentWidth, itemHeight);


paintOpenCloseButton (g, indentWidth, itemHeight, paintOpenCloseButton (g, indentWidth, itemHeight,
static_cast <TreeViewContentComponent*> (ownerView->viewport->getViewedComponent()) static_cast <TreeViewContentComponent*> (ownerView->viewport->getViewedComponent())
->isMouseOverButton (this)); ->isMouseOverButton (this));

g.restoreState();
} }
} }


@@ -57396,13 +57387,12 @@ void TreeViewItem::paintRecursively (Graphics& g, int width)


if (relY + ti->totalHeight >= clip.getY()) if (relY + ti->totalHeight >= clip.getY())
{ {
g.saveState();
Graphics::ScopedSaveState ss (g);

g.setOrigin (0, relY); g.setOrigin (0, relY);


if (g.reduceClipRegion (0, 0, width, ti->totalHeight)) if (g.reduceClipRegion (0, 0, width, ti->totalHeight))
ti->paintRecursively (g, width); ti->paintRecursively (g, width);

g.restoreState();
} }
} }
} }
@@ -68388,7 +68378,8 @@ void MenuBarComponent::paint (Graphics& g)
{ {
for (int i = 0; i < menuNames.size(); ++i) for (int i = 0; i < menuNames.size(); ++i)
{ {
g.saveState();
Graphics::ScopedSaveState ss (g);

g.setOrigin (xPositions [i], 0); g.setOrigin (xPositions [i], 0);
g.reduceClipRegion (0, 0, xPositions[i + 1] - xPositions[i], getHeight()); g.reduceClipRegion (0, 0, xPositions[i + 1] - xPositions[i], getHeight());


@@ -68401,8 +68392,6 @@ void MenuBarComponent::paint (Graphics& g)
i == currentPopupIndex, i == currentPopupIndex,
isMouseOverBar, isMouseOverBar,
*this); *this);

g.restoreState();
} }
} }
} }
@@ -71178,13 +71167,12 @@ public:
return 0; return 0;
} }


const Point<int> getScreenPosition()
const Point<int> getScreenPosition() const
{ {
// This must only be called with the message manager locked!
jassert (MessageManager::getInstance()->currentThreadHasLockedMessageManager());

setScreenPos (MouseInputSource::getCurrentMousePosition(), Time::currentTimeMillis(), false);
return lastScreenPos + unboundedMouseOffset;
// This needs to return the live position if possible, but it mustn't update the lastScreenPos
// value, because that can cause continuity problems.
return unboundedMouseOffset + (isMouseDevice ? MouseInputSource::getCurrentMousePosition()
: lastScreenPos);
} }


void sendMouseEnter (Component* const comp, const Point<int>& screenPos, const int64 time) void sendMouseEnter (Component* const comp, const Point<int>& screenPos, const int64 time)
@@ -76371,10 +76359,6 @@ public:
setSelectAllWhenFocused (true); setSelectAllWhenFocused (true);
} }


~AlertWindowTextEditor()
{
}

void returnPressed() void returnPressed()
{ {
// pass these up the component hierarchy to be trigger the buttons // pass these up the component hierarchy to be trigger the buttons
@@ -77318,9 +77302,9 @@ void ComponentPeer::handlePaint (LowLevelGraphicsContext& contextToPaintTo)
{ {
Graphics g (&contextToPaintTo); Graphics g (&contextToPaintTo);


#if JUCE_ENABLE_REPAINT_DEBUGGING
#if JUCE_ENABLE_REPAINT_DEBUGGING
g.saveState(); g.saveState();
#endif
#endif


JUCE_TRY JUCE_TRY
{ {
@@ -77328,18 +77312,16 @@ void ComponentPeer::handlePaint (LowLevelGraphicsContext& contextToPaintTo)
} }
JUCE_CATCH_EXCEPTION JUCE_CATCH_EXCEPTION


#if JUCE_ENABLE_REPAINT_DEBUGGING
#if JUCE_ENABLE_REPAINT_DEBUGGING
// enabling this code will fill all areas that get repainted with a colour overlay, to show // enabling this code will fill all areas that get repainted with a colour overlay, to show
// clearly when things are being repainted. // clearly when things are being repainted.
{
g.restoreState();
g.restoreState();


g.fillAll (Colour ((uint8) Random::getSystemRandom().nextInt (255),
(uint8) Random::getSystemRandom().nextInt (255),
(uint8) Random::getSystemRandom().nextInt (255),
(uint8) 0x50));
}
#endif
g.fillAll (Colour ((uint8) Random::getSystemRandom().nextInt (255),
(uint8) Random::getSystemRandom().nextInt (255),
(uint8) Random::getSystemRandom().nextInt (255),
(uint8) 0x50));
#endif


/** If this fails, it's probably be because your CPU floating-point precision mode has /** If this fails, it's probably be because your CPU floating-point precision mode has
been set to low.. This setting is sometimes changed by things like Direct3D, and can been set to low.. This setting is sometimes changed by things like Direct3D, and can
@@ -82523,6 +82505,17 @@ void Graphics::drawImageTransformed (const Image& imageToDraw,
} }
} }


Graphics::ScopedSaveState::ScopedSaveState (Graphics& g)
: context (g)
{
context.saveState();
}

Graphics::ScopedSaveState::~ScopedSaveState()
{
context.restoreState();
}

END_JUCE_NAMESPACE END_JUCE_NAMESPACE
/*** End of inlined file: juce_Graphics.cpp ***/ /*** End of inlined file: juce_Graphics.cpp ***/


@@ -85673,7 +85666,8 @@ void Drawable::draw (Graphics& g, float opacity, const AffineTransform& transfor


void Drawable::nonConstDraw (Graphics& g, float opacity, const AffineTransform& transform) void Drawable::nonConstDraw (Graphics& g, float opacity, const AffineTransform& transform)
{ {
g.saveState();
Graphics::ScopedSaveState ss (g);

const float oldOpacity = getAlpha(); const float oldOpacity = getAlpha();
setAlpha (opacity); setAlpha (opacity);
g.addTransform (AffineTransform::translation ((float) -originRelativeToComponent.getX(), g.addTransform (AffineTransform::translation ((float) -originRelativeToComponent.getX(),
@@ -85685,7 +85679,6 @@ void Drawable::nonConstDraw (Graphics& g, float opacity, const AffineTransform&
paintEntireComponent (g, false); paintEntireComponent (g, false);


setAlpha (oldOpacity); setAlpha (oldOpacity);
g.restoreState();
} }


void Drawable::drawAt (Graphics& g, float x, float y, float opacity) const void Drawable::drawAt (Graphics& g, float x, float y, float opacity) const
@@ -252875,10 +252868,12 @@ public:
const int rx = roundToInt (dx), ry = roundToInt (dy); const int rx = roundToInt (dx), ry = roundToInt (dy);
const int rw = roundToInt (dw), rh = roundToInt (dh); const int rw = roundToInt (dw), rh = roundToInt (dh);


g.saveState();
g.excludeClipRegion (Rectangle<int> (rx, ry, rw, rh));
g.fillAll (Colours::black);
g.restoreState();
{
Graphics::ScopedSaveState ss (g);

g.excludeClipRegion (Rectangle<int> (rx, ry, rw, rh));
g.fillAll (Colours::black);
}


g.drawImage (activeImage, rx, ry, rw, rh, 0, 0, width, height); g.drawImage (activeImage, rx, ry, rw, rh, 0, 0, width, height);
} }


+ 23
- 2
juce_amalgamated.h View File

@@ -64,7 +64,7 @@
*/ */
#define JUCE_MAJOR_VERSION 1 #define JUCE_MAJOR_VERSION 1
#define JUCE_MINOR_VERSION 52 #define JUCE_MINOR_VERSION 52
#define JUCE_BUILDNUMBER 102
#define JUCE_BUILDNUMBER 103


/** Current Juce version number. /** Current Juce version number.


@@ -1198,12 +1198,14 @@ inline bool isPositiveAndBelow (Type valueToTest, Type upperLimit) throw()
return Type() <= valueToTest && valueToTest < upperLimit; return Type() <= valueToTest && valueToTest < upperLimit;
} }


#if ! JUCE_VC6
template <> template <>
inline bool isPositiveAndBelow (const int valueToTest, const int upperLimit) throw() inline bool isPositiveAndBelow (const int valueToTest, const int upperLimit) throw()
{ {
jassert (upperLimit >= 0); // makes no sense to call this if the upper limit is itself below zero.. jassert (upperLimit >= 0); // makes no sense to call this if the upper limit is itself below zero..
return static_cast <unsigned int> (valueToTest) < static_cast <unsigned int> (upperLimit); return static_cast <unsigned int> (valueToTest) < static_cast <unsigned int> (upperLimit);
} }
#endif


/** Returns true if a value is at least zero, and also less than or equal to a specified upper limit. /** Returns true if a value is at least zero, and also less than or equal to a specified upper limit.
This is basically a quicker way to write: This is basically a quicker way to write:
@@ -1217,12 +1219,14 @@ inline bool isPositiveAndNotGreaterThan (Type valueToTest, Type upperLimit) thro
return Type() <= valueToTest && valueToTest <= upperLimit; return Type() <= valueToTest && valueToTest <= upperLimit;
} }


#if ! JUCE_VC6
template <> template <>
inline bool isPositiveAndNotGreaterThan (const int valueToTest, const int upperLimit) throw() inline bool isPositiveAndNotGreaterThan (const int valueToTest, const int upperLimit) throw()
{ {
jassert (upperLimit >= 0); // makes no sense to call this if the upper limit is itself below zero.. jassert (upperLimit >= 0); // makes no sense to call this if the upper limit is itself below zero..
return static_cast <unsigned int> (valueToTest) <= static_cast <unsigned int> (upperLimit); return static_cast <unsigned int> (valueToTest) <= static_cast <unsigned int> (upperLimit);
} }
#endif


/** Handy function to swap two values over. /** Handy function to swap two values over.
*/ */
@@ -25090,15 +25094,32 @@ public:
bool isClipEmpty() const; bool isClipEmpty() const;


/** Saves the current graphics state on an internal stack. /** Saves the current graphics state on an internal stack.

To restore the state, use restoreState(). To restore the state, use restoreState().
@see ScopedSaveState
*/ */
void saveState(); void saveState();


/** Restores a graphics state that was previously saved with saveState(). /** Restores a graphics state that was previously saved with saveState().
@see ScopedSaveState
*/ */
void restoreState(); void restoreState();


/** Uses RAII to save and restore the state of a graphics context.
On construction, this calls Graphics::saveState(), and on destruction it calls
Graphics::restoreState() on the Graphics object that you supply.
*/
class ScopedSaveState
{
public:
ScopedSaveState (Graphics& g);
~ScopedSaveState();

private:
Graphics& context;

JUCE_DECLARE_NON_COPYABLE (ScopedSaveState);
};

/** Begins rendering to an off-screen bitmap which will later be flattened onto the current /** Begins rendering to an off-screen bitmap which will later be flattened onto the current
context with the given opacity. context with the given opacity.




+ 1
- 1
src/audio/audio_file_formats/juce_AudioFormatWriter.cpp View File

@@ -264,7 +264,7 @@ public:
void setThumbnail (AudioThumbnail* thumb) void setThumbnail (AudioThumbnail* thumb)
{ {
if (thumb != 0) if (thumb != 0)
thumb->reset (buffer.getNumChannels(), writer->sampleRate);
thumb->reset (buffer.getNumChannels(), writer->getSampleRate());
const ScopedLock sl (thumbnailLock); const ScopedLock sl (thumbnailLock);
thumbnailToUpdate = thumb; thumbnailToUpdate = thumb;


+ 1
- 1
src/audio/plugins/formats/juce_VSTPluginFormat.cpp View File

@@ -212,7 +212,7 @@ namespace
} }
//============================================================================== //==============================================================================
typedef AEffect* (*MainCall) (audioMasterCallback);
typedef AEffect* (VSTCALLBACK *MainCall) (audioMasterCallback);
static VstIntPtr VSTCALLBACK audioMaster (AEffect* effect, VstInt32 opcode, VstInt32 index, VstIntPtr value, void* ptr, float opt); static VstIntPtr VSTCALLBACK audioMaster (AEffect* effect, VstInt32 opcode, VstInt32 index, VstIntPtr value, void* ptr, float opt);


+ 4
- 0
src/core/juce_MathsFunctions.h View File

@@ -227,12 +227,14 @@ inline bool isPositiveAndBelow (Type valueToTest, Type upperLimit) throw()
return Type() <= valueToTest && valueToTest < upperLimit; return Type() <= valueToTest && valueToTest < upperLimit;
} }
#if ! JUCE_VC6
template <> template <>
inline bool isPositiveAndBelow (const int valueToTest, const int upperLimit) throw() inline bool isPositiveAndBelow (const int valueToTest, const int upperLimit) throw()
{ {
jassert (upperLimit >= 0); // makes no sense to call this if the upper limit is itself below zero.. jassert (upperLimit >= 0); // makes no sense to call this if the upper limit is itself below zero..
return static_cast <unsigned int> (valueToTest) < static_cast <unsigned int> (upperLimit); return static_cast <unsigned int> (valueToTest) < static_cast <unsigned int> (upperLimit);
} }
#endif
/** Returns true if a value is at least zero, and also less than or equal to a specified upper limit. /** Returns true if a value is at least zero, and also less than or equal to a specified upper limit.
This is basically a quicker way to write: This is basically a quicker way to write:
@@ -246,12 +248,14 @@ inline bool isPositiveAndNotGreaterThan (Type valueToTest, Type upperLimit) thro
return Type() <= valueToTest && valueToTest <= upperLimit; return Type() <= valueToTest && valueToTest <= upperLimit;
} }
#if ! JUCE_VC6
template <> template <>
inline bool isPositiveAndNotGreaterThan (const int valueToTest, const int upperLimit) throw() inline bool isPositiveAndNotGreaterThan (const int valueToTest, const int upperLimit) throw()
{ {
jassert (upperLimit >= 0); // makes no sense to call this if the upper limit is itself below zero.. jassert (upperLimit >= 0); // makes no sense to call this if the upper limit is itself below zero..
return static_cast <unsigned int> (valueToTest) <= static_cast <unsigned int> (upperLimit); return static_cast <unsigned int> (valueToTest) <= static_cast <unsigned int> (upperLimit);
} }
#endif
//============================================================================== //==============================================================================
/** Handy function to swap two values over. /** Handy function to swap two values over.


+ 1
- 1
src/core/juce_StandardHeader.h View File

@@ -33,7 +33,7 @@
*/ */
#define JUCE_MAJOR_VERSION 1 #define JUCE_MAJOR_VERSION 1
#define JUCE_MINOR_VERSION 52 #define JUCE_MINOR_VERSION 52
#define JUCE_BUILDNUMBER 102
#define JUCE_BUILDNUMBER 103
/** Current Juce version number. /** Current Juce version number.


+ 2
- 3
src/gui/components/controls/juce_TableHeaderComponent.cpp View File

@@ -543,7 +543,8 @@ void TableHeaderComponent::paint (Graphics& g)
|| dragOverlayComp == 0 || dragOverlayComp == 0
|| ! dragOverlayComp->isVisible())) || ! dragOverlayComp->isVisible()))
{ {
g.saveState();
Graphics::ScopedSaveState ss (g);
g.setOrigin (x, 0); g.setOrigin (x, 0);
g.reduceClipRegion (0, 0, ci->width, getHeight()); g.reduceClipRegion (0, 0, ci->width, getHeight());
@@ -551,8 +552,6 @@ void TableHeaderComponent::paint (Graphics& g)
ci->id == columnIdUnderMouse, ci->id == columnIdUnderMouse,
ci->id == columnIdUnderMouse && isMouseButtonDown(), ci->id == columnIdUnderMouse && isMouseButtonDown(),
ci->propertyFlags); ci->propertyFlags);
g.restoreState();
} }
x += ci->width; x += ci->width;


+ 2
- 2
src/gui/components/controls/juce_TableListBox.cpp View File

@@ -63,11 +63,11 @@ public:
const int columnId = header.getColumnIdOfIndex (i, true); const int columnId = header.getColumnIdOfIndex (i, true);
const Rectangle<int> columnRect (header.getColumnPosition(i).withHeight (getHeight())); const Rectangle<int> columnRect (header.getColumnPosition(i).withHeight (getHeight()));
g.saveState();
Graphics::ScopedSaveState ss (g);
g.reduceClipRegion (columnRect); g.reduceClipRegion (columnRect);
g.setOrigin (columnRect.getX(), 0); g.setOrigin (columnRect.getX(), 0);
model->paintCell (g, row, columnId, columnRect.getWidth(), columnRect.getHeight(), isSelected); model->paintCell (g, row, columnId, columnRect.getWidth(), columnRect.getHeight(), isSelected);
g.restoreState();
} }
} }
} }


+ 5
- 7
src/gui/components/controls/juce_TextEditor.cpp View File

@@ -1602,12 +1602,6 @@ void TextEditor::insertTextAtCaret (const String& newText_)
if (allowedCharacters.isNotEmpty()) if (allowedCharacters.isNotEmpty())
newText = newText.retainCharacters (allowedCharacters); newText = newText.retainCharacters (allowedCharacters);
if ((! returnKeyStartsNewLine) && newText == "\n")
{
returnPressed();
return;
}
if (! isMultiLine()) if (! isMultiLine())
newText = newText.replaceCharacters ("\r\n", " "); newText = newText.replaceCharacters ("\r\n", " ");
else else
@@ -2043,7 +2037,11 @@ bool TextEditor::keyPressed (const KeyPress& key)
else if (key == KeyPress::returnKey) else if (key == KeyPress::returnKey)
{ {
newTransaction(); newTransaction();
insertTextAtCaret ("\n");
if (returnKeyStartsNewLine)
insertTextAtCaret ("\n");
else
returnPressed();
} }
else if (key.isKeyCode (KeyPress::escapeKey)) else if (key.isKeyCode (KeyPress::escapeKey))
{ {


+ 2
- 3
src/gui/components/controls/juce_ToolbarItemComponent.cpp View File

@@ -205,13 +205,12 @@ void ToolbarItemComponent::paintButton (Graphics& g, const bool over, const bool
if (! contentArea.isEmpty()) if (! contentArea.isEmpty())
{ {
g.saveState();
Graphics::ScopedSaveState ss (g);
g.reduceClipRegion (contentArea); g.reduceClipRegion (contentArea);
g.setOrigin (contentArea.getX(), contentArea.getY()); g.setOrigin (contentArea.getX(), contentArea.getY());
paintButtonArea (g, contentArea.getWidth(), contentArea.getHeight(), over, down); paintButtonArea (g, contentArea.getWidth(), contentArea.getHeight(), over, down);
g.restoreState();
} }
} }


+ 5
- 9
src/gui/components/controls/juce_TreeView.cpp View File

@@ -1437,14 +1437,12 @@ void TreeViewItem::paintRecursively (Graphics& g, int width)
const int itemW = itemWidth < 0 ? width - indent : itemWidth; const int itemW = itemWidth < 0 ? width - indent : itemWidth;
{ {
g.saveState();
Graphics::ScopedSaveState ss (g);
g.setOrigin (indent, 0); g.setOrigin (indent, 0);
if (g.reduceClipRegion (drawsInLeftMargin ? -indent : 0, 0, if (g.reduceClipRegion (drawsInLeftMargin ? -indent : 0, 0,
drawsInLeftMargin ? itemW + indent : itemW, itemHeight)) drawsInLeftMargin ? itemW + indent : itemW, itemHeight))
paintItem (g, itemW, itemHeight); paintItem (g, itemW, itemHeight);
g.restoreState();
} }
g.setColour (ownerView->findColour (TreeView::linesColourId)); g.setColour (ownerView->findColour (TreeView::linesColourId));
@@ -1497,15 +1495,14 @@ void TreeViewItem::paintRecursively (Graphics& g, int width)
if (mightContainSubItems()) if (mightContainSubItems())
{ {
g.saveState();
Graphics::ScopedSaveState ss (g);
g.setOrigin (depth * indentWidth, 0); g.setOrigin (depth * indentWidth, 0);
g.reduceClipRegion (0, 0, indentWidth, itemHeight); g.reduceClipRegion (0, 0, indentWidth, itemHeight);
paintOpenCloseButton (g, indentWidth, itemHeight, paintOpenCloseButton (g, indentWidth, itemHeight,
static_cast <TreeViewContentComponent*> (ownerView->viewport->getViewedComponent()) static_cast <TreeViewContentComponent*> (ownerView->viewport->getViewedComponent())
->isMouseOverButton (this)); ->isMouseOverButton (this));
g.restoreState();
} }
} }
@@ -1524,13 +1521,12 @@ void TreeViewItem::paintRecursively (Graphics& g, int width)
if (relY + ti->totalHeight >= clip.getY()) if (relY + ti->totalHeight >= clip.getY())
{ {
g.saveState();
Graphics::ScopedSaveState ss (g);
g.setOrigin (0, relY); g.setOrigin (0, relY);
if (g.reduceClipRegion (0, 0, width, ti->totalHeight)) if (g.reduceClipRegion (0, 0, width, ti->totalHeight))
ti->paintRecursively (g, width); ti->paintRecursively (g, width);
g.restoreState();
} }
} }
} }


+ 2
- 4
src/gui/components/juce_Component.cpp View File

@@ -2426,8 +2426,6 @@ void Component::internalMouseUp (MouseInputSource& source, const Point<int>& rel
{ {
if (flags.mouseDownFlag) if (flags.mouseDownFlag)
{ {
Desktop& desktop = Desktop::getInstance();
flags.mouseDownFlag = false; flags.mouseDownFlag = false;
BailOutChecker checker (this); BailOutChecker checker (this);
@@ -2447,6 +2445,7 @@ void Component::internalMouseUp (MouseInputSource& source, const Point<int>& rel
if (checker.shouldBailOut()) if (checker.shouldBailOut())
return; return;
Desktop& desktop = Desktop::getInstance();
desktop.resetTimer(); desktop.resetTimer();
desktop.mouseListeners.callChecked (checker, &MouseListener::mouseUp, me); desktop.mouseListeners.callChecked (checker, &MouseListener::mouseUp, me);
@@ -2473,8 +2472,6 @@ void Component::internalMouseDrag (MouseInputSource& source, const Point<int>& r
{ {
if (flags.mouseDownFlag) if (flags.mouseDownFlag)
{ {
Desktop& desktop = Desktop::getInstance();
flags.mouseOverFlag = reallyContains (relativePos, false); flags.mouseOverFlag = reallyContains (relativePos, false);
BailOutChecker checker (this); BailOutChecker checker (this);
@@ -2491,6 +2488,7 @@ void Component::internalMouseDrag (MouseInputSource& source, const Point<int>& r
if (checker.shouldBailOut()) if (checker.shouldBailOut())
return; return;
Desktop& desktop = Desktop::getInstance();
desktop.resetTimer(); desktop.resetTimer();
desktop.mouseListeners.callChecked (checker, &MouseListener::mouseDrag, me); desktop.mouseListeners.callChecked (checker, &MouseListener::mouseDrag, me);


+ 2
- 3
src/gui/components/menus/juce_MenuBarComponent.cpp View File

@@ -91,7 +91,8 @@ void MenuBarComponent::paint (Graphics& g)
{ {
for (int i = 0; i < menuNames.size(); ++i) for (int i = 0; i < menuNames.size(); ++i)
{ {
g.saveState();
Graphics::ScopedSaveState ss (g);
g.setOrigin (xPositions [i], 0); g.setOrigin (xPositions [i], 0);
g.reduceClipRegion (0, 0, xPositions[i + 1] - xPositions[i], getHeight()); g.reduceClipRegion (0, 0, xPositions[i + 1] - xPositions[i], getHeight());
@@ -104,8 +105,6 @@ void MenuBarComponent::paint (Graphics& g)
i == currentPopupIndex, i == currentPopupIndex,
isMouseOverBar, isMouseOverBar,
*this); *this);
g.restoreState();
} }
} }
} }


+ 5
- 6
src/gui/components/mouse/juce_MouseInputSource.cpp View File

@@ -89,13 +89,12 @@ public:
return 0; return 0;
} }
const Point<int> getScreenPosition()
const Point<int> getScreenPosition() const
{ {
// This must only be called with the message manager locked!
jassert (MessageManager::getInstance()->currentThreadHasLockedMessageManager());
setScreenPos (MouseInputSource::getCurrentMousePosition(), Time::currentTimeMillis(), false);
return lastScreenPos + unboundedMouseOffset;
// This needs to return the live position if possible, but it mustn't update the lastScreenPos
// value, because that can cause continuity problems.
return unboundedMouseOffset + (isMouseDevice ? MouseInputSource::getCurrentMousePosition()
: lastScreenPos);
} }
//============================================================================== //==============================================================================


+ 0
- 4
src/gui/components/windows/juce_AlertWindow.cpp View File

@@ -47,10 +47,6 @@ public:
setSelectAllWhenFocused (true); setSelectAllWhenFocused (true);
} }
~AlertWindowTextEditor()
{
}
void returnPressed() void returnPressed()
{ {
// pass these up the component hierarchy to be trigger the buttons // pass these up the component hierarchy to be trigger the buttons


+ 9
- 11
src/gui/components/windows/juce_ComponentPeer.cpp View File

@@ -120,9 +120,9 @@ void ComponentPeer::handlePaint (LowLevelGraphicsContext& contextToPaintTo)
{ {
Graphics g (&contextToPaintTo); Graphics g (&contextToPaintTo);
#if JUCE_ENABLE_REPAINT_DEBUGGING
#if JUCE_ENABLE_REPAINT_DEBUGGING
g.saveState(); g.saveState();
#endif
#endif
JUCE_TRY JUCE_TRY
{ {
@@ -130,18 +130,16 @@ void ComponentPeer::handlePaint (LowLevelGraphicsContext& contextToPaintTo)
} }
JUCE_CATCH_EXCEPTION JUCE_CATCH_EXCEPTION
#if JUCE_ENABLE_REPAINT_DEBUGGING
#if JUCE_ENABLE_REPAINT_DEBUGGING
// enabling this code will fill all areas that get repainted with a colour overlay, to show // enabling this code will fill all areas that get repainted with a colour overlay, to show
// clearly when things are being repainted. // clearly when things are being repainted.
{
g.restoreState();
g.restoreState();
g.fillAll (Colour ((uint8) Random::getSystemRandom().nextInt (255),
(uint8) Random::getSystemRandom().nextInt (255),
(uint8) Random::getSystemRandom().nextInt (255),
(uint8) 0x50));
}
#endif
g.fillAll (Colour ((uint8) Random::getSystemRandom().nextInt (255),
(uint8) Random::getSystemRandom().nextInt (255),
(uint8) Random::getSystemRandom().nextInt (255),
(uint8) 0x50));
#endif
/** If this fails, it's probably be because your CPU floating-point precision mode has /** If this fails, it's probably be because your CPU floating-point precision mode has
been set to low.. This setting is sometimes changed by things like Direct3D, and can been set to low.. This setting is sometimes changed by things like Direct3D, and can


+ 12
- 0
src/gui/graphics/contexts/juce_Graphics.cpp View File

@@ -719,5 +719,17 @@ void Graphics::drawImageTransformed (const Image& imageToDraw,
} }
} }
//==============================================================================
Graphics::ScopedSaveState::ScopedSaveState (Graphics& g)
: context (g)
{
context.saveState();
}
Graphics::ScopedSaveState::~ScopedSaveState()
{
context.restoreState();
}
END_JUCE_NAMESPACE END_JUCE_NAMESPACE

+ 20
- 1
src/gui/graphics/contexts/juce_Graphics.h View File

@@ -603,16 +603,35 @@ public:
/** Returns true if no drawing can be done because the clip region is zero. */ /** Returns true if no drawing can be done because the clip region is zero. */
bool isClipEmpty() const; bool isClipEmpty() const;
//==============================================================================
/** Saves the current graphics state on an internal stack. /** Saves the current graphics state on an internal stack.
To restore the state, use restoreState(). To restore the state, use restoreState().
@see ScopedSaveState
*/ */
void saveState(); void saveState();
/** Restores a graphics state that was previously saved with saveState(). /** Restores a graphics state that was previously saved with saveState().
@see ScopedSaveState
*/ */
void restoreState(); void restoreState();
/** Uses RAII to save and restore the state of a graphics context.
On construction, this calls Graphics::saveState(), and on destruction it calls
Graphics::restoreState() on the Graphics object that you supply.
*/
class ScopedSaveState
{
public:
ScopedSaveState (Graphics& g);
~ScopedSaveState();
private:
Graphics& context;
JUCE_DECLARE_NON_COPYABLE (ScopedSaveState);
};
//==============================================================================
/** Begins rendering to an off-screen bitmap which will later be flattened onto the current /** Begins rendering to an off-screen bitmap which will later be flattened onto the current
context with the given opacity. context with the given opacity.


+ 2
- 2
src/gui/graphics/drawables/juce_Drawable.cpp View File

@@ -58,7 +58,8 @@ void Drawable::draw (Graphics& g, float opacity, const AffineTransform& transfor
void Drawable::nonConstDraw (Graphics& g, float opacity, const AffineTransform& transform) void Drawable::nonConstDraw (Graphics& g, float opacity, const AffineTransform& transform)
{ {
g.saveState();
Graphics::ScopedSaveState ss (g);
const float oldOpacity = getAlpha(); const float oldOpacity = getAlpha();
setAlpha (opacity); setAlpha (opacity);
g.addTransform (AffineTransform::translation ((float) -originRelativeToComponent.getX(), g.addTransform (AffineTransform::translation ((float) -originRelativeToComponent.getX(),
@@ -70,7 +71,6 @@ void Drawable::nonConstDraw (Graphics& g, float opacity, const AffineTransform&
paintEntireComponent (g, false); paintEntireComponent (g, false);
setAlpha (oldOpacity); setAlpha (oldOpacity);
g.restoreState();
} }
void Drawable::drawAt (Graphics& g, float x, float y, float opacity) const void Drawable::drawAt (Graphics& g, float x, float y, float opacity) const


+ 6
- 4
src/native/windows/juce_win32_CameraDevice.cpp View File

@@ -244,10 +244,12 @@ public:
const int rx = roundToInt (dx), ry = roundToInt (dy); const int rx = roundToInt (dx), ry = roundToInt (dy);
const int rw = roundToInt (dw), rh = roundToInt (dh); const int rw = roundToInt (dw), rh = roundToInt (dh);
g.saveState();
g.excludeClipRegion (Rectangle<int> (rx, ry, rw, rh));
g.fillAll (Colours::black);
g.restoreState();
{
Graphics::ScopedSaveState ss (g);
g.excludeClipRegion (Rectangle<int> (rx, ry, rw, rh));
g.fillAll (Colours::black);
}
g.drawImage (activeImage, rx, ry, rw, rh, 0, 0, width, height); g.drawImage (activeImage, rx, ry, rw, rh, 0, 0, width, height);
} }


Loading…
Cancel
Save