mirror of
git://xwords.git.sourceforge.net/gitroot/xwords/xwords
synced 2025-01-16 15:41:16 +01:00
framework for smarter inval of hint rect during drag
This commit is contained in:
parent
b637c2c6e6
commit
6a05866e80
1 changed files with 33 additions and 5 deletions
|
@ -1865,9 +1865,11 @@ figureHintAtts( BoardCtxt* board, XP_U16 col, XP_U16 row )
|
||||||
if ( row == limits.bottom ) {
|
if ( row == limits.bottom ) {
|
||||||
result |= isFlipped? HINT_BORDER_RIGHT:HINT_BORDER_BOTTOM;
|
result |= isFlipped? HINT_BORDER_RIGHT:HINT_BORDER_BOTTOM;
|
||||||
}
|
}
|
||||||
|
#ifndef XWFEATURE_SEARCHLIMIT_DOCENTERS
|
||||||
if ( result == HINT_BORDER_NONE ) {
|
if ( result == HINT_BORDER_NONE ) {
|
||||||
result = HINT_BORDER_CENTER;
|
result = HINT_BORDER_CENTER;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1966,6 +1968,30 @@ setHintRect( BoardCtxt* board )
|
||||||
board->hasHintRect[board->selPlayer] = XP_TRUE;
|
board->hasHintRect[board->selPlayer] = XP_TRUE;
|
||||||
} /* setHintRect */
|
} /* setHintRect */
|
||||||
|
|
||||||
|
static void
|
||||||
|
invalHintRectDiffs( BoardCtxt* board, HintLimits* newLim,
|
||||||
|
HintLimits* oldLim )
|
||||||
|
{
|
||||||
|
/* These two regions will generally have close to 50% of their borders in
|
||||||
|
common. Try not to inval what needn't be inval'd. But at the moment
|
||||||
|
performance seems good enough without adding the complexity and new
|
||||||
|
bugs... */
|
||||||
|
invalCellRegion( board, newLim->left, newLim->top,
|
||||||
|
newLim->right, newLim->bottom, XP_FALSE );
|
||||||
|
invalCellRegion( board, oldLim->left, oldLim->top,
|
||||||
|
oldLim->right, oldLim->bottom, XP_FALSE );
|
||||||
|
|
||||||
|
/* The challenge in doing a smarter diff is that some squares need to be
|
||||||
|
invalidated even if they're part of the borders of both limits rects,
|
||||||
|
in particular if one is a corner of one and just a side of another.
|
||||||
|
One simple but expensive way of accounting for this would be to call
|
||||||
|
figureHintAtts() on each square in the borders of both rects and
|
||||||
|
invalidate when the hintAttributes aren't the same for both. That
|
||||||
|
misses an opportunity to avoid doing any calculations on those border
|
||||||
|
squares that clearly haven't changed at all.
|
||||||
|
*/
|
||||||
|
} /* invalHintRectDiffs */
|
||||||
|
|
||||||
static XP_Bool
|
static XP_Bool
|
||||||
continueHintRegionDrag( BoardCtxt* board, XP_U16 x, XP_U16 y )
|
continueHintRegionDrag( BoardCtxt* board, XP_U16 x, XP_U16 y )
|
||||||
{
|
{
|
||||||
|
@ -1973,17 +1999,17 @@ continueHintRegionDrag( BoardCtxt* board, XP_U16 x, XP_U16 y )
|
||||||
|
|
||||||
XP_U16 col, row;
|
XP_U16 col, row;
|
||||||
if ( coordToCell( board, x, y, &col, &row ) ) {
|
if ( coordToCell( board, x, y, &col, &row ) ) {
|
||||||
|
XP_U16 selPlayer = board->selPlayer;
|
||||||
|
|
||||||
checkScrollCell( board, board->selPlayer, col, row );
|
checkScrollCell( board, selPlayer, col, row );
|
||||||
|
|
||||||
if ( col != board->hintDragCurCol || row != board->hintDragCurRow ) {
|
if ( col != board->hintDragCurCol || row != board->hintDragCurRow ) {
|
||||||
|
HintLimits oldHL;
|
||||||
|
|
||||||
needsRedraw = XP_TRUE;
|
needsRedraw = XP_TRUE;
|
||||||
|
|
||||||
board->hintDragInProgress = XP_TRUE;
|
board->hintDragInProgress = XP_TRUE;
|
||||||
|
|
||||||
if ( board->hasHintRect[board->selPlayer] ) {
|
|
||||||
clearCurHintRect( board );
|
|
||||||
}
|
|
||||||
/* Now that we've moved, this isn't a timer thing. Clean up any
|
/* Now that we've moved, this isn't a timer thing. Clean up any
|
||||||
artifacts. */
|
artifacts. */
|
||||||
board->penTimerFired = XP_FALSE;
|
board->penTimerFired = XP_FALSE;
|
||||||
|
@ -1993,8 +2019,10 @@ continueHintRegionDrag( BoardCtxt* board, XP_U16 x, XP_U16 y )
|
||||||
|
|
||||||
board->hintDragCurCol = col;
|
board->hintDragCurCol = col;
|
||||||
board->hintDragCurRow = row;
|
board->hintDragCurRow = row;
|
||||||
|
|
||||||
|
oldHL = board->limits[selPlayer];
|
||||||
setHintRect( board );
|
setHintRect( board );
|
||||||
invalCurHintRect( board, board->selPlayer, XP_FALSE );
|
invalHintRectDiffs( board, &board->limits[selPlayer], &oldHL );
|
||||||
XP_LOGF( "now includes with %d,%d", col, row );
|
XP_LOGF( "now includes with %d,%d", col, row );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue