| @@ -83856,6 +83856,8 @@ const Identifier Drawable::ValueTreeWrapperBase::gradientPoint2 ("point2"); | |||||
| const Identifier Drawable::ValueTreeWrapperBase::colour ("colour"); | const Identifier Drawable::ValueTreeWrapperBase::colour ("colour"); | ||||
| const Identifier Drawable::ValueTreeWrapperBase::radial ("radial"); | const Identifier Drawable::ValueTreeWrapperBase::radial ("radial"); | ||||
| const Identifier Drawable::ValueTreeWrapperBase::colours ("colours"); | const Identifier Drawable::ValueTreeWrapperBase::colours ("colours"); | ||||
| const Identifier Drawable::ValueTreeWrapperBase::imageId ("imageId"); | |||||
| const Identifier Drawable::ValueTreeWrapperBase::imageOpacity ("imageOpacity"); | |||||
| Drawable::ValueTreeWrapperBase::ValueTreeWrapperBase (const ValueTree& state_) | Drawable::ValueTreeWrapperBase::ValueTreeWrapperBase (const ValueTree& state_) | ||||
| : state (state_) | : state (state_) | ||||
| @@ -83871,7 +83873,7 @@ const String Drawable::ValueTreeWrapperBase::getID() const | |||||
| return state [idProperty]; | return state [idProperty]; | ||||
| } | } | ||||
| void Drawable::ValueTreeWrapperBase::setID (const String& newID, UndoManager* undoManager) | |||||
| void Drawable::ValueTreeWrapperBase::setID (const String& newID, UndoManager* const undoManager) | |||||
| { | { | ||||
| if (newID.isEmpty()) | if (newID.isEmpty()) | ||||
| state.removeProperty (idProperty, undoManager); | state.removeProperty (idProperty, undoManager); | ||||
| @@ -83879,8 +83881,8 @@ void Drawable::ValueTreeWrapperBase::setID (const String& newID, UndoManager* un | |||||
| state.setProperty (idProperty, newID, undoManager); | state.setProperty (idProperty, newID, undoManager); | ||||
| } | } | ||||
| const FillType Drawable::ValueTreeWrapperBase::readFillType (const ValueTree& v, RelativePoint* gp1, RelativePoint* gp2, | |||||
| RelativeCoordinate::NamedCoordinateFinder* nameFinder) | |||||
| const FillType Drawable::ValueTreeWrapperBase::readFillType (const ValueTree& v, RelativePoint* const gp1, RelativePoint* const gp2, | |||||
| RelativeCoordinate::NamedCoordinateFinder* const nameFinder, ImageProvider* imageProvider) | |||||
| { | { | ||||
| const String newType (v[type].toString()); | const String newType (v[type].toString()); | ||||
| @@ -83916,7 +83918,13 @@ const FillType Drawable::ValueTreeWrapperBase::readFillType (const ValueTree& v, | |||||
| } | } | ||||
| else if (newType == "image") | else if (newType == "image") | ||||
| { | { | ||||
| jassertfalse; //xxx todo | |||||
| Image im; | |||||
| if (imageProvider != 0) | |||||
| im = imageProvider->getImageForIdentifier (v[imageId]); | |||||
| FillType f (im, AffineTransform::identity); | |||||
| f.setOpacity ((float) v.getProperty (imageOpacity, 1.0f)); | |||||
| return f; | |||||
| } | } | ||||
| jassertfalse; | jassertfalse; | ||||
| @@ -83924,8 +83932,8 @@ const FillType Drawable::ValueTreeWrapperBase::readFillType (const ValueTree& v, | |||||
| } | } | ||||
| void Drawable::ValueTreeWrapperBase::writeFillType (ValueTree& v, const FillType& fillType, | void Drawable::ValueTreeWrapperBase::writeFillType (ValueTree& v, const FillType& fillType, | ||||
| const RelativePoint* gp1, const RelativePoint* gp2, | |||||
| UndoManager* const undoManager) | |||||
| const RelativePoint* const gp1, const RelativePoint* const gp2, | |||||
| ImageProvider* imageProvider, UndoManager* const undoManager) | |||||
| { | { | ||||
| if (fillType.isColour()) | if (fillType.isColour()) | ||||
| { | { | ||||
| @@ -83941,8 +83949,8 @@ void Drawable::ValueTreeWrapperBase::writeFillType (ValueTree& v, const FillType | |||||
| String s; | String s; | ||||
| for (int i = 0; i < fillType.gradient->getNumColours(); ++i) | for (int i = 0; i < fillType.gradient->getNumColours(); ++i) | ||||
| s << " " << fillType.gradient->getColourPosition (i) | |||||
| << " " << String::toHexString ((int) fillType.gradient->getColour(i).getARGB()); | |||||
| s << ' ' << fillType.gradient->getColourPosition (i) | |||||
| << ' ' << String::toHexString ((int) fillType.gradient->getColour(i).getARGB()); | |||||
| v.setProperty (colours, s.trimStart(), undoManager); | v.setProperty (colours, s.trimStart(), undoManager); | ||||
| } | } | ||||
| @@ -83950,7 +83958,13 @@ void Drawable::ValueTreeWrapperBase::writeFillType (ValueTree& v, const FillType | |||||
| { | { | ||||
| v.setProperty (type, "image", undoManager); | v.setProperty (type, "image", undoManager); | ||||
| jassertfalse; //xxx todo | |||||
| if (imageProvider != 0) | |||||
| v.setProperty (imageId, imageProvider->getIdentifierForImage (fillType.image), undoManager); | |||||
| if (fillType.getOpacity() < 1.0f) | |||||
| v.setProperty (imageOpacity, fillType.getOpacity(), undoManager); | |||||
| else | |||||
| v.removeProperty (imageOpacity, undoManager); | |||||
| } | } | ||||
| else | else | ||||
| { | { | ||||
| @@ -84759,6 +84773,11 @@ const var DrawableImage::ValueTreeWrapper::getImageIdentifier() const | |||||
| return state [image]; | return state [image]; | ||||
| } | } | ||||
| Value DrawableImage::ValueTreeWrapper::getImageIdentifierValue (UndoManager* undoManager) | |||||
| { | |||||
| return state.getPropertyAsValue (image, undoManager); | |||||
| } | |||||
| void DrawableImage::ValueTreeWrapper::setImageIdentifier (const var& newIdentifier, UndoManager* undoManager) | void DrawableImage::ValueTreeWrapper::setImageIdentifier (const var& newIdentifier, UndoManager* undoManager) | ||||
| { | { | ||||
| state.setProperty (image, newIdentifier, undoManager); | state.setProperty (image, newIdentifier, undoManager); | ||||
| @@ -84769,6 +84788,14 @@ float DrawableImage::ValueTreeWrapper::getOpacity() const | |||||
| return (float) state.getProperty (opacity, 1.0); | return (float) state.getProperty (opacity, 1.0); | ||||
| } | } | ||||
| Value DrawableImage::ValueTreeWrapper::getOpacityValue (UndoManager* undoManager) | |||||
| { | |||||
| if (! state.hasProperty (opacity)) | |||||
| state.setProperty (opacity, 1.0, undoManager); | |||||
| return state.getPropertyAsValue (opacity, undoManager); | |||||
| } | |||||
| void DrawableImage::ValueTreeWrapper::setOpacity (float newOpacity, UndoManager* undoManager) | void DrawableImage::ValueTreeWrapper::setOpacity (float newOpacity, UndoManager* undoManager) | ||||
| { | { | ||||
| state.setProperty (opacity, newOpacity, undoManager); | state.setProperty (opacity, newOpacity, undoManager); | ||||
| @@ -84787,6 +84814,11 @@ void DrawableImage::ValueTreeWrapper::setOverlayColour (const Colour& newColour, | |||||
| state.setProperty (overlay, String::toHexString ((int) newColour.getARGB()), undoManager); | state.setProperty (overlay, String::toHexString ((int) newColour.getARGB()), undoManager); | ||||
| } | } | ||||
| Value DrawableImage::ValueTreeWrapper::getOverlayColourValue (UndoManager* undoManager) | |||||
| { | |||||
| return state.getPropertyAsValue (overlay, undoManager); | |||||
| } | |||||
| const RelativePoint DrawableImage::ValueTreeWrapper::getTargetPositionForTopLeft() const | const RelativePoint DrawableImage::ValueTreeWrapper::getTargetPositionForTopLeft() const | ||||
| { | { | ||||
| const String pos (state [topLeft].toString()); | const String pos (state [topLeft].toString()); | ||||
| @@ -85065,7 +85097,7 @@ ValueTree DrawablePath::ValueTreeWrapper::getMainFillState() | |||||
| if (v.isValid()) | if (v.isValid()) | ||||
| return v; | return v; | ||||
| setMainFill (Colours::black, 0, 0, 0); | |||||
| setMainFill (Colours::black, 0, 0, 0, 0); | |||||
| return getMainFillState(); | return getMainFillState(); | ||||
| } | } | ||||
| @@ -85075,32 +85107,34 @@ ValueTree DrawablePath::ValueTreeWrapper::getStrokeFillState() | |||||
| if (v.isValid()) | if (v.isValid()) | ||||
| return v; | return v; | ||||
| setStrokeFill (Colours::black, 0, 0, 0); | |||||
| setStrokeFill (Colours::black, 0, 0, 0, 0); | |||||
| return getStrokeFillState(); | return getStrokeFillState(); | ||||
| } | } | ||||
| const FillType DrawablePath::ValueTreeWrapper::getMainFill (RelativeCoordinate::NamedCoordinateFinder* nameFinder) const | |||||
| const FillType DrawablePath::ValueTreeWrapper::getMainFill (RelativeCoordinate::NamedCoordinateFinder* nameFinder, | |||||
| ImageProvider* imageProvider) const | |||||
| { | { | ||||
| return readFillType (state.getChildWithName (fill), 0, 0, nameFinder); | |||||
| return readFillType (state.getChildWithName (fill), 0, 0, nameFinder, imageProvider); | |||||
| } | } | ||||
| void DrawablePath::ValueTreeWrapper::setMainFill (const FillType& newFill, const RelativePoint* gp1, | void DrawablePath::ValueTreeWrapper::setMainFill (const FillType& newFill, const RelativePoint* gp1, | ||||
| const RelativePoint* gp2, UndoManager* undoManager) | |||||
| const RelativePoint* gp2, ImageProvider* imageProvider, UndoManager* undoManager) | |||||
| { | { | ||||
| ValueTree v (state.getOrCreateChildWithName (fill, undoManager)); | ValueTree v (state.getOrCreateChildWithName (fill, undoManager)); | ||||
| writeFillType (v, newFill, gp1, gp2, undoManager); | |||||
| writeFillType (v, newFill, gp1, gp2, imageProvider, undoManager); | |||||
| } | } | ||||
| const FillType DrawablePath::ValueTreeWrapper::getStrokeFill (RelativeCoordinate::NamedCoordinateFinder* nameFinder) const | |||||
| const FillType DrawablePath::ValueTreeWrapper::getStrokeFill (RelativeCoordinate::NamedCoordinateFinder* nameFinder, | |||||
| ImageProvider* imageProvider) const | |||||
| { | { | ||||
| return readFillType (state.getChildWithName (stroke), 0, 0, nameFinder); | |||||
| return readFillType (state.getChildWithName (stroke), 0, 0, nameFinder, imageProvider); | |||||
| } | } | ||||
| void DrawablePath::ValueTreeWrapper::setStrokeFill (const FillType& newFill, const RelativePoint* gp1, | void DrawablePath::ValueTreeWrapper::setStrokeFill (const FillType& newFill, const RelativePoint* gp1, | ||||
| const RelativePoint* gp2, UndoManager* undoManager) | |||||
| const RelativePoint* gp2, ImageProvider* imageProvider, UndoManager* undoManager) | |||||
| { | { | ||||
| ValueTree v (state.getOrCreateChildWithName (stroke, undoManager)); | ValueTree v (state.getOrCreateChildWithName (stroke, undoManager)); | ||||
| writeFillType (v, newFill, gp1, gp2, undoManager); | |||||
| writeFillType (v, newFill, gp1, gp2, imageProvider, undoManager); | |||||
| } | } | ||||
| const PathStrokeType DrawablePath::ValueTreeWrapper::getStrokeType() const | const PathStrokeType DrawablePath::ValueTreeWrapper::getStrokeType() const | ||||
| @@ -85193,14 +85227,14 @@ const RelativePoint DrawablePath::ValueTreeWrapper::Element::getEndPoint() const | |||||
| return RelativePoint(); | return RelativePoint(); | ||||
| } | } | ||||
| const Rectangle<float> DrawablePath::refreshFromValueTree (const ValueTree& tree, ImageProvider*) | |||||
| const Rectangle<float> DrawablePath::refreshFromValueTree (const ValueTree& tree, ImageProvider* imageProvider) | |||||
| { | { | ||||
| Rectangle<float> damageRect; | Rectangle<float> damageRect; | ||||
| ValueTreeWrapper v (tree); | ValueTreeWrapper v (tree); | ||||
| setName (v.getID()); | setName (v.getID()); | ||||
| bool needsRedraw = false; | bool needsRedraw = false; | ||||
| const FillType newFill (v.getMainFill (parent)); | |||||
| const FillType newFill (v.getMainFill (parent, imageProvider)); | |||||
| if (mainFill != newFill) | if (mainFill != newFill) | ||||
| { | { | ||||
| @@ -85208,7 +85242,7 @@ const Rectangle<float> DrawablePath::refreshFromValueTree (const ValueTree& tree | |||||
| mainFill = newFill; | mainFill = newFill; | ||||
| } | } | ||||
| const FillType newStrokeFill (v.getStrokeFill (parent)); | |||||
| const FillType newStrokeFill (v.getStrokeFill (parent, imageProvider)); | |||||
| if (strokeFill != newStrokeFill) | if (strokeFill != newStrokeFill) | ||||
| { | { | ||||
| @@ -85242,14 +85276,14 @@ const Rectangle<float> DrawablePath::refreshFromValueTree (const ValueTree& tree | |||||
| return damageRect; | return damageRect; | ||||
| } | } | ||||
| const ValueTree DrawablePath::createValueTree (ImageProvider*) const | |||||
| const ValueTree DrawablePath::createValueTree (ImageProvider* imageProvider) const | |||||
| { | { | ||||
| ValueTree tree (valueTreeType); | ValueTree tree (valueTreeType); | ||||
| ValueTreeWrapper v (tree); | ValueTreeWrapper v (tree); | ||||
| v.setID (getName(), 0); | v.setID (getName(), 0); | ||||
| v.setMainFill (mainFill, 0, 0, 0); | |||||
| v.setStrokeFill (strokeFill, 0, 0, 0); | |||||
| v.setMainFill (mainFill, 0, 0, imageProvider, 0); | |||||
| v.setStrokeFill (strokeFill, 0, 0, imageProvider, 0); | |||||
| v.setStrokeType (strokeType, 0); | v.setStrokeType (strokeType, 0); | ||||
| if (relativePath != 0) | if (relativePath != 0) | ||||
| @@ -93288,6 +93322,17 @@ const Image Image::convertedToFormat (PixelFormat newFormat) const | |||||
| return newImage; | return newImage; | ||||
| } | } | ||||
| const var Image::getTag() const | |||||
| { | |||||
| return image == 0 ? var::null : image->userTag; | |||||
| } | |||||
| void Image::setTag (const var& newTag) | |||||
| { | |||||
| if (image != 0) | |||||
| image->userTag = newTag; | |||||
| } | |||||
| Image::BitmapData::BitmapData (Image& image, const int x, const int y, const int w, const int h, const bool /*makeWritable*/) | Image::BitmapData::BitmapData (Image& image, const int x, const int y, const int w, const int h, const bool /*makeWritable*/) | ||||
| : data (image.image == 0 ? 0 : image.image->getPixelData (x, y)), | : data (image.image == 0 ? 0 : image.image->getPixelData (x, y)), | ||||
| pixelFormat (image.getFormat()), | pixelFormat (image.getFormat()), | ||||
| @@ -253550,10 +253595,10 @@ bool juce_setThreadPriority (void* handle, int priority) | |||||
| int pri = ((maxp - minp) / 2) * (priority - 1) / 9; | int pri = ((maxp - minp) / 2) * (priority - 1) / 9; | ||||
| if (param.__sched_priority >= (minp + (maxp - minp) / 2)) | |||||
| param.__sched_priority = minp + ((maxp - minp) / 2) + pri; // (realtime) | |||||
| if (param.sched_priority >= (minp + (maxp - minp) / 2)) | |||||
| param.sched_priority = minp + ((maxp - minp) / 2) + pri; // (realtime) | |||||
| else | else | ||||
| param.__sched_priority = minp + pri; // (high) | |||||
| param.sched_priority = minp + pri; // (high) | |||||
| param.sched_priority = jlimit (1, 127, 1 + (priority * 126) / 11); | param.sched_priority = jlimit (1, 127, 1 + (priority * 126) / 11); | ||||
| return pthread_setschedparam ((pthread_t) handle, policy, ¶m) == 0; | return pthread_setschedparam ((pthread_t) handle, policy, ¶m) == 0; | ||||
| @@ -253620,13 +253665,13 @@ void Process::setPriority (ProcessPriority prior) | |||||
| maxp = sched_get_priority_max (policy); | maxp = sched_get_priority_max (policy); | ||||
| if (p < 2) | if (p < 2) | ||||
| param.__sched_priority = 0; | |||||
| param.sched_priority = 0; | |||||
| else if (p == 2 ) | else if (p == 2 ) | ||||
| // Set to middle of lower realtime priority range | // Set to middle of lower realtime priority range | ||||
| param.__sched_priority = minp + (maxp - minp) / 4; | |||||
| param.sched_priority = minp + (maxp - minp) / 4; | |||||
| else | else | ||||
| // Set to middle of higher realtime priority range | // Set to middle of higher realtime priority range | ||||
| param.__sched_priority = minp + (3 * (maxp - minp) / 4); | |||||
| param.sched_priority = minp + (3 * (maxp - minp) / 4); | |||||
| pthread_setschedparam (pthread_self(), policy, ¶m); | pthread_setschedparam (pthread_self(), policy, ¶m); | ||||
| } | } | ||||
| @@ -64,7 +64,7 @@ | |||||
| */ | */ | ||||
| #define JUCE_MAJOR_VERSION 1 | #define JUCE_MAJOR_VERSION 1 | ||||
| #define JUCE_MINOR_VERSION 52 | #define JUCE_MINOR_VERSION 52 | ||||
| #define JUCE_BUILDNUMBER 10 | |||||
| #define JUCE_BUILDNUMBER 11 | |||||
| /** Current Juce version number. | /** Current Juce version number. | ||||
| @@ -24182,6 +24182,9 @@ public: | |||||
| /** True if the image's format is RGB. */ | /** True if the image's format is RGB. */ | ||||
| bool isRGB() const throw() { return getFormat() == RGB; } | bool isRGB() const throw() { return getFormat() == RGB; } | ||||
| /** True if the image's format is a single-channel alpha map. */ | |||||
| bool isSingleChannel() const throw() { return getFormat() == SingleChannel; } | |||||
| /** True if the image contains an alpha-channel. */ | /** True if the image contains an alpha-channel. */ | ||||
| bool hasAlphaChannel() const throw() { return getFormat() != RGB; } | bool hasAlphaChannel() const throw() { return getFormat() != RGB; } | ||||
| @@ -24219,6 +24222,8 @@ public: | |||||
| Call this if you want to draw onto the image, but want to make sure that this doesn't | Call this if you want to draw onto the image, but want to make sure that this doesn't | ||||
| affect any other code that may be sharing the same data. | affect any other code that may be sharing the same data. | ||||
| @see getReferenceCount | |||||
| */ | */ | ||||
| void duplicateIfShared(); | void duplicateIfShared(); | ||||
| @@ -24348,12 +24353,37 @@ public: | |||||
| void createSolidAreaMask (RectangleList& result, | void createSolidAreaMask (RectangleList& result, | ||||
| float alphaThreshold = 0.5f) const; | float alphaThreshold = 0.5f) const; | ||||
| /** Returns a user-specified data item that was set with setTag(). | |||||
| setTag() and getTag() allow you to attach an arbitrary identifier value to an | |||||
| image. The value is shared between all Image object that are referring to the | |||||
| same underlying image data object. | |||||
| */ | |||||
| const var getTag() const; | |||||
| /** Attaches a user-specified data item to this image, which can be retrieved using getTag(). | |||||
| setTag() and getTag() allow you to attach an arbitrary identifier value to an | |||||
| image. The value is shared between all Image object that are referring to the | |||||
| same underlying image data object. | |||||
| Note that if this Image is null, this method will fail to store the data. | |||||
| */ | |||||
| void setTag (const var& newTag); | |||||
| /** Creates a context suitable for drawing onto this image. | /** Creates a context suitable for drawing onto this image. | ||||
| Don't call this method directly! It's used internally by the Graphics class. | Don't call this method directly! It's used internally by the Graphics class. | ||||
| */ | */ | ||||
| LowLevelGraphicsContext* createLowLevelContext() const; | LowLevelGraphicsContext* createLowLevelContext() const; | ||||
| /** | |||||
| /** Returns the number of Image objects which are currently referring to the same internal | |||||
| shared image data. | |||||
| @see duplicateIfShared | |||||
| */ | |||||
| int getReferenceCount() const throw() { return image == 0 ? 0 : image->getReferenceCount(); } | |||||
| /** This is a base class for task-specific types of image. | |||||
| Don't use this class directly! It's used internally by the Image class. | |||||
| */ | */ | ||||
| class SharedImage : public ReferenceCountedObject | class SharedImage : public ReferenceCountedObject | ||||
| { | { | ||||
| @@ -24375,6 +24405,7 @@ public: | |||||
| const int width, height; | const int width, height; | ||||
| int pixelStride, lineStride; | int pixelStride, lineStride; | ||||
| uint8* imageData; | uint8* imageData; | ||||
| var userTag; | |||||
| uint8* getPixelData (int x, int y) const throw(); | uint8* getPixelData (int x, int y) const throw(); | ||||
| @@ -24384,13 +24415,9 @@ public: | |||||
| /** @internal */ | /** @internal */ | ||||
| SharedImage* getSharedImage() const throw() { return image; } | SharedImage* getSharedImage() const throw() { return image; } | ||||
| /** @internal */ | /** @internal */ | ||||
| explicit Image (SharedImage* instance); | explicit Image (SharedImage* instance); | ||||
| /** @internal */ | |||||
| int getReferenceCount() const throw() { return image->getReferenceCount(); } | |||||
| juce_UseDebuggingNewOperator | juce_UseDebuggingNewOperator | ||||
| private: | private: | ||||
| @@ -42844,14 +42871,16 @@ public: | |||||
| static const Identifier idProperty; | static const Identifier idProperty; | ||||
| static const FillType readFillType (const ValueTree& v, RelativePoint* gradientPoint1, RelativePoint* gradientPoint2, | static const FillType readFillType (const ValueTree& v, RelativePoint* gradientPoint1, RelativePoint* gradientPoint2, | ||||
| RelativeCoordinate::NamedCoordinateFinder* nameFinder); | |||||
| RelativeCoordinate::NamedCoordinateFinder* nameFinder, | |||||
| ImageProvider* imageProvider); | |||||
| static void writeFillType (ValueTree& v, const FillType& fillType, | static void writeFillType (ValueTree& v, const FillType& fillType, | ||||
| const RelativePoint* gradientPoint1, const RelativePoint* gradientPoint2, | const RelativePoint* gradientPoint1, const RelativePoint* gradientPoint2, | ||||
| ImageProvider* imageProvider, | |||||
| UndoManager* undoManager); | UndoManager* undoManager); | ||||
| ValueTree state; | ValueTree state; | ||||
| static const Identifier type, gradientPoint1, gradientPoint2, colour, radial, colours; | |||||
| static const Identifier type, gradientPoint1, gradientPoint2, colour, radial, colours, imageId, imageOpacity; | |||||
| }; | }; | ||||
| juce_UseDebuggingNewOperator | juce_UseDebuggingNewOperator | ||||
| @@ -58532,12 +58561,15 @@ public: | |||||
| const var getImageIdentifier() const; | const var getImageIdentifier() const; | ||||
| void setImageIdentifier (const var& newIdentifier, UndoManager* undoManager); | void setImageIdentifier (const var& newIdentifier, UndoManager* undoManager); | ||||
| Value getImageIdentifierValue (UndoManager* undoManager); | |||||
| float getOpacity() const; | float getOpacity() const; | ||||
| void setOpacity (float newOpacity, UndoManager* undoManager); | void setOpacity (float newOpacity, UndoManager* undoManager); | ||||
| Value getOpacityValue (UndoManager* undoManager); | |||||
| const Colour getOverlayColour() const; | const Colour getOverlayColour() const; | ||||
| void setOverlayColour (const Colour& newColour, UndoManager* undoManager); | void setOverlayColour (const Colour& newColour, UndoManager* undoManager); | ||||
| Value getOverlayColourValue (UndoManager* undoManager); | |||||
| const RelativePoint getTargetPositionForTopLeft() const; | const RelativePoint getTargetPositionForTopLeft() const; | ||||
| void setTargetPositionForTopLeft (const RelativePoint& newPoint, UndoManager* undoManager); | void setTargetPositionForTopLeft (const RelativePoint& newPoint, UndoManager* undoManager); | ||||
| @@ -58667,15 +58699,17 @@ public: | |||||
| public: | public: | ||||
| ValueTreeWrapper (const ValueTree& state); | ValueTreeWrapper (const ValueTree& state); | ||||
| const FillType getMainFill (RelativeCoordinate::NamedCoordinateFinder* nameFinder) const; | |||||
| const FillType getMainFill (RelativeCoordinate::NamedCoordinateFinder* nameFinder, | |||||
| ImageProvider* imageProvider) const; | |||||
| ValueTree getMainFillState(); | ValueTree getMainFillState(); | ||||
| void setMainFill (const FillType& newFill, const RelativePoint* gradientPoint1, | |||||
| const RelativePoint* gradientPoint2, UndoManager* undoManager); | |||||
| void setMainFill (const FillType& newFill, const RelativePoint* gradientPoint1, const RelativePoint* gradientPoint2, | |||||
| ImageProvider* imageProvider, UndoManager* undoManager); | |||||
| const FillType getStrokeFill (RelativeCoordinate::NamedCoordinateFinder* nameFinder) const; | |||||
| const FillType getStrokeFill (RelativeCoordinate::NamedCoordinateFinder* nameFinder, | |||||
| ImageProvider* imageProvider) const; | |||||
| ValueTree getStrokeFillState(); | ValueTree getStrokeFillState(); | ||||
| void setStrokeFill (const FillType& newFill, const RelativePoint* gradientPoint1, | |||||
| const RelativePoint* gradientPoint2, UndoManager* undoManager); | |||||
| void setStrokeFill (const FillType& newFill, const RelativePoint* gradientPoint1, const RelativePoint* gradientPoint2, | |||||
| ImageProvider* imageProvider, UndoManager* undoManager); | |||||
| const PathStrokeType getStrokeType() const; | const PathStrokeType getStrokeType() const; | ||||
| void setStrokeType (const PathStrokeType& newStrokeType, UndoManager* undoManager); | void setStrokeType (const PathStrokeType& newStrokeType, UndoManager* undoManager); | ||||
| @@ -33,7 +33,7 @@ | |||||
| */ | */ | ||||
| #define JUCE_MAJOR_VERSION 1 | #define JUCE_MAJOR_VERSION 1 | ||||
| #define JUCE_MINOR_VERSION 52 | #define JUCE_MINOR_VERSION 52 | ||||
| #define JUCE_BUILDNUMBER 10 | |||||
| #define JUCE_BUILDNUMBER 11 | |||||
| /** Current Juce version number. | /** Current Juce version number. | ||||
| @@ -171,6 +171,8 @@ const Identifier Drawable::ValueTreeWrapperBase::gradientPoint2 ("point2"); | |||||
| const Identifier Drawable::ValueTreeWrapperBase::colour ("colour"); | const Identifier Drawable::ValueTreeWrapperBase::colour ("colour"); | ||||
| const Identifier Drawable::ValueTreeWrapperBase::radial ("radial"); | const Identifier Drawable::ValueTreeWrapperBase::radial ("radial"); | ||||
| const Identifier Drawable::ValueTreeWrapperBase::colours ("colours"); | const Identifier Drawable::ValueTreeWrapperBase::colours ("colours"); | ||||
| const Identifier Drawable::ValueTreeWrapperBase::imageId ("imageId"); | |||||
| const Identifier Drawable::ValueTreeWrapperBase::imageOpacity ("imageOpacity"); | |||||
| Drawable::ValueTreeWrapperBase::ValueTreeWrapperBase (const ValueTree& state_) | Drawable::ValueTreeWrapperBase::ValueTreeWrapperBase (const ValueTree& state_) | ||||
| : state (state_) | : state (state_) | ||||
| @@ -186,7 +188,7 @@ const String Drawable::ValueTreeWrapperBase::getID() const | |||||
| return state [idProperty]; | return state [idProperty]; | ||||
| } | } | ||||
| void Drawable::ValueTreeWrapperBase::setID (const String& newID, UndoManager* undoManager) | |||||
| void Drawable::ValueTreeWrapperBase::setID (const String& newID, UndoManager* const undoManager) | |||||
| { | { | ||||
| if (newID.isEmpty()) | if (newID.isEmpty()) | ||||
| state.removeProperty (idProperty, undoManager); | state.removeProperty (idProperty, undoManager); | ||||
| @@ -194,8 +196,8 @@ void Drawable::ValueTreeWrapperBase::setID (const String& newID, UndoManager* un | |||||
| state.setProperty (idProperty, newID, undoManager); | state.setProperty (idProperty, newID, undoManager); | ||||
| } | } | ||||
| const FillType Drawable::ValueTreeWrapperBase::readFillType (const ValueTree& v, RelativePoint* gp1, RelativePoint* gp2, | |||||
| RelativeCoordinate::NamedCoordinateFinder* nameFinder) | |||||
| const FillType Drawable::ValueTreeWrapperBase::readFillType (const ValueTree& v, RelativePoint* const gp1, RelativePoint* const gp2, | |||||
| RelativeCoordinate::NamedCoordinateFinder* const nameFinder, ImageProvider* imageProvider) | |||||
| { | { | ||||
| const String newType (v[type].toString()); | const String newType (v[type].toString()); | ||||
| @@ -231,7 +233,13 @@ const FillType Drawable::ValueTreeWrapperBase::readFillType (const ValueTree& v, | |||||
| } | } | ||||
| else if (newType == "image") | else if (newType == "image") | ||||
| { | { | ||||
| jassertfalse; //xxx todo | |||||
| Image im; | |||||
| if (imageProvider != 0) | |||||
| im = imageProvider->getImageForIdentifier (v[imageId]); | |||||
| FillType f (im, AffineTransform::identity); | |||||
| f.setOpacity ((float) v.getProperty (imageOpacity, 1.0f)); | |||||
| return f; | |||||
| } | } | ||||
| jassertfalse; | jassertfalse; | ||||
| @@ -239,8 +247,8 @@ const FillType Drawable::ValueTreeWrapperBase::readFillType (const ValueTree& v, | |||||
| } | } | ||||
| void Drawable::ValueTreeWrapperBase::writeFillType (ValueTree& v, const FillType& fillType, | void Drawable::ValueTreeWrapperBase::writeFillType (ValueTree& v, const FillType& fillType, | ||||
| const RelativePoint* gp1, const RelativePoint* gp2, | |||||
| UndoManager* const undoManager) | |||||
| const RelativePoint* const gp1, const RelativePoint* const gp2, | |||||
| ImageProvider* imageProvider, UndoManager* const undoManager) | |||||
| { | { | ||||
| if (fillType.isColour()) | if (fillType.isColour()) | ||||
| { | { | ||||
| @@ -256,8 +264,8 @@ void Drawable::ValueTreeWrapperBase::writeFillType (ValueTree& v, const FillType | |||||
| String s; | String s; | ||||
| for (int i = 0; i < fillType.gradient->getNumColours(); ++i) | for (int i = 0; i < fillType.gradient->getNumColours(); ++i) | ||||
| s << " " << fillType.gradient->getColourPosition (i) | |||||
| << " " << String::toHexString ((int) fillType.gradient->getColour(i).getARGB()); | |||||
| s << ' ' << fillType.gradient->getColourPosition (i) | |||||
| << ' ' << String::toHexString ((int) fillType.gradient->getColour(i).getARGB()); | |||||
| v.setProperty (colours, s.trimStart(), undoManager); | v.setProperty (colours, s.trimStart(), undoManager); | ||||
| } | } | ||||
| @@ -265,7 +273,13 @@ void Drawable::ValueTreeWrapperBase::writeFillType (ValueTree& v, const FillType | |||||
| { | { | ||||
| v.setProperty (type, "image", undoManager); | v.setProperty (type, "image", undoManager); | ||||
| jassertfalse; //xxx todo | |||||
| if (imageProvider != 0) | |||||
| v.setProperty (imageId, imageProvider->getIdentifierForImage (fillType.image), undoManager); | |||||
| if (fillType.getOpacity() < 1.0f) | |||||
| v.setProperty (imageOpacity, fillType.getOpacity(), undoManager); | |||||
| else | |||||
| v.removeProperty (imageOpacity, undoManager); | |||||
| } | } | ||||
| else | else | ||||
| { | { | ||||
| @@ -249,14 +249,16 @@ public: | |||||
| static const Identifier idProperty; | static const Identifier idProperty; | ||||
| static const FillType readFillType (const ValueTree& v, RelativePoint* gradientPoint1, RelativePoint* gradientPoint2, | static const FillType readFillType (const ValueTree& v, RelativePoint* gradientPoint1, RelativePoint* gradientPoint2, | ||||
| RelativeCoordinate::NamedCoordinateFinder* nameFinder); | |||||
| RelativeCoordinate::NamedCoordinateFinder* nameFinder, | |||||
| ImageProvider* imageProvider); | |||||
| static void writeFillType (ValueTree& v, const FillType& fillType, | static void writeFillType (ValueTree& v, const FillType& fillType, | ||||
| const RelativePoint* gradientPoint1, const RelativePoint* gradientPoint2, | const RelativePoint* gradientPoint1, const RelativePoint* gradientPoint2, | ||||
| ImageProvider* imageProvider, | |||||
| UndoManager* undoManager); | UndoManager* undoManager); | ||||
| ValueTree state; | ValueTree state; | ||||
| static const Identifier type, gradientPoint1, gradientPoint2, colour, radial, colours; | |||||
| static const Identifier type, gradientPoint1, gradientPoint2, colour, radial, colours, imageId, imageOpacity; | |||||
| }; | }; | ||||
| //============================================================================== | //============================================================================== | ||||
| @@ -199,6 +199,11 @@ const var DrawableImage::ValueTreeWrapper::getImageIdentifier() const | |||||
| return state [image]; | return state [image]; | ||||
| } | } | ||||
| Value DrawableImage::ValueTreeWrapper::getImageIdentifierValue (UndoManager* undoManager) | |||||
| { | |||||
| return state.getPropertyAsValue (image, undoManager); | |||||
| } | |||||
| void DrawableImage::ValueTreeWrapper::setImageIdentifier (const var& newIdentifier, UndoManager* undoManager) | void DrawableImage::ValueTreeWrapper::setImageIdentifier (const var& newIdentifier, UndoManager* undoManager) | ||||
| { | { | ||||
| state.setProperty (image, newIdentifier, undoManager); | state.setProperty (image, newIdentifier, undoManager); | ||||
| @@ -209,6 +214,14 @@ float DrawableImage::ValueTreeWrapper::getOpacity() const | |||||
| return (float) state.getProperty (opacity, 1.0); | return (float) state.getProperty (opacity, 1.0); | ||||
| } | } | ||||
| Value DrawableImage::ValueTreeWrapper::getOpacityValue (UndoManager* undoManager) | |||||
| { | |||||
| if (! state.hasProperty (opacity)) | |||||
| state.setProperty (opacity, 1.0, undoManager); | |||||
| return state.getPropertyAsValue (opacity, undoManager); | |||||
| } | |||||
| void DrawableImage::ValueTreeWrapper::setOpacity (float newOpacity, UndoManager* undoManager) | void DrawableImage::ValueTreeWrapper::setOpacity (float newOpacity, UndoManager* undoManager) | ||||
| { | { | ||||
| state.setProperty (opacity, newOpacity, undoManager); | state.setProperty (opacity, newOpacity, undoManager); | ||||
| @@ -227,6 +240,11 @@ void DrawableImage::ValueTreeWrapper::setOverlayColour (const Colour& newColour, | |||||
| state.setProperty (overlay, String::toHexString ((int) newColour.getARGB()), undoManager); | state.setProperty (overlay, String::toHexString ((int) newColour.getARGB()), undoManager); | ||||
| } | } | ||||
| Value DrawableImage::ValueTreeWrapper::getOverlayColourValue (UndoManager* undoManager) | |||||
| { | |||||
| return state.getPropertyAsValue (overlay, undoManager); | |||||
| } | |||||
| const RelativePoint DrawableImage::ValueTreeWrapper::getTargetPositionForTopLeft() const | const RelativePoint DrawableImage::ValueTreeWrapper::getTargetPositionForTopLeft() const | ||||
| { | { | ||||
| const String pos (state [topLeft].toString()); | const String pos (state [topLeft].toString()); | ||||
| @@ -134,12 +134,15 @@ public: | |||||
| const var getImageIdentifier() const; | const var getImageIdentifier() const; | ||||
| void setImageIdentifier (const var& newIdentifier, UndoManager* undoManager); | void setImageIdentifier (const var& newIdentifier, UndoManager* undoManager); | ||||
| Value getImageIdentifierValue (UndoManager* undoManager); | |||||
| float getOpacity() const; | float getOpacity() const; | ||||
| void setOpacity (float newOpacity, UndoManager* undoManager); | void setOpacity (float newOpacity, UndoManager* undoManager); | ||||
| Value getOpacityValue (UndoManager* undoManager); | |||||
| const Colour getOverlayColour() const; | const Colour getOverlayColour() const; | ||||
| void setOverlayColour (const Colour& newColour, UndoManager* undoManager); | void setOverlayColour (const Colour& newColour, UndoManager* undoManager); | ||||
| Value getOverlayColourValue (UndoManager* undoManager); | |||||
| const RelativePoint getTargetPositionForTopLeft() const; | const RelativePoint getTargetPositionForTopLeft() const; | ||||
| void setTargetPositionForTopLeft (const RelativePoint& newPoint, UndoManager* undoManager); | void setTargetPositionForTopLeft (const RelativePoint& newPoint, UndoManager* undoManager); | ||||
| @@ -212,7 +212,7 @@ ValueTree DrawablePath::ValueTreeWrapper::getMainFillState() | |||||
| if (v.isValid()) | if (v.isValid()) | ||||
| return v; | return v; | ||||
| setMainFill (Colours::black, 0, 0, 0); | |||||
| setMainFill (Colours::black, 0, 0, 0, 0); | |||||
| return getMainFillState(); | return getMainFillState(); | ||||
| } | } | ||||
| @@ -222,32 +222,34 @@ ValueTree DrawablePath::ValueTreeWrapper::getStrokeFillState() | |||||
| if (v.isValid()) | if (v.isValid()) | ||||
| return v; | return v; | ||||
| setStrokeFill (Colours::black, 0, 0, 0); | |||||
| setStrokeFill (Colours::black, 0, 0, 0, 0); | |||||
| return getStrokeFillState(); | return getStrokeFillState(); | ||||
| } | } | ||||
| const FillType DrawablePath::ValueTreeWrapper::getMainFill (RelativeCoordinate::NamedCoordinateFinder* nameFinder) const | |||||
| const FillType DrawablePath::ValueTreeWrapper::getMainFill (RelativeCoordinate::NamedCoordinateFinder* nameFinder, | |||||
| ImageProvider* imageProvider) const | |||||
| { | { | ||||
| return readFillType (state.getChildWithName (fill), 0, 0, nameFinder); | |||||
| return readFillType (state.getChildWithName (fill), 0, 0, nameFinder, imageProvider); | |||||
| } | } | ||||
| void DrawablePath::ValueTreeWrapper::setMainFill (const FillType& newFill, const RelativePoint* gp1, | void DrawablePath::ValueTreeWrapper::setMainFill (const FillType& newFill, const RelativePoint* gp1, | ||||
| const RelativePoint* gp2, UndoManager* undoManager) | |||||
| const RelativePoint* gp2, ImageProvider* imageProvider, UndoManager* undoManager) | |||||
| { | { | ||||
| ValueTree v (state.getOrCreateChildWithName (fill, undoManager)); | ValueTree v (state.getOrCreateChildWithName (fill, undoManager)); | ||||
| writeFillType (v, newFill, gp1, gp2, undoManager); | |||||
| writeFillType (v, newFill, gp1, gp2, imageProvider, undoManager); | |||||
| } | } | ||||
| const FillType DrawablePath::ValueTreeWrapper::getStrokeFill (RelativeCoordinate::NamedCoordinateFinder* nameFinder) const | |||||
| const FillType DrawablePath::ValueTreeWrapper::getStrokeFill (RelativeCoordinate::NamedCoordinateFinder* nameFinder, | |||||
| ImageProvider* imageProvider) const | |||||
| { | { | ||||
| return readFillType (state.getChildWithName (stroke), 0, 0, nameFinder); | |||||
| return readFillType (state.getChildWithName (stroke), 0, 0, nameFinder, imageProvider); | |||||
| } | } | ||||
| void DrawablePath::ValueTreeWrapper::setStrokeFill (const FillType& newFill, const RelativePoint* gp1, | void DrawablePath::ValueTreeWrapper::setStrokeFill (const FillType& newFill, const RelativePoint* gp1, | ||||
| const RelativePoint* gp2, UndoManager* undoManager) | |||||
| const RelativePoint* gp2, ImageProvider* imageProvider, UndoManager* undoManager) | |||||
| { | { | ||||
| ValueTree v (state.getOrCreateChildWithName (stroke, undoManager)); | ValueTree v (state.getOrCreateChildWithName (stroke, undoManager)); | ||||
| writeFillType (v, newFill, gp1, gp2, undoManager); | |||||
| writeFillType (v, newFill, gp1, gp2, imageProvider, undoManager); | |||||
| } | } | ||||
| const PathStrokeType DrawablePath::ValueTreeWrapper::getStrokeType() const | const PathStrokeType DrawablePath::ValueTreeWrapper::getStrokeType() const | ||||
| @@ -283,6 +285,7 @@ void DrawablePath::ValueTreeWrapper::setUsesNonZeroWinding (bool b, UndoManager* | |||||
| state.setProperty (nonZeroWinding, b, undoManager); | state.setProperty (nonZeroWinding, b, undoManager); | ||||
| } | } | ||||
| //============================================================================== | |||||
| const Identifier DrawablePath::ValueTreeWrapper::Element::startSubPathElement ("Move"); | const Identifier DrawablePath::ValueTreeWrapper::Element::startSubPathElement ("Move"); | ||||
| const Identifier DrawablePath::ValueTreeWrapper::Element::closeSubPathElement ("Close"); | const Identifier DrawablePath::ValueTreeWrapper::Element::closeSubPathElement ("Close"); | ||||
| const Identifier DrawablePath::ValueTreeWrapper::Element::lineToElement ("Line"); | const Identifier DrawablePath::ValueTreeWrapper::Element::lineToElement ("Line"); | ||||
| @@ -342,14 +345,14 @@ const RelativePoint DrawablePath::ValueTreeWrapper::Element::getEndPoint() const | |||||
| //============================================================================== | //============================================================================== | ||||
| const Rectangle<float> DrawablePath::refreshFromValueTree (const ValueTree& tree, ImageProvider*) | |||||
| const Rectangle<float> DrawablePath::refreshFromValueTree (const ValueTree& tree, ImageProvider* imageProvider) | |||||
| { | { | ||||
| Rectangle<float> damageRect; | Rectangle<float> damageRect; | ||||
| ValueTreeWrapper v (tree); | ValueTreeWrapper v (tree); | ||||
| setName (v.getID()); | setName (v.getID()); | ||||
| bool needsRedraw = false; | bool needsRedraw = false; | ||||
| const FillType newFill (v.getMainFill (parent)); | |||||
| const FillType newFill (v.getMainFill (parent, imageProvider)); | |||||
| if (mainFill != newFill) | if (mainFill != newFill) | ||||
| { | { | ||||
| @@ -357,7 +360,7 @@ const Rectangle<float> DrawablePath::refreshFromValueTree (const ValueTree& tree | |||||
| mainFill = newFill; | mainFill = newFill; | ||||
| } | } | ||||
| const FillType newStrokeFill (v.getStrokeFill (parent)); | |||||
| const FillType newStrokeFill (v.getStrokeFill (parent, imageProvider)); | |||||
| if (strokeFill != newStrokeFill) | if (strokeFill != newStrokeFill) | ||||
| { | { | ||||
| @@ -391,14 +394,14 @@ const Rectangle<float> DrawablePath::refreshFromValueTree (const ValueTree& tree | |||||
| return damageRect; | return damageRect; | ||||
| } | } | ||||
| const ValueTree DrawablePath::createValueTree (ImageProvider*) const | |||||
| const ValueTree DrawablePath::createValueTree (ImageProvider* imageProvider) const | |||||
| { | { | ||||
| ValueTree tree (valueTreeType); | ValueTree tree (valueTreeType); | ||||
| ValueTreeWrapper v (tree); | ValueTreeWrapper v (tree); | ||||
| v.setID (getName(), 0); | v.setID (getName(), 0); | ||||
| v.setMainFill (mainFill, 0, 0, 0); | |||||
| v.setStrokeFill (strokeFill, 0, 0, 0); | |||||
| v.setMainFill (mainFill, 0, 0, imageProvider, 0); | |||||
| v.setStrokeFill (strokeFill, 0, 0, imageProvider, 0); | |||||
| v.setStrokeType (strokeType, 0); | v.setStrokeType (strokeType, 0); | ||||
| if (relativePath != 0) | if (relativePath != 0) | ||||
| @@ -129,15 +129,17 @@ public: | |||||
| public: | public: | ||||
| ValueTreeWrapper (const ValueTree& state); | ValueTreeWrapper (const ValueTree& state); | ||||
| const FillType getMainFill (RelativeCoordinate::NamedCoordinateFinder* nameFinder) const; | |||||
| const FillType getMainFill (RelativeCoordinate::NamedCoordinateFinder* nameFinder, | |||||
| ImageProvider* imageProvider) const; | |||||
| ValueTree getMainFillState(); | ValueTree getMainFillState(); | ||||
| void setMainFill (const FillType& newFill, const RelativePoint* gradientPoint1, | |||||
| const RelativePoint* gradientPoint2, UndoManager* undoManager); | |||||
| void setMainFill (const FillType& newFill, const RelativePoint* gradientPoint1, const RelativePoint* gradientPoint2, | |||||
| ImageProvider* imageProvider, UndoManager* undoManager); | |||||
| const FillType getStrokeFill (RelativeCoordinate::NamedCoordinateFinder* nameFinder) const; | |||||
| const FillType getStrokeFill (RelativeCoordinate::NamedCoordinateFinder* nameFinder, | |||||
| ImageProvider* imageProvider) const; | |||||
| ValueTree getStrokeFillState(); | ValueTree getStrokeFillState(); | ||||
| void setStrokeFill (const FillType& newFill, const RelativePoint* gradientPoint1, | |||||
| const RelativePoint* gradientPoint2, UndoManager* undoManager); | |||||
| void setStrokeFill (const FillType& newFill, const RelativePoint* gradientPoint1, const RelativePoint* gradientPoint2, | |||||
| ImageProvider* imageProvider, UndoManager* undoManager); | |||||
| const PathStrokeType getStrokeType() const; | const PathStrokeType getStrokeType() const; | ||||
| void setStrokeType (const PathStrokeType& newStrokeType, UndoManager* undoManager); | void setStrokeType (const PathStrokeType& newStrokeType, UndoManager* undoManager); | ||||
| @@ -198,6 +198,16 @@ const Image Image::convertedToFormat (PixelFormat newFormat) const | |||||
| return newImage; | return newImage; | ||||
| } | } | ||||
| const var Image::getTag() const | |||||
| { | |||||
| return image == 0 ? var::null : image->userTag; | |||||
| } | |||||
| void Image::setTag (const var& newTag) | |||||
| { | |||||
| if (image != 0) | |||||
| image->userTag = newTag; | |||||
| } | |||||
| //============================================================================== | //============================================================================== | ||||
| Image::BitmapData::BitmapData (Image& image, const int x, const int y, const int w, const int h, const bool /*makeWritable*/) | Image::BitmapData::BitmapData (Image& image, const int x, const int y, const int w, const int h, const bool /*makeWritable*/) | ||||
| @@ -28,6 +28,7 @@ | |||||
| #include "../colour/juce_Colour.h" | #include "../colour/juce_Colour.h" | ||||
| #include "../contexts/juce_Graphics.h" | #include "../contexts/juce_Graphics.h" | ||||
| #include "../../../containers/juce_Variant.h" | |||||
| //============================================================================== | //============================================================================== | ||||
| @@ -159,6 +160,9 @@ public: | |||||
| /** True if the image's format is RGB. */ | /** True if the image's format is RGB. */ | ||||
| bool isRGB() const throw() { return getFormat() == RGB; } | bool isRGB() const throw() { return getFormat() == RGB; } | ||||
| /** True if the image's format is a single-channel alpha map. */ | |||||
| bool isSingleChannel() const throw() { return getFormat() == SingleChannel; } | |||||
| /** True if the image contains an alpha-channel. */ | /** True if the image contains an alpha-channel. */ | ||||
| bool hasAlphaChannel() const throw() { return getFormat() != RGB; } | bool hasAlphaChannel() const throw() { return getFormat() != RGB; } | ||||
| @@ -197,6 +201,8 @@ public: | |||||
| Call this if you want to draw onto the image, but want to make sure that this doesn't | Call this if you want to draw onto the image, but want to make sure that this doesn't | ||||
| affect any other code that may be sharing the same data. | affect any other code that may be sharing the same data. | ||||
| @see getReferenceCount | |||||
| */ | */ | ||||
| void duplicateIfShared(); | void duplicateIfShared(); | ||||
| @@ -328,13 +334,40 @@ public: | |||||
| void createSolidAreaMask (RectangleList& result, | void createSolidAreaMask (RectangleList& result, | ||||
| float alphaThreshold = 0.5f) const; | float alphaThreshold = 0.5f) const; | ||||
| //============================================================================== | |||||
| /** Returns a user-specified data item that was set with setTag(). | |||||
| setTag() and getTag() allow you to attach an arbitrary identifier value to an | |||||
| image. The value is shared between all Image object that are referring to the | |||||
| same underlying image data object. | |||||
| */ | |||||
| const var getTag() const; | |||||
| /** Attaches a user-specified data item to this image, which can be retrieved using getTag(). | |||||
| setTag() and getTag() allow you to attach an arbitrary identifier value to an | |||||
| image. The value is shared between all Image object that are referring to the | |||||
| same underlying image data object. | |||||
| Note that if this Image is null, this method will fail to store the data. | |||||
| */ | |||||
| void setTag (const var& newTag); | |||||
| //============================================================================== | |||||
| /** Creates a context suitable for drawing onto this image. | /** Creates a context suitable for drawing onto this image. | ||||
| Don't call this method directly! It's used internally by the Graphics class. | Don't call this method directly! It's used internally by the Graphics class. | ||||
| */ | */ | ||||
| LowLevelGraphicsContext* createLowLevelContext() const; | LowLevelGraphicsContext* createLowLevelContext() const; | ||||
| /** Returns the number of Image objects which are currently referring to the same internal | |||||
| shared image data. | |||||
| @see duplicateIfShared | |||||
| */ | |||||
| int getReferenceCount() const throw() { return image == 0 ? 0 : image->getReferenceCount(); } | |||||
| //============================================================================== | //============================================================================== | ||||
| /** | |||||
| /** This is a base class for task-specific types of image. | |||||
| Don't use this class directly! It's used internally by the Image class. | |||||
| */ | */ | ||||
| class SharedImage : public ReferenceCountedObject | class SharedImage : public ReferenceCountedObject | ||||
| { | { | ||||
| @@ -356,6 +389,7 @@ public: | |||||
| const int width, height; | const int width, height; | ||||
| int pixelStride, lineStride; | int pixelStride, lineStride; | ||||
| uint8* imageData; | uint8* imageData; | ||||
| var userTag; | |||||
| uint8* getPixelData (int x, int y) const throw(); | uint8* getPixelData (int x, int y) const throw(); | ||||
| @@ -364,14 +398,10 @@ public: | |||||
| }; | }; | ||||
| /** @internal */ | /** @internal */ | ||||
| SharedImage* getSharedImage() const throw() { return image; } | |||||
| SharedImage* getSharedImage() const throw() { return image; } | |||||
| /** @internal */ | /** @internal */ | ||||
| explicit Image (SharedImage* instance); | explicit Image (SharedImage* instance); | ||||
| /** @internal */ | |||||
| int getReferenceCount() const throw() { return image->getReferenceCount(); } | |||||
| //============================================================================== | //============================================================================== | ||||
| juce_UseDebuggingNewOperator | juce_UseDebuggingNewOperator | ||||
| @@ -100,10 +100,10 @@ bool juce_setThreadPriority (void* handle, int priority) | |||||
| int pri = ((maxp - minp) / 2) * (priority - 1) / 9; | int pri = ((maxp - minp) / 2) * (priority - 1) / 9; | ||||
| if (param.__sched_priority >= (minp + (maxp - minp) / 2)) | |||||
| param.__sched_priority = minp + ((maxp - minp) / 2) + pri; // (realtime) | |||||
| if (param.sched_priority >= (minp + (maxp - minp) / 2)) | |||||
| param.sched_priority = minp + ((maxp - minp) / 2) + pri; // (realtime) | |||||
| else | else | ||||
| param.__sched_priority = minp + pri; // (high) | |||||
| param.sched_priority = minp + pri; // (high) | |||||
| param.sched_priority = jlimit (1, 127, 1 + (priority * 126) / 11); | param.sched_priority = jlimit (1, 127, 1 + (priority * 126) / 11); | ||||
| return pthread_setschedparam ((pthread_t) handle, policy, ¶m) == 0; | return pthread_setschedparam ((pthread_t) handle, policy, ¶m) == 0; | ||||
| @@ -172,13 +172,13 @@ void Process::setPriority (ProcessPriority prior) | |||||
| maxp = sched_get_priority_max (policy); | maxp = sched_get_priority_max (policy); | ||||
| if (p < 2) | if (p < 2) | ||||
| param.__sched_priority = 0; | |||||
| param.sched_priority = 0; | |||||
| else if (p == 2 ) | else if (p == 2 ) | ||||
| // Set to middle of lower realtime priority range | // Set to middle of lower realtime priority range | ||||
| param.__sched_priority = minp + (maxp - minp) / 4; | |||||
| param.sched_priority = minp + (maxp - minp) / 4; | |||||
| else | else | ||||
| // Set to middle of higher realtime priority range | // Set to middle of higher realtime priority range | ||||
| param.__sched_priority = minp + (3 * (maxp - minp) / 4); | |||||
| param.sched_priority = minp + (3 * (maxp - minp) / 4); | |||||
| pthread_setschedparam (pthread_self(), policy, ¶m); | pthread_setschedparam (pthread_self(), policy, ¶m); | ||||
| } | } | ||||