-//\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
-
+//
+// 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)
//
// 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;\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
+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);
+ }
+ }
+}