* roottypes.cs: Rename from tree.cs.
[mono.git] / mcs / class / System.Drawing / System.Drawing.Drawing2D / GraphicsPathIterator.cs
index 1ca8a04a692032f547ed7d17f75152b77afde7a3..dbd2f4341dc4fe54ee265bc78659fe7a5572a077 100644 (file)
-//\r
-// System.Drawing.Drawing2D.GraphicsPathIterator.cs\r
-//\r
-// Author:\r
-//   Dennis Hayes (dennish@Raytek.com)\r
-//   Duncan Mak (duncan@ximian.com)\r
-//\r
-// (C) 2002/3 Ximian, Inc\r
-//\r
-using System;\r
-using System.Drawing;\r
-\r
-namespace System.Drawing.Drawing2D\r
-{\r
-        public sealed class GraphicsPathIterator : MarshalByRefObject, IDisposable\r
-        {\r
-                PointF [] _points;\r
-                byte [] _types;\r
-                int _count;\r
-                int _current;\r
-                \r
-                // Constructors\r
-                public GraphicsPathIterator (GraphicsPath path)\r
-                {\r
-                        this._points = path.PathPoints;\r
-                        this._types = path.PathTypes;\r
-                        this._count = path.PointCount;\r
-                        this._current = 0;\r
-                }\r
-\r
-                // Public Properites\r
-                public int Count {\r
-                        get {\r
-                                return _count;\r
-                        }\r
-                }\r
-\r
-                public int SubpathCount {\r
-                        get {\r
-                                int count = 0;\r
-\r
-                                foreach (byte b in _types)\r
-                                        if (b == (byte) PathPointType.Start)\r
-                                                count++;\r
-                                \r
-                                return count;\r
-                        }\r
-                }\r
-\r
-                // Public Methods.\r
-                public int CopyData (ref PointF [] points, ref byte [] types, int startIndex, int endIndex)\r
-                {\r
-                        for (int i = 0, j = startIndex; j < endIndex; i++, j++) {\r
-                                points [i] = _points [j];\r
-                                types [i] = _types [j];\r
-                        }\r
-\r
-                        return endIndex - startIndex;\r
-                }\r
-\r
-                public void Dispose ()\r
-                {\r
-                }\r
-\r
-               ~GraphicsPathIterator ()\r
-               {\r
-               }\r
-               \r
-                public int Enumerate (ref PointF [] points, ref byte [] types)\r
-                {\r
-                        points = _points;\r
-                        types = _types;\r
-\r
-                        return _count;\r
-                }\r
-\r
-                public bool HasCurve ()\r
-                {\r
-                        foreach (byte b in _types)\r
-                                if (b == (byte) PathPointType.Bezier)\r
-                                        return true;\r
-\r
-                        return false;\r
-                }\r
-\r
-                [MonoTODO]\r
-                public int NextMarker (GraphicsPath path)\r
-                {\r
-                        throw new NotImplementedException ();\r
-                }\r
-\r
-                [MonoTODO]\r
-                public int NextMarker (out int startIndex, out int endIndex)\r
-                {\r
-                        throw new NotImplementedException ();\r
-                }\r
-\r
-                [MonoTODO]\r
-                public int NextPathType (out byte pathType, out int startIndex, out int endIndex)\r
-                {\r
-                        throw new NotImplementedException ();\r
-                }\r
-\r
-                [MonoTODO]\r
-                public int NextSubpath (GraphicsPath path, out bool isClosed)\r
-                {\r
-                        throw new NotImplementedException ();\r
-                }\r
-\r
-                [MonoTODO]\r
-                public int NextSubpath (out int startIndex, out int endIndex, out bool isClosed)\r
-                {\r
-                        throw new NotImplementedException ();\r
-                }\r
-\r
-                public void Rewind ()\r
-                {\r
-                        _current = 0;\r
-                }\r
-        }\r
-}\r
+//
+// System.Drawing.Drawing2D.GraphicsPathIterator.cs
+//
+// Author:
+//   Dennis Hayes (dennish@Raytek.com)
+//   Duncan Mak (duncan@ximian.com)
+//   Ravindra (rkumar@novell.com)
+//
+// Copyright (C) 2002/3 Ximian, Inc (http://www.ximian.com)
+//
+// Copyright (C) 2004 Novell, Inc (http://www.novell.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+// 
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+// 
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+using System;
+using System.Drawing;
+
+namespace System.Drawing.Drawing2D
+{
+       public sealed class GraphicsPathIterator : MarshalByRefObject, IDisposable
+       {
+               private IntPtr nativeObject = IntPtr.Zero;
+
+               // Constructors
+               internal GraphicsPathIterator (IntPtr native)
+               {
+                       this.nativeObject = native;
+               }
+
+               public GraphicsPathIterator (GraphicsPath path)
+               {
+                       Status status = GDIPlus.GdipCreatePathIter (out nativeObject, path.NativeObject);
+                       GDIPlus.CheckStatus (status);
+               }
+
+               internal IntPtr NativeObject {
+                       get {
+                               return nativeObject;
+                       }
+                       set {
+                               nativeObject = value;
+                       }
+               }
+
+               // Public Properites
+
+               public int Count {
+                       get {
+                               int count;
+                               Status status = GDIPlus.GdipPathIterGetCount (nativeObject, out count);
+                               GDIPlus.CheckStatus (status);
+
+                               return count;
+                       }
+               }
+
+               public int SubpathCount {
+                       get {
+                               int count;
+                               Status status = GDIPlus.GdipPathIterGetSubpathCount (nativeObject, out count);
+                               GDIPlus.CheckStatus (status);
+
+                               return count;
+                       }
+               }
+
+               internal void Dispose (bool disposing)
+               {
+                       Status status;
+                       if (nativeObject != IntPtr.Zero) {
+                               status = GDIPlus.GdipDeletePathIter (nativeObject);
+                               GDIPlus.CheckStatus (status);
+
+                               nativeObject = IntPtr.Zero;
+                       }
+               }
+
+               // Public Methods.
+
+               public int CopyData (ref PointF [] points, ref byte [] types, int startIndex, int endIndex)
+               {
+                       Status status;
+                       int resultCount;
+
+                       if (points.Length != types.Length)
+                               throw new ArgumentException ("Invalid arguments passed. Both arrays should have the same length.");
+
+                       status = GDIPlus.GdipPathIterCopyData (nativeObject, out resultCount, points, types, startIndex, endIndex);
+                       GDIPlus.CheckStatus (status);
+
+                       return resultCount;
+               }
+
+               public void Dispose ()
+               {
+                       Dispose (true);
+                       System.GC.SuppressFinalize (this);
+               }
+
+               ~GraphicsPathIterator ()
+               {
+                       Dispose (false);
+               }
+
+               public int Enumerate (ref PointF [] points, ref byte [] types)
+               {
+                       Status status;
+                       int resultCount;
+                       int count = points.Length;
+
+                       if (count != types.Length)
+                               throw new ArgumentException ("Invalid arguments passed. Both arrays should have the same length.");
+
+                       status = GDIPlus.GdipPathIterEnumerate (nativeObject, out resultCount, points, types, count);
+                       GDIPlus.CheckStatus (status);
+
+                       return resultCount;
+               }
+
+               public bool HasCurve ()
+               {
+                       bool curve;
+                       Status status = GDIPlus.GdipPathIterHasCurve (nativeObject, out curve);
+                       GDIPlus.CheckStatus (status);
+
+                       return curve;
+               }
+
+               public int NextMarker (GraphicsPath path)
+               {
+                       Status status;
+                       int resultCount;
+                       status = GDIPlus.GdipPathIterNextMarkerPath (nativeObject, out resultCount, path.NativeObject);
+                       GDIPlus.CheckStatus (status);
+
+                       return resultCount;
+               }
+
+               public int NextMarker (out int startIndex, out int endIndex)
+               {
+                       Status status;
+                       int resultCount;
+                       status = GDIPlus.GdipPathIterNextMarker (nativeObject, out resultCount, out startIndex, out endIndex);
+                       GDIPlus.CheckStatus (status);
+
+                       return resultCount;
+               }
+
+               public int NextPathType (out byte pathType, out int startIndex, out int endIndex)
+               {
+                       Status status;
+                       int resultCount;
+                       status = GDIPlus.GdipPathIterNextPathType (nativeObject, out resultCount, out pathType, out startIndex, out endIndex);
+                       GDIPlus.CheckStatus (status);
+
+                       return resultCount;
+               }
+
+               public int NextSubpath (GraphicsPath path, out bool isClosed)
+               {
+                       Status status;
+                       int resultCount;
+                       status = GDIPlus.GdipPathIterNextSubpathPath (nativeObject, out resultCount, path.NativeObject, out isClosed);
+                       GDIPlus.CheckStatus (status);
+
+                       return resultCount;
+               }
+
+               public int NextSubpath (out int startIndex, out int endIndex, out bool isClosed)
+               {
+                       Status status;
+                       int resultCount;
+                       status = GDIPlus.GdipPathIterNextSubpath (nativeObject, out resultCount, out startIndex, out endIndex, out isClosed);
+                       GDIPlus.CheckStatus (status);
+
+                       return resultCount;
+               }
+
+               public void Rewind ()
+               {
+                       Status status = GDIPlus.GdipPathIterRewind (nativeObject);
+                       GDIPlus.CheckStatus (status);
+               }
+       }
+}