diff --git a/ChangeLog.txt b/ChangeLog.txt index 8cd44db6aa..75b5f749d3 100644 --- a/ChangeLog.txt +++ b/ChangeLog.txt @@ -10,6 +10,32 @@ * Change, ! Fix, % Optimization, + Addition, - Removal, ; Comment */ +2013-05-10 08:28 UTC+0200 Przemyslaw Czerpak (druzus/at/poczta.onet.pl) + * include/hbgtinfo.ch + + added HB_GTI_REDRAWMAX + It sets maximum number of unchanged neighboring chars in redrawn + line. It may help to optimize screen updates in some GTs. + + * include/hbgtcore.h + * src/rtl/hbgtcore.c + * contrib/hbct/ctwin.c + + respect HB_GTI_REDRAWMAX in default REDRAWDIFF() GT methods. + + * contrib/gtqtc/gtqtc1.cpp + ! added protection against font resizing for degenerated console + window size. + % set HB_GTI_REDRAWMAX to 1 + + * src/rtl/gtwvt/gtwvt.c + ! translate screen base mouse wheel cords to window based ones. + % set HB_GTI_REDRAWMAX to 1 + + * src/rtl/gttrm/gttrm.c + % set HB_GTI_REDRAWMAX to 8 + + * src/rtl/gtwin/gtwin.c + % set HB_GTI_REDRAWMAX to 4 + 2013-05-08 09:57 UTC+0200 Przemyslaw Czerpak (druzus/at/poczta.onet.pl) * contrib/gtqtc/gtqtc1.cpp * minor: removed {} diff --git a/contrib/gtqtc/gtqtc1.cpp b/contrib/gtqtc/gtqtc1.cpp index 1e87761462..86c1174e72 100644 --- a/contrib/gtqtc/gtqtc1.cpp +++ b/contrib/gtqtc/gtqtc1.cpp @@ -1621,6 +1621,7 @@ static void hb_gt_qtc_Init( PHB_GT pGT, HB_FHANDLE hFilenoStdin, HB_FHANDLE hFil /* SUPER GT initialization */ HB_GTSUPER_INIT( pGT, hFilenoStdin, hFilenoStdout, hFilenoStderr ); HB_GTSELF_RESIZE( pGT, pQTC->iRows, pQTC->iCols ); + HB_GTSELF_SETFLAG( pGT, HB_GTI_REDRAWMAX, 1 ); HB_GTSELF_SEMICOLD( pGT ); } @@ -2456,6 +2457,10 @@ void QTConsole::setFontSize( int iFH, int iFW ) if( iWidth != iFW ) { iDec = ( iFW * 100 ) / iWidth; + if( iDec < 1 ) + iDec = 1; + else if( iDec >= 4000 ) + iDec = 3999; iDir = iDec; do { @@ -2470,15 +2475,17 @@ void QTConsole::setFontSize( int iFH, int iFW ) if( iWidth < iFW ) { - if( iDir <= iDec ) - iDec++; - else + if( iDir > iDec ) break; + ++iDec; } else /* iWidth > iFW */ - iDir = iDec--; + { + if( --iDec <= iDir ) + iDir = iDec + 1; + } } - while( iDec >= ( iDir >> 1 ) && iDec <= ( iDir << 1 ) ); + while( iDec > ( iDir >> 1 ) && iDec < ( iDir << 1 ) && iDec < 4000 ); } } diff --git a/contrib/hbct/ctwin.c b/contrib/hbct/ctwin.c index 6654db738d..7bbf57ca75 100644 --- a/contrib/hbct/ctwin.c +++ b/contrib/hbct/ctwin.c @@ -2354,8 +2354,9 @@ static void hb_ctw_gt_RedrawDiff( PHB_GT pGT ) HB_GTSUPER_REDRAWDIFF( pGT ); else if( pGT->fRefresh ) { - int i, l, r; + int i, l, r, s; long lIndex; + HB_U32 uiValue; for( i = 0; i < pGT->iHeight; ++i ) { @@ -2365,27 +2366,24 @@ static void hb_ctw_gt_RedrawDiff( PHB_GT pGT ) for( l = 0; l < pGT->iWidth; ++l, ++lIndex ) { if( pGT->prevBuffer[ lIndex ].uiValue != - hb_ctw_gt_cellValue( pGT, i, l ) ) - break; - } - if( l < pGT->iWidth ) - { - lIndex = ( long ) ( i + 1 ) * pGT->iWidth - 1; - for( r = pGT->iWidth - 1; r > l; --r, --lIndex ) + ( uiValue = hb_ctw_gt_cellValue( pGT, i, l ) ) ) { - if( pGT->prevBuffer[ lIndex ].uiValue != - hb_ctw_gt_cellValue( pGT, i, r ) ) - break; + pGT->prevBuffer[ lIndex ].uiValue = uiValue; + s = r = l; + while( ++l < pGT->iWidth ) + { + ++lIndex; + if( pGT->prevBuffer[ lIndex ].uiValue != + ( uiValue = pGT->screenBuffer[ lIndex ].uiValue ) ) + { + pGT->prevBuffer[ lIndex ].uiValue = uiValue; + r = l; + } + else if( pGT->iRedrawMax != 0 && l - r >= pGT->iRedrawMax ) + break; + } + HB_GTSELF_REDRAW( pGT, i, s, r - s + 1 ); } - HB_GTSELF_REDRAW( pGT, i, l, r - l + 1 ); - lIndex = ( long ) i * pGT->iWidth + l; - do - { - pGT->prevBuffer[ lIndex ].uiValue = - hb_ctw_gt_cellValue( pGT, i, l ); - ++lIndex; - } - while( ++l <= r ); } pGT->pLines[ i ] = HB_FALSE; } diff --git a/include/hbgtcore.h b/include/hbgtcore.h index b1e6f4f46c..1509081d8c 100644 --- a/include/hbgtcore.h +++ b/include/hbgtcore.h @@ -290,8 +290,9 @@ typedef struct _HB_GT_BASE PHB_SCREENCELL screenBuffer; /* window foreground (board) current buffer */ PHB_SCREENCELL prevBuffer; /* window foreground (board) previous buffer */ - HB_BOOL * pLines; /* Touched Window lines */ - HB_BOOL fRefresh; /* Should Window be refreshed */ + HB_BOOL * pLines; /* touched Window lines */ + HB_BOOL fRefresh; /* should Window be refreshed */ + int iRedrawMax; /* maximum number of unchanged neighboring chars in redrawn line */ HB_BOOL fVgaCell; HB_BOOL fIsColor; diff --git a/include/hbgtinfo.ch b/include/hbgtinfo.ch index 0ff7c697f1..d9852d8f8f 100644 --- a/include/hbgtinfo.ch +++ b/include/hbgtinfo.ch @@ -149,6 +149,7 @@ #define HB_GTI_WINHANDLE 69 /* Get console window low level handle */ #define HB_GTI_MOUSEPOS_XY 70 /* Get mouse position in pixels */ #define HB_GTI_DISPIMAGE 71 /* Display image with given name */ +#define HB_GTI_REDRAWMAX 72 /* Maximum number of unchanged neighboring chars in redrawn line */ /* Font weights */ #define HB_GTI_FONTW_THIN 1 diff --git a/src/rtl/gttrm/gttrm.c b/src/rtl/gttrm/gttrm.c index 13699cce5b..e9fef62a20 100644 --- a/src/rtl/gttrm/gttrm.c +++ b/src/rtl/gttrm/gttrm.c @@ -3086,6 +3086,7 @@ static void hb_gt_trm_Init( PHB_GT pGT, HB_FHANDLE hFilenoStdin, HB_FHANDLE hFil HB_GTSUPER_INIT( pGT, hFilenoStdin, hFilenoStdout, hFilenoStderr ); HB_GTSELF_RESIZE( pGT, iRows, iCols ); HB_GTSELF_SETFLAG( pGT, HB_GTI_COMPATBUFFER, HB_FALSE ); + HB_GTSELF_SETFLAG( pGT, HB_GTI_REDRAWMAX, 8 ); HB_GTSELF_SETFLAG( pGT, HB_GTI_STDOUTCON, pTerm->fStdoutTTY ); HB_GTSELF_SETFLAG( pGT, HB_GTI_STDERRCON, pTerm->fStderrTTY && pTerm->fOutTTY ); pTerm->Init( pTerm ); diff --git a/src/rtl/gtwin/gtwin.c b/src/rtl/gtwin/gtwin.c index bdac204ba1..7c2a4bcc66 100644 --- a/src/rtl/gtwin/gtwin.c +++ b/src/rtl/gtwin/gtwin.c @@ -971,6 +971,8 @@ static void hb_gt_win_Init( PHB_GT pGT, HB_FHANDLE hFilenoStdin, HB_FHANDLE hFil s_bClosable = s_bOldClosable = hb_gt_win_SetCloseButton( HB_FALSE, HB_FALSE ); s_bResetColors = HB_FALSE; + HB_GTSELF_SETFLAG( pGT, HB_GTI_REDRAWMAX, 4 ); + if( hb_fsIsDevice( hFilenoStdout ) ) HB_GTSELF_SETFLAG( pGT, HB_GTI_STDOUTCON, HB_TRUE ); if( hb_fsIsDevice( hFilenoStderr ) ) diff --git a/src/rtl/gtwvt/gtwvt.c b/src/rtl/gtwvt/gtwvt.c index a34837962d..5e21661f29 100644 --- a/src/rtl/gtwvt/gtwvt.c +++ b/src/rtl/gtwvt/gtwvt.c @@ -2176,6 +2176,9 @@ static void hb_gt_wvt_MouseEvent( PHB_GTWVT pWVT, UINT message, WPARAM wParam, L xy.x = LOWORD( lParam ); xy.y = HIWORD( lParam ); + if( message == WM_MOUSEWHEEL ) + ScreenToClient( pWVT->hWnd, &xy ); + colrow = hb_gt_wvt_GetColRowFromXY( pWVT, xy.x, xy.y ); if( hb_gt_wvt_SetMousePos( pWVT, colrow.y, colrow.x ) ) hb_gt_wvt_AddCharToInputQueue( pWVT, @@ -3184,6 +3187,7 @@ static void hb_gt_wvt_Init( PHB_GT pGT, HB_FHANDLE hFilenoStdin, HB_FHANDLE hFil /* SUPER GT initialization */ HB_GTSUPER_INIT( pGT, hFilenoStdin, hFilenoStdout, hFilenoStderr ); HB_GTSELF_RESIZE( pGT, pWVT->ROWS, pWVT->COLS ); + HB_GTSELF_SETFLAG( pGT, HB_GTI_REDRAWMAX, 1 ); HB_GTSELF_SEMICOLD( pGT ); /* hb_gt_wvt_CreateConsoleWindow( pWVT ); */ diff --git a/src/rtl/hbgtcore.c b/src/rtl/hbgtcore.c index 28cf6fd1b6..84e2f71551 100644 --- a/src/rtl/hbgtcore.c +++ b/src/rtl/hbgtcore.c @@ -1808,6 +1808,12 @@ static HB_BOOL hb_gt_def_Info( PHB_GT pGT, int iType, PHB_GT_INFO pInfo ) pGT->fVgaCell = hb_itemGetL( pInfo->pNewVal ); break; + case HB_GTI_REDRAWMAX: + pInfo->pResult = hb_itemPutNI( pInfo->pResult, pGT->iRedrawMax ); + if( hb_itemType( pInfo->pNewVal ) & HB_IT_NUMERIC ) + pGT->iRedrawMax = hb_itemGetNI( pInfo->pNewVal ); + break; + case HB_GTI_BOXCP: pInfo->pResult = hb_itemPutC( pInfo->pResult, pGT->cdpBox ? pGT->cdpBox->id : NULL ); @@ -2329,6 +2335,11 @@ static int hb_gt_def_SetFlag( PHB_GT pGT, int iType, int iNewValue ) iPrevValue = pGT->fStdErrCon; pGT->fStdErrCon = iNewValue != 0; break; + + case HB_GTI_REDRAWMAX: + iPrevValue = pGT->iRedrawMax; + pGT->iRedrawMax = iNewValue; + break; } return iPrevValue; @@ -2515,7 +2526,7 @@ static void hb_gt_def_RedrawDiff( PHB_GT pGT ) { if( pGT->fRefresh ) { - int i, l, r; + int i, l, r, s; long lIndex; for( i = 0; i < pGT->iHeight; ++i ) @@ -2527,26 +2538,25 @@ static void hb_gt_def_RedrawDiff( PHB_GT pGT ) { if( pGT->prevBuffer[ lIndex ].uiValue != pGT->screenBuffer[ lIndex ].uiValue ) - break; - } - if( l < pGT->iWidth ) - { - lIndex = ( long ) ( i + 1 ) * pGT->iWidth - 1; - for( r = pGT->iWidth - 1; r > l; --r, --lIndex ) - { - if( pGT->prevBuffer[ lIndex ].uiValue != - pGT->screenBuffer[ lIndex ].uiValue ) - break; - } - HB_GTSELF_REDRAW( pGT, i, l, r - l + 1 ); - lIndex = ( long ) i * pGT->iWidth + l; - do { pGT->prevBuffer[ lIndex ].uiValue = pGT->screenBuffer[ lIndex ].uiValue; - ++lIndex; + s = r = l; + while( ++l < pGT->iWidth ) + { + ++lIndex; + if( pGT->prevBuffer[ lIndex ].uiValue != + pGT->screenBuffer[ lIndex ].uiValue ) + { + pGT->prevBuffer[ lIndex ].uiValue = + pGT->screenBuffer[ lIndex ].uiValue; + r = l; + } + else if( pGT->iRedrawMax != 0 && l - r >= pGT->iRedrawMax ) + break; + } + HB_GTSELF_REDRAW( pGT, i, s, r - s + 1 ); } - while( ++l <= r ); } pGT->pLines[ i ] = HB_FALSE; }