internal Rectangle[] SliceRectangles(Rectangle[] rois) { if (rois.Length == 0 || (this.MaximumRegionHeight == 0 && this.MaximumRegionWidth == 0)) return rois; // Re-slice regions List<Rectangle> sizedRegions = new List<Rectangle>(); Rectangle[] rectCopy = rois; // Resize width foreach (Rectangle rect in rectCopy) { if (this.MaximumRegionWidth > 0 && rect.Width > this.MaximumRegionWidth) { int sliceCount = (int)Math.Ceiling((double)rect.Width / (double)this.MaximumRegionWidth); for (int i = 0; i < sliceCount; i++) { if (i < sliceCount - 1) { sizedRegions.Add(new Rectangle(rect.X + (this.MaximumRegionWidth * i), rect.Y, this.MaximumRegionWidth, rect.Height)); } else { int remainingWidth = rect.Width - this.MaximumRegionWidth * (sliceCount - 1); sizedRegions.Add(new Rectangle(rect.Right - remainingWidth, rect.Y, remainingWidth, rect.Height)); } } } else { sizedRegions.Add(rect); } } rectCopy = sizedRegions.ToArray(); sizedRegions.Clear(); // Resize height foreach (Rectangle rect in rectCopy) { if (this.MaximumRegionHeight > 0 && rect.Height > this.MaximumRegionHeight) { int sliceCount = (int)Math.Ceiling((double)rect.Height / (double)this.MaximumRegionHeight); for (int i = 0; i < sliceCount; i++) { if (i < sliceCount - 1) { sizedRegions.Add(new Rectangle(rect.X, rect.Y + (this.MaximumRegionHeight * i), rect.Width, this.MaximumRegionHeight)); } else { int remainingHeight = rect.Height - this.MaximumRegionHeight * (sliceCount - 1); sizedRegions.Add(new Rectangle(rect.X, rect.Bottom - remainingHeight, rect.Width, remainingHeight)); } } } else { sizedRegions.Add(rect); } } return sizedRegions.ToArray(); }
public unsafe static Point[][] PolygonSetFromStencil(IBitVector2D stencil, Rectangle bounds, int translateX, int translateY) { List<Point[]> polygons = new List<Point[]>(); if (!stencil.IsEmpty) { Point start = bounds.Location; List<Point> pts = new List<Point>(); int count = 0; // find all islands while (true) { bool startFound = false; while (true) { if (stencil[start]) { startFound = true; break; } ++start.X; if (start.X >= bounds.Right) { ++start.Y; start.X = bounds.Left; if (start.Y >= bounds.Bottom) { break; } } } if (!startFound) { break; } pts.Clear(); Point last = new Point(start.X, start.Y + 1); Point curr = new Point(start.X, start.Y); Point next = curr; Point left = Point.Empty; Point right = Point.Empty; // trace island outline while (true) { left.X = ((curr.X - last.X) + (curr.Y - last.Y) + 2) / 2 + curr.X - 1; left.Y = ((curr.Y - last.Y) - (curr.X - last.X) + 2) / 2 + curr.Y - 1; right.X = ((curr.X - last.X) - (curr.Y - last.Y) + 2) / 2 + curr.X - 1; right.Y = ((curr.Y - last.Y) + (curr.X - last.X) + 2) / 2 + curr.Y - 1; if (bounds.Contains(left) && stencil[left]) { // go left next.X += curr.Y - last.Y; next.Y -= curr.X - last.X; } else if (bounds.Contains(right) && stencil[right]) { // go straight next.X += curr.X - last.X; next.Y += curr.Y - last.Y; } else { // turn right next.X -= curr.Y - last.Y; next.Y += curr.X - last.X; } if (Math.Sign(next.X - curr.X) != Math.Sign(curr.X - last.X) || Math.Sign(next.Y - curr.Y) != Math.Sign(curr.Y - last.Y)) { pts.Add(curr); ++count; } last = curr; curr = next; if (next.X == start.X && next.Y == start.Y) { break; } } Point[] points = pts.ToArray(); Scanline[] scans = Utility.GetScans(points); foreach (Scanline scan in scans) { stencil.Invert(scan); } Utility.TranslatePointsInPlace(points, translateX, translateY); polygons.Add(points); } } Point[][] returnVal = polygons.ToArray(); return returnVal; }
int NativeInterfaces.IFileDialogEvents.OnFileOk(NativeInterfaces.IFileDialog pfd) { int hr = NativeConstants.S_OK; NativeInterfaces.IShellItemArray results = null; FileOpenDialog.GetResults(out results); uint count = 0; results.GetCount(out count); List<NativeInterfaces.IShellItem> items = new List<NativeInterfaces.IShellItem>(); List<NativeInterfaces.IShellItem> needLocalCopy = new List<NativeInterfaces.IShellItem>(); List<NativeInterfaces.IShellItem> cannotCopy = new List<NativeInterfaces.IShellItem>(); List<string> localPathNames = new List<string>(); for (uint i = 0; i < count; ++i) { NativeInterfaces.IShellItem item = null; results.GetItemAt(i, out item); items.Add(item); } foreach (NativeInterfaces.IShellItem item in items) { // If it's a file system object, nothing special needs to be done. NativeConstants.SFGAO sfgaoAttribs; item.GetAttributes((NativeConstants.SFGAO)0xffffffff, out sfgaoAttribs); if ((sfgaoAttribs & NativeConstants.SFGAO.SFGAO_FILESYSTEM) == NativeConstants.SFGAO.SFGAO_FILESYSTEM) { string pathName = null; item.GetDisplayName(NativeConstants.SIGDN.SIGDN_FILESYSPATH, out pathName); localPathNames.Add(pathName); } else if ((sfgaoAttribs & NativeConstants.SFGAO.SFGAO_STREAM) == NativeConstants.SFGAO.SFGAO_STREAM) { needLocalCopy.Add(item); } else { cannotCopy.Add(item); } } Marshal.ReleaseComObject(results); results = null; if (needLocalCopy.Count > 0) { IntPtr hwnd = IntPtr.Zero; NativeInterfaces.IOleWindow oleWindow = (NativeInterfaces.IOleWindow)pfd; oleWindow.GetWindow(out hwnd); Win32Window win32Window = new Win32Window(hwnd, oleWindow); IFileTransferProgressEvents progressEvents = this.FileDialogUICallbacks.CreateFileTransferProgressEvents(); ThreadStart copyThreadProc = delegate() { try { progressEvents.SetItemCount(needLocalCopy.Count); for (int i = 0; i < needLocalCopy.Count; ++i) { NativeInterfaces.IShellItem item = needLocalCopy[i]; string pathName = null; progressEvents.SetItemOrdinal(i); CopyResult result = CreateLocalCopy(item, progressEvents, out pathName); if (result == CopyResult.Success) { localPathNames.Add(pathName); } else if (result == CopyResult.Skipped) { // do nothing } else if (result == CopyResult.CancelOperation) { hr = NativeConstants.S_FALSE; break; } else { throw new InvalidEnumArgumentException(); } } } finally { OperationResult result; if (hr == NativeConstants.S_OK) { result = OperationResult.Finished; } else { result = OperationResult.Canceled; } progressEvents.EndOperation(result); } }; Thread copyThread = new Thread(copyThreadProc); copyThread.SetApartmentState(ApartmentState.STA); EventHandler onUIShown = delegate(object sender, EventArgs e) { copyThread.Start(); }; this.cancelSink = new CancelableTearOff(); progressEvents.BeginOperation(win32Window, onUIShown, cancelSink); this.cancelSink = null; copyThread.Join(); Marshal.ReleaseComObject(oleWindow); oleWindow = null; } this.FileNames = localPathNames.ToArray(); // If they selected a bunch of files, and then they all errored or something, then don't proceed. if (this.FileNames.Length == 0) { hr = NativeConstants.S_FALSE; } foreach (NativeInterfaces.IShellItem item in items) { Marshal.ReleaseComObject(item); } items.Clear(); items = null; GC.KeepAlive(pfd); return hr; }