示例#1
0
 internal bool CompareTo(DirectBitmap other, int fade, double min, DBCompareFlags flags)
 {
     return(CompareTo(new Point(0, 0), other, fade, min, flags));
 }
示例#2
0
        //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);
        }