VirtualBox

Changeset 47081 in vbox


Ignore:
Timestamp:
Jul 10, 2013 2:44:12 PM (12 years ago)
Author:
vboxsync
Message:

FE/Qt: Quartz2D frame-buffer: Do not clear part of painted region which will be repainted anyway.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIFrameBufferQuartz2D.cpp

    r47068 r47081  
    248248    if (m_pMachineLogic->visualStateType() == UIVisualStateType_Seamless)
    249249    {
    250         /* Clear the background (make the rect fully transparent): */
    251         CGContextClearRect(ctx, viewRect);
    252 
    253250        /* Determine current visible region: */
    254251        RegionRects *pRgnRcts = ASMAtomicXchgPtrT(&mRegion, NULL, RegionRects*);
     252
     253        /* Prepare cleanup-region: */
     254        QRegion cleanupRegion(aEvent->rect());
     255        /* Filter out visible-rectangles;
     256         * That way we erase *only* invisible-rectangles of paint-region: */
     257        if (pRgnRcts && pRgnRcts->used > 0)
     258        {
     259            /* Slowly, step-by-step filter our visible-rectangles: */
     260            CGRect *pCgVisibleRect = pRgnRcts->rcts;
     261            for (ULONG uVisibleRectIndex = 0; uVisibleRectIndex < pRgnRcts->used; ++uVisibleRectIndex)
     262            {
     263                /* Prepare Qt visible-rectangle, flipping received CG visible-rectangle: */
     264                CGRect cgVisibleRectFlippedToQt = ::darwinFlipCGRect(*pCgVisibleRect, viewRect.size.height);
     265                QRect visibleRect(cgVisibleRectFlippedToQt.origin.x, cgVisibleRectFlippedToQt.origin.y,
     266                                  cgVisibleRectFlippedToQt.size.width, cgVisibleRectFlippedToQt.size.height);
     267                /* Filter that rectangle out: */
     268                cleanupRegion -= visibleRect;
     269                ++pCgVisibleRect;
     270            }
     271        }
     272        /* Erase cleanup-region: */
     273        if (!cleanupRegion.isEmpty())
     274        {
     275            /* Slowly, step-by-step erase cleanup-rectangles: */
     276            foreach (const QRect &cleanupRect, cleanupRegion.rects())
     277            {
     278                CGRect cgCleanupRect = ::darwinToCGRect(cleanupRect);
     279                CGContextClearRect(ctx, ::darwinFlipCGRect(cgCleanupRect, viewRect.size.height));
     280            }
     281        }
     282
     283        /* Prepare painting path/clipping: */
    255284        if (pRgnRcts)
    256285        {
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette