Esempio n. 1
0
BOOL BfxPixelOpPseudo::FloodSearch(INT32 x, INT32 y, INT32 MinimumArea,
				  INT32 FloodArray[BFX_PSEUDOFLOODSIZE][2], INT32 * FloodTop)
{
	if (IsInRegion(x,y))
	{
		WriteOriginalPixel(x, y, Colour^1); // make it out of the region
		FloodArray[*FloodTop][0]=x;
		FloodArray[(*FloodTop)++][1]=y; // save coordinate so we can restore value later
		if (*FloodTop>=MinimumArea) return TRUE;
		if (!FloodSearch(x-1, y-1, MinimumArea, FloodArray, FloodTop)) return FALSE;
		if (*FloodTop>=MinimumArea) return TRUE;
		if (!FloodSearch(x  , y-1, MinimumArea, FloodArray, FloodTop)) return FALSE;
		if (*FloodTop>=MinimumArea) return TRUE;
		if (!FloodSearch(x+1, y-1, MinimumArea, FloodArray, FloodTop)) return FALSE;
		if (*FloodTop>=MinimumArea) return TRUE;
		if (!FloodSearch(x-1, y  , MinimumArea, FloodArray, FloodTop)) return FALSE;
		if (*FloodTop>=MinimumArea) return TRUE;
		if (!FloodSearch(x+1, y  , MinimumArea, FloodArray, FloodTop)) return FALSE;
		if (*FloodTop>=MinimumArea) return TRUE;
		if (!FloodSearch(x-1, y+1, MinimumArea, FloodArray, FloodTop)) return FALSE;
		if (*FloodTop>=MinimumArea) return TRUE;
		if (!FloodSearch(x  , y+1, MinimumArea, FloodArray, FloodTop)) return FALSE;
		if (*FloodTop>=MinimumArea) return TRUE;
		if (!FloodSearch(x+1, y+1, MinimumArea, FloodArray, FloodTop)) return FALSE;
	}
	return TRUE;
}
GUIKeyboard::Key* GUIKeyboard::HitTestKey(int x, int y)
{
	if (!IsInRegion(x, y))
		return NULL;

	int rely = y - mRenderY;
	int relx = x - mRenderX;

	Layout& lay = layouts[currentLayout - 1];

	// Find the correct row
	int row;
	for (row = 0; row < MAX_KEYBOARD_ROWS; ++row) {
		if (lay.row_end_y[row] > rely)
			break;
	}
	if (row == MAX_KEYBOARD_ROWS)
		return NULL;

	// Find the correct key (column)
	int col;
	int x1 = 0;
	for (col = 0; col < MAX_KEYBOARD_KEYS; ++col) {
		Key& key = lay.keys[row][col];
		if (x1 <= relx && relx < key.end_x && key.key != 0) {
			// This is the key that was pressed!
			return &key;
		}
		x1 = key.end_x;
	}
	return NULL;
}
Esempio n. 3
0
BOOL BfxPixelOpPseudo::CheckMinimumArea(INT32 MinimumArea, INT32 InitialX, INT32 InitialY, BOOL * FoundRegion)
{
	// This is a bodge currently
	*FoundRegion = FALSE;
	if (IsInRegion(InitialX, InitialY))
	{
		if (MinimumArea>BFX_PSEUDOFLOODSIZE-1) MinimumArea=BFX_PSEUDOFLOODSIZE-1;
		INT32 FloodArray[BFX_PSEUDOFLOODSIZE][2];
		INT32 FloodTop=0;

		if (!FloodSearch(InitialX, InitialY, MinimumArea, FloodArray, &FloodTop)) return FALSE;
		*FoundRegion = (FloodTop >= MinimumArea);

		for (INT32 n=0; n<FloodTop; n++) WriteOriginalPixel(FloodArray[n][0], FloodArray[n][1], Colour);
	}

	return TRUE;
}
Esempio n. 4
0
BOOL BfxPixelOp32::FloodSearch(INT32 x, INT32 y, INT32 MinimumArea)
{
	if (IsCached(x,y)  // We've been here before
		|| GetCacheMarks()>=MinimumArea) // We've got enough
		return TRUE;
	if (IsInRegion(x,y))
	{
		if (!(	FloodSearch(x-1, y-1, MinimumArea) &&
				FloodSearch(x  , y-1, MinimumArea) &&
				FloodSearch(x+1, y-1, MinimumArea) &&
				FloodSearch(x-1, y  , MinimumArea) &&
				FloodSearch(x+1, y  , MinimumArea) &&
				FloodSearch(x-1, y+1, MinimumArea) &&
				FloodSearch(x  , y+1, MinimumArea) &&
				FloodSearch(x+1, y+1, MinimumArea) &&
				TRUE)) return TRUE;
	}
	return TRUE;
}