using System; using System.Collections.Generic; using OpenCVForUnity.CoreModule; #if !UNITY_WSA_10_0 using OpenCVForUnity.DnnModule; #endif namespace OpenCVForUnity.UtilsModule { public class Converters { public static Mat vector_Point_to_Mat (List pts) { return vector_Point_to_Mat (pts, CvType.CV_32S); } public static Mat vector_Point2f_to_Mat (List pts) { return vector_Point_to_Mat (pts, CvType.CV_32F); } public static Mat vector_Point2d_to_Mat (List pts) { return vector_Point_to_Mat (pts, CvType.CV_64F); } public static Mat vector_Point_to_Mat (List pts, int typeDepth) { Mat res; int count = (pts != null) ? pts.Count : 0; if (count > 0) { switch (typeDepth) { case CvType.CV_32S: { res = new Mat (count, 1, CvType.CV_32SC2); int[] buff = new int[count * 2]; for (int i = 0; i < count; i++) { Point p = pts [i]; buff [i * 2] = (int)p.x; buff [i * 2 + 1] = (int)p.y; } res.put (0, 0, buff); } break; case CvType.CV_32F: { res = new Mat (count, 1, CvType.CV_32FC2); float[] buff = new float[count * 2]; for (int i = 0; i < count; i++) { Point p = pts [i]; buff [i * 2] = (float)p.x; buff [i * 2 + 1] = (float)p.y; } res.put (0, 0, buff); } break; case CvType.CV_64F: { res = new Mat (count, 1, CvType.CV_64FC2); double[] buff = new double[count * 2]; for (int i = 0; i < count; i++) { Point p = pts [i]; buff [i * 2] = p.x; buff [i * 2 + 1] = p.y; } res.put (0, 0, buff); } break; default: throw new CvException ("'typeDepth' can be CV_32S, CV_32F or CV_64F"); } } else { res = new Mat (); } return res; } public static Mat vector_Point3i_to_Mat (List pts) { return vector_Point3_to_Mat (pts, CvType.CV_32S); } public static Mat vector_Point3f_to_Mat (List pts) { return vector_Point3_to_Mat (pts, CvType.CV_32F); } public static Mat vector_Point3d_to_Mat (List pts) { return vector_Point3_to_Mat (pts, CvType.CV_64F); } public static Mat vector_Point3_to_Mat (List pts, int typeDepth) { Mat res; int count = (pts != null) ? pts.Count : 0; if (count > 0) { switch (typeDepth) { case CvType.CV_32S: { res = new Mat (count, 1, CvType.CV_32SC3); int[] buff = new int[count * 3]; for (int i = 0; i < count; i++) { Point3 p = pts [i]; buff [i * 3] = (int)p.x; buff [i * 3 + 1] = (int)p.y; buff [i * 3 + 2] = (int)p.z; } res.put (0, 0, buff); } break; case CvType.CV_32F: { res = new Mat (count, 1, CvType.CV_32FC3); float[] buff = new float[count * 3]; for (int i = 0; i < count; i++) { Point3 p = pts [i]; buff [i * 3] = (float)p.x; buff [i * 3 + 1] = (float)p.y; buff [i * 3 + 2] = (float)p.z; } res.put (0, 0, buff); } break; case CvType.CV_64F: { res = new Mat (count, 1, CvType.CV_64FC3); double[] buff = new double[count * 3]; for (int i = 0; i < count; i++) { Point3 p = pts [i]; buff [i * 3] = p.x; buff [i * 3 + 1] = p.y; buff [i * 3 + 2] = p.z; } res.put (0, 0, buff); } break; default: throw new CvException ("'typeDepth' can be CV_32S, CV_32F or CV_64F"); } } else { res = new Mat (); } return res; } public static void Mat_to_vector_Point2f (Mat m, List pts) { if (m != null) m.ThrowIfDisposed (); Mat_to_vector_Point (m, pts); } public static void Mat_to_vector_Point2d (Mat m, List pts) { if (m != null) m.ThrowIfDisposed (); Mat_to_vector_Point (m, pts); } public static void Mat_to_vector_Point (Mat m, List pts) { if (m != null) m.ThrowIfDisposed (); if (pts == null) throw new CvException ("Output List can't be null"); int count = m.rows (); int type = m.type (); if (m.cols () != 1) throw new CvException ("Input Mat should have one column\n" + m); pts.Clear (); if (type == CvType.CV_32SC2) { int[] buff = new int[2 * count]; m.get (0, 0, buff); for (int i = 0; i < count; i++) { pts.Add (new Point (buff [i * 2], buff [i * 2 + 1])); } } else if (type == CvType.CV_32FC2) { float[] buff = new float[2 * count]; m.get (0, 0, buff); for (int i = 0; i < count; i++) { pts.Add (new Point (buff [i * 2], buff [i * 2 + 1])); } } else if (type == CvType.CV_64FC2) { double[] buff = new double[2 * count]; m.get (0, 0, buff); for (int i = 0; i < count; i++) { pts.Add (new Point (buff [i * 2], buff [i * 2 + 1])); } } else { throw new CvException ( "Input Mat should be of CV_32SC2, CV_32FC2 or CV_64FC2 type\n" + m); } } public static void Mat_to_vector_Point3i (Mat m, List pts) { if (m != null) m.ThrowIfDisposed (); Mat_to_vector_Point3 (m, pts); } public static void Mat_to_vector_Point3f (Mat m, List pts) { if (m != null) m.ThrowIfDisposed (); Mat_to_vector_Point3 (m, pts); } public static void Mat_to_vector_Point3d (Mat m, List pts) { if (m != null) m.ThrowIfDisposed (); Mat_to_vector_Point3 (m, pts); } public static void Mat_to_vector_Point3 (Mat m, List pts) { if (m != null) m.ThrowIfDisposed (); if (pts == null) throw new CvException ("Output List can't be null"); int count = m.rows (); int type = m.type (); if (m.cols () != 1) throw new CvException ("Input Mat should have one column\n" + m); pts.Clear (); if (type == CvType.CV_32SC3) { int[] buff = new int[3 * count]; m.get (0, 0, buff); for (int i = 0; i < count; i++) { pts.Add (new Point3 (buff [i * 3], buff [i * 3 + 1], buff [i * 3 + 2])); } } else if (type == CvType.CV_32FC3) { float[] buff = new float[3 * count]; m.get (0, 0, buff); for (int i = 0; i < count; i++) { pts.Add (new Point3 (buff [i * 3], buff [i * 3 + 1], buff [i * 3 + 2])); } } else if (type == CvType.CV_64FC3) { double[] buff = new double[3 * count]; m.get (0, 0, buff); for (int i = 0; i < count; i++) { pts.Add (new Point3 (buff [i * 3], buff [i * 3 + 1], buff [i * 3 + 2])); } } else { throw new CvException ( "Input Mat should be of CV_32SC3, CV_32FC3 or CV_64FC3 type\n" + m); } } public static Mat vector_Mat_to_Mat (List mats) { Mat res; int count = (mats != null) ? mats.Count : 0; if (count > 0) { res = new Mat (count, 1, CvType.CV_32SC2); int[] buff = new int[count * 2]; for (int i = 0; i < count; i++) { long addr = mats [i].nativeObj.ToInt64 ();//TODO:@check buff [i * 2] = (int)(addr >> 32); buff [i * 2 + 1] = (int)(addr & 0xffffffff); } res.put (0, 0, buff); } else { res = new Mat (); } return res; } public static void Mat_to_vector_Mat (Mat m, List mats) { if (m != null) m.ThrowIfDisposed (); if (mats == null) throw new CvException ("mats == null"); int count = m.rows (); if (CvType.CV_32SC2 != m.type () || m.cols () != 1) throw new CvException ( "CvType.CV_32SC2 != m.type() || m.cols()!=1\n" + m); mats.Clear (); int[] buff = new int[count * 2]; m.get (0, 0, buff); for (int i = 0; i < count; i++) { long addr = (((long)buff [i * 2]) << 32) | (((long)buff [i * 2 + 1]) & 0xffffffffL); // mats.add(new Mat(addr)); mats.Add (new Mat (new IntPtr (addr)));//TODO:@check } } public static Mat vector_float_to_Mat (List fs) { Mat res; int count = (fs != null) ? fs.Count : 0; if (count > 0) { res = new Mat (count, 1, CvType.CV_32FC1); float[] buff = new float[count]; for (int i = 0; i < count; i++) { float f = fs [i]; buff [i] = f; } res.put (0, 0, buff); } else { res = new Mat (); } return res; } public static void Mat_to_vector_float (Mat m, List fs) { if (m != null) m.ThrowIfDisposed (); if (fs == null) throw new CvException ("fs == null"); int count = m.rows (); if (CvType.CV_32FC1 != m.type () || m.cols () != 1) throw new CvException ( "CvType.CV_32FC1 != m.type() || m.cols()!=1\n" + m); fs.Clear (); float[] buff = new float[count]; m.get (0, 0, buff); for (int i = 0; i < count; i++) { fs.Add (buff [i]); } } public static Mat vector_uchar_to_Mat (List bs) { Mat res; int count = (bs != null) ? bs.Count : 0; if (count > 0) { res = new Mat (count, 1, CvType.CV_8UC1); byte[] buff = new byte[count]; for (int i = 0; i < count; i++) { byte b = bs [i]; buff [i] = b; } res.put (0, 0, buff); } else { res = new Mat (); } return res; } public static void Mat_to_vector_uchar (Mat m, List us) { if (m != null) m.ThrowIfDisposed (); if (us == null) throw new CvException ("Output List can't be null"); int count = m.rows (); if (CvType.CV_8UC1 != m.type () || m.cols () != 1) throw new CvException ( "CvType.CV_8UC1 != m.type() || m.cols()!=1\n" + m); us.Clear (); byte[] buff = new byte[count]; m.get (0, 0, buff); for (int i = 0; i < count; i++) { us.Add (buff [i]); } } public static Mat vector_char_to_Mat (List bs) { Mat res; int count = (bs != null) ? bs.Count : 0; if (count > 0) { res = new Mat (count, 1, CvType.CV_8SC1); byte[] buff = new byte[count]; for (int i = 0; i < count; i++) { byte b = bs [i]; buff [i] = b; } res.put (0, 0, buff); } else { res = new Mat (); } return res; } public static Mat vector_int_to_Mat (List _is) { Mat res; int count = (_is != null) ? _is.Count : 0; if (count > 0) { res = new Mat (count, 1, CvType.CV_32SC1); int[] buff = new int[count]; for (int i = 0; i < count; i++) { int v = _is [i]; buff [i] = v; } res.put (0, 0, buff); } else { res = new Mat (); } return res; } public static void Mat_to_vector_int (Mat m, List _is) { if (m != null) m.ThrowIfDisposed (); if (_is == null) throw new CvException ("is == null"); int count = m.rows (); if (CvType.CV_32SC1 != m.type () || m.cols () != 1) throw new CvException ( "CvType.CV_32SC1 != m.type() || m.cols()!=1\n" + m); _is.Clear (); int[] buff = new int[count]; m.get (0, 0, buff); for (int i = 0; i < count; i++) { _is.Add (buff [i]); } } public static void Mat_to_vector_char (Mat m, List bs) { if (m != null) m.ThrowIfDisposed (); if (bs == null) throw new CvException ("Output List can't be null"); int count = m.rows (); if (CvType.CV_8SC1 != m.type () || m.cols () != 1) throw new CvException ( "CvType.CV_8SC1 != m.type() || m.cols()!=1\n" + m); bs.Clear (); byte[] buff = new byte[count]; m.get (0, 0, buff); for (int i = 0; i < count; i++) { bs.Add (buff [i]); } } public static Mat vector_Rect_to_Mat (List rs) { Mat res; int count = (rs != null) ? rs.Count : 0; if (count > 0) { res = new Mat (count, 1, CvType.CV_32SC4); int[] buff = new int[4 * count]; for (int i = 0; i < count; i++) { Rect r = rs [i]; buff [4 * i] = r.x; buff [4 * i + 1] = r.y; buff [4 * i + 2] = r.width; buff [4 * i + 3] = r.height; } res.put (0, 0, buff); } else { res = new Mat (); } return res; } public static void Mat_to_vector_Rect (Mat m, List rs) { if (m != null) m.ThrowIfDisposed (); if (rs == null) throw new CvException ("rs == null"); int count = m.rows (); if (CvType.CV_32SC4 != m.type () || m.cols () != 1) throw new CvException ( "CvType.CV_32SC4 != m.type() || m.rows()!=1\n" + m); rs.Clear (); int[] buff = new int[4 * count]; m.get (0, 0, buff); for (int i = 0; i < count; i++) { rs.Add (new Rect (buff [4 * i], buff [4 * i + 1], buff [4 * i + 2], buff [4 * i + 3])); } } public static Mat vector_KeyPoint_to_Mat (List kps) { Mat res; int count = (kps != null) ? kps.Count : 0; if (count > 0) { res = new Mat (count, 1, CvType.CV_64FC (7)); double[] buff = new double[count * 7]; for (int i = 0; i < count; i++) { KeyPoint kp = kps [i]; buff [7 * i] = kp.pt.x; buff [7 * i + 1] = kp.pt.y; buff [7 * i + 2] = kp.size; buff [7 * i + 3] = kp.angle; buff [7 * i + 4] = kp.response; buff [7 * i + 5] = kp.octave; buff [7 * i + 6] = kp.class_id; } res.put (0, 0, buff); } else { res = new Mat (); } return res; } public static void Mat_to_vector_KeyPoint (Mat m, List kps) { if (m != null) m.ThrowIfDisposed (); if (kps == null) throw new CvException ("Output List can't be null"); int count = m.rows (); if (CvType.CV_64FC (7) != m.type () || m.cols () != 1) throw new CvException ( "CvType.CV_64FC(7) != m.type() || m.cols()!=1\n" + m); kps.Clear (); double[] buff = new double[7 * count]; m.get (0, 0, buff); for (int i = 0; i < count; i++) { kps.Add (new KeyPoint ((float)buff [7 * i], (float)buff [7 * i + 1], (float)buff [7 * i + 2], (float)buff [7 * i + 3], (float)buff [7 * i + 4], (int)buff [7 * i + 5], (int)buff [7 * i + 6])); } } // vector_vector_Point public static Mat vector_vector_Point_to_Mat (List pts, List mats) { Mat res; int lCount = (pts != null) ? pts.Count : 0; if (lCount > 0) { foreach (MatOfPoint vpt in pts) mats.Add (vpt); res = vector_Mat_to_Mat (mats); } else { res = new Mat (); } return res; } public static void Mat_to_vector_vector_Point (Mat m, List pts) { if (m != null) m.ThrowIfDisposed (); if (pts == null) throw new CvException ("Output List can't be null"); if (m == null) throw new CvException ("Input Mat can't be null"); List mats = new List (m.rows ()); Mat_to_vector_Mat (m, mats); foreach (Mat mi in mats) { MatOfPoint pt = new MatOfPoint (mi); pts.Add (pt); mi.release (); } mats.Clear (); } // vector_vector_Point2f public static void Mat_to_vector_vector_Point2f (Mat m, List pts) { if (m != null) m.ThrowIfDisposed (); if (pts == null) throw new CvException ("Output List can't be null"); if (m == null) throw new CvException ("Input Mat can't be null"); List mats = new List (m.rows ()); Mat_to_vector_Mat (m, mats); foreach (Mat mi in mats) { MatOfPoint2f pt = new MatOfPoint2f (mi); pts.Add (pt); mi.release (); } mats.Clear (); } // vector_vector_Point2f public static Mat vector_vector_Point2f_to_Mat (List pts, List mats) { Mat res; int lCount = (pts != null) ? pts.Count : 0; if (lCount > 0) { foreach (MatOfPoint2f vpt in pts) mats.Add (vpt); res = vector_Mat_to_Mat (mats); } else { res = new Mat (); } return res; } // vector_vector_Point3f public static void Mat_to_vector_vector_Point3f (Mat m, List pts) { if (m != null) m.ThrowIfDisposed (); if (pts == null) throw new CvException ("Output List can't be null"); if (m == null) throw new CvException ("Input Mat can't be null"); List mats = new List (m.rows ()); Mat_to_vector_Mat (m, mats); foreach (Mat mi in mats) { MatOfPoint3f pt = new MatOfPoint3f (mi); pts.Add (pt); mi.release (); } mats.Clear (); } // vector_vector_Point3f public static Mat vector_vector_Point3f_to_Mat (List pts, List mats) { Mat res; int lCount = (pts != null) ? pts.Count : 0; if (lCount > 0) { foreach (MatOfPoint3f vpt in pts) mats.Add (vpt); res = vector_Mat_to_Mat (mats); } else { res = new Mat (); } return res; } // vector_vector_KeyPoint public static Mat vector_vector_KeyPoint_to_Mat (List kps, List mats) { Mat res; int lCount = (kps != null) ? kps.Count : 0; if (lCount > 0) { foreach (MatOfKeyPoint vkp in kps) mats.Add (vkp); res = vector_Mat_to_Mat (mats); } else { res = new Mat (); } return res; } public static void Mat_to_vector_vector_KeyPoint (Mat m, List kps) { if (m != null) m.ThrowIfDisposed (); if (kps == null) throw new CvException ("Output List can't be null"); if (m == null) throw new CvException ("Input Mat can't be null"); List mats = new List (m.rows ()); Mat_to_vector_Mat (m, mats); foreach (Mat mi in mats) { MatOfKeyPoint vkp = new MatOfKeyPoint (mi); kps.Add (vkp); mi.release (); } mats.Clear (); } public static Mat vector_double_to_Mat (List ds) { Mat res; int count = (ds != null) ? ds.Count : 0; if (count > 0) { res = new Mat (count, 1, CvType.CV_64FC1); double[] buff = new double[count]; for (int i = 0; i < count; i++) { double v = ds [i]; buff [i] = v; } res.put (0, 0, buff); } else { res = new Mat (); } return res; } public static void Mat_to_vector_double (Mat m, List ds) { if (m != null) m.ThrowIfDisposed (); if (ds == null) throw new CvException ("ds == null"); int count = m.rows (); if (CvType.CV_64FC1 != m.type () || m.cols () != 1) throw new CvException ( "CvType.CV_64FC1 != m.type() || m.cols()!=1\n" + m); ds.Clear (); double[] buff = new double[count]; m.get (0, 0, buff); for (int i = 0; i < count; i++) { ds.Add (buff [i]); } } public static Mat vector_DMatch_to_Mat (List matches) { Mat res; int count = (matches != null) ? matches.Count : 0; if (count > 0) { res = new Mat (count, 1, CvType.CV_64FC4); double[] buff = new double[count * 4]; for (int i = 0; i < count; i++) { DMatch m = matches [i]; buff [4 * i] = m.queryIdx; buff [4 * i + 1] = m.trainIdx; buff [4 * i + 2] = m.imgIdx; buff [4 * i + 3] = m.distance; } res.put (0, 0, buff); } else { res = new Mat (); } return res; } public static void Mat_to_vector_DMatch (Mat m, List matches) { if (m != null) m.ThrowIfDisposed (); if (matches == null) throw new CvException ("Output List can't be null"); int count = m.rows (); if (CvType.CV_64FC4 != m.type () || m.cols () != 1) throw new CvException ( "CvType.CV_64FC4 != m.type() || m.cols()!=1\n" + m); matches.Clear (); double[] buff = new double[4 * count]; m.get (0, 0, buff); for (int i = 0; i < count; i++) { matches.Add (new DMatch ((int)buff [4 * i], (int)buff [4 * i + 1], (int)buff [4 * i + 2], (float)buff [4 * i + 3])); } } // vector_vector_DMatch public static Mat vector_vector_DMatch_to_Mat (List lvdm, List mats) { Mat res; int lCount = (lvdm != null) ? lvdm.Count : 0; if (lCount > 0) { foreach (MatOfDMatch vdm in lvdm) mats.Add (vdm); res = vector_Mat_to_Mat (mats); } else { res = new Mat (); } return res; } public static void Mat_to_vector_vector_DMatch (Mat m, List lvdm) { if (m != null) m.ThrowIfDisposed (); if (lvdm == null) throw new CvException ("Output List can't be null"); if (m == null) throw new CvException ("Input Mat can't be null"); List mats = new List (m.rows ()); Mat_to_vector_Mat (m, mats); lvdm.Clear (); foreach (Mat mi in mats) { MatOfDMatch vdm = new MatOfDMatch (mi); lvdm.Add (vdm); mi.release (); } mats.Clear (); } // vector_vector_char public static Mat vector_vector_char_to_Mat (List lvb, List mats) { Mat res; int lCount = (lvb != null) ? lvb.Count : 0; if (lCount > 0) { foreach (MatOfByte vb in lvb) mats.Add (vb); res = vector_Mat_to_Mat (mats); } else { res = new Mat (); } return res; } public static void Mat_to_vector_vector_char (Mat m, List> llb) { if (m != null) m.ThrowIfDisposed (); if (llb == null) throw new CvException ("Output List can't be null"); if (m == null) throw new CvException ("Input Mat can't be null"); List mats = new List (m.rows ()); Mat_to_vector_Mat (m, mats); foreach (Mat mi in mats) { List lb = new List (); Mat_to_vector_char (mi, lb); llb.Add (lb); mi.release (); } mats.Clear (); } public static Mat vector_RotatedRect_to_Mat (List rs) { Mat res; int count = (rs != null) ? rs.Count : 0; if (count > 0) { res = new Mat (count, 1, CvType.CV_32FC (5)); float[] buff = new float[5 * count]; for (int i = 0; i < count; i++) { RotatedRect r = rs [i]; buff [5 * i] = (float)r.center.x; buff [5 * i + 1] = (float)r.center.y; buff [5 * i + 2] = (float)r.size.width; buff [5 * i + 3] = (float)r.size.height; buff [5 * i + 4] = (float)r.angle; } res.put (0, 0, buff); } else { res = new Mat (); } return res; } public static void Mat_to_vector_RotatedRect (Mat m, List rs) { if (rs == null) throw new CvException ("rs == null"); int count = m.rows (); if (CvType.CV_32FC (5) != m.type () || m.cols () != 1) throw new CvException ( "CvType.CV_32FC5 != m.type() || m.rows()!=1\n" + m); rs.Clear (); float[] buff = new float[5 * count]; m.get (0, 0, buff); for (int i = 0; i < count; i++) { rs.Add (new RotatedRect (new Point (buff [5 * i], buff [5 * i + 1]), new Size (buff [5 * i + 2], buff [5 * i + 3]), buff [5 * i + 4])); } } public static Mat vector_String_to_Mat (List strings) { Mat res; int count = (strings != null) ? strings.Count : 0; if (count > 0) { System.Text.StringBuilder sb = new System.Text.StringBuilder (); for (int i = 0; i < count; i++) { if (i > 0) sb.Append (","); sb.Append (strings [i]); } // byte[] buff = System.Text.Encoding.ASCII.GetBytes (sb.ToString ()); byte[] buff = System.Text.Encoding.UTF8.GetBytes (sb.ToString ()); res = new Mat (1, buff.Length, CvType.CV_8SC1); res.put (0, 0, buff); } else { res = new Mat (); } return res; } public static void Mat_to_vector_String (Mat m, List strings) { if (m != null) m.ThrowIfDisposed (); if (strings == null) throw new CvException ("strings == null"); int count = m.cols (); if (CvType.CV_8SC1 != m.type () || m.rows () != 1) throw new CvException ( "CvType.CV_8SC1 != m.type() || m.rows()!=1\n" + m); strings.Clear (); if (count > 0) { byte[] buff = new byte[count]; m.get (0, 0, buff); // string str = System.Text.Encoding.ASCII.GetString (buff); // string str = System.Text.Encoding.UTF8.GetString (buff); // strings.AddRange (System.Text.Encoding.ASCII.GetString (buff).Split (',')); strings.AddRange (System.Text.Encoding.UTF8.GetString (buff).Split (',')); } } #if !UNITY_WSA_10_0 public static Mat vector_MatShape_to_Mat (List matshapes) { Mat res; int count = (matshapes != null) ? matshapes.Count : 0; if (count > 0) { res = new Mat (count, 1, CvType.CV_32SC2); int[] buff = new int[count * 2]; for (int i = 0; i < count; i++) { long addr = matshapes [i].nativeObj.ToInt64 ();//TODO:@check buff [i * 2] = (int)(addr >> 32); buff [i * 2 + 1] = (int)(addr & 0xffffffff); } res.put (0, 0, buff); } else { res = new Mat (); } return res; } public static void Mat_to_vector_Ptr_Layer (Mat m, List ptr_layers) { if (m != null) m.ThrowIfDisposed (); if (ptr_layers == null) throw new CvException ("ptr_layers == null"); int count = m.rows (); if (CvType.CV_32SC2 != m.type () || m.cols () != 1) throw new CvException ( "CvType.CV_32SC2 != m.type() || m.cols()!=1\n" + m); ptr_layers.Clear (); int[] buff = new int[count * 2]; m.get (0, 0, buff); for (int i = 0; i < count; i++) { long addr = (((long)buff [i * 2]) << 32) | (((long)buff [i * 2 + 1]) & 0xffffffffL); ptr_layers.Add (new Layer (new IntPtr (addr)));//TODO:@check } } #endif } }