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 <[email protected]> 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 <[email protected]> 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 <[email protected]> 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 <[email protected]> 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); _______________________________________________ Libreoffice-commits mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
