public virtual void StartSearch(Bitmap searchFor, Rectangle searchArea, Point startFrom, int maxCount,
                                            int tolerance)
            {
                BitmapHelper.CheckBitmap(searchFor);
                _searchFor      = BitmapHelper.CloneBitmap(searchFor);
                _startFrom      = startFrom;
                _tolerance      = tolerance * 0xfe01 / 100;
                _searchStarted  = true;
                _maxCount       = maxCount;
                _searchFinished = false;
                var rectangle = searchArea;

                rectangle.Intersect(new Rectangle(0, 0, _searchOn.Width, _searchOn.Height));
                rectangle.Width  -= _searchFor.Width - 1;
                rectangle.Height -= _searchFor.Height - 1;
                _sl           = rectangle.Left;
                _st           = rectangle.Top;
                _sr           = rectangle.Right;
                _sb           = rectangle.Bottom;
                _startFrom.X -= _searchFor.Width / 2;
                _startFrom.Y -= _searchFor.Height / 2;
                if (_startFrom.X < _sl)
                {
                    _startFrom.X = _sl;
                }
                if (_startFrom.Y < _st)
                {
                    _startFrom.Y = _st;
                }
                if (_startFrom.X >= _sr)
                {
                    _startFrom.X = _sr - 1;
                }
                if (_startFrom.Y >= _sb)
                {
                    _startFrom.Y = _sb - 1;
                }
                _maxOffset = Math.Max(Math.Max(_startFrom.X - _sl, _sr - _startFrom.X),
                                      Math.Max(_startFrom.Y - _st, _sb - _startFrom.Y));
                _x      = _startFrom.X;
                _y      = _startFrom.Y;
                _offset = 0;
                _i      = 1;
                _pos    = 0;
                _result = new ArrayList(_maxCount);
            }
Exemple #2
0
            protected Rectangle ExpandToRight(Rectangle rect)
            {
                var rectangle = rect;
                var num       = rect.Right - _topRightData.Width + 1;
                var y         = rect.Y;
                var num3      = rect.Bottom - _bottomRightData.Height;

                for (var i = num; i < _sr; i++)
                {
                    if (!BitmapHelper.CompareBitmapLocked(_searchOnData, _topRightData, i, y, _tolerance) ||
                        !BitmapHelper.CompareBitmapLocked(_searchOnData, _bottomRightData, i, num3, _tolerance))
                    {
                        return(rectangle);
                    }
                    rectangle.Width++;
                }
                return(rectangle);
            }
Exemple #3
0
            protected Rectangle ExpandToBottom(Rectangle rect)
            {
                var rectangle = rect;
                var x         = rect.X;
                var num2      = rect.Right - _bottomRightData.Width;
                var num3      = rect.Bottom - _bottomRightData.Height + 1;

                for (var i = num3; i < _sb; i++)
                {
                    if (!BitmapHelper.CompareBitmapLocked(_searchOnData, _bottomLeftData, x, i, _tolerance) ||
                        !BitmapHelper.CompareBitmapLocked(_searchOnData, _bottomRightData, num2, i, _tolerance))
                    {
                        return(rectangle);
                    }
                    rectangle.Height++;
                }
                return(rectangle);
            }
Exemple #4
0
            protected Rectangle ExpandToTop(Rectangle rect)
            {
                var rectangle = rect;
                var x         = rect.X;
                var num2      = rect.Right - _topRightData.Width;
                var num3      = rect.Y - 1;

                for (var i = num3; i >= _st; i--)
                {
                    if (!BitmapHelper.CompareBitmapLocked(_searchOnData, _topLeftData, x, i, _tolerance) ||
                        !BitmapHelper.CompareBitmapLocked(_searchOnData, _topRightData, num2, i, _tolerance))
                    {
                        return(rectangle);
                    }
                    rectangle.Y--;
                    rectangle.Height++;
                }
                return(rectangle);
            }
Exemple #5
0
            protected Rectangle ExpandToLeft(Rectangle rect)
            {
                var rectangle = rect;
                var num       = rect.X - 1;
                var y         = rect.Y;
                var num3      = rect.Bottom - _bottomLeftData.Height;

                for (var i = num; i >= _sl; i--)
                {
                    if (!BitmapHelper.CompareBitmapLocked(_searchOnData, _topLeftData, i, y, _tolerance) ||
                        !BitmapHelper.CompareBitmapLocked(_searchOnData, _bottomLeftData, i, num3, _tolerance))
                    {
                        return(rectangle);
                    }
                    rectangle.X--;
                    rectangle.Width++;
                }
                return(rectangle);
            }
