//////////////////////////////////////////////////////////////////////////////////////////////////// // NoesisGUI - http://www.noesisengine.com // Copyright (c) 2013 Noesis Technologies S.L. All Rights Reserved. //////////////////////////////////////////////////////////////////////////////////////////////////// #ifndef __GUI_STREAMGEOMETRY_H__ #define __GUI_STREAMGEOMETRY_H__ #include #include #include #include #include namespace Noesis { class StreamGeometryContext; enum FillRule: int32_t; NS_WARNING_PUSH NS_MSVC_WARNING_DISABLE(4251) //////////////////////////////////////////////////////////////////////////////////////////////////// /// Defines a geometric shape, described using a StreamGeometryContext or a SVG command string /// as described in the `W3C `_ specs. /// /// .. code-block:: c# /// /// StreamGeometry geometry = new StreamGeometry(); /// /// using (StreamGeometryContext context = geometry.Open()) /// { /// context.BeginFigure(new Point(100.0f, 100.0f), true, true); /// context.LineTo(new Point(200.0f, 100.0f), false, false); /// context.LineTo(new Point(200.0f, 200.0f), false, false); /// } /// /// .. code-block:: c# /// /// StreamGeometry geometry = new StreamGeometry(); /// geometry.SetData("M 100, 100 L 200, 100 200, 200 Z"); /// /// .. code-block:: xml /// /// /// /// /// /// http://msdn.microsoft.com/en-us/library/system.windows.media.streamgeometry.aspx //////////////////////////////////////////////////////////////////////////////////////////////////// class NS_GUI_CORE_API StreamGeometry: public Geometry { public: /// Constructor StreamGeometry(); StreamGeometry(const char* data); /// Constructs a StreamGeometry from SVG path commands static bool TryParse(const char* str, Ptr& result); /// Rebuild the geometry with a new set of `SVG `_ /// path commands /// /// Example: /// /// .. code-block:: xml /// /// M 100, 100 L 200, 100 200, 200 Z void SetData(const char* data); /// Returns an iterator of commands describing the path PathCommandIterator GetCommands() const; /// Constructs a stream geometry specifying drawing commands StreamGeometryContext Open(); /// Gets or sets a value that determines how the intersecting areas contained in this /// StreamGeometry are combined //@{ FillRule GetFillRule() const; void SetFillRule(FillRule rule); //@} /// From Geometry //@{ bool IsEmpty() const override; //@} // Hides Freezable methods for convenience //@{ Ptr Clone() const; Ptr CloneCurrentValue() const; //@} /// From BaseObject //@{ String ToString() const override; //@} /// From IRenderProxyCreator //@{ void CreateRenderProxy(RenderTreeUpdater& updater, uint32_t proxyIndex) override; void UpdateRenderProxy(RenderTreeUpdater& updater, uint32_t proxyIndex) override; //@} public: /// Dependency property static const DependencyProperty* FillRuleProperty; protected: /// From DependencyObject //@{ bool OnPropertyChanged(const DependencyPropertyChangedEventArgs& args) override; //@} /// From Freezable //@{ void CloneCommonCore(const Freezable* source) override; Ptr CreateInstanceCore() const override; //@} /// From Geometry //@{ Rect GetRenderBoundsOverride(Pen* pen) const override; bool FillContainsOverride(const Point& point) const override; bool StrokeContainsOverride(Pen* pen, const Point& point) const override; //@} private: void Close(); private: friend class StreamGeometryContext; friend class StreamGeometryTest; enum UpdateFlags { UpdateFlags_Path = Geometry::UpdateFlags_Sentinel, UpdateFlags_FillRule }; SVGPath mPath; mutable Rect mBounds; NS_DECLARE_REFLECTION(StreamGeometry, Geometry) }; NS_WARNING_POP } #endif