Changeset 491


Ignore:
Timestamp:
May 2, 2011, 12:19:30 AM (10 years ago)
Author:
dmik
Message:

Fixed annoying flicker when switching pages in documents with dark page backgrounds.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Lucide/gui/docViewer.cpp

    r450 r491  
    5656// ASYNCH_RENDER_ENABLE, normally must be defined
    5757#define ASYNCH_RENDER_ENABLE
     58
     59// FILL_PAGE_BACKGROUND: when asynchronous rendering is enabled and active
     60// for the current document, quickly fill the page with PAGEBACK_COLOR before
     61// rendering its contents. This is disabled for now because PAGEBACK_COLOR
     62// is currently hard coded to white and this creates the annoying flicker when
     63// switching pages in documents with dark page backgrounds. A possible solution
     64// would be to introduce a method to the document interface that returns the
     65// background color for the given page and use this color instead.
     66//#define FILL_PAGE_BACKGROUND
    5867
    5968typedef LuDocument_LuRectSequence    *PLuRectSequence;
     
    908917    }
    909918
     919    BOOL sizeChanged = cxClient != SHORT1FROMMP( mp2 ) ||
     920                       cyClient != SHORT2FROMMP( mp2 );
     921
    910922    cxClient = SHORT1FROMMP( mp2 );
    911923    cyClient = SHORT2FROMMP( mp2 );
     
    916928    adjustSize();
    917929
    918     if ( ( hpsBuffer != NULLHANDLE ) && ( hdcBuffer != NULLHANDLE ) ) {
    919         DestroyGraphicsBuffer( hpsBuffer, hdcBuffer );
    920         hpsBuffer = hdcBuffer = NULLHANDLE;
    921     }
    922 
    923     HPS hps = WinGetPS( hwnd );
    924     RECTL rectl = { 0, 0, cxClient, cyClient };
    925     CreateGraphicsBuffer( hab, &rectl, hps, &hpsBuffer, &hdcBuffer );
    926     WinReleasePS( hps );
     930    if ( sizeChanged || hpsBuffer == NULLHANDLE )
     931    {
     932        if ( ( hpsBuffer != NULLHANDLE ) && ( hdcBuffer != NULLHANDLE ) )
     933        {
     934            DestroyGraphicsBuffer( hpsBuffer, hdcBuffer );
     935            hpsBuffer = hdcBuffer = NULLHANDLE;
     936        }
     937
     938        HPS hps = WinGetPS( hwnd );
     939        RECTL rectl = { 0, 0, cxClient, cyClient };
     940        CreateGraphicsBuffer( hab, &rectl, hps, &hpsBuffer, &hdcBuffer );
     941        WinReleasePS( hps );
     942
     943        GpiCreateLogColorTable( hpsBuffer, 0, LCOLF_RGB, 0, 0, NULL );
     944    }
    927945
    928946    sHscrollMax = (SHORT)std::max( 0., ( isContinuous() ? fullwidth : width ) - cxClient );
     
    11091127    RECTL rcl;
    11101128    HPS hps = WinBeginPaint( hwnd, 0L, &rcl );
    1111     GpiCreateLogColorTable( hpsBuffer, 0, LCOLF_RGB, 0, 0, NULL );
     1129
     1130#if FILL_PAGE_BACKGROUND
     1131
    11121132    WinFillRect( hpsBuffer, &rcl, BORDER_COLOR );
    11131133    if ( doc != NULL )
     
    11271147    }
    11281148    BlitGraphicsBuffer( hps, hpsBuffer, &rcl );
     1149
     1150#else
     1151
     1152    GpiCreateLogColorTable( hps, 0, LCOLF_RGB, 0, 0, NULL );
     1153
     1154    if ( doc != NULL )
     1155    {
     1156        if ( width < cxClient ) {
     1157            xPos = ( cxClient - width ) / 2;
     1158        }
     1159        if ( height < cyClient ) {
     1160            yPos = ( cyClient - height ) / 2;
     1161        }
     1162
     1163        rclPage.xLeft   = xPos;
     1164        rclPage.yBottom = yPos;
     1165        rclPage.xRight  = width + xPos;
     1166        rclPage.yTop    = height + yPos;
     1167
     1168        HRGN hrgnBorder = GpiCreateRegion( hps, 1, &rcl );
     1169        HRGN hrgnPage = GpiCreateRegion( hps, 1, &rclPage );
     1170        LONG res = GpiCombineRegion( hps, hrgnBorder, hrgnBorder, hrgnPage,
     1171                                     CRGN_DIFF );
     1172        if ( res != RGN_NULL )
     1173        {
     1174            GpiSetColor( hps, BORDER_COLOR );
     1175            GpiPaintRegion( hps, hrgnBorder );
     1176        }
     1177        GpiDestroyRegion( hps, hrgnPage );
     1178        GpiDestroyRegion( hps, hrgnBorder );
     1179    }
     1180    else
     1181        WinFillRect( hps, &rcl, BORDER_COLOR );
     1182
     1183#endif
     1184
    11291185    WinEndPaint( hps );
    11301186
     
    11861242    RECTL rcl, rclWin, rclDraw = { 0 };
    11871243    HPS hps = WinBeginPaint( hwnd, 0L, &rcl );
    1188     GpiCreateLogColorTable( hpsBuffer, 0, LCOLF_RGB, 0, 0, NULL );
     1244
     1245#if FILL_PAGE_BACKGROUND
     1246
    11891247    WinFillRect( hpsBuffer, &rcl, BORDER_COLOR );
    11901248
     
    12121270
    12131271    BlitGraphicsBuffer( hps, hpsBuffer, &rcl );
     1272
     1273#else
     1274
     1275    GpiCreateLogColorTable( hps, 0, LCOLF_RGB, 0, 0, NULL );
     1276
     1277    if ( doc != NULL )
     1278    {
     1279        HRGN hrgnBorder = GpiCreateRegion( hps, 1, &rcl );
     1280        HRGN hrgnPage = GpiCreateRegion( hps, 0, NULL );
     1281        LONG res = RGN_NULL;
     1282
     1283        long foundpage = -1;
     1284        double pageRest;
     1285        for ( LONG i = rcl.yTop; i >= rcl.yBottom; i-- )
     1286        {
     1287            pageRest = 0;
     1288            long pg = posToPagenum( i, &pageRest );
     1289            if ( ( pg != foundpage ) && ( pg != -1 ) )
     1290            {
     1291                RECTL rclPage = { 0 };
     1292                LuRectangle lr = { 0, 0,
     1293                    isRotated() ? (pagesizes[ pg ].y - 1) : (pagesizes[ pg ].x - 1),
     1294                    isRotated() ? (pagesizes[ pg ].x - 1) : (pagesizes[ pg ].y - 1) };
     1295                docPosToWinPos( pg, &lr, &rclPage );
     1296                GpiSetRegion( hps, hrgnPage, 1, &rclPage );
     1297                res = GpiCombineRegion( hps, hrgnBorder, hrgnBorder, hrgnPage,
     1298                                        CRGN_DIFF );
     1299                foundpage = pg;
     1300                i -= pageRest;
     1301            }
     1302        }
     1303
     1304        if ( res != RGN_NULL )
     1305        {
     1306            GpiSetColor( hps, BORDER_COLOR );
     1307            GpiPaintRegion( hps, hrgnBorder );
     1308        }
     1309        GpiDestroyRegion( hps, hrgnPage );
     1310        GpiDestroyRegion( hps, hrgnBorder );
     1311    }
     1312    else
     1313        WinFillRect( hps, &rcl, BORDER_COLOR );
     1314
     1315#endif
     1316
    12141317    WinEndPaint( hps );
    12151318
     
    12781381    RECTL rcl;
    12791382    HPS hps = WinBeginPaint( hwnd, 0L, &rcl );
    1280     GpiCreateLogColorTable( hpsBuffer, 0, LCOLF_RGB, 0, 0, NULL );
    12811383    WinFillRect( hpsBuffer, &rcl, BORDER_COLOR );
    12821384
     
    15851687    RECTL rcl;
    15861688    HPS hps = WinBeginPaint( hwnd, 0L, &rcl );
    1587     GpiCreateLogColorTable( hpsBuffer, 0, LCOLF_RGB, 0, 0, NULL );
    15881689    WinFillRect( hpsBuffer, &rcl, BORDER_COLOR );
    15891690
Note: See TracChangeset for help on using the changeset viewer.