GraphicsPath.cs 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748
  1. //
  2. // System.Drawing.Drawing2D.GraphicsPath.cs
  3. //
  4. // Authors:
  5. //
  6. // Miguel de Icaza ([email protected])
  7. // Duncan Mak ([email protected])
  8. // Jordi Mas i Hernandez ([email protected])
  9. //
  10. // (C) 2004 Novell, Inc
  11. //
  12. using System;
  13. using System.Drawing;
  14. using System.Runtime.InteropServices;
  15. namespace System.Drawing.Drawing2D
  16. {
  17. public sealed class GraphicsPath : MarshalByRefObject, ICloneable, IDisposable {
  18. internal IntPtr nativePath = IntPtr.Zero;
  19. GraphicsPath (IntPtr ptr)
  20. {
  21. nativePath = ptr;
  22. }
  23. public GraphicsPath ()
  24. {
  25. Status status = GDIPlus.GdipCreatePath (FillMode.Alternate, out nativePath);
  26. GDIPlus.CheckStatus (status);
  27. }
  28. public GraphicsPath (FillMode fillMode)
  29. {
  30. Status status = GDIPlus.GdipCreatePath (fillMode, out nativePath);
  31. GDIPlus.CheckStatus (status);
  32. }
  33. public GraphicsPath (Point[] pts, byte[] types)
  34. {
  35. Status status = GDIPlus.GdipCreatePath2 (
  36. ConvertPoints (pts), types, pts.Length, FillMode.Alternate, out nativePath);
  37. GDIPlus.CheckStatus (status);
  38. }
  39. public GraphicsPath (PointF[] pts, byte[] types)
  40. {
  41. Status status = GDIPlus.GdipCreatePath2 (pts, types, pts.Length, FillMode.Alternate, out nativePath);
  42. GDIPlus.CheckStatus (status);
  43. }
  44. public GraphicsPath (Point[] pts, byte[] types, FillMode fillMode)
  45. {
  46. Status status = GDIPlus.GdipCreatePath2 (
  47. ConvertPoints (pts), types, pts.Length, fillMode, out nativePath);
  48. GDIPlus.CheckStatus (status);
  49. }
  50. public GraphicsPath(PointF[] pts, byte[] types, FillMode fillMode)
  51. {
  52. Status status = GDIPlus.GdipCreatePath2 (pts, types, pts.Length, fillMode, out nativePath);
  53. GDIPlus.CheckStatus (status);
  54. }
  55. PointF [] ConvertPoints (Point [] pt)
  56. {
  57. int length = pt.Length;
  58. PointF [] pf = new PointF [length];
  59. for (int i = 0; i < length; i++)
  60. pf [i] = pt [i];
  61. return pf;
  62. }
  63. public object Clone ()
  64. {
  65. IntPtr clone;
  66. Status status = GDIPlus.GdipClonePath (nativePath, out clone);
  67. GDIPlus.CheckStatus (status);
  68. return new GraphicsPath (clone);
  69. }
  70. public void Dispose ()
  71. {
  72. Dispose (true);
  73. System.GC.SuppressFinalize (this);
  74. }
  75. ~GraphicsPath ()
  76. {
  77. Dispose (false);
  78. }
  79. void Dispose (bool disposing)
  80. {
  81. }
  82. public FillMode FillMode {
  83. get {
  84. FillMode mode;
  85. Status status = GDIPlus.GdipGetPathFillMode (nativePath, out mode);
  86. GDIPlus.CheckStatus (status);
  87. return mode;
  88. }
  89. set {
  90. Status status = GDIPlus.GdipSetPathFillMode (nativePath, value);
  91. GDIPlus.CheckStatus (status);
  92. }
  93. }
  94. public PathData PathData {
  95. get {
  96. IntPtr tmp;
  97. Status status = GDIPlus.GdipGetPathData (nativePath, out tmp);
  98. GDIPlus.CheckStatus (status);
  99. throw new Exception ();
  100. }
  101. }
  102. public PointF [] PathPoints {
  103. get {
  104. int count;
  105. Status status = GDIPlus.GdipGetPointCount (nativePath, out count);
  106. GDIPlus.CheckStatus (status);
  107. PointF [] points = new PointF [count];
  108. status = GDIPlus.GdipGetPathPoints (nativePath, points, count);
  109. GDIPlus.CheckStatus (status);
  110. return points;
  111. }
  112. }
  113. public byte [] PathTypes {
  114. get {
  115. int count;
  116. Status status = GDIPlus.GdipGetPointCount (nativePath, out count);
  117. GDIPlus.CheckStatus (status);
  118. byte [] types = new byte [count];
  119. status = GDIPlus.GdipGetPathTypes (nativePath, types, count);
  120. GDIPlus.CheckStatus (status);
  121. return types;
  122. }
  123. }
  124. public int PointCount {
  125. get {
  126. int count;
  127. Status status = GDIPlus.GdipGetPointCount (nativePath, out count);
  128. GDIPlus.CheckStatus (status);
  129. return count;
  130. }
  131. }
  132. internal IntPtr NativeObject{
  133. get {
  134. return nativePath;
  135. }
  136. set {
  137. nativePath = value;
  138. }
  139. }
  140. //
  141. // AddArc
  142. //
  143. public void AddArc (Rectangle rect, float start_angle, float sweep_angle)
  144. {
  145. Status status = GDIPlus.GdipAddPathArcI (nativePath, rect.X, rect.Y, rect.Width, rect.Height, start_angle, sweep_angle);
  146. GDIPlus.CheckStatus (status);
  147. }
  148. public void AddArc (RectangleF rect, float start_angle, float sweep_angle)
  149. {
  150. Status status = GDIPlus.GdipAddPathArc (nativePath, rect.X, rect.Y, rect.Width, rect.Height, start_angle, sweep_angle);
  151. GDIPlus.CheckStatus (status);
  152. }
  153. public void AddArc (int x, int y, int width, int height, float start_angle, float sweep_angle)
  154. {
  155. Status status = GDIPlus.GdipAddPathArcI (nativePath, x, y, width, height, start_angle, sweep_angle);
  156. GDIPlus.CheckStatus (status);
  157. }
  158. public void AddArc (float x, float y, float width, float height, float start_angle, float sweep_angle)
  159. {
  160. Status status = GDIPlus.GdipAddPathArc (nativePath, x, y, width, height, start_angle, sweep_angle);
  161. GDIPlus.CheckStatus (status);
  162. }
  163. //
  164. // AddBezier
  165. //
  166. public void AddBezier (Point pt1, Point pt2, Point pt3, Point pt4)
  167. {
  168. Status status = GDIPlus.GdipAddPathBezierI (nativePath, pt1.X, pt1.Y,
  169. pt2.X, pt2.Y, pt3.X, pt3.Y, pt4.X, pt4.Y);
  170. GDIPlus.CheckStatus (status);
  171. }
  172. public void AddBezier (PointF pt1, PointF pt2, PointF pt3, PointF pt4)
  173. {
  174. Status status = GDIPlus.GdipAddPathBezier (nativePath, pt1.X, pt1.Y,
  175. pt2.X, pt2.Y, pt3.X, pt3.Y, pt4.X, pt4.Y);
  176. GDIPlus.CheckStatus (status);
  177. }
  178. public void AddBezier (int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4)
  179. {
  180. Status status = GDIPlus.GdipAddPathBezierI (nativePath, x1, y1, x2, y2, x3, y3, x4, y4);
  181. GDIPlus.CheckStatus (status);
  182. }
  183. public void AddBezier (float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4)
  184. {
  185. Status status = GDIPlus.GdipAddPathBezier (nativePath, x1, y1, x2, y2, x3, y3, x4, y4);
  186. GDIPlus.CheckStatus (status);
  187. }
  188. //
  189. // AddBeziers
  190. //
  191. public void AddBeziers (Point [] pts)
  192. {
  193. Status status = GDIPlus.GdipAddPathBeziersI (nativePath, pts, pts.Length);
  194. GDIPlus.CheckStatus (status);
  195. }
  196. public void AddBeziers (PointF [] pts)
  197. {
  198. Status status = GDIPlus.GdipAddPathBeziers (nativePath, pts, pts.Length);
  199. GDIPlus.CheckStatus (status);
  200. }
  201. //
  202. // AddEllipse
  203. //
  204. public void AddEllipse (RectangleF r)
  205. {
  206. Status status = GDIPlus.GdipAddPathEllipse (nativePath, r.X, r.Y, r.Width, r.Height);
  207. GDIPlus.CheckStatus (status);
  208. }
  209. public void AddEllipse (float x, float y, float width, float height)
  210. {
  211. Status status = GDIPlus.GdipAddPathEllipse (nativePath, x, y, width, height);
  212. GDIPlus.CheckStatus (status);
  213. }
  214. public void AddEllipse (Rectangle r)
  215. {
  216. Status status = GDIPlus.GdipAddPathEllipseI (nativePath, r.X, r.Y, r.Width, r.Height);
  217. GDIPlus.CheckStatus (status);
  218. }
  219. public void AddEllipse (int x, int y, int width, int height)
  220. {
  221. Status status = GDIPlus.GdipAddPathEllipseI (nativePath, x, y, width, height);
  222. GDIPlus.CheckStatus (status);
  223. }
  224. //
  225. // AddLine
  226. //
  227. public void AddLine (Point a, Point b)
  228. {
  229. Status status = GDIPlus.GdipAddPathLineI (nativePath, a.X, a.Y, b.X, b.Y);
  230. GDIPlus.CheckStatus (status);
  231. }
  232. public void AddLine (PointF a, PointF b)
  233. {
  234. Status status = GDIPlus.GdipAddPathLine (nativePath, a.X, a.Y, b.X,
  235. b.Y);
  236. GDIPlus.CheckStatus (status);
  237. }
  238. public void AddLine (int x1, int y1, int x2, int y2)
  239. {
  240. Status status = GDIPlus.GdipAddPathLineI (nativePath, x1, y1, x2, y2);
  241. GDIPlus.CheckStatus (status);
  242. }
  243. public void AddLine (float x1, float y1, float x2, float y2)
  244. {
  245. Status status = GDIPlus.GdipAddPathLine (nativePath, x1, y1, x2,
  246. y2);
  247. GDIPlus.CheckStatus (status);
  248. }
  249. //
  250. // AddLines
  251. //
  252. public void AddLines (Point [] points)
  253. {
  254. int length = points.Length;
  255. for (int i = 0; i < length - 2; i += 2) {
  256. int j = i + 1;
  257. Status status = GDIPlus.GdipAddPathLineI (
  258. nativePath, points [i].X, points [i].Y, points [j].X, points [j].Y);
  259. GDIPlus.CheckStatus (status);
  260. }
  261. }
  262. public void AddLines (PointF [] points)
  263. {
  264. int length = points.Length;
  265. for (int i = 0; i < length - 2; i += 2) {
  266. int j = i + 1;
  267. Status status = GDIPlus.GdipAddPathLine (
  268. nativePath, points [i].X, points [i].Y, points [j].X, points [j].Y);
  269. GDIPlus.CheckStatus (status);
  270. }
  271. }
  272. //
  273. // AddPie
  274. //
  275. public void AddPie (Rectangle rect, float startAngle, float sweepAngle)
  276. {
  277. Status status = GDIPlus.GdipAddPathPie (
  278. nativePath, rect.X, rect.Y, rect.Width, rect.Height, startAngle, sweepAngle);
  279. GDIPlus.CheckStatus (status);
  280. }
  281. public void AddPie (int x, int y, int width, int height, float startAngle, float sweepAngle)
  282. {
  283. Status status = GDIPlus.GdipAddPathPie (nativePath, x, y, width, height, startAngle, sweepAngle);
  284. GDIPlus.CheckStatus (status);
  285. }
  286. public void AddPie (float x, float y, float width, float height, float startAngle, float sweepAngle)
  287. {
  288. Status status = GDIPlus.GdipAddPathPie (nativePath, x, y, width, height, startAngle, sweepAngle);
  289. GDIPlus.CheckStatus (status);
  290. }
  291. //
  292. // AddPolygon
  293. //
  294. public void AddPolygon (Point [] points)
  295. {
  296. Status status = GDIPlus.GdipAddPathPolygonI (nativePath, points, points.Length);
  297. GDIPlus.CheckStatus (status);
  298. }
  299. public void AddPolygon (PointF [] points)
  300. {
  301. Status status = GDIPlus.GdipAddPathPolygon (nativePath, points, points.Length);
  302. GDIPlus.CheckStatus (status);
  303. }
  304. //
  305. // AddRectangle
  306. //
  307. public void AddRectangle (Rectangle rect)
  308. {
  309. Status status = GDIPlus.GdipAddPathRectangleI (nativePath, rect.X, rect.Y, rect.Width, rect.Height);
  310. GDIPlus.CheckStatus (status);
  311. }
  312. public void AddRectangle (RectangleF rect)
  313. {
  314. Status status = GDIPlus.GdipAddPathRectangle (nativePath, rect.X, rect.Y, rect.Width, rect.Height);
  315. GDIPlus.CheckStatus (status);
  316. }
  317. //
  318. // AddRectangles
  319. //
  320. public void AddRectangles (Rectangle [] rects)
  321. {
  322. Status status = GDIPlus.GdipAddPathRectanglesI (nativePath, rects, rects.Length);
  323. GDIPlus.CheckStatus (status);
  324. }
  325. public void AddRectangles (RectangleF [] rects)
  326. {
  327. Status status = GDIPlus.GdipAddPathRectangles (nativePath, rects, rects.Length);
  328. GDIPlus.CheckStatus (status);
  329. }
  330. //
  331. // AddPath
  332. //
  333. public void AddPath (GraphicsPath addingPath, bool connect)
  334. {
  335. Status status = GDIPlus.GdipAddPathPath (nativePath, addingPath.nativePath, connect);
  336. GDIPlus.CheckStatus (status);
  337. }
  338. public PointF GetLastPoint ()
  339. {
  340. PointF pt;
  341. Status status = GDIPlus.GdipGetPathLastPoint (nativePath, out pt);
  342. GDIPlus.CheckStatus (status);
  343. return pt;
  344. }
  345. //
  346. // AddClosedCurve
  347. //
  348. public void AddClosedCurve (Point [] points)
  349. {
  350. Status status = GDIPlus.GdipAddPathClosedCurveI (nativePath, points, points.Length);
  351. GDIPlus.CheckStatus (status);
  352. }
  353. public void AddClosedCurve (PointF [] points)
  354. {
  355. Status status = GDIPlus.GdipAddPathClosedCurve (nativePath, points, points.Length);
  356. GDIPlus.CheckStatus (status);
  357. }
  358. public void AddClosedCurve (Point [] points, float tension)
  359. {
  360. Status status = GDIPlus.GdipAddPathClosedCurve2I (nativePath, points, points.Length, tension);
  361. GDIPlus.CheckStatus (status);
  362. }
  363. public void AddClosedCurve (PointF [] points, float tension)
  364. {
  365. Status status = GDIPlus.GdipAddPathClosedCurve2 (nativePath, points, points.Length, tension);
  366. GDIPlus.CheckStatus (status);
  367. }
  368. //
  369. // AddCurve
  370. //
  371. public void AddCurve (Point [] points)
  372. {
  373. Status status = GDIPlus.GdipAddPathCurveI (nativePath, points, points.Length);
  374. GDIPlus.CheckStatus (status);
  375. }
  376. public void AddCurve (PointF [] points)
  377. {
  378. Status status = GDIPlus.GdipAddPathCurve (nativePath, points, points.Length);
  379. GDIPlus.CheckStatus (status);
  380. }
  381. public void AddCurve (Point [] points, float tension)
  382. {
  383. Status status = GDIPlus.GdipAddPathCurve2I (nativePath, points, points.Length, tension);
  384. GDIPlus.CheckStatus (status);
  385. }
  386. public void AddCurve (PointF [] points, float tension)
  387. {
  388. Status status = GDIPlus.GdipAddPathCurve2 (nativePath, points, points.Length, tension);
  389. GDIPlus.CheckStatus (status);
  390. }
  391. public void AddCurve (Point [] points, int offset, int numberOfSegments, float tension)
  392. {
  393. Status status = GDIPlus.GdipAddPathCurve3I (nativePath, points, points.Length,
  394. offset, numberOfSegments, tension);
  395. GDIPlus.CheckStatus (status);
  396. }
  397. public void AddCurve (PointF [] points, int offset, int numberOfSegments, float tension)
  398. {
  399. Status status = GDIPlus.GdipAddPathCurve3 (nativePath, points, points.Length,
  400. offset, numberOfSegments, tension);
  401. GDIPlus.CheckStatus (status);
  402. }
  403. public void Reset ()
  404. {
  405. Status status = GDIPlus.GdipResetPath (nativePath);
  406. GDIPlus.CheckStatus (status);
  407. }
  408. public void Reverse ()
  409. {
  410. Status status = GDIPlus.GdipReversePath (nativePath);
  411. GDIPlus.CheckStatus (status);
  412. }
  413. public void Transform (Matrix matrix)
  414. {
  415. Status status = GDIPlus.GdipTransformPath (nativePath, matrix.nativeMatrix);
  416. GDIPlus.CheckStatus (status);
  417. }
  418. [MonoTODO]
  419. public void AddString (string s, FontFamily family, int style, float emSize, Point origin, StringFormat format)
  420. {
  421. throw new NotImplementedException ();
  422. }
  423. [MonoTODO]
  424. public void AddString (string s, FontFamily family, int style, float emSize, PointF origin, StringFormat format)
  425. {
  426. throw new NotImplementedException ();
  427. }
  428. [MonoTODO]
  429. public void AddString (string s, FontFamily family, int style, float emSize, Rectangle layoutRect, StringFormat format)
  430. {
  431. throw new NotImplementedException ();
  432. }
  433. [MonoTODO]
  434. public void AddString (string s, FontFamily family, int style, float emSize, RectangleF layoutRect, StringFormat format)
  435. {
  436. throw new NotImplementedException ();
  437. }
  438. [MonoTODO]
  439. public void ClearMarkers()
  440. {
  441. throw new NotImplementedException ();
  442. }
  443. [MonoTODO]
  444. public void CloseAllFigures()
  445. {
  446. throw new NotImplementedException ();
  447. }
  448. [MonoTODO]
  449. public void CloseFigure()
  450. {
  451. throw new NotImplementedException ();
  452. }
  453. [MonoTODO]
  454. public void Flatten ()
  455. {
  456. throw new NotImplementedException ();
  457. }
  458. [MonoTODO]
  459. public void Flatten (Matrix matrix)
  460. {
  461. throw new NotImplementedException ();
  462. }
  463. [MonoTODO]
  464. public void Flatten (Matrix matrix, float flatness)
  465. {
  466. throw new NotImplementedException ();
  467. }
  468. [MonoTODO]
  469. public RectangleF GetBounds ()
  470. {
  471. throw new NotImplementedException ();
  472. }
  473. [MonoTODO]
  474. public RectangleF GetBounds (Matrix matrix)
  475. {
  476. throw new NotImplementedException ();
  477. }
  478. [MonoTODO]
  479. public RectangleF GetBounds (Matrix matrix, Pen pen)
  480. {
  481. throw new NotImplementedException ();
  482. }
  483. [MonoTODO]
  484. public bool IsOutlineVisible (Point point, Pen pen)
  485. {
  486. throw new NotImplementedException ();
  487. }
  488. [MonoTODO]
  489. public bool IsOutlineVisible (PointF point, Pen pen)
  490. {
  491. throw new NotImplementedException ();
  492. }
  493. [MonoTODO]
  494. public bool IsOutlineVisible (int x, int y, Pen pen)
  495. {
  496. throw new NotImplementedException ();
  497. }
  498. [MonoTODO]
  499. public bool IsOutlineVisible (Point pt, Pen pen, Graphics graphics)
  500. {
  501. throw new NotImplementedException ();
  502. }
  503. [MonoTODO]
  504. public bool IsOutlineVisible (PointF pt, Pen pen, Graphics graphics)
  505. {
  506. throw new NotImplementedException ();
  507. }
  508. [MonoTODO]
  509. public bool IsOutlineVisible (float x, float y, Pen pen)
  510. {
  511. throw new NotImplementedException ();
  512. }
  513. [MonoTODO]
  514. public bool IsOutlineVisible (int x, int y, Pen pen, Graphics graphics)
  515. {
  516. throw new NotImplementedException ();
  517. }
  518. [MonoTODO]
  519. public bool IsOutlineVisible (float x, float y, Pen pen, Graphics graphics)
  520. {
  521. throw new NotImplementedException ();
  522. }
  523. [MonoTODO]
  524. public bool IsVisible (Point point)
  525. {
  526. throw new NotImplementedException ();
  527. }
  528. [MonoTODO]
  529. public bool IsVisible (PointF point)
  530. {
  531. throw new NotImplementedException ();
  532. }
  533. [MonoTODO]
  534. public bool IsVisible (int x, int y)
  535. {
  536. throw new NotImplementedException ();
  537. }
  538. [MonoTODO]
  539. public bool IsVisible (Point pt, Graphics graphics)
  540. {
  541. throw new NotImplementedException ();
  542. }
  543. [MonoTODO]
  544. public bool IsVisible (PointF pt, Graphics graphics)
  545. {
  546. throw new NotImplementedException ();
  547. }
  548. [MonoTODO]
  549. public bool IsVisible (float x, float y)
  550. {
  551. throw new NotImplementedException ();
  552. }
  553. [MonoTODO]
  554. public bool IsVisible (int x, int y, Graphics graphics)
  555. {
  556. throw new NotImplementedException ();
  557. }
  558. [MonoTODO]
  559. public bool IsVisible (float x, float y, Graphics graphics)
  560. {
  561. throw new NotImplementedException ();
  562. }
  563. [MonoTODO]
  564. public void SetMarkers()
  565. {
  566. throw new NotImplementedException ();
  567. }
  568. [MonoTODO]
  569. public void StartFigure()
  570. {
  571. throw new NotImplementedException ();
  572. }
  573. [MonoTODO]
  574. public void Warp (PointF[] destPoints, RectangleF srcRect)
  575. {
  576. throw new NotImplementedException ();
  577. }
  578. [MonoTODO]
  579. public void Warp (PointF[] destPoints, RectangleF srcRect, Matrix matrix)
  580. {
  581. throw new NotImplementedException ();
  582. }
  583. [MonoTODO]
  584. public void Warp (PointF[] destPoints, RectangleF srcRect, Matrix matrix, WarpMode warpMode)
  585. {
  586. throw new NotImplementedException ();
  587. }
  588. [MonoTODO]
  589. public void Warp (PointF[] destPoints, RectangleF srcRect, Matrix matrix, WarpMode warpMode, float flatness)
  590. {
  591. throw new NotImplementedException ();
  592. }
  593. [MonoTODO]
  594. public void Widen (Pen pen)
  595. {
  596. throw new NotImplementedException ();
  597. }
  598. [MonoTODO]
  599. public void Widen (Pen pen, Matrix matrix)
  600. {
  601. throw new NotImplementedException ();
  602. }
  603. [MonoTODO]
  604. public void Widen (Pen pen, Matrix matrix, float flatness)
  605. {
  606. throw new NotImplementedException ();
  607. }
  608. }
  609. }