Exemple #6
0
            public override Rectangle FindNext()
            {
                Rectangle rectangle;

                _topLeftData     = null;
                _topRightData    = null;
                _bottomLeftData  = null;
                _bottomRightData = null;
                try
                {
                    _topLeftData     = BitmapHelper.LockBits(_topLeft, ImageLockMode.ReadOnly);
                    _topRightData    = BitmapHelper.LockBits(_topRight, ImageLockMode.ReadOnly);
                    _bottomLeftData  = BitmapHelper.LockBits(_bottomLeft, ImageLockMode.ReadOnly);
                    _bottomRightData = BitmapHelper.LockBits(_bottomRight, ImageLockMode.ReadOnly);
                    rectangle        = base.FindNext();
                }
                finally
                {
                    if (_topLeftData != null)
                    {
                        BitmapHelper.UnlockBits(_topLeft, _topLeftData);
                    }
                    if (_topRightData != null)
                    {
                        BitmapHelper.UnlockBits(_topRight, _topRightData);
                    }
                    if (_bottomLeftData != null)
                    {
                        BitmapHelper.UnlockBits(_bottomLeft, _bottomLeftData);
                    }
                    if (_bottomRightData != null)
                    {
                        BitmapHelper.UnlockBits(_bottomRight, _bottomRightData);
                    }
                }
                return(rectangle);
            }
