[Libreoffice-commits] core.git: 4 commits - include/vcl vcl/inc vcl/source

Jan Holesovsky kendy at collabora.com
Fri May 22 06:09:13 PDT 2015


 include/vcl/outdev.hxx        |    1 
 vcl/inc/brdwin.hxx            |    8 +-
 vcl/source/window/brdwin.cxx  |  145 ++++++++++++++++++++----------------------
 vcl/source/window/paint.cxx   |   50 ++++++++++++--
 vcl/source/window/toolbox.cxx |    3 
 5 files changed, 118 insertions(+), 89 deletions(-)

New commits:
commit c81f202788124631fb3a321c3f47a6c44692a26e
Author: Jan Holesovsky <kendy at collabora.com>
Date:   Fri May 22 13:24:07 2015 +0200

    rendercontext: Make borderwindow painting via rendercontext.
    
    Change-Id: I51bce6c3af7484d1e5dd42190f14511ba88e1679

diff --git a/vcl/inc/brdwin.hxx b/vcl/inc/brdwin.hxx
index e118024..de911ff 100644
--- a/vcl/inc/brdwin.hxx
+++ b/vcl/inc/brdwin.hxx
@@ -228,7 +228,7 @@ public:
     virtual void            GetBorder( sal_Int32& rLeftBorder, sal_Int32& rTopBorder,
                                        sal_Int32& rRightBorder, sal_Int32& rBottomBorder ) const = 0;
     virtual long            CalcTitleWidth() const = 0;
-    virtual void            DrawWindow( sal_uInt16 nDrawFlags, OutputDevice* pOutDev = NULL, const Point* pOffset = NULL ) = 0;
+    virtual void            DrawWindow(vcl::RenderContext& rRenderContext, sal_uInt16 nDrawFlags, const Point* pOffset = NULL) = 0;
     virtual Rectangle       GetMenuRect() const;
 
     static void             ImplInitTitle( ImplBorderFrameData* pData );
@@ -249,7 +249,7 @@ public:
     virtual void            GetBorder( sal_Int32& rLeftBorder, sal_Int32& rTopBorder,
                                        sal_Int32& rRightBorder, sal_Int32& rBottomBorder ) const SAL_OVERRIDE;
     virtual long            CalcTitleWidth() const SAL_OVERRIDE;
-    virtual void            DrawWindow( sal_uInt16 nDrawFlags, OutputDevice* pOutDev, const Point* pOffset ) SAL_OVERRIDE;
+    virtual void            DrawWindow(vcl::RenderContext& rRenderContext, sal_uInt16 nDrawFlags, const Point* pOffset) SAL_OVERRIDE;
 };
 
 class ImplSmallBorderWindowView : public ImplBorderWindowView
@@ -271,7 +271,7 @@ public:
     virtual void            GetBorder( sal_Int32& rLeftBorder, sal_Int32& rTopBorder,
                                        sal_Int32& rRightBorder, sal_Int32& rBottomBorder ) const SAL_OVERRIDE;
     virtual long            CalcTitleWidth() const SAL_OVERRIDE;
-    virtual void            DrawWindow( sal_uInt16 nDrawFlags, OutputDevice* pOutDev, const Point* pOffset ) SAL_OVERRIDE;
+    virtual void            DrawWindow(vcl::RenderContext& rRenderContext, sal_uInt16 nDrawFlags, const Point* pOffset) SAL_OVERRIDE;
 };
 
 class ImplStdBorderWindowView : public ImplBorderWindowView
@@ -294,7 +294,7 @@ public:
     virtual void            GetBorder( sal_Int32& rLeftBorder, sal_Int32& rTopBorder,
                                        sal_Int32& rRightBorder, sal_Int32& rBottomBorder ) const SAL_OVERRIDE;
     virtual long            CalcTitleWidth() const SAL_OVERRIDE;
-    virtual void            DrawWindow( sal_uInt16 nDrawFlags, OutputDevice* pOutDev, const Point* pOffset ) SAL_OVERRIDE;
+    virtual void            DrawWindow(vcl::RenderContext& rRenderContext, sal_uInt16 nDrawFlags, const Point* pOffset) SAL_OVERRIDE;
 };
 
 #endif // INCLUDED_VCL_INC_BRDWIN_HXX
