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

Major change to the way the Image class works, making it use value semantics and internally shared data (see the forum notes for more info on this). Also minor changes to win32 browser plugin object ref counting and linux millisecond timers.

This commit is contained in:
Julian Storer 2010-06-01 18:01:13 +01:00
parent 1baaa016bd
commit 24673283eb
121 changed files with 2763 additions and 2930 deletions

View file

@ -144,6 +144,7 @@
#include "../src/threads/juce_Thread.cpp"
#include "../src/threads/juce_ThreadPool.cpp"
#include "../src/threads/juce_TimeSliceThread.cpp"
#include "../src/utilities/juce_DeletedAtShutdown.cpp"
#endif
#if JUCE_BUILD_MISC
@ -154,7 +155,6 @@
#include "../src/application/juce_ApplicationCommandManager.cpp"
#include "../src/application/juce_ApplicationCommandTarget.cpp"
#include "../src/application/juce_ApplicationProperties.cpp"
#include "../src/utilities/juce_DeletedAtShutdown.cpp"
#include "../src/utilities/juce_PropertiesFile.cpp"
#include "../src/utilities/juce_FileBasedDocument.cpp"
#include "../src/utilities/juce_RecentlyOpenedFilesList.cpp"

View file

@ -275,12 +275,12 @@ const ValueTree DrawableDocument::performNewItemMenuItem (int menuResultCode)
}
//==============================================================================
Image* DrawableDocument::getImageForIdentifier (const var& imageIdentifier)
const Image DrawableDocument::getImageForIdentifier (const var& imageIdentifier)
{
return ImageCache::getFromMemory (BinaryData::juce_icon_png, BinaryData::juce_icon_pngSize);
}
const var DrawableDocument::getIdentifierForImage (Image* image)
const var DrawableDocument::getIdentifierForImage (const Image& image)
{
return var::null; //xxx todo
}

View file

@ -97,8 +97,8 @@ public:
const String getNonexistentMarkerName (const String& name);
void renameAnchor (const String& oldName, const String& newName);
Image* getImageForIdentifier (const var& imageIdentifier);
const var getIdentifierForImage (Image* image);
const Image getImageForIdentifier (const var& imageIdentifier);
const var getIdentifierForImage (const Image& image);
//==============================================================================
void valueTreePropertyChanged (ValueTree& tree, const Identifier& name);

View file

@ -661,7 +661,7 @@ bool Project::Item::addFile (const File& file, int insertIndex)
return true;
}
Image* Project::Item::getIcon() const
const Image Project::Item::getIcon() const
{
if (isFile())
return LookAndFeel::getDefaultLookAndFeel().getDefaultDocumentFileImage();

View file

@ -192,7 +192,7 @@ public:
Item getParent() const;
Image* getIcon() const;
const Image getIcon() const;
private:
//==============================================================================

View file

@ -124,7 +124,7 @@ namespace ComponentEditorTreeView
const String getDisplayName() const { return getRenamingName(); }
const String getRenamingName() const { return componentState [ComponentDocument::memberNameProperty]; }
Image* getIcon() const { return LookAndFeel::getDefaultLookAndFeel().getDefaultDocumentFileImage(); }
const Image getIcon() const { return LookAndFeel::getDefaultLookAndFeel().getDefaultDocumentFileImage(); }
const String getDragSourceDescription() { return getDragIdFor (editor); }
@ -179,7 +179,7 @@ namespace ComponentEditorTreeView
const String getDisplayName() const { return getRenamingName(); }
const String getRenamingName() const { return "Components"; }
Image* getIcon() const { return LookAndFeel::getDefaultLookAndFeel().getDefaultFolderImage(); }
const Image getIcon() const { return LookAndFeel::getDefaultLookAndFeel().getDefaultFolderImage(); }
const String getDragSourceDescription() { return String::empty; }
bool isInterestedInDragSource (const String& sourceDescription, Component* sourceComponent)
@ -299,7 +299,7 @@ namespace ComponentEditorTreeView
const String getDisplayName() const { return getRenamingName(); }
const String getRenamingName() const { return markerState [MarkerListBase::getMarkerNameProperty()]; }
Image* getIcon() const { return LookAndFeel::getDefaultLookAndFeel().getDefaultDocumentFileImage(); }
const Image getIcon() const { return LookAndFeel::getDefaultLookAndFeel().getDefaultDocumentFileImage(); }
const String getDragSourceDescription() { return String::empty; }
@ -354,7 +354,7 @@ namespace ComponentEditorTreeView
const String getDisplayName() const { return getRenamingName(); }
const String getRenamingName() const { return isX ? "Markers (X-axis)" : "Markers (Y-axis)"; }
Image* getIcon() const { return LookAndFeel::getDefaultLookAndFeel().getDefaultFolderImage(); }
const Image getIcon() const { return LookAndFeel::getDefaultLookAndFeel().getDefaultFolderImage(); }
const String getDragSourceDescription() { return String::empty; }
private:
@ -388,7 +388,7 @@ namespace ComponentEditorTreeView
const String getDisplayName() const { return getRenamingName(); }
const String getRenamingName() const { return editor.getDocument().getClassName().toString(); }
Image* getIcon() const { return LookAndFeel::getDefaultLookAndFeel().getDefaultFolderImage(); }
const Image getIcon() const { return LookAndFeel::getDefaultLookAndFeel().getDefaultFolderImage(); }
const String getDragSourceDescription() { return String::empty; }
};
}

View file

@ -124,7 +124,7 @@ public:
bool isMissing() { return false; }
Image* getIcon() const
const Image getIcon() const
{
return LookAndFeel::getDefaultLookAndFeel().getDefaultDocumentFileImage();
}

View file

@ -454,9 +454,15 @@ public:
{
lasso->dragLasso (e);
}
else if (mouseDownCompUID.isNotEmpty() && (! e.mouseWasClicked()) && (! e.mods.isPopupMenu()))
else
{
if (! isDraggingClickedComp)
if ((! isDraggingClickedComp)
&& mouseDownCompUID.isNotEmpty()
&& (! e.mouseWasClicked())
&& (! e.mods.isPopupMenu())
&& e.getDistanceFromDragStart() > 7) // whenever this drag occurs, it's selecting the object
// and beginning a drag, so allow for more wobble than
// when when dragging an already-selected object
{
isDraggingClickedComp = true;
canvas->enableResizingMode();
@ -464,8 +470,11 @@ public:
canvas->beginDrag (e.withNewPosition (e.getMouseDownPosition()), ResizableBorderComponent::Zone (ResizableBorderComponent::Zone::centre));
}
canvas->continueDrag (e);
showSizeGuides();
if (isDraggingClickedComp)
{
canvas->continueDrag (e);
showSizeGuides();
}
}
autoScrollForMouseEvent (e);

View file

@ -190,10 +190,9 @@ private:
void paint (Graphics& g)
{
Image* im = ImageCache::getFromMemory (BinaryData::brushed_aluminium_png, BinaryData::brushed_aluminium_pngSize);
g.setTiledImageFill (*im, 0, 0, 1.0f);
g.setTiledImageFill (ImageCache::getFromMemory (BinaryData::brushed_aluminium_png, BinaryData::brushed_aluminium_pngSize),
0, 0, 1.0f);
g.fillAll();
ImageCache::release (im);
}
void paintOverChildren (Graphics& g)

View file

@ -97,16 +97,9 @@ public:
void paint (Graphics& g)
{
int x = getHeight() + 6;
Image* icon = item.getIcon();
if (icon != 0)
{
g.drawImageWithin (icon, 2, 2, x - 4, getHeight() - 4,
RectanglePlacement::centred | RectanglePlacement::onlyReduceInSize,
false);
ImageCache::release (icon);
}
g.drawImageWithin (item.getIcon(), 2, 2, x - 4, getHeight() - 4,
RectanglePlacement::centred | RectanglePlacement::onlyReduceInSize,
false);
g.setColour (Colours::black);
g.setFont (getHeight() * 0.6f);

View file

@ -61,8 +61,8 @@ void ItemPreviewComponent::tryToLoadImage (InputStream* in)
image = ImageFileFormat::loadFrom (*input);
if (image != 0)
facts.add (String (image->getWidth()) + " x " + String (image->getHeight()) + formatName);
if (image.isValid())
facts.add (String (image.getWidth()) + " x " + String (image.getHeight()) + formatName);
const int64 totalSize = input->getTotalLength();
@ -73,19 +73,14 @@ void ItemPreviewComponent::tryToLoadImage (InputStream* in)
void ItemPreviewComponent::paint (Graphics& g)
{
if (image != 0)
{
g.drawImageWithin (image,
2, 22, getWidth() - 4, getHeight() - 24,
RectanglePlacement::centred | RectanglePlacement::onlyReduceInSize,
false);
}
g.drawImageWithin (image, 2, 22, getWidth() - 4, getHeight() - 24,
RectanglePlacement::centred | RectanglePlacement::onlyReduceInSize,
false);
g.setFont (15.0f, Font::bold);
g.setColour (Colours::white);
g.drawMultiLineText (facts.joinIntoString ("\n"),
10, 15, getWidth() - 16);
}
void ItemPreviewComponent::resized()

View file

@ -48,7 +48,7 @@ public:
private:
StringArray facts;
File file;
ScopedPointer <Image> image;
Image image;
void tryToLoadImage (InputStream* input);
};

View file

@ -175,10 +175,9 @@ ProjectInformationComponent::~ProjectInformationComponent()
void ProjectInformationComponent::paint (Graphics& g)
{
//[UserPrePaint] Add your own custom painting code here..
Image* im = ImageCache::getFromMemory (BinaryData::brushed_aluminium_png, BinaryData::brushed_aluminium_pngSize);
g.setTiledImageFill (*im, 0, 0, 1.0f);
g.setTiledImageFill (ImageCache::getFromMemory (BinaryData::brushed_aluminium_png, BinaryData::brushed_aluminium_pngSize),
0, 0, 1.0f);
g.fillAll();
ImageCache::release (im);
drawRecessedShadows (g, getWidth(), getHeight(), 14);
//[/UserPrePaint]

View file

@ -104,7 +104,7 @@ protected:
//==============================================================================
virtual void addSubItems();
virtual ProjectTreeViewBase* createSubItem (const Project::Item& node) = 0;
Image* getIcon() const { return item.getIcon(); }
const Image getIcon() const { return item.getIcon(); }
//==============================================================================
void triggerAsyncRename (const Project::Item& itemToRename);

View file

@ -54,16 +54,10 @@ void JucerTreeViewBase::paintItem (Graphics& g, int width, int height)
const int x = getTextX();
g.setColour (isMissing() ? Colours::red : Colours::black);
Image* icon = getIcon();
if (icon != 0)
{
g.drawImageWithin (icon, 2, 2, x - 4, height - 4,
RectanglePlacement::centred | RectanglePlacement::onlyReduceInSize,
false);
ImageCache::release (icon);
}
g.drawImageWithin (getIcon(), 2, 2, x - 4, height - 4,
RectanglePlacement::centred | RectanglePlacement::onlyReduceInSize,
false);
g.setFont (getFont());
g.drawFittedText (getDisplayName(), x, 0, width - x, height, Justification::centredLeft, 1, 0.8f);

View file

@ -52,7 +52,7 @@ public:
virtual const String getDisplayName() const = 0;
virtual void setName (const String& newName) = 0;
virtual bool isMissing() = 0;
virtual Image* getIcon() const = 0;
virtual const Image getIcon() const = 0;
virtual void showRenameBox();

View file

@ -130,7 +130,7 @@ public:
else if (b == &imageButton)
{
if (! currentFill.isTiledImage())
setFillType (FillType (*StoredSettings::getInstance()->getFallbackImage(),
setFillType (FillType (StoredSettings::getInstance()->getFallbackImage(),
AffineTransform::identity));
}
}

View file

@ -135,9 +135,9 @@ const StringArray& StoredSettings::getFontNames()
return fontNames;
}
Image* StoredSettings::getFallbackImage()
const Image StoredSettings::getFallbackImage()
{
if (fallbackImage == 0)
if (fallbackImage.isNull())
fallbackImage = ImageFileFormat::loadFrom (BinaryData::juce_icon_png, BinaryData::juce_icon_pngSize);
return fallbackImage;

View file

@ -69,7 +69,7 @@ public:
};
Image* getFallbackImage();
const Image getFallbackImage();
//==============================================================================
juce_UseDebuggingNewOperator
@ -78,7 +78,7 @@ private:
ScopedPointer<PropertiesFile> props;
StringArray fontNames;
ScopedPointer<Image> fallbackImage;
Image fallbackImage;
};

View file

@ -164,7 +164,7 @@ class IDispatchWrappingDynamicObject : public IDispatch
public:
IDispatchWrappingDynamicObject (const var& object_)
: object (object_),
refCount (0)
refCount (1)
{
DBG ("num Juce wrapper objs: " + String (++numJuceSO));
}

View file

@ -42,7 +42,6 @@ public:
cameraDevice = 0;
cameraPreviewComp = 0;
lastSnapshot = 0;
recordingMovie = false;
addAndMakeVisible (cameraSelectorComboBox = new ComboBox (T("Camera")));
@ -65,16 +64,14 @@ public:
{
deleteAllChildren();
delete cameraDevice;
delete lastSnapshot;
}
void paint (Graphics& g)
{
if (lastSnapshot != 0)
g.drawImageWithin (lastSnapshot,
getWidth() / 2 + 10, 40,
getWidth() / 2 - 20, getHeight() - 50,
RectanglePlacement::centred, false);
g.drawImageWithin (lastSnapshot,
getWidth() / 2 + 10, 40,
getWidth() / 2 - 20, getHeight() - 50,
RectanglePlacement::centred, false);
}
void resized()
@ -160,7 +157,7 @@ public:
}
// This is called by the camera device when a new image arrives
void imageReceived (Image& image)
void imageReceived (const Image& image)
{
// In this app we just want to take one image, so as soon as this happens,
// we'll unregister ourselves as a listener.
@ -170,8 +167,7 @@ public:
// This callback won't be on the message thread, so need to lock it before using
// data that may already be in use..
const MessageManagerLock mm;
deleteAndZero (lastSnapshot);
lastSnapshot = image.createCopy();
lastSnapshot = image;
repaint();
}
@ -185,7 +181,7 @@ private:
Component* cameraPreviewComp;
bool recordingMovie;
Image* lastSnapshot;
Image lastSnapshot;
};

View file