Exemple #7
0
            protected override bool CheckLocation(int x, int y)
            {
                if ((x >= _sl) && (y >= _st) && (x < _sr) && (y < _sb))
                {
                    switch (_startCorner)
                    {
                    case 0:
                        if (BitmapHelper.CompareBitmapLocked(_searchOnData, _topLeftData, x, y, _tolerance))
                        {
                            for (var i = x + _topLeft.Width; i < _sr; i++)
                            {
                                if (BitmapHelper.CompareBitmapLocked(_searchOnData, _topRightData, i, y, _tolerance))
                                {
                                    for (var j = y + _topLeft.Height; j < _sb; j++)
                                    {
                                        if (
                                            BitmapHelper.CompareBitmapLocked(_searchOnData, _bottomRightData, i, j,
                                                                             _tolerance) &&
                                            BitmapHelper.CompareBitmapLocked(_searchOnData, _bottomLeftData, x, j,
                                                                             _tolerance))
                                        {
                                            var rectangle =
                                                Expand(Rectangle.FromLTRB(x, y, i + _bottomRight.Width,
                                                                          j + _bottomRight.Height));
                                            _result.Add(rectangle);
                                            rectangle.Inflate(-1, -1);
                                            MaskRectangle(rectangle);
                                            return(true);
                                        }
                                    }
                                }
                            }
                        }
                        break;

                    case 1:
                        if (BitmapHelper.CompareBitmapLocked(_searchOnData, _topRightData, x, y, _tolerance))
                        {
                            for (var k = y + _topRight.Height; k < _sb; k++)
                            {
                                if (BitmapHelper.CompareBitmapLocked(_searchOnData, _bottomRightData, x, k,
                                                                     _tolerance))
                                {
                                    for (var m = x - _bottomLeft.Width; m >= _sl; m--)
                                    {
                                        if (
                                            BitmapHelper.CompareBitmapLocked(_searchOnData, _bottomLeftData, m, k,
                                                                             _tolerance) &&
                                            BitmapHelper.CompareBitmapLocked(_searchOnData, _topLeftData, m, y,
                                                                             _tolerance))
                                        {
                                            var rectangle2 =
                                                Expand(Rectangle.FromLTRB(m, y, x + _topRight.Width,
                                                                          k + _bottomRight.Height));
                                            _result.Add(rectangle2);
                                            rectangle2.Inflate(-1, -1);
                                            MaskRectangle(rectangle2);
                                            return(true);
                                        }
                                    }
                                }
                            }
                        }
                        break;

                    case 2:
                        if (BitmapHelper.CompareBitmapLocked(_searchOnData, _bottomLeftData, x, y, _tolerance))
                        {
                            for (var n = y - _topLeft.Height; n >= _st; n--)
                            {
                                if (BitmapHelper.CompareBitmapLocked(_searchOnData, _topLeftData, x, n, _tolerance))
                                {
                                    for (var num6 = x + _topLeft.Width; num6 < _sr; num6++)
                                    {
                                        if (
                                            BitmapHelper.CompareBitmapLocked(_searchOnData, _topRightData, num6, n,
                                                                             _tolerance) &&
                                            BitmapHelper.CompareBitmapLocked(_searchOnData, _bottomRightData, num6,
                                                                             y, _tolerance))
                                        {
                                            var rectangle3 =
                                                Expand(Rectangle.FromLTRB(x, n, num6 + _topRight.Width,
                                                                          y + _bottomLeft.Height));
                                            _result.Add(rectangle3);
                                            rectangle3.Inflate(-1, -1);
                                            MaskRectangle(rectangle3);
                                            return(true);
                                        }
                                    }
                                }
                            }
                        }
                        break;

                    case 3:
                        if (BitmapHelper.CompareBitmapLocked(_searchOnData, _bottomRightData, x, y, _tolerance))
                        {
                            for (var num7 = x - _bottomLeft.Width; num7 >= _sl; num7--)
                            {
                                if (BitmapHelper.CompareBitmapLocked(_searchOnData, _bottomLeftData, num7, y,
                                                                     _tolerance))
                                {
                                    for (var num8 = y - _topLeft.Height; num8 >= _st; num8--)
                                    {
                                        if (
                                            BitmapHelper.CompareBitmapLocked(_searchOnData, _topLeftData, num7, num8,
                                                                             _tolerance) &&
                                            BitmapHelper.CompareBitmapLocked(_searchOnData, _topRightData, x, num8,
                                                                             _tolerance))
                                        {
                                            var rectangle4 =
                                                Expand(Rectangle.FromLTRB(num7, num8, x + _bottomRight.Width,
                                                                          y + _bottomRight.Height));
                                            _result.Add(rectangle4);
                                            rectangle4.Inflate(-1, -1);
                                            MaskRectangle(rectangle4);
                                            return(true);
                                        }
                                    }
                                }
                            }
                        }
                        break;
                    }
                }
                return(false);
            }
            public virtual Rectangle FindNext()
            {
                Rectangle empty;

                _searchOnData  = null;
                _searchForData = null;
                try
                {
                    _searchOnData  = BitmapHelper.LockBits(_searchOn, ImageLockMode.ReadOnly);
                    _searchForData = BitmapHelper.LockBits(_searchFor, ImageLockMode.ReadOnly);
                    if (_searchFinished)
                    {
                        return(Rectangle.Empty);
                    }
                    if (!_searchStarted)
                    {
                        throw new ApplicationException(
                                  "Search is not started. Use StartSearch prior to calling FindNext");
                    }
                    if (_offset != 0)
                    {
                        goto Label_02CE;
                    }
                    _offset++;
                    if (!CheckLocation(_x, _y))
                    {
                        goto Label_02CE;
                    }
                    return((Rectangle)_result[_result.Count - 1]);

Label_00A3:
                    switch (_pos)
                    {
                    case 0:
                        _x0 = _x - _i + 1;
                        _y0 = _y - _offset;
                        break;

                    case 1:
                        _x0 = _x + _i;
                        _y0 = _y - _offset;
                        break;

                    case 2:
                        _x0 = _x + _offset;
                        _y0 = _y - _i + 1;
                        break;

                    case 3:
                        _x0 = _x + _offset;
                        _y0 = _y + _i;
                        break;

                    case 4:
                        _x0 = _x + _i - 1;
                        _y0 = _y + _offset;
                        break;

                    case 5:
                        _x0 = _x - _i;
                        _y0 = _y + _offset;
                        break;

                    case 6:
                        _x0 = _x - _offset;
                        _y0 = _y + _i - 1;
                        break;

                    case 7:
                        _x0 = _x - _offset;
                        _y0 = _y - _i;
                        break;
                    }
                    _pos++;
                    if (CheckLocation(_x0, _y0))
                    {
                        if (_result.Count <= _maxCount)
                        {
                            return((Rectangle)_result[_result.Count - 1]);
                        }
                        return(Rectangle.Empty);
                    }
Label_028A:
                    if (_pos < 8)
                    {
                        goto Label_00A3;
                    }
                    _i++;
                    _pos = 0;
Label_02AB:
                    if (_i <= _offset)
                    {
                        goto Label_028A;
                    }
                    _offset++;
                    _i = 1;
Label_02CE:
                    if (_offset <= _maxOffset)
                    {
                        goto Label_02AB;
                    }
                    _searchFinished = true;
                    empty           = Rectangle.Empty;
                }
                finally
                {
                    if (_searchForData != null)
                    {
                        BitmapHelper.UnlockBits(_searchFor, _searchForData);
                    }
                    if (_searchOnData != null)
                    {
                        BitmapHelper.UnlockBits(_searchOn, _searchOnData);
                    }
                }
                return(empty);
            }
 public BitmapSearch(Bitmap searchOn)
 {
     _searchOn = BitmapHelper.CloneBitmap(searchOn);
 }
 protected void MaskRectangle(Rectangle R)
 {
     BitmapHelper.MaskRectangle(_searchOnData, R, true);
 }