diff --git a/vcl/source/window/brdwin.cxx b/vcl/source/window/brdwin.cxx
index 406dbe2..a282c5a 100644
--- a/vcl/source/window/brdwin.cxx
+++ b/vcl/source/window/brdwin.cxx
@@ -344,22 +344,22 @@ bool ImplBorderWindowView::ImplMouseButtonDown( ImplBorderFrameData* pData, cons
             if ( pData->mnHitTest & BORDERWINDOW_HITTEST_CLOSE )
             {
                 pData->mnCloseState |= DrawButtonFlags::Pressed;
-                DrawWindow( BORDERWINDOW_DRAW_CLOSE );
+                pBorderWindow->InvalidateBorder();
             }
             else if ( pData->mnHitTest & BORDERWINDOW_HITTEST_ROLL )
             {
                 pData->mnRollState |= DrawButtonFlags::Pressed;
-                DrawWindow( BORDERWINDOW_DRAW_ROLL );
+                pBorderWindow->InvalidateBorder();
             }
             else if ( pData->mnHitTest & BORDERWINDOW_HITTEST_DOCK )
             {
                 pData->mnDockState |= DrawButtonFlags::Pressed;
-                DrawWindow( BORDERWINDOW_DRAW_DOCK );
+                pBorderWindow->InvalidateBorder();
             }
             else if ( pData->mnHitTest & BORDERWINDOW_HITTEST_MENU )
             {
                 pData->mnMenuState |= DrawButtonFlags::Pressed;
-                DrawWindow( BORDERWINDOW_DRAW_MENU );
+                pBorderWindow->InvalidateBorder();
 
                 // call handler already on mouse down
                 if ( pBorderWindow->ImplGetClientWindow()->IsSystemWindow() )
@@ -371,17 +371,17 @@ bool ImplBorderWindowView::ImplMouseButtonDown( ImplBorderFrameData* pData, cons
             else if ( pData->mnHitTest & BORDERWINDOW_HITTEST_HIDE )
             {
                 pData->mnHideState |= DrawButtonFlags::Pressed;
-                DrawWindow( BORDERWINDOW_DRAW_HIDE );
+                pBorderWindow->InvalidateBorder();
             }
             else if ( pData->mnHitTest & BORDERWINDOW_HITTEST_HELP )
             {
                 pData->mnHelpState |= DrawButtonFlags::Pressed;
-                DrawWindow( BORDERWINDOW_DRAW_HELP );
+                pBorderWindow->InvalidateBorder();
             }
             else if ( pData->mnHitTest & BORDERWINDOW_HITTEST_PIN )
             {
                 pData->mnPinState |= DrawButtonFlags::Pressed;
-                DrawWindow( BORDERWINDOW_DRAW_PIN );
+                pBorderWindow->InvalidateBorder();
             }
             else
             {
@@ -459,7 +459,7 @@ bool ImplBorderWindowView::ImplTracking( ImplBorderFrameData* pData, const Track
             if ( pData->mnCloseState & DrawButtonFlags::Pressed )
             {
                 pData->mnCloseState &= ~DrawButtonFlags::Pressed;
-                DrawWindow( BORDERWINDOW_DRAW_CLOSE );
+                pBorderWindow->InvalidateBorder();
 
                 // do not call a Click-Handler when aborting
                 if ( !rTEvt.IsTrackingCanceled() )
@@ -481,7 +481,7 @@ bool ImplBorderWindowView::ImplTracking( ImplBorderFrameData* pData, const Track
             if ( pData->mnRollState & DrawButtonFlags::Pressed )
             {
                 pData->mnRollState &= ~DrawButtonFlags::Pressed;
-                DrawWindow( BORDERWINDOW_DRAW_ROLL );
+                pBorderWindow->InvalidateBorder();
 
                 // do not call a Click-Handler when aborting
                 if ( !rTEvt.IsTrackingCanceled() )
@@ -503,7 +503,7 @@ bool ImplBorderWindowView::ImplTracking( ImplBorderFrameData* pData, const Track
             if ( pData->mnDockState & DrawButtonFlags::Pressed )
             {
                 pData->mnDockState &= ~DrawButtonFlags::Pressed;
-                DrawWindow( BORDERWINDOW_DRAW_DOCK );
+                pBorderWindow->InvalidateBorder();
 
                 // do not call a Click-Handler when aborting
                 if ( !rTEvt.IsTrackingCanceled() )
@@ -521,7 +521,7 @@ bool ImplBorderWindowView::ImplTracking( ImplBorderFrameData* pData, const Track
             if ( pData->mnMenuState & DrawButtonFlags::Pressed )
             {
                 pData->mnMenuState &= ~DrawButtonFlags::Pressed;
-                DrawWindow( BORDERWINDOW_DRAW_MENU );
+                pBorderWindow->InvalidateBorder();
 
                 // handler already called on mouse down
             }
@@ -531,7 +531,7 @@ bool ImplBorderWindowView::ImplTracking( ImplBorderFrameData* pData, const Track
             if ( pData->mnHideState & DrawButtonFlags::Pressed )
             {
                 pData->mnHideState &= ~DrawButtonFlags::Pressed;
-                DrawWindow( BORDERWINDOW_DRAW_HIDE );
+                pBorderWindow->InvalidateBorder();
 
                 // do not call a Click-Handler when aborting
                 if ( !rTEvt.IsTrackingCanceled() )
@@ -549,7 +549,7 @@ bool ImplBorderWindowView::ImplTracking( ImplBorderFrameData* pData, const Track
             if ( pData->mnHelpState & DrawButtonFlags::Pressed )
             {
                 pData->mnHelpState &= ~DrawButtonFlags::Pressed;
-                DrawWindow( BORDERWINDOW_DRAW_HELP );
+                pBorderWindow->InvalidateBorder();
 
                 // do not call a Click-Handler when aborting
                 if ( !rTEvt.IsTrackingCanceled() )
@@ -562,7 +562,7 @@ bool ImplBorderWindowView::ImplTracking( ImplBorderFrameData* pData, const Track
             if ( pData->mnPinState & DrawButtonFlags::Pressed )
             {
                 pData->mnPinState &= ~DrawButtonFlags::Pressed;
-                DrawWindow( BORDERWINDOW_DRAW_PIN );
+                pBorderWindow->InvalidateBorder();
 
                 // do not call a Click-Handler when aborting
                 if ( !rTEvt.IsTrackingCanceled() )
@@ -612,7 +612,7 @@ bool ImplBorderWindowView::ImplTracking( ImplBorderFrameData* pData, const Track
                 if ( !(pData->mnCloseState & DrawButtonFlags::Pressed) )
                 {
                     pData->mnCloseState |= DrawButtonFlags::Pressed;
-                    DrawWindow( BORDERWINDOW_DRAW_CLOSE );
+                    pBorderWindow->InvalidateBorder();
                 }
             }
             else
@@ -620,7 +620,7 @@ bool ImplBorderWindowView::ImplTracking( ImplBorderFrameData* pData, const Track
                 if ( pData->mnCloseState & DrawButtonFlags::Pressed )
                 {
                     pData->mnCloseState &= ~DrawButtonFlags::Pressed;
-                    DrawWindow( BORDERWINDOW_DRAW_CLOSE );
+                    pBorderWindow->InvalidateBorder();
                 }
             }
         }
@@ -631,7 +631,7 @@ bool ImplBorderWindowView::ImplTracking( ImplBorderFrameData* pData, const Track
                 if ( !(pData->mnRollState & DrawButtonFlags::Pressed) )
                 {
                     pData->mnRollState |= DrawButtonFlags::Pressed;
-                    DrawWindow( BORDERWINDOW_DRAW_ROLL );
+                    pBorderWindow->InvalidateBorder();
                 }
             }
             else
@@ -639,7 +639,7 @@ bool ImplBorderWindowView::ImplTracking( ImplBorderFrameData* pData, const Track
                 if ( pData->mnRollState & DrawButtonFlags::Pressed )
                 {
                     pData->mnRollState &= ~DrawButtonFlags::Pressed;
-                    DrawWindow( BORDERWINDOW_DRAW_ROLL );
+                    pBorderWindow->InvalidateBorder();
                 }
             }
         }
@@ -650,7 +650,7 @@ bool ImplBorderWindowView::ImplTracking( ImplBorderFrameData* pData, const Track
                 if ( !(pData->mnDockState & DrawButtonFlags::Pressed) )
                 {
                     pData->mnDockState |= DrawButtonFlags::Pressed;
-                    DrawWindow( BORDERWINDOW_DRAW_DOCK );
+                    pBorderWindow->InvalidateBorder();
                 }
             }
             else
@@ -658,7 +658,7 @@ bool ImplBorderWindowView::ImplTracking( ImplBorderFrameData* pData, const Track
                 if ( pData->mnDockState & DrawButtonFlags::Pressed )
                 {
                     pData->mnDockState &= ~DrawButtonFlags::Pressed;
-                    DrawWindow( BORDERWINDOW_DRAW_DOCK );
+                    pBorderWindow->InvalidateBorder();
                 }
             }
         }
@@ -669,8 +669,7 @@ bool ImplBorderWindowView::ImplTracking( ImplBorderFrameData* pData, const Track
                 if ( !(pData->mnMenuState & DrawButtonFlags::Pressed) )
                 {
                     pData->mnMenuState |= DrawButtonFlags::Pressed;
-                    DrawWindow( BORDERWINDOW_DRAW_MENU );
-
+                    pBorderWindow->InvalidateBorder();
                 }
             }
             else
@@ -678,7 +677,7 @@ bool ImplBorderWindowView::ImplTracking( ImplBorderFrameData* pData, const Track
                 if ( pData->mnMenuState & DrawButtonFlags::Pressed )
                 {
                     pData->mnMenuState &= ~DrawButtonFlags::Pressed;
-                    DrawWindow( BORDERWINDOW_DRAW_MENU );
+                    pBorderWindow->InvalidateBorder();
                 }
             }
         }
@@ -689,7 +688,7 @@ bool ImplBorderWindowView::ImplTracking( ImplBorderFrameData* pData, const Track
                 if ( !(pData->mnHideState & DrawButtonFlags::Pressed) )
                 {
                     pData->mnHideState |= DrawButtonFlags::Pressed;
-                    DrawWindow( BORDERWINDOW_DRAW_HIDE );
+                    pBorderWindow->InvalidateBorder();
                 }
             }
             else
@@ -697,7 +696,7 @@ bool ImplBorderWindowView::ImplTracking( ImplBorderFrameData* pData, const Track
                 if ( pData->mnHideState & DrawButtonFlags::Pressed )
                 {
                     pData->mnHideState &= ~DrawButtonFlags::Pressed;
-                    DrawWindow( BORDERWINDOW_DRAW_HIDE );
+                    pBorderWindow->InvalidateBorder();
                 }
             }
         }
@@ -708,7 +707,7 @@ bool ImplBorderWindowView::ImplTracking( ImplBorderFrameData* pData, const Track
                 if ( !(pData->mnHelpState & DrawButtonFlags::Pressed) )
                 {
                     pData->mnHelpState |= DrawButtonFlags::Pressed;
-                    DrawWindow( BORDERWINDOW_DRAW_HELP );
+                    pBorderWindow->InvalidateBorder();
                 }
             }
             else
@@ -716,7 +715,7 @@ bool ImplBorderWindowView::ImplTracking( ImplBorderFrameData* pData, const Track
                 if ( pData->mnHelpState & DrawButtonFlags::Pressed )
                 {
                     pData->mnHelpState &= ~DrawButtonFlags::Pressed;
-                    DrawWindow( BORDERWINDOW_DRAW_HELP );
+                    pBorderWindow->InvalidateBorder();
                 }
             }
         }
@@ -727,7 +726,7 @@ bool ImplBorderWindowView::ImplTracking( ImplBorderFrameData* pData, const Track
                 if ( !(pData->mnPinState & DrawButtonFlags::Pressed) )
                 {
                     pData->mnPinState |= DrawButtonFlags::Pressed;
-                    DrawWindow( BORDERWINDOW_DRAW_PIN );
+                    pBorderWindow->InvalidateBorder();
                 }
             }
             else
@@ -735,7 +734,7 @@ bool ImplBorderWindowView::ImplTracking( ImplBorderFrameData* pData, const Track
                 if ( pData->mnPinState & DrawButtonFlags::Pressed )
                 {
                     pData->mnPinState &= ~DrawButtonFlags::Pressed;
-                    DrawWindow( BORDERWINDOW_DRAW_PIN );
+                    pBorderWindow->InvalidateBorder();
                 }
             }
         }
@@ -987,7 +986,7 @@ long ImplNoBorderWindowView::CalcTitleWidth() const
     return 0;
 }
 
-void ImplNoBorderWindowView::DrawWindow( sal_uInt16, OutputDevice*, const Point* )
+void ImplNoBorderWindowView::DrawWindow(vcl::RenderContext&, sal_uInt16, const Point*)
 {
 }
 
@@ -1182,7 +1181,7 @@ long ImplSmallBorderWindowView::CalcTitleWidth() const
     return 0;
 }
 
-void ImplSmallBorderWindowView::DrawWindow(sal_uInt16 nDrawFlags, OutputDevice*, const Point* )
+void ImplSmallBorderWindowView::DrawWindow(vcl::RenderContext& rRenderContext, sal_uInt16 nDrawFlags, const Point*)
 {
     WindowBorderStyle nBorderStyle = mpBorderWindow->GetBorderStyle();
     if (nBorderStyle & WindowBorderStyle::NOBORDER)
@@ -1191,10 +1190,12 @@ void ImplSmallBorderWindowView::DrawWindow(sal_uInt16 nDrawFlags, OutputDevice*,
     bool bNativeOK = false;
     // for native widget drawing we must find out what
     // control this border belongs to
+    // FIXME RenderContext - ultimately we'll need to get rid of the
+    // vcl::Window here to get native widgets here
     vcl::Window* pWin = NULL;
     vcl::Window* pCtrl = NULL;
-    if (mpOutDev->GetOutDevType() == OUTDEV_WINDOW)
-        pWin = static_cast<vcl::Window*>(mpOutDev.get());
+    if (rRenderContext.GetOutDevType() == OUTDEV_WINDOW)
+        pWin = static_cast<vcl::Window*>(&rRenderContext);
 
     ControlType aCtrlType = 0;
     ControlPart aCtrlPart = PART_ENTIRE_CONTROL;
@@ -1296,14 +1297,14 @@ void ImplSmallBorderWindowView::DrawWindow(sal_uInt16 nDrawFlags, OutputDevice*,
         Rectangle aBoundingRgn(aPoint, Size(mnWidth, mnHeight));
         Rectangle aContentRgn(aCtrlRegion);
         if (!ImplGetSVData()->maNWFData.mbCanDrawWidgetAnySize &&
-            pWin->GetNativeControlRegion(aCtrlType, aCtrlPart, aCtrlRegion,
+            rRenderContext.GetNativeControlRegion(aCtrlType, aCtrlPart, aCtrlRegion,
                                          nState, aControlValue, OUString(),
                                          aBoundingRgn, aContentRgn))
         {
             aCtrlRegion=aContentRgn;
         }
 
-        bNativeOK = pWin->DrawNativeControl(aCtrlType, aCtrlPart, aCtrlRegion, nState, aControlValue, OUString());
+        bNativeOK = rRenderContext.DrawNativeControl(aCtrlType, aCtrlPart, aCtrlRegion, nState, aControlValue, OUString());
 
         // if the native theme draws the spinbuttons in one call, make sure the proper settings
         // are passed, this might force a redraw though.... (TODO: improve)
@@ -1337,7 +1338,7 @@ void ImplSmallBorderWindowView::DrawWindow(sal_uInt16 nDrawFlags, OutputDevice*,
         if (pWin && pWin == pWin->ImplGetFrameWindow())
             nFlags |= DrawFrameFlags::WindowBorder;
 
-        DecorationView aDecoView(mpOutDev);
+        DecorationView aDecoView(&rRenderContext);
         Point aTmpPoint;
         Rectangle aInRect(aTmpPoint, Size(mnWidth, mnHeight));
         aDecoView.DrawFrame(aInRect, nStyle, nFlags);
@@ -1555,15 +1556,14 @@ long ImplStdBorderWindowView::CalcTitleWidth() const
     return ImplCalcTitleWidth( &maFrameData );
 }
 
-void ImplStdBorderWindowView::DrawWindow( sal_uInt16 nDrawFlags, OutputDevice* pOutDev, const Point* pOffset )
+void ImplStdBorderWindowView::DrawWindow(vcl::RenderContext& rRenderContext, sal_uInt16 nDrawFlags, const Point* pOffset)
 {
     ImplBorderFrameData* pData = &maFrameData;
-    OutputDevice* pDev = pOutDev ? pOutDev : pData->mpOutDev.get();
     ImplBorderWindow* pBorderWindow = pData->mpBorderWindow;
     Point aTmpPoint = pOffset ? Point(*pOffset) : Point();
     Rectangle aInRect( aTmpPoint, Size( pData->mnWidth, pData->mnHeight ) );
-    const StyleSettings& rStyleSettings = pData->mpOutDev->GetSettings().GetStyleSettings();
-    DecorationView aDecoView(pDev);
+    const StyleSettings& rStyleSettings = rRenderContext.GetSettings().GetStyleSettings();
+    DecorationView aDecoView(&rRenderContext);
     Color aFaceColor(rStyleSettings.GetFaceColor());
     Color aFrameColor(aFaceColor);
 
@@ -1572,7 +1572,7 @@ void ImplStdBorderWindowView::DrawWindow( sal_uInt16 nDrawFlags, OutputDevice* p
     // Draw Frame
     if (nDrawFlags & BORDERWINDOW_DRAW_FRAME)
     {
-        vcl::Region oldClipRgn(pDev->GetClipRegion());
+        vcl::Region oldClipRgn(rRenderContext.GetClipRegion());
 
         // for popups, don't draw part of the frame
         if (pData->mnTitleType == BORDERWINDOW_TITLE_POPUP)
@@ -1586,15 +1586,15 @@ void ImplStdBorderWindowView::DrawWindow( sal_uInt16 nDrawFlags, OutputDevice* p
                 {
                     aItemClipRect.SetPos(pData->mpBorderWindow->AbsoluteScreenToOutputPixel(aItemClipRect.TopLeft()));
                     aClipRgn.Exclude(aItemClipRect);
-                    pDev->SetClipRegion(aClipRgn);
+                    rRenderContext.SetClipRegion(aClipRgn);
                 }
             }
         }
 
         // single line frame
-        pDev->SetLineColor(aFrameColor);
-        pDev->SetFillColor();
-        pDev->DrawRect(aInRect);
+        rRenderContext.SetLineColor(aFrameColor);
+        rRenderContext.SetFillColor();
+        rRenderContext.DrawRect(aInRect);
         ++aInRect.Left();
         --aInRect.Right();
         ++aInRect.Top();
@@ -1602,24 +1602,24 @@ void ImplStdBorderWindowView::DrawWindow( sal_uInt16 nDrawFlags, OutputDevice* p
 
         // restore
         if (pData->mnTitleType == BORDERWINDOW_TITLE_POPUP)
-            pDev->SetClipRegion(oldClipRgn);
+            rRenderContext.SetClipRegion(oldClipRgn);
     }
     else
         aInRect = aDecoView.DrawFrame(aInRect, DrawFrameStyle::DoubleOut, DrawFrameFlags::NoDraw);
 
     // Draw Border
-    pDev->SetLineColor();
+    rRenderContext.SetLineColor();
     long nBorderSize = pData->mnBorderSize;
     if ((nDrawFlags & BORDERWINDOW_DRAW_BORDER) && nBorderSize)
     {
-        pDev->SetFillColor(rStyleSettings.GetFaceColor());
-        pDev->DrawRect(Rectangle(Point(aInRect.Left(), aInRect.Top()),
+        rRenderContext.SetFillColor(rStyleSettings.GetFaceColor());
+        rRenderContext.DrawRect(Rectangle(Point(aInRect.Left(), aInRect.Top()),
                                  Size(aInRect.GetWidth(), nBorderSize)));
-        pDev->DrawRect(Rectangle(Point(aInRect.Left(), aInRect.Top() + nBorderSize),
+        rRenderContext.DrawRect(Rectangle(Point(aInRect.Left(), aInRect.Top() + nBorderSize),
                                  Size(nBorderSize, aInRect.GetHeight() - nBorderSize)));
-        pDev->DrawRect(Rectangle(Point(aInRect.Left(), aInRect.Bottom() - nBorderSize + 1),
+        rRenderContext.DrawRect(Rectangle(Point(aInRect.Left(), aInRect.Bottom() - nBorderSize + 1),
                                  Size(aInRect.GetWidth(), nBorderSize)));
-        pDev->DrawRect(Rectangle(Point(aInRect.Right()-nBorderSize + 1, aInRect.Top() + nBorderSize),
+        rRenderContext.DrawRect(Rectangle(Point(aInRect.Right()-nBorderSize + 1, aInRect.Top() + nBorderSize),
                                  Size(nBorderSize, aInRect.GetHeight() - nBorderSize)));
     }
 
@@ -1630,15 +1630,15 @@ void ImplStdBorderWindowView::DrawWindow( sal_uInt16 nDrawFlags, OutputDevice* p
 
         // use no gradient anymore, just a static titlecolor
         if (pData->mnTitleType != BORDERWINDOW_TITLE_POPUP)
-            pDev->SetFillColor(aFrameColor);
+            rRenderContext.SetFillColor(aFrameColor);
         else
-            pDev->SetFillColor(aFaceColor);
+            rRenderContext.SetFillColor(aFaceColor);
 
-        pDev->SetTextColor(rStyleSettings.GetButtonTextColor());
+        rRenderContext.SetTextColor(rStyleSettings.GetButtonTextColor());
         Rectangle aTitleRect(pData->maTitleRect);
         if(pOffset)
             aTitleRect.Move(pOffset->X(), pOffset->Y());
-        pDev->DrawRect(aTitleRect);
+        rRenderContext.DrawRect(aTitleRect);
 
         if (pData->mnTitleType != BORDERWINDOW_TITLE_TEAROFF)
         {
@@ -1668,10 +1668,10 @@ void ImplStdBorderWindowView::DrawWindow( sal_uInt16 nDrawFlags, OutputDevice* p
 
             // must show tooltip ?
             TextRectInfo aInfo;
-            pDev->GetTextRect(aInRect, pBorderWindow->GetText(), nTextStyle, &aInfo);
+            rRenderContext.GetTextRect(aInRect, pBorderWindow->GetText(), nTextStyle, &aInfo);
             pData->mbTitleClipped = aInfo.IsEllipses();
 
-            pDev->DrawText(aInRect, pBorderWindow->GetText(), nTextStyle);
+            rRenderContext.DrawText(aInRect, pBorderWindow->GetText(), nTextStyle);
         }
     }
 
@@ -1681,7 +1681,7 @@ void ImplStdBorderWindowView::DrawWindow( sal_uInt16 nDrawFlags, OutputDevice* p
         Rectangle aSymbolRect(pData->maCloseRect);
         if (pOffset)
             aSymbolRect.Move(pOffset->X(), pOffset->Y());
-        ImplDrawBrdWinSymbolButton(pDev, aSymbolRect, SymbolType::CLOSE, pData->mnCloseState);
+        ImplDrawBrdWinSymbolButton(&rRenderContext, aSymbolRect, SymbolType::CLOSE, pData->mnCloseState);
     }
     if (((nDrawFlags & BORDERWINDOW_DRAW_DOCK) || (nDrawFlags & BORDERWINDOW_DRAW_TITLE))
        && !pData->maDockRect.IsEmpty())
@@ -1689,7 +1689,7 @@ void ImplStdBorderWindowView::DrawWindow( sal_uInt16 nDrawFlags, OutputDevice* p
         Rectangle aSymbolRect(pData->maDockRect);
         if (pOffset)
             aSymbolRect.Move(pOffset->X(), pOffset->Y());
-        ImplDrawBrdWinSymbolButton(pDev, aSymbolRect, SymbolType::DOCK, pData->mnDockState);
+        ImplDrawBrdWinSymbolButton(&rRenderContext, aSymbolRect, SymbolType::DOCK, pData->mnDockState);
     }
     if (((nDrawFlags & BORDERWINDOW_DRAW_MENU) || (nDrawFlags & BORDERWINDOW_DRAW_TITLE))
        && !pData->maMenuRect.IsEmpty())
@@ -1697,7 +1697,7 @@ void ImplStdBorderWindowView::DrawWindow( sal_uInt16 nDrawFlags, OutputDevice* p
         Rectangle aSymbolRect(pData->maMenuRect);
         if (pOffset)
             aSymbolRect.Move(pOffset->X(), pOffset->Y());
-        ImplDrawBrdWinSymbolButton(pDev, aSymbolRect, SymbolType::MENU, pData->mnMenuState);
+        ImplDrawBrdWinSymbolButton(&rRenderContext, aSymbolRect, SymbolType::MENU, pData->mnMenuState);
     }
     if (((nDrawFlags & BORDERWINDOW_DRAW_HIDE) || (nDrawFlags & BORDERWINDOW_DRAW_TITLE))
        && !pData->maHideRect.IsEmpty())
@@ -1705,7 +1705,7 @@ void ImplStdBorderWindowView::DrawWindow( sal_uInt16 nDrawFlags, OutputDevice* p
         Rectangle aSymbolRect(pData->maHideRect);
         if (pOffset)
             aSymbolRect.Move(pOffset->X(), pOffset->Y());
-        ImplDrawBrdWinSymbolButton(pDev, aSymbolRect, SymbolType::HIDE, pData->mnHideState);
+        ImplDrawBrdWinSymbolButton(&rRenderContext, aSymbolRect, SymbolType::HIDE, pData->mnHideState);
     }
     if (((nDrawFlags & BORDERWINDOW_DRAW_ROLL) || (nDrawFlags & BORDERWINDOW_DRAW_TITLE))
        && !pData->maRollRect.IsEmpty())
@@ -1718,7 +1718,7 @@ void ImplStdBorderWindowView::DrawWindow( sal_uInt16 nDrawFlags, OutputDevice* p
         Rectangle aSymbolRect(pData->maRollRect);
         if (pOffset)
             aSymbolRect.Move(pOffset->X(), pOffset->Y());
-        ImplDrawBrdWinSymbolButton(pDev, aSymbolRect, eType, pData->mnRollState);
+        ImplDrawBrdWinSymbolButton(&rRenderContext, aSymbolRect, eType, pData->mnRollState);
     }
 
     if (((nDrawFlags & BORDERWINDOW_DRAW_HELP) || (nDrawFlags & BORDERWINDOW_DRAW_TITLE))
@@ -1727,7 +1727,7 @@ void ImplStdBorderWindowView::DrawWindow( sal_uInt16 nDrawFlags, OutputDevice* p
         Rectangle aSymbolRect(pData->maHelpRect);
         if (pOffset)
             aSymbolRect.Move(pOffset->X(), pOffset->Y());
-        ImplDrawBrdWinSymbolButton(pDev, aSymbolRect, SymbolType::HELP, pData->mnHelpState);
+        ImplDrawBrdWinSymbolButton(&rRenderContext, aSymbolRect, SymbolType::HELP, pData->mnHelpState);
     }
     if (((nDrawFlags & BORDERWINDOW_DRAW_PIN) || (nDrawFlags & BORDERWINDOW_DRAW_TITLE))
        && !pData->maPinRect.IsEmpty())
@@ -1741,12 +1741,12 @@ void ImplStdBorderWindowView::DrawWindow( sal_uInt16 nDrawFlags, OutputDevice* p
             aPos.Move(pOffset->X(), pOffset->Y());
         if (nRectHeight < aImageSize.Height())
         {
-            pDev->DrawImage(aPos, Size( aImageSize.Width(), nRectHeight ), aImage);
+            rRenderContext.DrawImage(aPos, Size( aImageSize.Width(), nRectHeight ), aImage);
         }
         else
         {
             aPos.Y() += (nRectHeight-aImageSize.Height()) / 2;
-            pDev->DrawImage(aPos, aImage);
+            rRenderContext.DrawImage(aPos, aImage);
         }
     }
 }
@@ -1881,12 +1881,12 @@ void ImplBorderWindow::Tracking( const TrackingEvent& rTEvt )
 
 void ImplBorderWindow::Paint( vcl::RenderContext& rRenderContext, const Rectangle& )
 {
-    mpBorderView->DrawWindow(BORDERWINDOW_DRAW_ALL, &rRenderContext);
+    mpBorderView->DrawWindow(rRenderContext, BORDERWINDOW_DRAW_ALL);
 }
 
 void ImplBorderWindow::Draw( const Rectangle&, OutputDevice* pOutDev, const Point& rPos )
 {
-    mpBorderView->DrawWindow(BORDERWINDOW_DRAW_ALL, pOutDev, &rPos);
+    mpBorderView->DrawWindow(*pOutDev, BORDERWINDOW_DRAW_ALL, &rPos);
 }
 
 void ImplBorderWindow::Activate()
@@ -1986,13 +1986,8 @@ void ImplBorderWindow::StateChanged( StateChangedType nType )
          (nType == StateChangedType::Image) ||
          (nType == StateChangedType::Data) )
     {
-        if ( IsReallyVisible() && mbFrameBorder )
-        {
-            if ( HasPaintEvent() )
-                InvalidateBorder();
-            else
-                mpBorderView->DrawWindow( BORDERWINDOW_DRAW_TITLE );
-        }
+        if (IsReallyVisible() && mbFrameBorder)
+            InvalidateBorder();
     }
 
     Window::StateChanged( nType );
commit 918886e43d3579f1b24375c15c6e911aaf8dc8eb
Author: Jan Holesovsky <kendy at collabora.com>
Date:   Thu May 21 17:42:26 2015 +0200

    rendercontext: Position the double-buffered subwidgets correctly.
    
    Change-Id: I707ff09ac2b7b610f0f13440a215abf083f9815d

diff --git a/include/vcl/outdev.hxx b/include/vcl/outdev.hxx
index 27cee53..b00f2d3 100644
--- a/include/vcl/outdev.hxx
+++ b/include/vcl/outdev.hxx
@@ -314,6 +314,7 @@ namespace vcl {
 
 class VCL_DLLPUBLIC OutputDevice
 {
+    friend class PaintHelper;
     friend class Printer;
     friend class VirtualDevice;
     friend class vcl::Window;
diff --git a/vcl/source/window/paint.cxx b/vcl/source/window/paint.cxx
index 3531710..af64a31 100644
--- a/vcl/source/window/paint.cxx
+++ b/vcl/source/window/paint.cxx
@@ -85,6 +85,9 @@ public:
     void DoPaint(const vcl::Region* pRegion);
 
     /// Create m_pBuffer, and set it up to have the same settings as m_pWindow.
+    void CreateBuffer();
+
+    /// Setup m_pBuffer according to the settings of the current m_pWindow.
     void SetupBuffer();
 
     /// Paint the content of the buffer to the current m_pWindow.
@@ -104,13 +107,29 @@ PaintHelper::PaintHelper(vcl::Window *pWindow, const VclPtr<VirtualDevice>& rBuf
 {
 }
 
-void PaintHelper::SetupBuffer()
+void PaintHelper::CreateBuffer()
 {
     assert(!m_pBuffer);
 
     m_pBuffer = VclPtrInstance<VirtualDevice>();
     m_bCreatedBuffer = true;
 
+    SetupBuffer();
+
+    // update the output size now, after all the settings were copied
+    m_pBuffer->SetOutputSize(m_pWindow->GetOutputSize());
+
+    // we need to remember the mnOutOffX / mnOutOffY, but actually really
+    // set it just temporarily for the subwidgets - so we are setting it here
+    // only to remember the value & to be able to pass it to the descendants
+    // FIXME: once everything's double-buffered, this is (hopefully) not
+    // necessary as the m_pBuffer is always created for the main window.
+    m_pBuffer->mnOutOffX = m_pWindow->GetOutOffXPixel();
+    m_pBuffer->mnOutOffY = m_pWindow->GetOutOffYPixel();
+}
+
+void PaintHelper::SetupBuffer()
+{
     // transfer various settings
     // FIXME: this must disappear as we move to RenderContext only,
     // the painting must become state-less, so that no actual
@@ -133,17 +152,17 @@ void PaintHelper::SetupBuffer()
     m_pBuffer->SetTextFillColor(m_pWindow->GetTextFillColor());
     m_pBuffer->SetTextAlign(m_pWindow->GetTextAlign());
     m_pBuffer->SetRasterOp(m_pWindow->GetRasterOp());
-    m_pBuffer->SetRefPoint(m_pWindow->GetRefPoint());
     m_pBuffer->SetLayoutMode(m_pWindow->GetLayoutMode());
     m_pBuffer->SetDigitLanguage(m_pWindow->GetDigitLanguage());
-
-    // update the output size now, after all the settings were copied
-    m_pBuffer->SetOutputSize(m_pWindow->GetOutputSize());
 }
 
 void PaintHelper::PaintBuffer()
 {
     assert(m_pBuffer);
+    assert(m_bCreatedBuffer);
+
+    m_pBuffer->mnOutOffX = 0;
+    m_pBuffer->mnOutOffY = 0;
 
     // copy the buffer content to the actual window
     // export VCL_DOUBLEBUFFERING_AVOID_PAINT=1 to see where we are
@@ -186,7 +205,7 @@ void PaintHelper::DoPaint(const vcl::Region* pRegion)
 
         // double-buffering: setup the buffer if it does not exist
         if (!m_pBuffer && m_pWindow->SupportsDoubleBuffering())
-            SetupBuffer();
+            CreateBuffer();
 
         // double-buffering: if this window does not support double-buffering,
         // but we are in the middle of double-buffered paint, we might be
@@ -197,9 +216,24 @@ void PaintHelper::DoPaint(const vcl::Region* pRegion)
         if (m_pBuffer && m_pWindow->SupportsDoubleBuffering())
         {
             // double-buffering
+            SetupBuffer();
+
+            // temporarily decrease the mnOutOffX/Y of the buffer for the
+            // subwidgets (because the m_pBuffer is our base here)
+            // FIXME: once everything's double-buffered, this is (hopefully) not
+            // necessary as the m_pBuffer is always created for the main window.
+            long nOutOffX = m_pBuffer->mnOutOffX;
+            long nOutOffY = m_pBuffer->mnOutOffY;
+            m_pBuffer->mnOutOffX = m_pWindow->GetOutOffXPixel() - m_pBuffer->mnOutOffX;
+            m_pBuffer->mnOutOffY = m_pWindow->GetOutOffYPixel() - m_pBuffer->mnOutOffY;
+
             m_pWindow->PushPaintHelper(this, *m_pWindow);
             m_pWindow->ApplySettings(*m_pBuffer.get());
             m_pWindow->Paint(*m_pBuffer.get(), m_aPaintRect);
+
+            // restore the mnOutOffX/Y value
+            m_pBuffer->mnOutOffX = nOutOffX;
+            m_pBuffer->mnOutOffY = nOutOffY;
         }
         else
         {
commit b6b7e34bccb243174b0b0892361589b66a1bf915
Author: Jan Holesovsky <kendy at collabora.com>
Date:   Thu May 21 12:30:45 2015 +0200

    rendercontext: Draw toolbox separators via the rendercontext.
    
    Change-Id: Ie34f9eeb9f706e1a43c31d08869c8b6c610228ec

diff --git a/vcl/source/window/toolbox.cxx b/vcl/source/window/toolbox.cxx
index 452661b..ccffc73 100644
--- a/vcl/source/window/toolbox.cxx
+++ b/vcl/source/window/toolbox.cxx
@@ -2979,7 +2979,6 @@ void ToolBox::ImplDrawButton(vcl::RenderContext& rRenderContext, const Rectangle
 
 void ToolBox::ImplDrawItem(vcl::RenderContext& rRenderContext, sal_uInt16 nPos, sal_uInt16 nHighlight, bool bPaint, bool bLayout)
 {
-
     if (nPos >= mpData->m_aItems.size())
         return;
 
@@ -3044,7 +3043,7 @@ void ToolBox::ImplDrawItem(vcl::RenderContext& rRenderContext, sal_uInt16 nPos,
          nPos > 0
          )
     {
-        ImplDrawSeparator(*this, nPos, aButtonRect); // FIXME
+        ImplDrawSeparator(rRenderContext, nPos, aButtonRect);
     }
 
     // do nothing if item is no button or will be displayed as window
commit 1026eec23e34fb9a2197af0f6e1235910fb582d4
Author: Jan Holesovsky <kendy at collabora.com>
Date:   Thu May 21 12:01:36 2015 +0200

    rendercontext: Correct output of the type that is not double-buffered.
    
    And also don't attempt to draw the non-double-buffered windows via double
    buffering.
    
    Change-Id: Ic7afb976dfbe005e1aeff2d726360f259f87f4bc

diff --git a/vcl/source/window/paint.cxx b/vcl/source/window/paint.cxx
index 374e5de..3531710 100644
--- a/vcl/source/window/paint.cxx
+++ b/vcl/source/window/paint.cxx
@@ -192,9 +192,9 @@ void PaintHelper::DoPaint(const vcl::Region* pRegion)
         // but we are in the middle of double-buffered paint, we might be
         // losing information
         if (m_pBuffer && !m_pWindow->SupportsDoubleBuffering())
-            SAL_WARN("vcl.doublebuffering", "non-double buffered window in the double-buffered hierarchy, painting directly: " << typeid(m_pWindow).name());
+            SAL_WARN("vcl.doublebuffering", "non-double buffered window in the double-buffered hierarchy, painting directly: " << typeid(*m_pWindow.get()).name());
 
-        if (m_pBuffer)
+        if (m_pBuffer && m_pWindow->SupportsDoubleBuffering())
         {
             // double-buffering
             m_pWindow->PushPaintHelper(this, *m_pWindow);


More information about the Libreoffice-commits mailing list