AUT_RESULT AutoIt_Script::F_PixelSearch (VectorVariant &vParams, Variant &vResult)
{
uint iNumParams = vParams.size();
int q,r;
int col;
BYTE red, green, blue;
BYTE red_low, red_high, green_low, green_high, blue_low, blue_high;
HDC hdc;
RECT relrect;
int nVar;
int nStep = 1;
POINT ptOrigin;
relrect.left = vParams[0].nValue();
relrect.top = vParams[1].nValue();
relrect.right = vParams[2].nValue();
relrect.bottom = vParams[3].nValue();
// Convert coords to screen/active window/client
ConvertCoords(m_nCoordPixelMode, ptOrigin);
relrect.left += ptOrigin.x;
relrect.top += ptOrigin.y;
relrect.right += ptOrigin.x;
relrect.bottom += ptOrigin.y;
// Get the search colour and split into components
col = vParams[4].nValue(); // Pixel color to find
if (m_bColorModeBGR == false)
Util_RGBtoBGR(col); // Get RGB color into the standard COLORREF BGR format
red = GetRValue(col);
green = GetGValue(col);
blue = GetBValue(col);
// Variation required?
if (iNumParams >= 6)
{
nVar = vParams[5].nValue();
if ( nVar < 0 )
nVar = 0;
else if ( nVar > 0xff )
nVar = 0xff;
}
else
nVar = 0;
// Step required?
if (iNumParams >= 7 && vParams[6].nValue() > 1)
nStep = vParams[6].nValue();
// Config the variation code
if (nVar == 0) // Exact match
{
red_low = red_high = red;
green_low = green_high = green;
blue_low = blue_high = blue;
}
else
{
// Prevent wrap around
red_low = (nVar > red) ? 0 : red - nVar;
green_low = (nVar > green) ? 0 : green - nVar;
blue_low = (nVar > blue) ? 0 : blue - nVar;
red_high = (nVar > 0xFF - red) ? 0xFF : red + nVar;
green_high = (nVar > 0xFF - green) ? 0xFF : green + nVar;
blue_high = (nVar > 0xFF - blue) ? 0xFF : blue + nVar;
}
hdc = GetDC(NULL);
for( q=relrect.left; q<=relrect.right; q = q + nStep)
{
for( r=relrect.top; r<=relrect.bottom; r = r + nStep)
{
col = GetPixel(hdc, q, r);
red = GetRValue(col);
green = GetGValue(col);
blue = GetBValue(col);
if (red >= red_low && red <= red_high && green >= green_low && green <= green_high
&& blue >= blue_low && blue <= blue_high)
{
// Match!
// Setup vResult as an Array to hold the 2 values we want to return
Variant *pvTemp;
Util_VariantArrayDim(&vResult, 2);
// Convert coords to screen/active window/client
q -= ptOrigin.x;
r -= ptOrigin.y;
pvTemp = Util_VariantArrayGetRef(&vResult, 0); //First element
*pvTemp = q; // X
pvTemp = Util_VariantArrayGetRef(&vResult, 1);
*pvTemp = r; // Y
ReleaseDC(NULL,hdc);
return AUT_OK;
}
}
}
ReleaseDC(NULL,hdc);
SetFuncErrorCode(1); // Not found
return AUT_OK;
} // PixelSearch()