internal bool CompareTo(DirectBitmap other, int fade, double min, DBCompareFlags flags) { return(CompareTo(new Point(0, 0), other, fade, min, flags)); }
//internal bool CompareTo(Rectangle rectangle, DirectBitmap other, int fade, double min, DBCompareFlags flags) internal bool CompareTo(Point scanAt, DirectBitmap other, int fade, double min, DBCompareFlags flags) { int maxFail = (int)((double)other.Width * other.Height * ((100 - min) / 100)); int pixelsFailed = 0; bool failed = false; Action <int, ParallelLoopState> check = new Action <int, ParallelLoopState>((x, loopState) => { for (int y = 0; y < other.Height && !failed; y++) { Color pixelColor = other.GetPixel(x, y); if ((flags.HasFlag(DBCompareFlags.IgnoreBlack) && pixelColor == Color.FromArgb(255, 0, 0, 0)) || (flags.HasFlag(DBCompareFlags.IgnoreWhite) && pixelColor == Color.FromArgb(255, 255, 255, 255))) { continue; } else if (!CompareColor(x + scanAt.X, y + scanAt.Y, pixelColor.ToInt(), fade)) { pixelsFailed++; } failed = pixelsFailed >= maxFail; if (loopState != null && failed) { loopState.Break(); } } }); if (!flags.HasFlag(DBCompareFlags.Multithread)) { for (int x = 0; x < other.Width && !failed; x++) { check.Invoke(x, null); } } else { Parallel.For(0, other.Width, check); } return(!failed); }