- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
bool findImageToleranceIn(CTSInfo *info, bitmap *imageToFind, int32_t *x, int32_t *y, int32_t x1, int32_t y1, int32_t x2, int32_t y2, uint16_t tolerance)
{
int I, J, XX, YY;
info->tol = tolerance;
int dX = (x2 - x1) - (imageToFind->width - 1);
int dY = (y2 - y1) - (imageToFind->height - 1);
for (I = 0; I < dY; ++I)
{
for (J = 0; J < dX; ++J)
{
for (YY = 0; YY < imageToFind->height; ++YY)
{
for (XX = 0; XX < imageToFind->width; ++XX)
{
rgb32* pixel = &imageToFind->pixels[YY * imageToFind->width + XX];
rgb32* targetPixel = &info->targetImage->pixels[(YY + I) * info->targetImage->width + (XX + J)];
if (pixel->a != 0)
{
if (!(*info->ctsFuncPtr)(info, pixel, targetPixel))
{
goto Skip;
}
}
}
}
*x = J + x1;
*y = I + y1;
return true;
Skip:
continue;
}
}
*x = -1;
*y = -1;
return false;
}
orion 01.12.2014 23:11 # 0
Cynicrus 01.12.2014 23:17 # 0
Dr_Sigmund 02.12.2014 01:32 # +2
Если же ctsFuncPtr возвращает false, то работа двух внутренних циклов прерывается, и мы переходим (при помощи goto) к следующему шагу внешних циклов. Goto здесь используется вместо кошерного break, потому что надо выйти сразу из двух внутренних циклов, break выходит только из самого внутреннего.
Qwertiy 02.12.2014 18:41 # −2