|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260 |
- /*
- ==============================================================================
-
- This file is part of the JUCE library.
- Copyright (c) 2013 - Raw Material Software Ltd.
-
- Permission is granted to use this software under the terms of either:
- a) the GPL v2 (or any later version)
- b) the Affero GPL v3
-
- Details of these licenses can be found at: www.gnu.org/licenses
-
- JUCE is distributed in the hope that it will be useful, but WITHOUT ANY
- WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
- A PARTICULAR PURPOSE. See the GNU General Public License for more details.
-
- ------------------------------------------------------------------------------
-
- To release a closed-source product which uses JUCE, commercial licenses are
- available: visit www.juce.com for more information.
-
- ==============================================================================
- */
-
- #ifndef JUCE_DRAWABLE_H_INCLUDED
- #define JUCE_DRAWABLE_H_INCLUDED
-
-
- //==============================================================================
- /**
- The base class for objects which can draw themselves, e.g. polygons, images, etc.
-
- @see DrawableComposite, DrawableImage, DrawablePath, DrawableText
- */
- class JUCE_API Drawable : public Component
- {
- protected:
- //==============================================================================
- /** The base class can't be instantiated directly.
-
- @see DrawableComposite, DrawableImage, DrawablePath, DrawableText
- */
- Drawable();
-
- public:
- /** Destructor. */
- virtual ~Drawable();
-
- //==============================================================================
- /** Creates a deep copy of this Drawable object.
-
- Use this to create a new copy of this and any sub-objects in the tree.
- */
- virtual Drawable* createCopy() const = 0;
-
- //==============================================================================
- /** Renders this Drawable object.
-
- Note that the preferred way to render a drawable in future is by using it
- as a component and adding it to a parent, so you might want to consider that
- before using this method.
-
- @see drawWithin
- */
- void draw (Graphics& g, float opacity,
- const AffineTransform& transform = AffineTransform::identity) const;
-
- /** Renders the Drawable at a given offset within the Graphics context.
-
- The coordinates passed-in are used to translate the object relative to its own
- origin before drawing it - this is basically a quick way of saying:
-
- @code
- draw (g, AffineTransform::translation (x, y)).
- @endcode
-
- Note that the preferred way to render a drawable in future is by using it
- as a component and adding it to a parent, so you might want to consider that
- before using this method.
- */
- void drawAt (Graphics& g, float x, float y, float opacity) const;
-
- /** Renders the Drawable within a rectangle, scaling it to fit neatly inside without
- changing its aspect-ratio.
-
- The object can placed arbitrarily within the rectangle based on a Justification type,
- and can either be made as big as possible, or just reduced to fit.
-
- Note that the preferred way to render a drawable in future is by using it
- as a component and adding it to a parent, so you might want to consider that
- before using this method.
-
- @param g the graphics context to render onto
- @param destArea the target rectangle to fit the drawable into
- @param placement defines the alignment and rescaling to use to fit
- this object within the target rectangle.
- @param opacity the opacity to use, in the range 0 to 1.0
- */
- void drawWithin (Graphics& g,
- const Rectangle<float>& destArea,
- RectanglePlacement placement,
- float opacity) const;
-
-
- //==============================================================================
- /** Resets any transformations on this drawable, and positions its origin within
- its parent component.
- */
- void setOriginWithOriginalSize (Point<float> originWithinParent);
-
- /** Sets a transform for this drawable that will position it within the specified
- area of its parent component.
- */
- void setTransformToFit (const Rectangle<float>& areaInParent, RectanglePlacement placement);
-
- /** Returns the DrawableComposite that contains this object, if there is one. */
- DrawableComposite* getParent() const;
-
- //==============================================================================
- /** Tries to turn some kind of image file into a drawable.
-
- The data could be an image that the ImageFileFormat class understands, or it
- could be SVG.
- */
- static Drawable* createFromImageData (const void* data, size_t numBytes);
-
- /** Tries to turn a stream containing some kind of image data into a drawable.
-
- The data could be an image that the ImageFileFormat class understands, or it
- could be SVG.
- */
- static Drawable* createFromImageDataStream (InputStream& dataSource);
-
- /** Tries to turn a file containing some kind of image data into a drawable.
-
- The data could be an image that the ImageFileFormat class understands, or it
- could be SVG.
- */
- static Drawable* createFromImageFile (const File& file);
-
- /** Attempts to parse an SVG (Scalable Vector Graphics) document, and to turn this
- into a Drawable tree.
-
- The object returned must be deleted by the caller. If something goes wrong
- while parsing, it may return nullptr.
-
- SVG is a pretty large and complex spec, and this doesn't aim to be a full
- implementation, but it can return the basic vector objects.
- */
- static Drawable* createFromSVG (const XmlElement& svgDocument);
-
- /** Parses an SVG path string and returns it. */
- static Path parseSVGPath (const String& svgPath);
-
- //==============================================================================
- /** Tries to create a Drawable from a previously-saved ValueTree.
- The ValueTree must have been created by the createValueTree() method.
- If there are any images used within the drawable, you'll need to provide a valid
- ImageProvider object that can be used to retrieve these images from whatever type
- of identifier is used to represent them.
- Internally, this uses a ComponentBuilder, and registerDrawableTypeHandlers().
- */
- static Drawable* createFromValueTree (const ValueTree& tree, ComponentBuilder::ImageProvider* imageProvider);
-
- /** Creates a ValueTree to represent this Drawable.
- The ValueTree that is returned can be turned back into a Drawable with createFromValueTree().
- If there are any images used in this drawable, you'll need to provide a valid ImageProvider
- object that can be used to create storable representations of them.
- */
- virtual ValueTree createValueTree (ComponentBuilder::ImageProvider* imageProvider) const = 0;
-
- /** Returns the area that this drawble covers.
- The result is expressed in this drawable's own coordinate space, and does not take
- into account any transforms that may be applied to the component.
- */
- virtual Rectangle<float> getDrawableBounds() const = 0;
-
- /** Recursively replaces a colour that might be used for filling or stroking.
- return true if any instances of this colour were found.
- */
- virtual bool replaceColour (Colour originalColour, Colour replacementColour);
-
- //==============================================================================
- /** Internal class used to manage ValueTrees that represent Drawables. */
- class ValueTreeWrapperBase
- {
- public:
- ValueTreeWrapperBase (const ValueTree& state);
-
- ValueTree& getState() noexcept { return state; }
-
- String getID() const;
- void setID (const String& newID);
-
- ValueTree state;
- };
-
- //==============================================================================
- /** Registers a set of ComponentBuilder::TypeHandler objects that can be used to
- load all the different Drawable types from a saved state.
- @see ComponentBuilder::registerTypeHandler()
- */
- static void registerDrawableTypeHandlers (ComponentBuilder& componentBuilder);
-
- protected:
- //==============================================================================
- friend class DrawableComposite;
- friend class DrawableShape;
-
- /** @internal */
- void transformContextToCorrectOrigin (Graphics&);
- /** @internal */
- void parentHierarchyChanged() override;
- /** @internal */
- void setBoundsToEnclose (const Rectangle<float>&);
-
- Point<int> originRelativeToComponent;
-
- #ifndef DOXYGEN
- /** Internal utility class used by Drawables. */
- template <class DrawableType>
- class Positioner : public RelativeCoordinatePositionerBase
- {
- public:
- Positioner (DrawableType& c)
- : RelativeCoordinatePositionerBase (c),
- owner (c)
- {}
-
- bool registerCoordinates() override { return owner.registerCoordinates (*this); }
-
- void applyToComponentBounds() override
- {
- ComponentScope scope (getComponent());
- owner.recalculateCoordinates (&scope);
- }
-
- void applyNewBounds (const Rectangle<int>&) override
- {
- jassertfalse; // drawables can't be resized directly!
- }
-
- private:
- DrawableType& owner;
-
- JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Positioner)
- };
-
- Drawable (const Drawable&);
- #endif
-
- private:
- void nonConstDraw (Graphics&, float opacity, const AffineTransform&);
-
- Drawable& operator= (const Drawable&);
- JUCE_LEAK_DETECTOR (Drawable)
- };
-
-
- #endif // JUCE_DRAWABLE_H_INCLUDED
|