@ -56,7 +56,7 @@ class DemoOpenGLCanvas : public OpenGLComponent,
public Timer
{
float rotation, delta;
Image* image;
Image image;
public:
DemoOpenGLCanvas()
@ -69,12 +69,12 @@ public:
rotation = 0.0f;
delta = 1.0f;
Image* im = ImageFileFormat::loadFrom (BinaryData::juce_png, BinaryData::juce_pngSize);
image = new Image (Image::RGB, 512, 512, true);
Graphics g (*image);
image = Image (Image::RGB, 512, 512, true, Image::SoftwareImage);
Graphics g (image);
g.fillAll (Colours::white);
g.drawImage (im, 0, 0, 512, 512, 0, 0, im->getWidth(), im->getHeight());
delete im;
g.drawImageWithin (ImageFileFormat::loadFrom (BinaryData::juce_png, BinaryData::juce_pngSize),
0, 0, 512, 512, RectanglePlacement::stretchToFit);
startTimer (20);
@ -107,7 +107,6 @@ public:
~DemoOpenGLCanvas()
{
delete image;
}
// when the component creates a new internal context, this is called, and
@ -133,9 +132,9 @@ public:
glPixelStorei (GL_UNPACK_ALIGNMENT, 4);
Image::BitmapData srcData (*image, 0, 0, image->getWidth(), image->getHeight());
Image::BitmapData srcData (image, 0, 0, image.getWidth(), image.getHeight());
glTexImage2D (GL_TEXTURE_2D, 0, 4, image->getWidth(), image->getHeight(),
glTexImage2D (GL_TEXTURE_2D, 0, 4, image.getWidth(), image.getHeight(),
0, GL_RGB,
GL_UNSIGNED_BYTE, srcData.data);

View file

@ -68,8 +68,6 @@ public:
~RenderingTestCanvas()
{
delete rgbImage;
delete argbImage;
delete svgDrawable;
}
@ -151,8 +149,7 @@ private:
RenderingTestComponent& owner;
double averageTime;
Image* rgbImage;
Image* argbImage;
Image rgbImage, argbImage;
DrawableComposite* svgDrawable;
GlyphArrangement glyphs;
ColourGradient linearGradient, radialGradient;
@ -191,12 +188,12 @@ private:
void clipToImage (Graphics& g)
{
AffineTransform transform (AffineTransform::translation (argbImage->getWidth() / -2.0f, argbImage->getHeight() / -2.0f)
AffineTransform transform (AffineTransform::translation (argbImage.getWidth() / -2.0f, argbImage.getHeight() / -2.0f)
.rotated (bouncingNumber[3])
.scaled (bouncingNumber[2] + 4.0f, bouncingNumber[2] + 4.0f)
.translated (bouncingPointX[2], bouncingPointY[2]));
g.reduceClipRegion (*argbImage,
Rectangle<int> (0, 0, argbImage->getWidth(), argbImage->getHeight()),
g.reduceClipRegion (argbImage,
Rectangle<int> (0, 0, argbImage.getWidth(), argbImage.getHeight()),
transform);
}
@ -264,24 +261,24 @@ private:
g.strokePath (p, stroke, AffineTransform::identity);
}
void drawImages (Graphics& g, Image* image)
void drawImages (Graphics& g, const Image& image)
{
AffineTransform transform (AffineTransform::translation ((float) (image->getWidth() / -2),
(float) (image->getHeight() / -2))
AffineTransform transform (AffineTransform::translation ((float) (image.getWidth() / -2),
(float) (image.getHeight() / -2))
.followedBy (getTransform()));
g.setOpacity ((float) owner.opacitySlider->getValue());
g.drawImageTransformed (image, image->getBounds(),
g.drawImageTransformed (image, image.getBounds(),
transform, false);
}
void drawTiling (Graphics& g, Image* image)
void drawTiling (Graphics& g, const Image& image)
{
AffineTransform transform (AffineTransform::translation ((float) (image->getWidth() / -2),
(float) (image->getHeight() / -2))
AffineTransform transform (AffineTransform::translation ((float) (image.getWidth() / -2),
(float) (image.getHeight() / -2))
.followedBy (getTransform()));
FillType fill (*image, transform);
FillType fill (image, transform);
fill.setOpacity ((float) owner.opacitySlider->getValue());
g.setFillType (fill);
g.fillAll();

View file

@ -512,7 +512,7 @@ public:
over.setStrokeThickness (5.0f);
DrawableImage down;
down.setImage (ImageCache::getFromMemory (BinaryData::juce_png, BinaryData::juce_pngSize), true);
down.setImage (ImageCache::getFromMemory (BinaryData::juce_png, BinaryData::juce_pngSize));
down.setOverlayColour (Colours::black.withAlpha (0.3f));
//==============================================================================
@ -567,10 +567,7 @@ public:
ImageButton* imageButton = new ImageButton ("imagebutton");
addAndMakeVisible (imageButton);
Image* juceImage = ImageCache::getFromMemory (BinaryData::juce_png, BinaryData::juce_pngSize);
ImageCache::incReferenceCount (juceImage);
ImageCache::incReferenceCount (juceImage);
Image juceImage = ImageCache::getFromMemory (BinaryData::juce_png, BinaryData::juce_pngSize);
imageButton->setImages (true, true, true,
juceImage, 0.7f, Colours::transparentBlack,
juceImage, 1.0f, Colours::transparentBlack,

View file

@ -166,7 +166,7 @@ public:
const String resName (getImageResource (ib, role));
if (resName.isEmpty())
return "0";
return "Image()";
return "ImageCache::getFromMemory (" + resName + ", " + resName + "Size)";
}
@ -522,9 +522,9 @@ public:
//==============================================================================
static void updateButtonImages (JucerDocument& document, ImageButton* const ib)
{
Image* norm = document.getResources().getImageFromCache (getImageResource (ib, normalImage));
Image* over = document.getResources().getImageFromCache (getImageResource (ib, overImage));
Image* down = document.getResources().getImageFromCache (getImageResource (ib, downImage));
Image norm = document.getResources().getImageFromCache (getImageResource (ib, normalImage));
Image over = document.getResources().getImageFromCache (getImageResource (ib, overImage));
Image down = document.getResources().getImageFromCache (getImageResource (ib, downImage));
ib->setImages (false, true, doesImageKeepProportions (ib),
norm,

View file

@ -199,14 +199,14 @@ const Drawable* BinaryResources::getDrawable (const String& name) const
return res->drawable;
}
Image* BinaryResources::getImageFromCache (const String& name) const
const Image BinaryResources::getImageFromCache (const String& name) const
{
const BinaryResources::BinaryResource* const res = getResource (name);
if (res != 0 && res->data.getSize() > 0)
return ImageCache::getFromMemory (res->data.getData(), (int) res->data.getSize());
return 0;
return Image();
}
void BinaryResources::loadFromCpp (const File& cppFileLocation, const String& cppFile)

View file

@ -76,7 +76,7 @@ public:
const StringArray getResourceNames() const;
const Drawable* getDrawable (const String& name) const;
Image* getImageFromCache (const String& name) const;
const Image getImageFromCache (const String& name) const;
template <class ElementComparator>
void sort (ElementComparator& sorter)

View file

@ -98,16 +98,13 @@ void GeneratedCode::addImageResourceLoader (const String& imageMemberName, const
initialisers.add (initialiser);
privateMemberDeclarations
<< "Image* " << imageMemberName << ";\n";
<< "Image " << imageMemberName << ";\n";
if (resourceName.isNotEmpty())
{
constructorCode
<< imageMemberName << " = ImageCache::getFromMemory ("
<< resourceName << ", " << resourceName << "Size);\n";
destructorCode
<< "ImageCache::release (" << imageMemberName << ");\n";
}
}
}

View file

@ -36,7 +36,7 @@ JucerFillType::JucerFillType()
JucerFillType::JucerFillType (const JucerFillType& other)
{
image = 0;
image = Image();
mode = other.mode;
colour = other.colour;
gradCol1 = other.gradCol1;
@ -50,9 +50,7 @@ JucerFillType::JucerFillType (const JucerFillType& other)
JucerFillType& JucerFillType::operator= (const JucerFillType& other)
{
ImageCache::release (image);
image = 0;
image = Image();
mode = other.mode;
colour = other.colour;
gradCol1 = other.gradCol1;
@ -68,7 +66,6 @@ JucerFillType& JucerFillType::operator= (const JucerFillType& other)
JucerFillType::~JucerFillType()
{
ImageCache::release (image);
}
bool JucerFillType::operator== (const JucerFillType& other) const throw()
@ -91,9 +88,7 @@ bool JucerFillType::operator!= (const JucerFillType& other) const throw()
void JucerFillType::reset()
{
ImageCache::release (image);
image = 0;
image = Image();
mode = solidColour;
colour = Colours::brown.withHue (Random::getSystemRandom().nextFloat());
gradCol1 = Colours::red;
@ -114,9 +109,7 @@ void JucerFillType::setFillType (Graphics& g, JucerDocument* const document, con
{
if (mode == solidColour)
{
ImageCache::release (image);
image = 0;
image = Image();
g.setColour (colour);
}
else if (mode == imageBrush)
@ -125,12 +118,11 @@ void JucerFillType::setFillType (Graphics& g, JucerDocument* const document, con
Rectangle<int> r (imageAnchor.getRectangle (parentArea, document->getComponentLayout()));
g.setTiledImageFill (*image, r.getX(), r.getY(), (float) imageOpacity);
g.setTiledImageFill (image, r.getX(), r.getY(), (float) imageOpacity);
}
else
{
ImageCache::release (image);
image = 0;
image = Image();
Rectangle<int> r1 (gradPos1.getRectangle (parentArea, document->getComponentLayout()));
Rectangle<int> r2 (gradPos2.getRectangle (parentArea, document->getComponentLayout()));
@ -285,9 +277,9 @@ bool JucerFillType::isOpaque() const
return gradCol1.isOpaque() && gradCol1.isOpaque();
case imageBrush:
return image != 0
return image.isValid()
&& imageOpacity >= 1.0f
&& ! image->hasAlphaChannel();
&& ! image.hasAlphaChannel();
default:
jassertfalse
@ -321,28 +313,28 @@ bool JucerFillType::isInvisible() const
void JucerFillType::loadImage (JucerDocument* const document)
{
if (image == 0)
if (image.isNull())
{
if (document != 0)
image = document->getResources().getImageFromCache (imageResourceName);
if (image == 0)
if (image.isNull())
{
const int hashCode = 0x3437856f;
image = ImageCache::getFromHashCode (hashCode);
if (image == 0)
if (image.isNull())
{
image = new Image (Image::RGB, 100, 100, true);
image = Image (Image::RGB, 100, 100, true);
Graphics g (*image);
g.fillCheckerBoard (0, 0, image->getWidth(), image->getHeight(),
image->getWidth() / 2, image->getHeight() / 2,
Graphics g (image);
g.fillCheckerBoard (0, 0, image.getWidth(), image.getHeight(),
image.getWidth() / 2, image.getHeight() / 2,
Colours::white, Colours::lightgrey);
g.setFont (12.0f);
g.setColour (Colours::grey);
g.drawText (T("(image missing)"), 0, 0, image->getWidth(), image->getHeight() / 2, Justification::centred, true);
g.drawText (T("(image missing)"), 0, 0, image.getWidth(), image.getHeight() / 2, Justification::centred, true);
ImageCache::addImageToCache (image, hashCode);
}

View file

@ -78,7 +78,7 @@ public:
//==============================================================================
private:
Image* image;
Image image;
void reset();
void loadImage (JucerDocument* const document);

View file

@ -184,10 +184,10 @@ const Rectangle<int> ComponentLayoutEditor::getComponentArea() const
}
}
Image* ComponentLayoutEditor::createComponentLayerSnapshot() const
const Image ComponentLayoutEditor::createComponentLayerSnapshot() const
{
((SubComponentHolderComp*) subCompHolder)->dontFillBackground = true;
Image* const im = subCompHolder->createComponentSnapshot (Rectangle<int> (0, 0, subCompHolder->getWidth(), subCompHolder->getHeight()));
Image im = subCompHolder->createComponentSnapshot (Rectangle<int> (0, 0, subCompHolder->getWidth(), subCompHolder->getHeight()));
((SubComponentHolderComp*) subCompHolder)->dontFillBackground = false;
return im;

View file

@ -72,7 +72,7 @@ public:
const Rectangle<int> getComponentArea() const;
Image* createComponentLayerSnapshot() const;
const Image createComponentLayerSnapshot() const;
//==============================================================================
juce_UseDebuggingNewOperator

View file

@ -120,7 +120,7 @@ const Rectangle<int> ComponentLayoutPanel::getComponentArea() const
return ((ComponentLayoutEditor*) editor)->getComponentArea();
}
Image* ComponentLayoutPanel::createComponentSnapshot() const
const Image ComponentLayoutPanel::createComponentSnapshot() const
{
return ((ComponentLayoutEditor*) editor)->createComponentLayerSnapshot();
}

View file

@ -45,7 +45,7 @@ public:
void updatePropertiesList();
const Rectangle<int> getComponentArea() const;
Image* createComponentSnapshot() const;
const Image createComponentSnapshot() const;
//==============================================================================
juce_UseDebuggingNewOperator

View file

@ -1300,10 +1300,10 @@ JucerDocumentHolder* JucerDocumentHolder::getActiveDocumentHolder()
return dynamic_cast <JucerDocumentHolder*> (target);
}
Image* JucerDocumentHolder::createComponentLayerSnapshot() const
const Image JucerDocumentHolder::createComponentLayerSnapshot() const
{
if (compLayoutPanel != 0)
return compLayoutPanel->createComponentSnapshot();
return 0;
return Image();
}

View file

@ -57,7 +57,7 @@ public:
void setViewportToLastPos (Viewport* vp);
void storeLastViewportPos (Viewport* vp);
Image* createComponentLayerSnapshot() const;
const Image createComponentLayerSnapshot() const;
//==============================================================================
void paint (Graphics& g);

View file

@ -53,8 +53,6 @@ PaintRoutineEditor::~PaintRoutineEditor()
removeChildComponent (&lassoComp);
deleteAllChildren();
delete componentOverlay;
}
void PaintRoutineEditor::removeAllElementComps()
@ -99,10 +97,10 @@ void PaintRoutineEditor::paint (Graphics& g)
void PaintRoutineEditor::paintOverChildren (Graphics& g)
{
if (componentOverlay == 0 && document.getComponentOverlayOpacity() > 0.0f)
if (componentOverlay.isNull() && document.getComponentOverlayOpacity() > 0.0f)
updateComponentOverlay();
if (componentOverlay != 0)
if (componentOverlay.isValid())
{
const Rectangle<int> clip (getComponentArea());
g.drawImageAt (componentOverlay, clip.getX(), clip.getY());
@ -113,7 +111,7 @@ void PaintRoutineEditor::resized()
{
if (getWidth() > 0 && getHeight() > 0)
{
deleteAndZero (componentOverlay);
componentOverlay = Image();
refreshAllElements();
}
}
@ -133,11 +131,10 @@ void PaintRoutineEditor::updateChildBounds()
void PaintRoutineEditor::updateComponentOverlay()
{
if (componentOverlay != 0)
if (componentOverlay.isValid())
repaint();
deleteAndZero (componentOverlay);
componentOverlay = Image();
componentOverlayOpacity = document.getComponentOverlayOpacity();
if (componentOverlayOpacity > 0.0f)
@ -145,9 +142,9 @@ void PaintRoutineEditor::updateComponentOverlay()
if (documentHolder != 0)
componentOverlay = documentHolder->createComponentLayerSnapshot();
if (componentOverlay != 0)
if (componentOverlay.isValid())
{
componentOverlay->multiplyAllAlphas (componentOverlayOpacity);
componentOverlay.multiplyAllAlphas (componentOverlayOpacity);
repaint();
}
}
@ -165,7 +162,7 @@ void PaintRoutineEditor::visibilityChanged()
else
{
document.removeChangeListener (this);
deleteAndZero (componentOverlay);
componentOverlay = Image();
}
}
@ -210,7 +207,7 @@ void PaintRoutineEditor::refreshAllElements()
if (componentOverlayOpacity != document.getComponentOverlayOpacity())
{
deleteAndZero (componentOverlay);
componentOverlay = Image();
componentOverlayOpacity = document.getComponentOverlayOpacity();
repaint();
}

View file

@ -79,7 +79,7 @@ private:
JucerDocumentHolder* const documentHolder;
LassoComponent <PaintElement*> lassoComp;
SnapGridPainter grid;
Image* componentOverlay;
Image componentOverlay;
float componentOverlayOpacity;
Colour currentBackgroundColour;

View file

@ -64,7 +64,7 @@ public:
class AboutPage : public Component
{
HyperlinkButton* link;
Image* logo;
Image logo;
TextLayout text1, text2;
public:
@ -89,7 +89,6 @@ public:
~AboutPage()
{
deleteAllChildren();
ImageCache::release (logo);
}
void paint (Graphics& g)

View file

@ -37,7 +37,6 @@ SnapGridPainter::SnapGridPainter()
SnapGridPainter::~SnapGridPainter()
{
delete backgroundFill;
}
bool SnapGridPainter::updateFromDesign (JucerDocument& design)
@ -48,7 +47,7 @@ bool SnapGridPainter::updateFromDesign (JucerDocument& design)
snapGridSize = design.getSnappingGridSize();
snapShown = design.isSnapShown() && design.isSnapActive (false);
deleteAndZero (backgroundFill);
backgroundFill = Image();
return true;
}
@ -57,16 +56,16 @@ bool SnapGridPainter::updateFromDesign (JucerDocument& design)
void SnapGridPainter::updateColour()
{
deleteAndZero (backgroundFill);
backgroundFill = Image();
}
void SnapGridPainter::draw (Graphics& g, PaintRoutine* backgroundGraphics)
{
if (backgroundFill == 0 && snapShown)
if (backgroundFill.isNull() && snapShown)
{
backgroundFill = new Image (Image::ARGB, snapGridSize, snapGridSize, true);
backgroundFill = Image (Image::ARGB, snapGridSize, snapGridSize, true);
Graphics g (*backgroundFill);
Graphics g (backgroundFill);
Colour col (Colours::black);
@ -83,9 +82,9 @@ void SnapGridPainter::draw (Graphics& g, PaintRoutine* backgroundGraphics)
g.setPixel (0, 0);
}
if (backgroundFill != 0)
if (backgroundFill.isValid())
{
g.setTiledImageFill (*backgroundFill, 0, 0, 1.0f);
g.setTiledImageFill (backgroundFill, 0, 0, 1.0f);
g.fillAll();
}
}

View file

@ -52,7 +52,7 @@ public:
private:
int snapGridSize;
bool snapShown;
Image* backgroundFill;
Image backgroundFill;
};

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -28,27 +28,11 @@
BEGIN_JUCE_NAMESPACE
#include "juce_Identifier.h"
#include "../utilities/juce_DeletedAtShutdown.h"
#include "../core/juce_Singleton.h"
#include "../text/juce_StringPool.h"
//==============================================================================
class Identifier::Pool : public DeletedAtShutdown
{
public:
Pool() {}
~Pool() { clearSingletonInstance(); }
StringPool Identifier::pool;
StringPool pool;
juce_DeclareSingleton_SingleThreaded_Minimal (Pool);
};
juce_ImplementSingleton_SingleThreaded (Identifier::Pool);
//==============================================================================
Identifier::Identifier() throw()
: name (0)
{
@ -66,7 +50,7 @@ Identifier& Identifier::operator= (const Identifier& other) throw()
}
Identifier::Identifier (const String& name_)
: name (Identifier::Pool::getInstance()->pool.getPooledString (name_))
: name (Identifier::pool.getPooledString (name_))
{
/* An Identifier string must be suitable for use as a script variable or XML
attribute, so it can only contain this limited set of characters.. */
@ -74,7 +58,7 @@ Identifier::Identifier (const String& name_)
}
Identifier::Identifier (const char* const name_)
: name (Identifier::Pool::getInstance()->pool.getPooledString (name_))
: name (Identifier::pool.getPooledString (name_))
{
/* An Identifier string must be suitable for use as a script variable or XML
attribute, so it can only contain this limited set of characters.. */

View file

@ -26,7 +26,7 @@
#ifndef __JUCE_IDENTIFIER_JUCEHEADER__
#define __JUCE_IDENTIFIER_JUCEHEADER__
#include "../text/juce_String.h"
#include "../text/juce_StringPool.h"
//==============================================================================
@ -82,7 +82,7 @@ private:
//==============================================================================
const juce_wchar* name;
class Pool;
static StringPool pool;
};

View file

@ -55,6 +55,16 @@ RSAKey::~RSAKey()
{
}
bool RSAKey::operator== (const RSAKey& other) const throw()
{
return part1 == other.part1 && part2 == other.part2;
}
bool RSAKey::operator!= (const RSAKey& other) const throw()
{
return ! operator== (other);
}
const String RSAKey::toString() const
{
return part1.toString (16) + "," + part2.toString (16);

View file

@ -55,6 +55,9 @@ public:
/** Destructor. */
~RSAKey();
bool operator== (const RSAKey& other) const throw();
bool operator!= (const RSAKey& other) const throw();
//==============================================================================
/** Turns the key into a string representation.

View file

@ -50,40 +50,30 @@ ImageButton::ImageButton (const String& text_)
ImageButton::~ImageButton()
{
deleteImages();
}
void ImageButton::deleteImages()
{
ImageCache::releaseOrDelete (normalImage);
ImageCache::releaseOrDelete (overImage);
ImageCache::releaseOrDelete (downImage);
}
void ImageButton::setImages (const bool resizeButtonNowToFitThisImage,
const bool rescaleImagesWhenButtonSizeChanges,
const bool preserveImageProportions,
Image* const normalImage_,
const Image& normalImage_,
const float imageOpacityWhenNormal,
const Colour& overlayColourWhenNormal,
Image* const overImage_,
const Image& overImage_,
const float imageOpacityWhenOver,
const Colour& overlayColourWhenOver,
Image* const downImage_,
const Image& downImage_,
const float imageOpacityWhenDown,
const Colour& overlayColourWhenDown,
const float hitTestAlphaThreshold)
{
deleteImages();
normalImage = normalImage_;
overImage = overImage_;
downImage = downImage_;
if (resizeButtonNowToFitThisImage && normalImage != 0)
if (resizeButtonNowToFitThisImage && normalImage.isValid())
{
imageW = normalImage->getWidth();
imageH = normalImage->getHeight();
imageW = normalImage.getWidth();
imageH = normalImage.getHeight();
setSize (imageW, imageH);
}
@ -103,7 +93,7 @@ void ImageButton::setImages (const bool resizeButtonNowToFitThisImage,
repaint();
}
Image* ImageButton::getCurrentImage() const
const Image ImageButton::getCurrentImage() const
{
if (isDown() || getToggleState())
return getDownImage();
@ -114,21 +104,21 @@ Image* ImageButton::getCurrentImage() const
return getNormalImage();
}
Image* ImageButton::getNormalImage() const throw()
const Image ImageButton::getNormalImage() const
{
return normalImage;
}
Image* ImageButton::getOverImage() const throw()
const Image ImageButton::getOverImage() const
{
return (overImage != 0) ? overImage
: normalImage;
return overImage.isValid() ? overImage
: normalImage;
}
Image* ImageButton::getDownImage() const throw()
const Image ImageButton::getDownImage() const
{
return (downImage != 0) ? downImage
: getOverImage();
return downImage.isValid() ? downImage
: getOverImage();
}
void ImageButton::paintButton (Graphics& g,
@ -141,12 +131,12 @@ void ImageButton::paintButton (Graphics& g,
isButtonDown = false;
}
Image* const im = getCurrentImage();
Image im (getCurrentImage());
if (im != 0)
if (im.isValid())
{
const int iw = im->getWidth();
const int ih = im->getHeight();
const int iw = im.getWidth();
const int ih = im.getHeight();
imageW = getWidth();
imageH = getHeight();
imageX = (imageW - iw) >> 1;
@ -189,7 +179,7 @@ void ImageButton::paintButton (Graphics& g,
imageH = ih;
}
getLookAndFeel().drawImageButton (g, im, imageX, imageY, imageW, imageH,
getLookAndFeel().drawImageButton (g, &im, imageX, imageY, imageW, imageH,
isButtonDown ? downOverlay
: (isMouseOverButton ? overOverlay
: normalOverlay),
@ -205,12 +195,11 @@ bool ImageButton::hitTest (int x, int y)
if (alphaThreshold == 0)
return true;
Image* const im = getCurrentImage();
Image im (getCurrentImage());
return im == 0
|| (imageW > 0 && imageH > 0
&& alphaThreshold < im->getPixelAt (((x - imageX) * im->getWidth()) / imageW,
((y - imageY) * im->getHeight()) / imageH).getAlpha());
return im.isNull() || (imageW > 0 && imageH > 0
&& alphaThreshold < im.getPixelAt (((x - imageX) * im.getWidth()) / imageW,
((y - imageY) * im.getHeight()) / imageH).getAlpha());
}
END_JUCE_NAMESPACE

View file

@ -57,10 +57,6 @@ public:
//==============================================================================
/** Sets up the images to draw in various states.
Important! Bear in mind that if you pass the same image in for more than one of
these parameters, this button will delete it (or release from the ImageCache)
multiple times!
@param resizeButtonNowToFitThisImage if true, the button will be immediately
resized to the same dimensions as the normal image
@param rescaleImagesWhenButtonSizeChanges if true, the image will be rescaled to fit the
@ -69,9 +65,7 @@ public:
the button will keep the image's x and y proportions
correct - i.e. it won't distort its shape, although
this might create gaps around the edges
@param normalImage the image to use when the button is in its normal state. The
image passed in will be deleted (or released if it
was created by the ImageCache class) when the
@param normalImage the image to use when the button is in its normal state.
button no longer needs it.
@param imageOpacityWhenNormal the opacity to use when drawing the normal image.
@param overlayColourWhenNormal an overlay colour to use to fill the alpha channel of the
@ -81,19 +75,15 @@ public:
colour to the image to brighten or darken it
@param overImage the image to use when the mouse is over the button. If
you want to use the same image as was set in the normalImage
parameter, this value can be 0. As for normalImage, it
will be deleted or released by the button when no longer
needed
parameter, this value can be a null image.
@param imageOpacityWhenOver the opacity to use when drawing the image when the mouse
is over the button
@param overlayColourWhenOver an overlay colour to use to fill the alpha channel of the
image when the mouse is over - if this colour is transparent,
no overlay will be drawn
@param downImage an image to use when the button is pressed down. If set
to zero, the 'over' image will be drawn instead (or the
normal image if there isn't an 'over' image either). This
image will be deleted or released by the button when no
longer needed
to a null image, the 'over' image will be drawn instead (or the
normal image if there isn't an 'over' image either).
@param imageOpacityWhenDown the opacity to use when drawing the image when the button
is pressed
@param overlayColourWhenDown an overlay colour to use to fill the alpha channel of the
@ -109,33 +99,33 @@ public:
void setImages (bool resizeButtonNowToFitThisImage,
bool rescaleImagesWhenButtonSizeChanges,
bool preserveImageProportions,
Image* normalImage,
const Image& normalImage,
float imageOpacityWhenNormal,
const Colour& overlayColourWhenNormal,
Image* overImage,
const Image& overImage,
float imageOpacityWhenOver,
const Colour& overlayColourWhenOver,
Image* downImage,
const Image& downImage,
float imageOpacityWhenDown,
const Colour& overlayColourWhenDown,
float hitTestAlphaThreshold = 0.0f);
/** Returns the currently set 'normal' image. */
Image* getNormalImage() const throw();
const Image getNormalImage() const;
/** Returns the image that's drawn when the mouse is over the button.
If an 'over' image has been set, this will return it; otherwise it'll
If a valid 'over' image has been set, this will return it; otherwise it'll
just return the normal image.
*/
Image* getOverImage() const throw();
const Image getOverImage() const;
/** Returns the image that's drawn when the button is held down.
If a 'down' image has been set, this will return it; otherwise it'll
If a valid 'down' image has been set, this will return it; otherwise it'll
return the 'over' image or normal image, depending on what's available.
*/
Image* getDownImage() const throw();
const Image getDownImage() const;
//==============================================================================
juce_UseDebuggingNewOperator
@ -153,14 +143,11 @@ private:
bool scaleImageToFit, preserveProportions;
unsigned char alphaThreshold;
int imageX, imageY, imageW, imageH;
Image* normalImage;
Image* overImage;
Image* downImage;
Image normalImage, overImage, downImage;
float normalOpacity, overOpacity, downOpacity;
Colour normalOverlay, overOverlay, downOverlay;
Image* getCurrentImage() const;
void deleteImages();
const Image getCurrentImage() const;
ImageButton (const ImageButton&);
ImageButton& operator= (const ImageButton&);

View file

@ -72,11 +72,14 @@ void ToolbarButton::paintButtonArea (Graphics& g,
if (! isEnabled())
{
Image im (Image::ARGB, width, height, true);
Graphics g2 (im);
d->drawWithin (g2, 0, 0, width, height, RectanglePlacement::centred, 1.0f);
im.desaturate();
g.drawImageAt (&im, 0, 0);
{
Graphics g2 (im);
d->drawWithin (g2, 0, 0, width, height, RectanglePlacement::centred, 1.0f);
}
im.desaturate();
g.drawImageAt (im, 0, 0);
}
else
{

View file

@ -880,7 +880,7 @@ void ListBox::repaintRow (const int rowNumber) throw()
repaint (getRowPosition (rowNumber, true));
}
Image* ListBox::createSnapshotOfSelectedRows (int& imageX, int& imageY)
const Image ListBox::createSnapshotOfSelectedRows (int& imageX, int& imageY)
{
Rectangle<int> imageArea;
const int firstRow = getRowContainingPosition (0, 0);
@ -901,7 +901,7 @@ Image* ListBox::createSnapshotOfSelectedRows (int& imageX, int& imageY)
imageArea = imageArea.getIntersection (getLocalBounds());
imageX = imageArea.getX();
imageY = imageArea.getY();
Image* snapshot = Image::createNativeImage (Image::ARGB, imageArea.getWidth(), imageArea.getHeight(), true);
Image snapshot (Image::ARGB, imageArea.getWidth(), imageArea.getHeight(), true, Image::NativeImage);
for (i = getNumRowsOnScreen() + 2; --i >= 0;)
{
@ -911,7 +911,7 @@ Image* ListBox::createSnapshotOfSelectedRows (int& imageX, int& imageY)
{
const Point<int> pos (rowComp->relativePositionToOtherComponent (this, Point<int>()));
Graphics g (*snapshot);
Graphics g (snapshot);
g.setOrigin (pos.getX() - imageX, pos.getY() - imageY);
if (g.reduceClipRegion (0, 0, rowComp->getWidth(), rowComp->getHeight()))
rowComp->paintEntireComponent (g);
@ -929,8 +929,8 @@ void ListBox::startDragAndDrop (const MouseEvent& e, const String& dragDescripti
if (dragContainer != 0)
{
int x, y;
Image* dragImage = createSnapshotOfSelectedRows (x, y);
dragImage->multiplyAllAlphas (0.6f);
Image dragImage (createSnapshotOfSelectedRows (x, y));
dragImage.multiplyAllAlphas (0.6f);
MouseEvent e2 (e.getEventRelativeTo (this));
const Point<int> p (x - e2.x, y - e2.y);

View file

@ -525,7 +525,7 @@ public:
@see Component::createComponentSnapshot
*/
Image* createSnapshotOfSelectedRows (int& x, int& y);
const Image createSnapshotOfSelectedRows (int& x, int& y);
/** Returns the viewport that this ListBox uses.

View file

@ -38,10 +38,11 @@ BEGIN_JUCE_NAMESPACE
class DragOverlayComp : public Component
{
public:
DragOverlayComp (Image* const image_)
DragOverlayComp (const Image& image_)
: image (image_)
{
image->multiplyAllAlphas (0.8f);
image.duplicateIfShared();
image.multiplyAllAlphas (0.8f);
setAlwaysOnTop (true);
}
@ -55,7 +56,7 @@ public:
}
private:
ScopedPointer <Image> image;
Image image;
DragOverlayComp (const DragOverlayComp&);
DragOverlayComp& operator= (const DragOverlayComp&);

View file

@ -96,7 +96,7 @@ public:
if (dnd != 0)
{
dnd->startDragging (Toolbar::toolbarDragDescriptor, getParentComponent(), 0, true);
dnd->startDragging (Toolbar::toolbarDragDescriptor, getParentComponent(), Image(), true);
ToolbarItemComponent* const tc = dynamic_cast <ToolbarItemComponent*> (getParentComponent());

View file

@ -139,10 +139,10 @@ public:
if (dragContainer != 0)
{
pos.setSize (pos.getWidth(), item->itemHeight);
Image* dragImage = Component::createComponentSnapshot (pos, true);
dragImage->multiplyAllAlphas (0.6f);
Image dragImage (Component::createComponentSnapshot (pos, true));
dragImage.multiplyAllAlphas (0.6f);
Point<int> imageOffset (pos.getX() - e.x, pos.getY() - e.y);
Point<int> imageOffset (pos.getPosition() - e.getPosition());
dragContainer->startDragging (dragDescription, &owner, dragImage, true, &imageOffset);
}
else

View file

@ -32,7 +32,7 @@ BEGIN_JUCE_NAMESPACE
#include "../../graphics/imaging/juce_ImageCache.h"
#include "../../../events/juce_AsyncUpdater.h"
Image* juce_createIconForFile (const File& file);
const Image juce_createIconForFile (const File& file);
//==============================================================================
@ -107,7 +107,7 @@ public:
{
getLookAndFeel().drawFileBrowserRow (g, getWidth(), getHeight(),
file.getFileName(),
icon,
&icon,
fileSize, modTime,
isDirectory, highlighted,
index);
@ -164,12 +164,11 @@ public:
clearIcon();
}
if (file != File::nonexistent
&& icon == 0 && ! isDirectory)
if (file != File::nonexistent && icon.isNull() && ! isDirectory)
{
updateIcon (true);
if (icon == 0)
if (! icon.isValid())
thread.addTimeSliceClient (this);
}
}
@ -196,31 +195,30 @@ private:
File file;
String fileSize;
String modTime;
Image* icon;
Image icon;
bool isDirectory;
void clearIcon()
{
ImageCache::release (icon);
icon = 0;
icon = Image();
}
void updateIcon (const bool onlyUpdateIfCached)
{
if (icon == 0)
if (icon.isNull())
{
const int hashCode = (file.getFullPathName() + "_iconCacheSalt").hashCode();
Image* im = ImageCache::getFromHashCode (hashCode);
Image im (ImageCache::getFromHashCode (hashCode));
if (im == 0 && ! onlyUpdateIfCached)
if (im.isNull() && ! onlyUpdateIfCached)
{
im = juce_createIconForFile (file);
if (im != 0)
if (im.isValid())
ImageCache::addImageToCache (im, hashCode);
}
if (im != 0)
if (im.isValid())
{
icon = im;
triggerAsyncUpdate();

View file

@ -32,7 +32,7 @@ BEGIN_JUCE_NAMESPACE
#include "../../graphics/imaging/juce_ImageCache.h"
#include "../../../events/juce_AsyncUpdater.h"
Image* juce_createIconForFile (const File& file);
const Image juce_createIconForFile (const File& file);
//==============================================================================
@ -77,7 +77,6 @@ public:
thread.removeTimeSliceClient (this);
clearSubItems();
ImageCache::release (icon);
if (canDeleteSubContentsList)
delete subContentsList;
@ -145,15 +144,14 @@ public:
{
updateIcon (true);
if (icon == 0)
if (icon.isNull())
thread.addTimeSliceClient (this);
}
owner.getLookAndFeel()
.drawFileBrowserRow (g, width, height,
file.getFileName(),
icon,
fileSize, modTime,
&icon, fileSize, modTime,
isDirectory, isSelected(),
indexInContentsList);
}
@ -199,26 +197,26 @@ private:
DirectoryContentsList* subContentsList;
bool isDirectory, canDeleteSubContentsList;
TimeSliceThread& thread;
Image* icon;
Image icon;
String fileSize;
String modTime;
void updateIcon (const bool onlyUpdateIfCached)
{
if (icon == 0)
if (icon.isNull())
{
const int hashCode = (file.getFullPathName() + "_iconCacheSalt").hashCode();
Image* im = ImageCache::getFromHashCode (hashCode);
Image im (ImageCache::getFromHashCode (hashCode));
if (im == 0 && ! onlyUpdateIfCached)
if (im.isNull() && ! onlyUpdateIfCached)
{
im = juce_createIconForFile (file);
if (im != 0)
if (im.isValid())
ImageCache::addImageToCache (im, hashCode);
}
if (im != 0)
if (im.isValid())
{
icon = im;
triggerAsyncUpdate();

View file

@ -68,7 +68,7 @@ void ImagePreviewComponent::timerCallback()
{
stopTimer();
currentThumbnail = 0;
currentThumbnail = Image();
currentDetails = String::empty;
repaint();
@ -82,10 +82,10 @@ void ImagePreviewComponent::timerCallback()
{
currentThumbnail = format->decodeImage (*in);
if (currentThumbnail != 0)
if (currentThumbnail.isValid())
{
int w = currentThumbnail->getWidth();
int h = currentThumbnail->getHeight();
int w = currentThumbnail.getWidth();
int h = currentThumbnail.getHeight();
currentDetails
<< fileToLoad.getFileName() << "\n"
@ -95,7 +95,7 @@ void ImagePreviewComponent::timerCallback()
getThumbSize (w, h);
currentThumbnail = currentThumbnail->createCopy (w, h);
currentThumbnail = currentThumbnail.rescaled (w, h);
}
}
}
@ -103,12 +103,12 @@ void ImagePreviewComponent::timerCallback()
void ImagePreviewComponent::paint (Graphics& g)
{
if (currentThumbnail != 0)
if (currentThumbnail.isValid())
{
g.setFont (13.0f);
int w = currentThumbnail->getWidth();
int h = currentThumbnail->getHeight();
int w = currentThumbnail.getWidth();
int h = currentThumbnail.getHeight();
getThumbSize (w, h);
const int numLines = 4;

View file

@ -60,7 +60,7 @@ public:
private:
File fileToLoad;
ScopedPointer <Image> currentThumbnail;
Image currentThumbnail;
String currentDetails;
void getThumbSize (int& w, int& h) const;

View file

@ -111,7 +111,6 @@ Component::~Component()
for (int i = childComponentList_.size(); --i >= 0;)
childComponentList_.getUnchecked(i)->parentComponent_ = 0;
delete bufferedImage_;
delete mouseListeners_;
delete keyListeners_;
}
@ -258,7 +257,6 @@ public:
~FadeOutProxyComponent()
{
delete image;
}
void paint (Graphics& g)
@ -267,7 +265,7 @@ public:
g.drawImage (image,
0, 0, getWidth(), getHeight(),
0, 0, image->getWidth(), image->getHeight());
0, 0, image.getWidth(), image.getHeight());
}
void timerCallback()
@ -290,8 +288,8 @@ public:
centreY += yChangePerMs * msPassed;
scale += scaleChangePerMs * msPassed;
const int w = roundToInt (image->getWidth() * scale);
const int h = roundToInt (image->getHeight() * scale);
const int w = roundToInt (image.getWidth() * scale);
const int h = roundToInt (image.getHeight() * scale);
setBounds (roundToInt (centreX) - w / 2,
roundToInt (centreY) - h / 2,
@ -309,7 +307,7 @@ public:
juce_UseDebuggingNewOperator
private:
Image* image;
Image image;
uint32 lastTime;
float alpha, alphaChangePerMs;
float centreX, xChangePerMs;
@ -511,7 +509,7 @@ void Component::setBufferedToImage (const bool shouldBeBuffered)
{
if (shouldBeBuffered != flags.bufferToImageFlag)
{
deleteAndZero (bufferedImage_);
bufferedImage_ = Image();
flags.bufferToImageFlag = shouldBeBuffered;
}
}
@ -1549,7 +1547,7 @@ void Component::repaint()
void Component::repaint (const int x, const int y,
const int w, const int h)
{
deleteAndZero (bufferedImage_);
bufferedImage_ = Image();
if (flags.visibleFlag)
internalRepaint (x, y, w, h);
@ -1619,12 +1617,12 @@ void Component::renderComponent (Graphics& g)
{
if (flags.bufferToImageFlag)
{
if (bufferedImage_ == 0)
if (bufferedImage_.isNull())
{
bufferedImage_ = Image::createNativeImage (flags.opaqueFlag ? Image::RGB : Image::ARGB,
getWidth(), getHeight(), ! flags.opaqueFlag);
bufferedImage_ = Image (flags.opaqueFlag ? Image::RGB : Image::ARGB,
getWidth(), getHeight(), ! flags.opaqueFlag, Image::NativeImage);
Graphics imG (*bufferedImage_);
Graphics imG (bufferedImage_);
paint (imG);
}
@ -1684,15 +1682,15 @@ void Component::paintEntireComponent (Graphics& g)
if (effect_ != 0)
{
ScopedPointer<Image> effectImage (Image::createNativeImage (flags.opaqueFlag ? Image::RGB : Image::ARGB,
getWidth(), getHeight(),
! flags.opaqueFlag));
Image effectImage (flags.opaqueFlag ? Image::RGB : Image::ARGB,
getWidth(), getHeight(),
! flags.opaqueFlag, Image::NativeImage);
{
Graphics g2 (*effectImage);
Graphics g2 (effectImage);
renderComponent (g2);
}
effect_->applyEffect (*effectImage, g);
effect_->applyEffect (effectImage, g);
}
else
{
@ -1705,24 +1703,24 @@ void Component::paintEntireComponent (Graphics& g)
}
//==============================================================================
Image* Component::createComponentSnapshot (const Rectangle<int>& areaToGrab,
const bool clipImageToComponentBounds)
const Image Component::createComponentSnapshot (const Rectangle<int>& areaToGrab,
const bool clipImageToComponentBounds)
{
Rectangle<int> r (areaToGrab);
if (clipImageToComponentBounds)
r = r.getIntersection (getLocalBounds());
ScopedPointer<Image> componentImage (Image::createNativeImage (flags.opaqueFlag ? Image::RGB : Image::ARGB,
jmax (1, r.getWidth()),
jmax (1, r.getHeight()),
true));
Image componentImage (flags.opaqueFlag ? Image::RGB : Image::ARGB,
jmax (1, r.getWidth()),
jmax (1, r.getHeight()),
true);
Graphics imageContext (*componentImage);
Graphics imageContext (componentImage);
imageContext.setOrigin (-r.getX(), -r.getY());
paintEntireComponent (imageContext);
return componentImage.release();
return componentImage;
}
void Component::setComponentEffect (ImageEffectFilter* const effect)

View file

@ -33,6 +33,7 @@
#include "keyboard/juce_KeyListener.h"
#include "keyboard/juce_KeyboardFocusTraverser.h"
#include "../graphics/effects/juce_ImageEffectFilter.h"
#include "../graphics/imaging/juce_Image.h"
#include "../graphics/geometry/juce_RectangleList.h"
#include "../graphics/geometry/juce_BorderSize.h"
#include "../../events/juce_MessageListener.h"
@ -867,12 +868,10 @@ public:
the size of the component, it'll be clipped. If clipImageToComponentBounds is false
then parts of the component beyond its bounds can be drawn.
The caller is responsible for deleting the image that is returned.
@see paintEntireComponent
*/
Image* createComponentSnapshot (const Rectangle<int>& areaToGrab,
bool clipImageToComponentBounds = true);
const Image createComponentSnapshot (const Rectangle<int>& areaToGrab,
bool clipImageToComponentBounds = true);
/** Draws this component and all its subcomponents onto the specified graphics
context.
@ -2016,7 +2015,7 @@ private:
LookAndFeel* lookAndFeel_;
MouseCursor cursor_;
ImageEffectFilter* effect_;
Image* bufferedImage_;
Image bufferedImage_;
Array <MouseListener*>* mouseListeners_;
Array <KeyListener*>* keyListeners_;
ListenerList <ComponentListener> componentListeners;

View file

@ -1084,7 +1084,7 @@ void LookAndFeel::drawPopupMenuItem (Graphics& g,
if (image != 0)
{
g.drawImageWithin (image,
g.drawImageWithin (*image,
2, 1, leftBorder - 4, height - 2,
RectanglePlacement::centred | RectanglePlacement::onlyReduceInSize, false);
}
@ -1701,7 +1701,7 @@ void LookAndFeel::drawImageButton (Graphics& g, Image* image,
{
g.setOpacity (imageOpacity);
g.drawImage (image, imageX, imageY, imageW, imageH,
g.drawImage (*image, imageX, imageY, imageW, imageH,
0, 0, image->getWidth(), image->getHeight(), false);
}
@ -1709,7 +1709,7 @@ void LookAndFeel::drawImageButton (Graphics& g, Image* image,
{
g.setColour (overlayColour);
g.drawImage (image, imageX, imageY, imageW, imageH,
g.drawImage (*image, imageX, imageY, imageW, imageH,
0, 0, image->getWidth(), image->getHeight(), true);
}
}
@ -1804,7 +1804,7 @@ void LookAndFeel::drawDocumentWindowTitleBar (DocumentWindow& window,
if (icon != 0)
{
g.setOpacity (isActive ? 1.0f : 0.6f);
g.drawImageWithin (icon, textX, (h - iconH) / 2, iconW, iconH,
g.drawImageWithin (*icon, textX, (h - iconH) / 2, iconW, iconH,
RectanglePlacement::centred, false);
textX += iconW;
textW -= iconW;
@ -2559,24 +2559,21 @@ void LookAndFeel::drawFileBrowserRow (Graphics& g, int width, int height,
g.setColour (findColour (DirectoryContentsDisplayComponent::textColourId));
g.setFont (height * 0.7f);
Image* im = icon;
Image* toRelease = 0;
Image im;
if (icon != 0)
im = *icon;
if (im == 0)
{
toRelease = im = (isDirectory ? getDefaultFolderImage()
: getDefaultDocumentFileImage());
}
if (im.isNull())
im = isDirectory ? getDefaultFolderImage()
: getDefaultDocumentFileImage();
const int x = 32;
if (im != 0)
if (im.isValid())
{
g.drawImageWithin (im, 2, 2, x - 4, height - 4,
RectanglePlacement::centred | RectanglePlacement::onlyReduceInSize,
false);
ImageCache::release (toRelease);
}
if (width > 450 && ! isDirectory)
@ -2663,7 +2660,7 @@ void LookAndFeel::layoutFileBrowserComponent (FileBrowserComponent& browserComp,
filenameBox->setBounds (x + 50, y, w - 50, controlsHeight);
}
Image* LookAndFeel::getDefaultFolderImage()
const Image LookAndFeel::getDefaultFolderImage()
{
static const unsigned char foldericon_png[] = { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,32,0,0,0,28,8,6,0,0,0,0,194,189,34,0,0,0,4,103,65,77,65,0,0,175,200,55,5,
138,233,0,0,0,25,116,69,88,116,83,111,102,116,119,97,114,101,0,65,100,111,98,101,32,73,109,97,103,101,82,101,97,100,121,113,201,101,60,0,0,9,46,73,68,65,84,120,218,98,252,255,255,63,3,50,240,41,95,192,
@ -2713,7 +2710,7 @@ Image* LookAndFeel::getDefaultFolderImage()
return ImageCache::getFromMemory (foldericon_png, sizeof (foldericon_png));
}
Image* LookAndFeel::getDefaultDocumentFileImage()
const Image LookAndFeel::getDefaultDocumentFileImage()
{
static const unsigned char fileicon_png[] = { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,32,0,0,0,32,8,6,0,0,0,115,122,122,244,0,0,0,4,103,65,77,65,0,0,175,200,55,5,
138,233,0,0,0,25,116,69,88,116,83,111,102,116,119,97,114,101,0,65,100,111,98,101,32,73,109,97,103,101,82,101,97,100,121,113,201,101,60,0,0,4,99,73,68,65,84,120,218,98,252,255,255,63,3,12,48,50,50,50,1,

View file

@ -294,8 +294,8 @@ public:
//==============================================================================
// these return an image from the ImageCache, so use ImageCache::release() to free it
virtual Image* getDefaultFolderImage();
virtual Image* getDefaultDocumentFileImage();
virtual const Image getDefaultFolderImage();
virtual const Image getDefaultDocumentFileImage();
virtual void createFileChooserHeaderText (const String& title,
const String& instructions,

View file

@ -54,7 +54,7 @@ public:
const String& text_,
const bool active_,
const bool isTicked_,
const Image* im,
const Image& im,
const Colour& textColour_,
const bool usesColour_,
PopupMenuCustomComponent* const customComp_,
@ -62,15 +62,12 @@ public:
ApplicationCommandManager* const commandManager_)
: itemId (itemId_), text (text_), textColour (textColour_),
active (active_), isSeparator (false), isTicked (isTicked_),
usesColour (usesColour_), customComp (customComp_),
usesColour (usesColour_), image (im), customComp (customComp_),
commandManager (commandManager_)
{
if (subMenu_ != 0)
subMenu = new PopupMenu (*subMenu_);
if (im != 0)
image = im->createCopy();
if (commandManager_ != 0 && itemId_ != 0)
{
String shortcutKey;
@ -106,14 +103,12 @@ public:
isSeparator (other.isSeparator),
isTicked (other.isTicked),
usesColour (other.usesColour),
image (other.image),
customComp (other.customComp),
commandManager (other.commandManager)
{
if (other.subMenu != 0)
subMenu = new PopupMenu (*(other.subMenu));
if (other.image != 0)
image = other.image->createCopy();
}
~Item()
@ -136,7 +131,7 @@ public:
String text;
const Colour textColour;
const bool active, isSeparator, isTicked, usesColour;
ScopedPointer <Image> image;
Image image;
ReferenceCountedObjectPtr <PopupMenuCustomComponent> customComp;
ScopedPointer <PopupMenu> subMenu;
ApplicationCommandManager* const commandManager;
@ -207,7 +202,7 @@ public:
itemInfo.isTicked,
itemInfo.subMenu != 0,
mainText, endText,
itemInfo.image,
itemInfo.image.isValid() ? &itemInfo.image : 0,
itemInfo.usesColour ? &(itemInfo.textColour) : 0);
}
}
@ -1317,7 +1312,7 @@ void PopupMenu::addItem (const int itemResultId,
const String& itemText,
const bool isActive,
const bool isTicked,
const Image* const iconToUse)
const Image& iconToUse)
{
jassert (itemResultId != 0); // 0 is used as a return value to indicate that the user
// didn't pick anything, so you shouldn't use it as the id
@ -1325,8 +1320,8 @@ void PopupMenu::addItem (const int itemResultId,
addSeparatorIfPending();
items.add (new Item (itemResultId, itemText, isActive, isTicked,
iconToUse, Colours::black, false, 0, 0, 0));
items.add (new Item (itemResultId, itemText, isActive, isTicked, iconToUse,
Colours::black, false, 0, 0, 0));
}
void PopupMenu::addCommandItem (ApplicationCommandManager* commandManager,
@ -1349,7 +1344,7 @@ void PopupMenu::addCommandItem (ApplicationCommandManager* commandManager,
: info.shortName,
target != 0 && (info.flags & ApplicationCommandInfo::isDisabled) == 0,
(info.flags & ApplicationCommandInfo::isTicked) != 0,
0,
Image(),
Colours::black,
false,
0, 0,
@ -1362,7 +1357,7 @@ void PopupMenu::addColouredItem (const int itemResultId,
const Colour& itemTextColour,
const bool isActive,
const bool isTicked,
const Image* const iconToUse)
const Image& iconToUse)
{
jassert (itemResultId != 0); // 0 is used as a return value to indicate that the user
// didn't pick anything, so you shouldn't use it as the id
@ -1370,8 +1365,8 @@ void PopupMenu::addColouredItem (const int itemResultId,
addSeparatorIfPending();
items.add (new Item (itemResultId, itemText, isActive, isTicked,
iconToUse, itemTextColour, true, 0, 0, 0));
items.add (new Item (itemResultId, itemText, isActive, isTicked, iconToUse,
itemTextColour, true, 0, 0, 0));
}
//==============================================================================
@ -1384,7 +1379,7 @@ void PopupMenu::addCustomItem (const int itemResultId,
addSeparatorIfPending();
items.add (new Item (itemResultId, String::empty, true, false, 0,
items.add (new Item (itemResultId, String::empty, true, false, Image(),
Colours::black, false, customComponent, 0, 0));
}
@ -1439,7 +1434,7 @@ void PopupMenu::addCustomItem (const int itemResultId,
void PopupMenu::addSubMenu (const String& subMenuName,
const PopupMenu& subMenu,
const bool isActive,
Image* const iconToUse,
const Image& iconToUse,
const bool isTicked)
{
addSeparatorIfPending();

View file

@ -119,7 +119,7 @@ public:
const String& itemText,
bool isActive = true,
bool isTicked = false,
const Image* iconToUse = 0);
const Image& iconToUse = Image());
/** Adds an item that represents one of the commands in a command manager object.
@ -145,7 +145,7 @@ public:
const Colour& itemTextColour,
bool isActive = true,
bool isTicked = false,
const Image* iconToUse = 0);
const Image& iconToUse = Image());
/** Appends a custom menu item.
@ -183,7 +183,7 @@ public:
void addSubMenu (const String& subMenuName,
const PopupMenu& subMenu,
bool isActive = true,
Image* iconToUse = 0,
const Image& iconToUse = Image(),
bool isTicked = false);
/** Appends a separator to the menu, to help break it up into sections.
@ -357,7 +357,7 @@ public:
bool isCustomComponent;
bool isSectionHeader;
const Colour* customColour;
const Image* customImage;
Image customImage;
ApplicationCommandManager* commandManager;
//==============================================================================

View file

@ -46,7 +46,7 @@ class DragImageComponent : public Component,
public Timer
{
public:
DragImageComponent (Image* const im,
DragImageComponent (const Image& im,
const String& desc,
Component* const sourceComponent,
Component* const mouseDragSource_,
@ -61,7 +61,7 @@ public:
hasCheckedForExternalDrag (false),
drawImage (true)
{
setSize (im->getWidth(), im->getHeight());
setSize (im.getWidth(), im.getHeight());
if (mouseDragSource == 0)
mouseDragSource = source;
@ -280,7 +280,7 @@ public:
}
private:
ScopedPointer<Image> image;
Image image;
Component::SafePointer<Component> source;
Component::SafePointer<Component> mouseDragSource;
DragAndDropContainer* const owner;
@ -312,11 +312,11 @@ DragAndDropContainer::~DragAndDropContainer()
void DragAndDropContainer::startDragging (const String& sourceDescription,
Component* sourceComponent,
Image* dragImage_,
const Image& dragImage_,
const bool allowDraggingToExternalWindows,
const Point<int>* imageOffsetFromMouse)
{
ScopedPointer <Image> dragImage (dragImage_);
Image dragImage (dragImage_);
if (dragImageComponent == 0)
{
@ -339,32 +339,24 @@ void DragAndDropContainer::startDragging (const String& sourceDescription,
const Point<int> lastMouseDown (Desktop::getLastMouseDownPosition());
Point<int> imageOffset;
if (dragImage == 0)
if (dragImage.isNull())
{
dragImage = sourceComponent->createComponentSnapshot (sourceComponent->getLocalBounds());
dragImage = sourceComponent->createComponentSnapshot (sourceComponent->getLocalBounds())
.convertedToFormat (Image::ARGB);
if (dragImage->getFormat() != Image::ARGB)
{
Image* newIm = Image::createNativeImage (Image::ARGB, dragImage->getWidth(), dragImage->getHeight(), true);
Graphics g2 (*newIm);
g2.drawImageAt (dragImage, 0, 0);
dragImage = newIm;
}
dragImage->multiplyAllAlphas (0.6f);
dragImage.multiplyAllAlphas (0.6f);
const int lo = 150;
const int hi = 400;
Point<int> relPos (sourceComponent->globalPositionToRelative (lastMouseDown));
Point<int> clipped (dragImage->getBounds().getConstrainedPoint (relPos));
Point<int> clipped (dragImage.getBounds().getConstrainedPoint (relPos));
for (int y = dragImage->getHeight(); --y >= 0;)
for (int y = dragImage.getHeight(); --y >= 0;)
{
const double dy = (y - clipped.getY()) * (y - clipped.getY());
for (int x = dragImage->getWidth(); --x >= 0;)
for (int x = dragImage.getWidth(); --x >= 0;)
{
const int dx = x - clipped.getX();
const int distance = roundToInt (std::sqrt (dx * dx + dy));
@ -375,7 +367,7 @@ void DragAndDropContainer::startDragging (const String& sourceDescription,
: (hi - distance) / (float) (hi - lo)
+ Random::getSystemRandom().nextFloat() * 0.008f;
dragImage->multiplyAlphaAt (x, y, alpha);
dragImage.multiplyAlphaAt (x, y, alpha);
}
}
}
@ -385,12 +377,12 @@ void DragAndDropContainer::startDragging (const String& sourceDescription,
else
{
if (imageOffsetFromMouse == 0)
imageOffset = -dragImage->getBounds().getCentre();
imageOffset = -dragImage.getBounds().getCentre();
else
imageOffset = -(dragImage->getBounds().getConstrainedPoint (-*imageOffsetFromMouse));
imageOffset = -(dragImage.getBounds().getConstrainedPoint (-*imageOffsetFromMouse));
}
dragImageComponent = new DragImageComponent (dragImage.release(), sourceDescription, sourceComponent,
dragImageComponent = new DragImageComponent (dragImage, sourceDescription, sourceComponent,
draggingSource->getComponentUnderMouse(), this, imageOffset);
currentDragDesc = sourceDescription;

View file

@ -78,10 +78,8 @@ public:
dropped-onto so they can decide if they want to handle it or
not
@param sourceComponent the component that is being dragged
@param dragImage the image to drag around underneath the mouse. If this is
zero, a snapshot of the sourceComponent will be used instead. An
image passed-in will be deleted by this object when no longer
needed.
@param dragImage the image to drag around underneath the mouse. If this is a null image,
a snapshot of the sourceComponent will be used instead.
@param allowDraggingToOtherJuceWindows if true, the dragged component will appear as a desktop
window, and can be dragged to DragAndDropTargets that are the
children of components other than this one.
@ -92,7 +90,7 @@ public:
*/
void startDragging (const String& sourceDescription,
Component* sourceComponent,
Image* dragImage = 0,
const Image& dragImage = Image(),
bool allowDraggingToOtherJuceWindows = false,
const Point<int>* imageOffsetFromMouse = 0);

View file

@ -114,13 +114,13 @@ public:
void paint (Graphics& g)
{
if (colours == 0)
if (colours.isNull())
{
const int width = getWidth() / 2;
const int height = getHeight() / 2;
colours = new Image (Image::RGB, width, height, false);
colours = Image (Image::RGB, width, height, false);
Image::BitmapData pixels (*colours, 0, 0, width, height, true);
Image::BitmapData pixels (colours, 0, 0, width, height, true);
for (int y = 0; y < height; ++y)
{
@ -129,17 +129,15 @@ public:
for (int x = 0; x < width; ++x)
{
const float sat = x / (float) width;
const Colour col (h, sat, val, 1.0f);
PixelRGB* const pix = (PixelRGB*) pixels.getPixelPointer (x, y);
pix->set (col.getPixelARGB());
pixels.setPixelColour (x, y, Colour (h, sat, val, 1.0f));
}
}
}
g.setOpacity (1.0f);
g.drawImage (colours, edge, edge, getWidth() - edge * 2, getHeight() - edge * 2,
0, 0, colours->getWidth(), colours->getHeight());
0, 0, colours.getWidth(), colours.getHeight());
}
void mouseDown (const MouseEvent& e)
@ -160,7 +158,7 @@ public:
if (lastHue != h)
{
lastHue = h;
colours = 0;
colours = Image();
repaint();
}
@ -169,7 +167,7 @@ public:
void resized()
{
colours = 0;
colours = Image();
updateMarker();
}
@ -181,8 +179,7 @@ private:
float lastHue;
ColourSpaceMarker* marker;
const int edge;
ScopedPointer <Image> colours;
Image colours;
void updateMarker() const
{

View file

@ -39,17 +39,19 @@ BEGIN_JUCE_NAMESPACE
class ShadowWindow : public Component
{
Component* owner;
Image** shadowImageSections;
Image shadowImageSections [12];
const int type; // 0 = left, 1 = right, 2 = top, 3 = bottom. left + right are full-height
public:
ShadowWindow (Component* const owner_,
const int type_,
Image** const shadowImageSections_)
const Image shadowImageSections_ [12])
: owner (owner_),
shadowImageSections (shadowImageSections_),
type (type_)
{
for (int i = 0; i < numElementsInArray (shadowImageSections); ++i)
shadowImageSections [i] = shadowImageSections_ [i];
setInterceptsMouseClicks (false, false);
if (owner_->isOnDesktop())
@ -71,41 +73,41 @@ public:
void paint (Graphics& g)
{
Image* const topLeft = shadowImageSections [type * 3];
Image* const bottomRight = shadowImageSections [type * 3 + 1];
Image* const filler = shadowImageSections [type * 3 + 2];
const Image& topLeft = shadowImageSections [type * 3];
const Image& bottomRight = shadowImageSections [type * 3 + 1];
const Image& filler = shadowImageSections [type * 3 + 2];
g.setOpacity (1.0f);
if (type < 2)
{
int imH = jmin (topLeft->getHeight(), getHeight() / 2);
int imH = jmin (topLeft.getHeight(), getHeight() / 2);
g.drawImage (topLeft,
0, 0, topLeft->getWidth(), imH,
0, 0, topLeft->getWidth(), imH);
0, 0, topLeft.getWidth(), imH,
0, 0, topLeft.getWidth(), imH);
imH = jmin (bottomRight->getHeight(), getHeight() - getHeight() / 2);
imH = jmin (bottomRight.getHeight(), getHeight() - getHeight() / 2);
g.drawImage (bottomRight,
0, getHeight() - imH, bottomRight->getWidth(), imH,
0, bottomRight->getHeight() - imH, bottomRight->getWidth(), imH);
0, getHeight() - imH, bottomRight.getWidth(), imH,
0, bottomRight.getHeight() - imH, bottomRight.getWidth(), imH);
g.setTiledImageFill (*filler, 0, 0, 1.0f);
g.fillRect (0, topLeft->getHeight(), getWidth(), getHeight() - (topLeft->getHeight() + bottomRight->getHeight()));
g.setTiledImageFill (filler, 0, 0, 1.0f);
g.fillRect (0, topLeft.getHeight(), getWidth(), getHeight() - (topLeft.getHeight() + bottomRight.getHeight()));
}
else
{
int imW = jmin (topLeft->getWidth(), getWidth() / 2);
int imW = jmin (topLeft.getWidth(), getWidth() / 2);
g.drawImage (topLeft,
0, 0, imW, topLeft->getHeight(),
0, 0, imW, topLeft->getHeight());
0, 0, imW, topLeft.getHeight(),
0, 0, imW, topLeft.getHeight());
imW = jmin (bottomRight->getWidth(), getWidth() - getWidth() / 2);
imW = jmin (bottomRight.getWidth(), getWidth() - getWidth() / 2);
g.drawImage (bottomRight,
getWidth() - imW, 0, imW, bottomRight->getHeight(),
bottomRight->getWidth() - imW, 0, imW, bottomRight->getHeight());
getWidth() - imW, 0, imW, bottomRight.getHeight(),
bottomRight.getWidth() - imW, 0, imW, bottomRight.getHeight());
g.setTiledImageFill (*filler, 0, 0, 1.0f);
g.fillRect (topLeft->getWidth(), 0, getWidth() - (topLeft->getWidth() + bottomRight->getWidth()), getHeight());
g.setTiledImageFill (filler, 0, 0, 1.0f);
g.fillRect (topLeft.getWidth(), 0, getWidth() - (topLeft.getWidth() + bottomRight.getWidth()), getHeight());
}
}
@ -155,9 +157,6 @@ void DropShadower::deleteShadowWindows()
for (i = numShadows; --i >= 0;)
delete shadowWindows[i];
for (i = 12; --i >= 0;)
delete shadowImageSections[i];
numShadows = 0;
}
}
@ -235,31 +234,31 @@ void DropShadower::updateShadows()
const int hash = imageId.hashCode();
Image* bigIm = ImageCache::getFromHashCode (hash);
Image bigIm (ImageCache::getFromHashCode (hash));
if (bigIm == 0)
if (bigIm.isNull())
{
bigIm = Image::createNativeImage (Image::ARGB, shadowEdge * 5, shadowEdge * 5, true);
bigIm = Image (Image::ARGB, shadowEdge * 5, shadowEdge * 5, true, Image::NativeImage);
Graphics bigG (*bigIm);
Graphics bigG (bigIm);
bigG.setColour (Colours::black.withAlpha (alpha));
bigG.fillRect (shadowEdge + xOffset,
shadowEdge + yOffset,
bigIm->getWidth() - (shadowEdge * 2),
bigIm->getHeight() - (shadowEdge * 2));
bigIm.getWidth() - (shadowEdge * 2),
bigIm.getHeight() - (shadowEdge * 2));
ImageConvolutionKernel blurKernel (roundToInt (blurRadius * 2.0f));
blurKernel.createGaussianBlur (blurRadius);
blurKernel.applyToImage (*bigIm, 0,
blurKernel.applyToImage (bigIm, bigIm,
Rectangle<int> (xOffset, yOffset,
bigIm->getWidth(), bigIm->getHeight()));
bigIm.getWidth(), bigIm.getHeight()));
ImageCache::addImageToCache (bigIm, hash);
}
const int iw = bigIm->getWidth();
const int ih = bigIm->getHeight();
const int iw = bigIm.getWidth();
const int ih = bigIm.getHeight();
const int shadowEdge2 = shadowEdge * 2;
setShadowImage (bigIm, 0, shadowEdge, shadowEdge2, 0, 0);
@ -275,8 +274,6 @@ void DropShadower::updateShadows()
setShadowImage (bigIm, 10, shadowEdge, shadowEdge, iw - shadowEdge2, ih - shadowEdge);
setShadowImage (bigIm, 11, shadowEdge, shadowEdge, shadowEdge2, ih - shadowEdge);
ImageCache::release (bigIm);
for (int i = 0; i < 4; ++i)
{
shadowWindows[numShadows] = new ShadowWindow (owner, i, shadowImageSections);
@ -324,12 +321,12 @@ void DropShadower::updateShadows()
bringShadowWindowsToFront();
}
void DropShadower::setShadowImage (Image* const src, const int num, const int w, const int h,
void DropShadower::setShadowImage (const Image& src, const int num, const int w, const int h,
const int sx, const int sy)
{
shadowImageSections[num] = new Image (Image::ARGB, w, h, true);
shadowImageSections[num] = Image (Image::ARGB, w, h, true, Image::NativeImage);
Graphics g (*shadowImageSections[num]);
Graphics g (shadowImageSections[num]);
g.drawImage (src, 0, 0, w, h, sx, sy, w, h);
}

View file

@ -86,13 +86,13 @@ private:
Component* owner;
int numShadows;
Component* shadowWindows[4];
Image* shadowImageSections[12];
Image shadowImageSections[12];
const int shadowEdge, xOffset, yOffset;
const float alpha, blurRadius;
bool inDestructor, reentrant;
void updateShadows();
void setShadowImage (Image* const src,
void setShadowImage (const Image& src,
const int num,
const int w, const int h,
const int sx, const int sy);

View file

@ -275,7 +275,7 @@ void MagnifierComponent::paint (Graphics& g)
}
g.setImageResamplingQuality (quality);
g.drawImageTransformed (&temp, temp.getBounds(),
g.drawImageTransformed (temp, temp.getBounds(),
AffineTransform::scale ((float) scaleFactor, (float) scaleFactor),
false);
}

View file

@ -67,16 +67,16 @@ void PreferencesPanel::addSettingsPage (const String& title,
}
void PreferencesPanel::addSettingsPage (const String& title,
const char* imageData,
const void* imageData,
const int imageDataSize)
{
DrawableImage icon, iconOver, iconDown;
icon.setImage (ImageCache::getFromMemory (imageData, imageDataSize), true);
icon.setImage (ImageCache::getFromMemory (imageData, imageDataSize));
iconOver.setImage (ImageCache::getFromMemory (imageData, imageDataSize), true);
iconOver.setImage (ImageCache::getFromMemory (imageData, imageDataSize));
iconOver.setOverlayColour (Colours::black.withAlpha (0.12f));
iconDown.setImage (ImageCache::getFromMemory (imageData, imageDataSize), true);
iconDown.setImage (ImageCache::getFromMemory (imageData, imageDataSize));
iconDown.setOverlayColour (Colours::black.withAlpha (0.25f));
addSettingsPage (title, &icon, &iconOver, &iconDown);

View file

@ -95,7 +95,7 @@ public:
@param imageDataSize the size of the image data, in bytes
*/
void addSettingsPage (const String& pageTitle,
const char* imageData,
const void* imageData,
int imageDataSize);
/** Utility method to display this panel in a DialogWindow.

View file

@ -107,9 +107,9 @@ void DocumentWindow::setName (const String& newName)
}
}
void DocumentWindow::setIcon (const Image* imageToUse)
void DocumentWindow::setIcon (const Image& imageToUse)
{
titleBarIcon = imageToUse != 0 ? imageToUse->createCopy() : 0;
titleBarIcon = imageToUse;
repaintTitleBar();
}
@ -227,7 +227,7 @@ void DocumentWindow::paint (Graphics& g)
titleBarArea.getHeight(),
titleSpaceX1,
jmax (1, titleSpaceX2 - titleSpaceX1),
titleBarIcon,
titleBarIcon.isValid() ? &titleBarIcon : 0,
! drawTitleTextCentred);
}

View file

@ -115,7 +115,7 @@ public:
image after calling this. If 0 is passed-in, any existing icon will be
removed.
*/
void setIcon (const Image* imageToUse);
void setIcon (const Image& imageToUse);
/** Changes the height of the title-bar. */
void setTitleBarHeight (int newHeight);
@ -249,7 +249,7 @@ private:
int titleBarHeight, menuBarHeight, requiredButtons;
bool positionTitleBarButtonsOnLeft, drawTitleTextCentred;
ScopedPointer <Button> titleBarButtons [3];
ScopedPointer <Image> titleBarIcon;
Image titleBarIcon;
ScopedPointer <MenuBarComponent> menuBar;
MenuBarModel* menuBarModel;

View file

@ -36,34 +36,32 @@ BEGIN_JUCE_NAMESPACE
//==============================================================================
SplashScreen::SplashScreen()
: backgroundImage (0)
{
setOpaque (true);
}
SplashScreen::~SplashScreen()
{
ImageCache::releaseOrDelete (backgroundImage);
}
//==============================================================================
void SplashScreen::show (const String& title,
Image* const backgroundImage_,
const Image& backgroundImage_,
const int minimumTimeToDisplayFor,
const bool useDropShadow,
const bool removeOnMouseClick)
{
backgroundImage = backgroundImage_;
jassert (backgroundImage_ != 0);
jassert (backgroundImage_.isValid());
if (backgroundImage_ != 0)
if (backgroundImage_.isValid())
{
setOpaque (! backgroundImage_->hasAlphaChannel());
setOpaque (! backgroundImage_.hasAlphaChannel());
show (title,
backgroundImage_->getWidth(),
backgroundImage_->getHeight(),
backgroundImage_.getWidth(),
backgroundImage_.getHeight(),
minimumTimeToDisplayFor,
useDropShadow,
removeOnMouseClick);
@ -101,14 +99,11 @@ void SplashScreen::show (const String& title,
//==============================================================================
void SplashScreen::paint (Graphics& g)
{
if (backgroundImage != 0)
{
g.setOpacity (1.0f);
g.setOpacity (1.0f);
g.drawImage (backgroundImage,
0, 0, getWidth(), getHeight(),
0, 0, backgroundImage->getWidth(), backgroundImage->getHeight());
}
g.drawImage (backgroundImage,
0, 0, getWidth(), getHeight(),
0, 0, backgroundImage.getWidth(), backgroundImage.getHeight());
}
void SplashScreen::timerCallback()

View file

@ -97,7 +97,7 @@ public:
the mouse (anywhere)
*/
void show (const String& title,
Image* backgroundImage,
const Image& backgroundImage,
int minimumTimeToDisplayFor,
bool useDropShadow,
bool removeOnMouseClick = true);
@ -141,7 +141,7 @@ public:
juce_UseDebuggingNewOperator
private:
Image* backgroundImage;
Image backgroundImage;
Time earliestTimeToDelete;
int originalClickCounter;

View file

@ -48,7 +48,7 @@ FillType::FillType (const ColourGradient& gradient_)
}
FillType::FillType (const Image& image_, const AffineTransform& transform_) throw()
: colour (0xff000000), image (&image_), transform (transform_)
: colour (0xff000000), image (image_), transform (transform_)
{
}
@ -89,7 +89,7 @@ bool FillType::operator!= (const FillType& other) const
void FillType::setColour (const Colour& newColour) throw()
{
gradient = 0;
image = 0;
image = Image();
colour = newColour;
}
@ -101,7 +101,7 @@ void FillType::setGradient (const ColourGradient& newGradient)
}
else
{
image = 0;
image = Image();
gradient = new ColourGradient (newGradient);
colour = Colours::black;
}
@ -110,7 +110,7 @@ void FillType::setGradient (const ColourGradient& newGradient)
void FillType::setTiledImage (const Image& image_, const AffineTransform& transform_) throw()
{
gradient = 0;
image = &image_;
image = image_;
transform = transform_;
colour = Colours::black;
}

View file

@ -27,8 +27,8 @@
#define __JUCE_FILLTYPE_JUCEHEADER__
#include "../colour/juce_ColourGradient.h"
#include "../imaging/juce_Image.h"
#include "../../../containers/juce_ScopedPointer.h"
class Image;
//==============================================================================
@ -72,13 +72,13 @@ public:
~FillType() throw();
/** Returns true if this is a solid colour fill, and not a gradient or image. */
bool isColour() const throw() { return gradient == 0 && image == 0; }
bool isColour() const throw() { return gradient == 0 && image.isNull(); }
/** Returns true if this is a gradient fill. */
bool isGradient() const throw() { return gradient != 0; }
/** Returns true if this is a tiled image pattern fill. */
bool isTiledImage() const throw() { return image != 0; }
bool isTiledImage() const throw() { return image.isValid(); }
/** Turns this object into a solid colour fill.
If the object was an image or gradient, those fields will no longer be valid. */
@ -123,13 +123,11 @@ public:
*/
ScopedPointer <ColourGradient> gradient;
/** Returns the image that should be used for tiling.
The FillType object just keeps a pointer to this image, it doesn't own it, so you have to
be careful to make sure the image doesn't get deleted while it's being used.
/** The image that should be used for tiling.
If an image fill is active, the overall opacity with which it should be applied
is indicated by the alpha channel of the colour variable.
*/
const Image* image;
Image image;
/** The transform that should be applied to the image or gradient that's being drawn.
*/

View file

@ -32,6 +32,7 @@ BEGIN_JUCE_NAMESPACE
#include "../geometry/juce_PathStrokeType.h"
#include "juce_LowLevelGraphicsContext.h"
static const Graphics::ResamplingQuality defaultQuality = Graphics::mediumResamplingQuality;
//==============================================================================
@ -56,7 +57,7 @@ LowLevelGraphicsContext::~LowLevelGraphicsContext()
}
//==============================================================================
Graphics::Graphics (Image& imageToDrawOnto)
Graphics::Graphics (const Image& imageToDrawOnto)
: context (imageToDrawOnto.createLowLevelContext()),
contextToDelete (context),
saveStatePending (false)
@ -608,23 +609,20 @@ void Graphics::setImageResamplingQuality (const Graphics::ResamplingQuality newQ
}
//==============================================================================
void Graphics::drawImageAt (const Image* const imageToDraw,
void Graphics::drawImageAt (const Image& imageToDraw,
const int topLeftX, const int topLeftY,
const bool fillAlphaChannelWithCurrentBrush) const
{
if (imageToDraw != 0)
{
const int imageW = imageToDraw->getWidth();
const int imageH = imageToDraw->getHeight();
const int imageW = imageToDraw.getWidth();
const int imageH = imageToDraw.getHeight();
drawImage (imageToDraw,
topLeftX, topLeftY, imageW, imageH,
0, 0, imageW, imageH,
fillAlphaChannelWithCurrentBrush);
}
drawImage (imageToDraw,
topLeftX, topLeftY, imageW, imageH,
0, 0, imageW, imageH,
fillAlphaChannelWithCurrentBrush);
}
void Graphics::drawImageWithin (const Image* const imageToDraw,
void Graphics::drawImageWithin (const Image& imageToDraw,
const int destX, const int destY,
const int destW, const int destH,
const RectanglePlacement& placementWithinTarget,
@ -633,10 +631,10 @@ void Graphics::drawImageWithin (const Image* const imageToDraw,
// passing in a silly number can cause maths problems in rendering!
jassert (areCoordsSensibleNumbers (destX, destY, destW, destH));
if (imageToDraw != 0)
if (imageToDraw.isValid())
{
const int imageW = imageToDraw->getWidth();
const int imageH = imageToDraw->getHeight();
const int imageW = imageToDraw.getWidth();
const int imageH = imageToDraw.getHeight();
if (imageW > 0 && imageH > 0)
{
@ -659,7 +657,7 @@ void Graphics::drawImageWithin (const Image* const imageToDraw,
}
}
void Graphics::drawImage (const Image* const imageToDraw,
void Graphics::drawImage (const Image& imageToDraw,
int dx, int dy, int dw, int dh,
int sx, int sy, int sw, int sh,
const bool fillAlphaChannelWithCurrentBrush) const
@ -668,7 +666,7 @@ void Graphics::drawImage (const Image* const imageToDraw,
jassert (areCoordsSensibleNumbers (dx, dy, dw, dh));
jassert (areCoordsSensibleNumbers (sx, sy, sw, sh));
if (context->clipRegionIntersects (Rectangle<int> (dx, dy, dw, dh)))
if (imageToDraw.isValid() && context->clipRegionIntersects (Rectangle<int> (dx, dy, dw, dh)))
{
drawImageTransformed (imageToDraw, Rectangle<int> (sx, sy, sw, sh),
AffineTransform::scale (dw / (float) sw, dh / (float) sh)
@ -677,25 +675,25 @@ void Graphics::drawImage (const Image* const imageToDraw,
}
}
void Graphics::drawImageTransformed (const Image* const imageToDraw,
void Graphics::drawImageTransformed (const Image& imageToDraw,
const Rectangle<int>& imageSubRegion,
const AffineTransform& transform,
const bool fillAlphaChannelWithCurrentBrush) const
{
if (imageToDraw != 0 && ! context->isClipEmpty())
if (imageToDraw.isValid() && ! context->isClipEmpty())
{
const Rectangle<int> srcClip (imageSubRegion.getIntersection (imageToDraw->getBounds()));
const Rectangle<int> srcClip (imageSubRegion.getIntersection (imageToDraw.getBounds()));
if (fillAlphaChannelWithCurrentBrush)
{
context->saveState();
context->clipToImageAlpha (*imageToDraw, srcClip, transform);
context->clipToImageAlpha (imageToDraw, srcClip, transform);
fillAll();
context->restoreState();
}
else
{
context->drawImage (*imageToDraw, srcClip, transform, false);
context->drawImage (imageToDraw, srcClip, transform, false);
}
}
}

View file

@ -31,10 +31,11 @@
#include "../geometry/juce_PathStrokeType.h"
#include "../geometry/juce_Line.h"
#include "../colour/juce_Colours.h"
#include "juce_FillType.h"
#include "../colour/juce_ColourGradient.h"
#include "juce_RectanglePlacement.h"
class LowLevelGraphicsContext;
class Image;
class FillType;
class RectangleList;
@ -64,7 +65,7 @@ public:
Obviously you shouldn't delete the image before this context is deleted.
*/
explicit Graphics (Image& imageToDrawOnto);
explicit Graphics (const Image& imageToDrawOnto);
/** Destructor. */
~Graphics();
@ -462,7 +463,7 @@ public:
don't want it to be drawn semi-transparently, be sure to call setOpacity (1.0f)
(or setColour() with an opaque colour) before drawing images.
*/
void drawImageAt (const Image* const imageToDraw, int topLeftX, int topLeftY,
void drawImageAt (const Image& imageToDraw, int topLeftX, int topLeftY,
bool fillAlphaChannelWithCurrentBrush = false) const;
/** Draws part of an image, rescaling it to fit in a given target region.
@ -490,7 +491,7 @@ public:
it will just fill the target with a solid rectangle)
@see setImageResamplingQuality, drawImageAt, drawImageWithin, fillAlphaMap
*/
void drawImage (const Image* const imageToDraw,
void drawImage (const Image& imageToDraw,
int destX, int destY, int destWidth, int destHeight,
int sourceX, int sourceY, int sourceWidth, int sourceHeight,
bool fillAlphaChannelWithCurrentBrush = false) const;
@ -516,7 +517,7 @@ public:
@see setImageResamplingQuality, drawImage
*/
void drawImageTransformed (const Image* imageToDraw,
void drawImageTransformed (const Image& imageToDraw,
const Rectangle<int>& imageSubRegion,
const AffineTransform& transform,
bool fillAlphaChannelWithCurrentBrush = false) const;
@ -542,7 +543,7 @@ public:
similar to fillAlphaMap(), and see also drawImage()
@see setImageResamplingQuality, drawImage, drawImageTransformed, drawImageAt, RectanglePlacement
*/
void drawImageWithin (const Image* imageToDraw,
void drawImageWithin (const Image& imageToDraw,
int destX, int destY, int destWidth, int destHeight,
const RectanglePlacement& placementWithinTarget,
bool fillAlphaChannelWithCurrentBrush = false) const;

View file

@ -30,6 +30,7 @@
#include "../geometry/juce_Path.h"
#include "../geometry/juce_RectangleList.h"
#include "../colour/juce_ColourGradient.h"
#include "juce_FillType.h"
//==============================================================================

View file

@ -1925,7 +1925,7 @@ public:
}
else if (fillType.isTiledImage())
{
renderImage (image, *(fillType.image), fillType.image->getBounds(), fillType.transform, shapeToFill);
renderImage (image, fillType.image, fillType.image.getBounds(), fillType.transform, shapeToFill);
}
else
{
@ -2012,13 +2012,13 @@ private:
//==============================================================================
LowLevelGraphicsSoftwareRenderer::LowLevelGraphicsSoftwareRenderer (Image& image_)
LowLevelGraphicsSoftwareRenderer::LowLevelGraphicsSoftwareRenderer (const Image& image_)
: image (image_)
{
currentState = new SavedState (image_.getBounds(), 0, 0);
}
LowLevelGraphicsSoftwareRenderer::LowLevelGraphicsSoftwareRenderer (Image& image_, const int xOffset, const int yOffset,
LowLevelGraphicsSoftwareRenderer::LowLevelGraphicsSoftwareRenderer (const Image& image_, const int xOffset, const int yOffset,
const RectangleList& initialClip)
: image (image_)
{

View file

@ -41,8 +41,8 @@ class JUCE_API LowLevelGraphicsSoftwareRenderer : public LowLevelGraphicsCon
{
public:
//==============================================================================
LowLevelGraphicsSoftwareRenderer (Image& imageToRenderOn);
LowLevelGraphicsSoftwareRenderer (Image& imageToRenderOn, int xOffset, int yOffset, const RectangleList& initialClip);
LowLevelGraphicsSoftwareRenderer (const Image& imageToRenderOn);
LowLevelGraphicsSoftwareRenderer (const Image& imageToRenderOn, int xOffset, int yOffset, const RectangleList& initialClip);
~LowLevelGraphicsSoftwareRenderer();
bool isVectorDevice() const;
@ -91,7 +91,7 @@ public:
protected:
//==============================================================================
Image& image;
Image image;
class GlyphCache;
class CachedGlyph;

View file

@ -91,12 +91,12 @@ Drawable* Drawable::createFromImageData (const void* data, const size_t numBytes
{
Drawable* result = 0;
Image* const image = ImageFileFormat::loadFrom (data, (int) numBytes);
Image image (ImageFileFormat::loadFrom (data, (int) numBytes));
if (image != 0)
if (image.isValid())
{
DrawableImage* const di = new DrawableImage();
di->setImage (image, true);
di->setImage (image);
result = di;
}
else

View file

@ -201,13 +201,13 @@ public:
The image that is returned will be owned by the caller, but it may come
from the ImageCache.
*/
virtual Image* getImageForIdentifier (const var& imageIdentifier) = 0;
virtual const Image getImageForIdentifier (const var& imageIdentifier) = 0;
/** Returns an identifier to be used to refer to a given image.
This is used when converting a drawable into a ValueTree, so if you're
only loading drawables, you can just return a var::null here.
*/
virtual const var getIdentifierForImage (Image* image) = 0;
virtual const var getIdentifierForImage (const Image& image) = 0;
};
/** Tries to create a Drawable from a previously-saved ValueTree.

View file

@ -199,7 +199,7 @@ void DrawableComposite::render (const Drawable::RenderingContext& context) const
}
context.g.setOpacity (context.opacity);
context.g.drawImageAt (&tempImage, clipBounds.getX(), clipBounds.getY());
context.g.drawImageAt (tempImage, clipBounds.getX(), clipBounds.getY());
}
}
}

View file

@ -35,7 +35,6 @@ BEGIN_JUCE_NAMESPACE
//==============================================================================
DrawableImage::DrawableImage()
: image (0),
canDeleteImage (false),
opacity (1.0f),
overlayColour (0x00000000)
{
@ -44,53 +43,28 @@ DrawableImage::DrawableImage()
}
DrawableImage::DrawableImage (const DrawableImage& other)
: image (0),
canDeleteImage (false),
: image (other.image),
opacity (other.opacity),
overlayColour (other.overlayColour)
{
for (int i = 0; i < numElementsInArray (controlPoints); ++i)
controlPoints[i] = other.controlPoints[i];
if (other.image != 0)
{
if ((! other.canDeleteImage) || ! ImageCache::isImageInCache (other.image))
{
setImage (*other.image);
}
else
{
ImageCache::incReferenceCount (other.image);
setImage (other.image, true);
}
}
}
DrawableImage::~DrawableImage()
{
setImage (0, false);
}
//==============================================================================
void DrawableImage::setImage (const Image& imageToCopy)
void DrawableImage::setImage (const Image& imageToUse)
{
setImage (new Image (imageToCopy), true);
}
void DrawableImage::setImage (Image* imageToUse,
const bool releaseWhenNotNeeded)
{
if (canDeleteImage)
ImageCache::releaseOrDelete (image);
image = imageToUse;
canDeleteImage = releaseWhenNotNeeded;
if (image != 0)
if (image.isValid())
{
controlPoints[0] = RelativePoint (Point<float> (0.0f, 0.0f));
controlPoints[1] = RelativePoint (Point<float> ((float) image->getWidth(), 0.0f));
controlPoints[2] = RelativePoint (Point<float> (0.0f, (float) image->getHeight()));
controlPoints[1] = RelativePoint (Point<float> ((float) image.getWidth(), 0.0f));
controlPoints[2] = RelativePoint (Point<float> (0.0f, (float) image.getHeight()));
}
}
@ -116,15 +90,15 @@ void DrawableImage::setTransform (const RelativePoint& imageTopLeftPosition,
//==============================================================================
const AffineTransform DrawableImage::calculateTransform() const
{
if (image == 0)
if (image.isNull())
return AffineTransform::identity;
Point<float> resolved[3];
for (int i = 0; i < 3; ++i)
resolved[i] = controlPoints[i].resolve (parent);
const Point<float> tr (resolved[0] + (resolved[1] - resolved[0]) / (float) image->getWidth());
const Point<float> bl (resolved[0] + (resolved[2] - resolved[0]) / (float) image->getHeight());
const Point<float> tr (resolved[0] + (resolved[1] - resolved[0]) / (float) image.getWidth());
const Point<float> bl (resolved[0] + (resolved[2] - resolved[0]) / (float) image.getHeight());
return AffineTransform::fromTargetPoints (resolved[0].getX(), resolved[0].getY(),
tr.getX(), tr.getY(),
@ -133,27 +107,27 @@ const AffineTransform DrawableImage::calculateTransform() const
void DrawableImage::render (const Drawable::RenderingContext& context) const
{
if (image != 0)
if (image.isValid())
{
const AffineTransform t (calculateTransform().followedBy (context.transform));
if (opacity > 0.0f && ! overlayColour.isOpaque())
{
context.g.setOpacity (context.opacity * opacity);
context.g.drawImageTransformed (image, image->getBounds(), t, false);
context.g.drawImageTransformed (image, image.getBounds(), t, false);
}
if (! overlayColour.isTransparent())
{
context.g.setColour (overlayColour.withMultipliedAlpha (context.opacity));
context.g.drawImageTransformed (image, image->getBounds(), t, true);
context.g.drawImageTransformed (image, image.getBounds(), t, true);
}
}
}
const Rectangle<float> DrawableImage::getBounds() const
{
if (image == 0)
if (image.isNull())
return Rectangle<float>();
Point<float> resolved[3];
@ -179,7 +153,7 @@ const Rectangle<float> DrawableImage::getBounds() const
bool DrawableImage::hitTest (float x, float y) const
{
if (image == 0)
if (image.isNull())
return false;
calculateTransform().inverted().transformPoint (x, y);
@ -189,9 +163,9 @@ bool DrawableImage::hitTest (float x, float y) const
return ix >= 0
&& iy >= 0
&& ix < image->getWidth()
&& iy < image->getHeight()
&& image->getPixelAt (ix, iy).getAlpha() >= 127;
&& ix < image.getWidth()
&& iy < image.getHeight()
&& image.getPixelAt (ix, iy).getAlpha() >= 127;
}
Drawable* DrawableImage::createCopy() const
@ -296,7 +270,7 @@ const Rectangle<float> DrawableImage::refreshFromValueTree (const ValueTree& tre
const float newOpacity = controller.getOpacity();
const Colour newOverlayColour (controller.getOverlayColour());
Image* newImage = 0;
Image newImage;
const var imageIdentifier (controller.getImageIdentifier());
jassert (imageProvider != 0 || imageIdentifier.isVoid()); // if you're using images, you need to provide something that can load and save them!
@ -320,20 +294,11 @@ const Rectangle<float> DrawableImage::refreshFromValueTree (const ValueTree& tre
controlPoints[0] = newControlPoint[0];
controlPoints[1] = newControlPoint[1];
controlPoints[2] = newControlPoint[2];
if (image != newImage)
{
if (canDeleteImage)
ImageCache::releaseOrDelete (image);
canDeleteImage = true;
image = newImage;
}
image = newImage;
return damage.getUnion (getBounds());
}
ImageCache::release (newImage);
return Rectangle<float>();
}
@ -349,7 +314,7 @@ const ValueTree DrawableImage::createValueTree (ImageProvider* imageProvider) co
v.setTargetPositionForTopRight (controlPoints[1], 0);
v.setTargetPositionForBottomLeft (controlPoints[2], 0);
if (image != 0)
if (image.isValid())
{
jassert (imageProvider != 0); // if you're using images, you need to provide something that can load and save them!

View file

@ -27,6 +27,7 @@
#define __JUCE_DRAWABLEIMAGE_JUCEHEADER__
#include "juce_Drawable.h"
#include "../imaging/juce_Image.h"
//==============================================================================
@ -46,30 +47,11 @@ public:
virtual ~DrawableImage();
//==============================================================================
/** Sets the image that this drawable will render.
An internal copy is made of the image passed-in. If you want to provide an
image that this object can take charge of without needing to create a copy,
use the other setImage() method.
*/
void setImage (const Image& imageToCopy);
/** Sets the image that this drawable will render.
A good way to use this is with the ImageCache - if you create an image
with ImageCache and pass it in here with releaseWhenNotNeeded = true, then
it'll be released neatly with its reference count being decreased.
@param imageToUse the image to render (may be a null pointer)
@param releaseWhenNotNeeded if false, a simple pointer is kept to the image; if true,
then the image will be deleted when this object no longer
needs it - unless the image was created by the ImageCache,
in which case it will be released with ImageCache::release().
*/
void setImage (Image* imageToUse, bool releaseWhenNotNeeded);
/** Sets the image that this drawable will render. */
void setImage (const Image& imageToUse);
/** Returns the current image. */
Image* getImage() const throw() { return image; }
const Image getImage() const { return image; }
/** Sets the opacity to use when drawing the image. */
void setOpacity (float newOpacity);
@ -176,8 +158,7 @@ public:
juce_UseDebuggingNewOperator
private:
Image* image;
bool canDeleteImage;
Image image;
float opacity;
Colour overlayColour;
RelativePoint controlPoints[3];

View file

@ -28,6 +28,7 @@
#include "juce_Drawable.h"
#include "../colour/juce_ColourGradient.h"
#include "../contexts/juce_FillType.h"
//==============================================================================

View file

@ -102,10 +102,10 @@ void DropShadowEffect::applyEffect (Image& image, Graphics& g)
}
g.setColour (Colours::black.withAlpha (opacity));
g.drawImageAt (&shadowImage, offsetX, offsetY, true);
g.drawImageAt (shadowImage, offsetX, offsetY, true);
g.setOpacity (1.0f);
g.drawImageAt (&image, 0, 0);
g.drawImageAt (image, 0, 0);
}
#if JUCE_MSVC && JUCE_DEBUG

View file

@ -58,13 +58,13 @@ void GlowEffect::applyEffect (Image& image, Graphics& g)
blurKernel.createGaussianBlur (radius);
blurKernel.rescaleAllValues (radius);
blurKernel.applyToImage (temp, &image, image.getBounds());
blurKernel.applyToImage (temp, image, image.getBounds());
g.setColour (colour);
g.drawImageAt (&temp, 0, 0, true);
g.drawImageAt (temp, 0, 0, true);
g.setOpacity (1.0f);
g.drawImageAt (&image, 0, 0, false);
g.drawImageAt (image, 0, 0, false);
}
END_JUCE_NAMESPACE

View file

@ -49,7 +49,7 @@ void ReduceOpacityEffect::setOpacity (const float newOpacity)
void ReduceOpacityEffect::applyEffect (Image& image, Graphics& g)
{
g.setOpacity (opacity);
g.drawImageAt (&image, 0, 0);
g.drawImageAt (image, 0, 0);
}
END_JUCE_NAMESPACE

View file

@ -204,25 +204,6 @@ namespace RelativeCoordinateHelpers
return String (n, 3).trimCharactersAtEnd ("0").trimCharactersAtEnd (".");
}
static bool couldBeMistakenForPathCommand (const String& s)
{
switch (s[0])
{
case 'a':
case 'm':
case 'l':
case 'z':
case 'q':
case 'c':
return s[1] == 0 || CharacterFunctions::isWhitespace (s[1]);
default:
break;
}
return false;
}
}
//==============================================================================
@ -632,7 +613,7 @@ RelativePointPath::RelativePointPath (const RelativePointPath& other)
containsDynamicPoints (false)
{
ValueTree state (DrawablePath::valueTreeType);
writeTo (state, 0);
other.writeTo (state, 0);
parse (state);
}
@ -663,7 +644,7 @@ RelativePointPath::RelativePointPath (const Path& path)
}
}
void RelativePointPath::writeTo (ValueTree state, UndoManager* undoManager)
void RelativePointPath::writeTo (ValueTree state, UndoManager* undoManager) const
{
DrawablePath::ValueTreeWrapper wrapper (state);
wrapper.setUsesNonZeroWinding (usesNonZeroWinding, undoManager);

View file

@ -432,7 +432,7 @@ public:
bool containsAnyDynamicPoints() const;
/** Writes the path to this drawable encoding. */
void writeTo (ValueTree state, UndoManager* undoManager);
void writeTo (ValueTree state, UndoManager* undoManager) const;
/** Quickly swaps the contents of this path with another. */
void swapWith (RelativePointPath& other) throw();

View file

@ -97,8 +97,8 @@ GIFLoader::GIFLoader (InputStream& in)
if (! readPalette (numColours))
break;
image = Image::createNativeImage ((transparent >= 0) ? Image::ARGB : Image::RGB,
imageWidth, imageHeight, (transparent >= 0));
image = Image ((transparent >= 0) ? Image::ARGB : Image::RGB,
imageWidth, imageHeight, (transparent >= 0));
readImage (imageWidth, imageHeight,
(buf[8] & 0x40) != 0,
@ -382,9 +382,9 @@ bool GIFLoader::readImage (const int width, const int height,
int index;
int xpos = 0, ypos = 0, pass = 0;
const Image::BitmapData destData (*image, 0, 0, width, height, true);
const Image::BitmapData destData (image, 0, 0, width, height, true);
uint8* p = destData.data;
const bool hasAlpha = image->hasAlphaChannel();
const bool hasAlpha = image.hasAlphaChannel();
while ((index = readLZWByte (false, c)) >= 0)
{

View file

@ -45,10 +45,10 @@ public:
GIFLoader (InputStream& in);
~GIFLoader();
Image* getImage() const { return image; }
const Image& getImage() const { return image; }
private:
Image* image;
Image image;
InputStream& input;
uint8 buffer [300];
uint8 palette [256][4];

View file

@ -249,7 +249,7 @@ bool JPEGImageFormat::canUnderstand (InputStream& in)
return false;
}
Image* JPEGImageFormat::decodeImage (InputStream& in)
const Image JPEGImageFormat::decodeImage (InputStream& in)
{
using namespace jpeglibNamespace;
using namespace JPEGHelpers;
@ -257,7 +257,7 @@ Image* JPEGImageFormat::decodeImage (InputStream& in)
MemoryBlock mb;
in.readIntoMemoryBlock (mb);
Image* image = 0;
Image image;
if (mb.getSize() > 16)
{
@ -299,10 +299,10 @@ Image* JPEGImageFormat::decodeImage (InputStream& in)
if (jpeg_start_decompress (&jpegDecompStruct))
{
image = Image::createNativeImage (Image::RGB, width, height, false);
const bool hasAlphaChan = image->hasAlphaChannel();
image = Image (Image::RGB, width, height, false);
const bool hasAlphaChan = image.hasAlphaChannel(); // (the native image creator may not give back what we expect)
const Image::BitmapData destData (*image, 0, 0, width, height, true);
const Image::BitmapData destData (image, 0, 0, width, height, true);
for (int y = 0; y < height; ++y)
{

View file

@ -151,10 +151,10 @@ bool PNGImageFormat::canUnderstand (InputStream& in)
&& header[3] == 'G';
}
Image* PNGImageFormat::decodeImage (InputStream& in)
const Image PNGImageFormat::decodeImage (InputStream& in)
{
using namespace pnglibNamespace;
Image* image = 0;
Image image;
png_structp pngReadStruct;
png_infop pngInfoStruct;
@ -168,7 +168,7 @@ Image* PNGImageFormat::decodeImage (InputStream& in)
if (pngInfoStruct == 0)
{
png_destroy_read_struct (&pngReadStruct, 0, 0);
return 0;
return Image();
}
png_set_error_fn (pngReadStruct, 0, PNGHelpers::errorCallback, PNGHelpers::errorCallback );
@ -221,12 +221,12 @@ Image* PNGImageFormat::decodeImage (InputStream& in)
png_destroy_read_struct (&pngReadStruct, &pngInfoStruct, 0);
// now convert the data to a juce image format..
image = Image::createNativeImage (hasAlphaChan ? Image::ARGB : Image::RGB,
(int) width, (int) height, hasAlphaChan);
image = Image (hasAlphaChan ? Image::ARGB : Image::RGB,
(int) width, (int) height, hasAlphaChan);
hasAlphaChan = image->hasAlphaChannel(); // (the native image creator may not give back what we expect)
hasAlphaChan = image.hasAlphaChannel(); // (the native image creator may not give back what we expect)
const Image::BitmapData destData (*image, 0, 0, (int) width, (int) height, true);
const Image::BitmapData destData (image, 0, 0, (int) width, (int) height, true);
uint8* srcRow = tempBuffer;
uint8* destRow = destData.data;

View file

@ -46,7 +46,7 @@ public:
and make sure that you process the data as quickly as possible to
avoid glitching!
*/
virtual void imageReceived (Image& image) = 0;
virtual void imageReceived (const Image& image) = 0;
};

Some files were not shown because too many files have changed in this diff Show more