[Libreoffice-commits] core.git: 7 commits - include/vcl vcl/inc vcl/source vcl/unx
Jan Holesovsky
kendy at collabora.com
Sat May 23 17:16:18 PDT 2015
include/vcl/salnativewidgets.hxx | 5 +++--
vcl/inc/opengl/x11/salvd.hxx | 1 +
vcl/inc/unx/gtk/gtkgdi.hxx | 3 ++-
vcl/inc/unx/salinst.h | 6 ++++++
vcl/inc/unx/salvd.h | 7 +++----
vcl/source/control/edit.cxx | 16 ++++++++++------
vcl/source/outdev/bitmap.cxx | 26 ++++++++++++++++++++++++++
vcl/source/outdev/curvedshapes.cxx | 9 +++++++++
vcl/source/outdev/gradient.cxx | 19 +++++++++++++++++--
vcl/source/outdev/hatch.cxx | 12 +++++++++---
vcl/source/outdev/line.cxx | 5 ++++-
vcl/source/outdev/mask.cxx | 9 +++++++++
vcl/source/outdev/nativecontrols.cxx | 6 ++++++
vcl/source/outdev/pixel.cxx | 6 ++++++
vcl/source/outdev/polygon.cxx | 7 ++++++-
vcl/source/outdev/polyline.cxx | 8 +++++++-
vcl/source/outdev/rect.cxx | 11 ++++++++++-
vcl/source/outdev/text.cxx | 9 ++++++++-
vcl/source/outdev/textline.cxx | 5 ++++-
vcl/source/outdev/transparent.cxx | 14 ++++++++++++--
vcl/source/outdev/wallpaper.cxx | 11 +++++++++++
vcl/source/window/brdwin.cxx | 15 +++++----------
vcl/source/window/paint.cxx | 2 +-
vcl/unx/generic/gdi/salvd.cxx | 27 ++++++++++++++++-----------
vcl/unx/gtk/app/gtkinst.cxx | 6 +++++-
vcl/unx/gtk/gdi/salnativewidgets-gtk.cxx | 11 ++++-------
26 files changed, 200 insertions(+), 56 deletions(-)
New commits:
commit 891304bb0ad3af9d8d73f947f25477abf57485a4
Author: Jan Holesovsky <kendy at collabora.com>
Date: Sun May 24 01:59:01 2015 +0200
rendercontext: Improve comboboxes in the double-buffered toolbar.
Change-Id: I91bfb4ea4672ff09482679f8fcf18a65e5a6ee3c
diff --git a/vcl/source/control/edit.cxx b/vcl/source/control/edit.cxx
index 114bab5..e67f09c 100644
--- a/vcl/source/control/edit.cxx
+++ b/vcl/source/control/edit.cxx
@@ -606,7 +606,7 @@ void Edit::ImplRepaint(vcl::RenderContext& rRenderContext, bool bLayout)
}
// draw normal text
Color aNormalTextColor = rRenderContext.GetTextColor();
- SetClipRegion(aNormalClipRegion);
+ rRenderContext.SetClipRegion(aNormalClipRegion);
if (IsPaintTransparent())
rRenderContext.SetTextFillColor();
@@ -1027,6 +1027,10 @@ void Edit::ImplClearBackground(vcl::RenderContext& rRenderContext, long nXStart,
void Edit::ImplPaintBorder(vcl::RenderContext& rRenderContext, long nXStart, long nXEnd)
{
+ // this is not needed when double-buffering
+ if (SupportsDoubleBuffering())
+ return;
+
Point aTmpPoint;
Rectangle aRect(aTmpPoint, GetOutputSizePixel());
aRect.Left() = nXStart;
commit 70bdecd7f0b423734d1b9042141b58180032caf9
Author: Jan Holesovsky <kendy at collabora.com>
Date: Sun May 24 01:04:07 2015 +0200
rendercontext: Fix border window's painting to work well with rendercontext.
This partially fixes rendering of comboboxes.
Change-Id: I243f63a0cd83bb435876d3954a073df0acd54c58
diff --git a/vcl/source/window/brdwin.cxx b/vcl/source/window/brdwin.cxx
index f35998c..0d6ab4e 100644
--- a/vcl/source/window/brdwin.cxx
+++ b/vcl/source/window/brdwin.cxx
@@ -637,16 +637,11 @@ void ImplSmallBorderWindowView::DrawWindow(vcl::RenderContext& rRenderContext, s
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 (rRenderContext.GetOutDevType() == OUTDEV_WINDOW)
- pWin = static_cast<vcl::Window*>(&rRenderContext);
+ vcl::Window* pCtrl = mpBorderWindow->GetWindow(GetWindowType::Client);
ControlType aCtrlType = 0;
ControlPart aCtrlPart = PART_ENTIRE_CONTROL;
- if (pWin && (pCtrl = mpBorderWindow->GetWindow(GetWindowType::Client)) != NULL)
+ if (pCtrl)
{
switch (pCtrl->GetType())
{
@@ -714,9 +709,9 @@ void ImplSmallBorderWindowView::DrawWindow(vcl::RenderContext& rRenderContext, s
ImplControlValue aControlValue;
ControlState nState = ControlState::ENABLED;
- if (!pWin->IsEnabled())
+ if (!mpBorderWindow->IsEnabled())
nState &= ~ControlState::ENABLED;
- if (pWin->HasFocus())
+ if (mpBorderWindow->HasFocus())
nState |= ControlState::FOCUSED;
else if(mbNWFBorder)
{
@@ -782,7 +777,7 @@ void ImplSmallBorderWindowView::DrawWindow(vcl::RenderContext& rRenderContext, s
if (nBorderStyle & WindowBorderStyle::MENU)
nFlags |= DrawFrameFlags::Menu;
// tell DrawFrame that we're drawing a window border of a frame window to avoid round corners
- if (pWin && pWin == pWin->ImplGetFrameWindow())
+ if (mpBorderWindow == mpBorderWindow->ImplGetFrameWindow())
nFlags |= DrawFrameFlags::WindowBorder;
DecorationView aDecoView(&rRenderContext);
commit 2d40468efc1a90969d4ed34f699a8f48277cb8b3
Author: Jan Holesovsky <kendy at collabora.com>
Date: Sat May 23 21:37:25 2015 +0200
rendercontext: Make the Gtk+ native widgets work with double-buffering.
Change-Id: Ic7101ab7cbaa7fd5f6b073a73ef0c0088b1af4c6
diff --git a/include/vcl/salnativewidgets.hxx b/include/vcl/salnativewidgets.hxx
index 5b0bda7..5177efe 100644
--- a/include/vcl/salnativewidgets.hxx
+++ b/include/vcl/salnativewidgets.hxx
@@ -246,11 +246,12 @@ enum class ControlState {
HIDDEN = 0x0010,
DEFAULT = 0x0020,
SELECTED = 0x0040,
- CACHING_ALLOWED = 0x8000, // set when the control is completely visible (i.e. not clipped)
+ DOUBLEBUFFERING = 0x4000, ///< Set when the control is painted using double-buffering via VirtualDevice.
+ CACHING_ALLOWED = 0x8000, ///< Set when the control is completely visible (i.e. not clipped).
};
namespace o3tl
{
- template<> struct typed_flags<ControlState> : is_typed_flags<ControlState, 0x8007f> {};
+ template<> struct typed_flags<ControlState> : is_typed_flags<ControlState, 0xc007f> {};
}
/* ButtonValue:
diff --git a/vcl/source/outdev/nativecontrols.cxx b/vcl/source/outdev/nativecontrols.cxx
index 6fc43f6..6e9279c 100644
--- a/vcl/source/outdev/nativecontrols.cxx
+++ b/vcl/source/outdev/nativecontrols.cxx
@@ -18,6 +18,7 @@
*/
#include <vcl/outdev.hxx>
+#include <vcl/virdev.hxx>
#include <vcl/window.hxx>
#include <vcl/salnativewidgets.hxx>
@@ -302,6 +303,9 @@ bool OutputDevice::DrawNativeControl( ControlType nType,
if (aTestRegion == vcl::Region(rControlRegion))
nState |= ControlState::CACHING_ALLOWED; // control is not clipped, caching allowed
+ if (dynamic_cast<VirtualDevice*>(this))
+ nState |= ControlState::DOUBLEBUFFERING;
+
bool bRet = mpGraphics->DrawNativeControl(nType, nPart, screenRegion, nState, *aScreenCtrlValue, aCaption, this );
return bRet;
diff --git a/vcl/unx/gtk/gdi/salnativewidgets-gtk.cxx b/vcl/unx/gtk/gdi/salnativewidgets-gtk.cxx
index b4f1ba0..6eb6043 100644
--- a/vcl/unx/gtk/gdi/salnativewidgets-gtk.cxx
+++ b/vcl/unx/gtk/gdi/salnativewidgets-gtk.cxx
@@ -860,12 +860,9 @@ bool GtkSalGraphics::hitTestNativeControl( ControlType nType,
* aValue: An optional value (tristate/numerical/string)
* rCaption: A caption or title string (like button text etc)
*/
-bool GtkSalGraphics::drawNativeControl( ControlType nType,
- ControlPart nPart,
- const Rectangle& rControlRegion,
- ControlState nState,
- const ImplControlValue& aValue,
- const OUString& rCaption )
+bool GtkSalGraphics::drawNativeControl(ControlType nType, ControlPart nPart,
+ const Rectangle& rControlRegion, ControlState nState,
+ const ImplControlValue& aValue, const OUString& rCaption)
{
// get a GC with current clipping region set
GetFontGC();
@@ -891,7 +888,7 @@ bool GtkSalGraphics::drawNativeControl( ControlType nType,
std::unique_ptr<GdkX11Pixmap> xPixmap;
std::unique_ptr<GdkX11Pixmap> xMask;
Rectangle aPixmapRect;
- if( ( bNeedPixmapPaint )
+ if ((bNeedPixmapPaint || (nState & ControlState::DOUBLEBUFFERING))
&& nType != CTRL_SCROLLBAR
&& nType != CTRL_SPINBOX
&& nType != CTRL_TAB_ITEM
commit 1926cfb9386269b81b6ca62bdc64591f2c403d03
Author: Jan Holesovsky <kendy at collabora.com>
Date: Sat May 23 19:18:40 2015 +0200
rendercontext: Fix borderwindow rendering when called from class Edit.
Change-Id: I0b63ee7fd30c9b6f67b9770386ba1904eea0e678
diff --git a/vcl/source/control/edit.cxx b/vcl/source/control/edit.cxx
index b196dfa..114bab5 100644
--- a/vcl/source/control/edit.cxx
+++ b/vcl/source/control/edit.cxx
@@ -1074,16 +1074,16 @@ void Edit::ImplPaintBorder(vcl::RenderContext& rRenderContext, long nXStart, lon
aClipRgn.Move(aBorderOffs.X(), aBorderOffs.Y());
}
- vcl::Region oldRgn(pBorder->GetClipRegion());
- pBorder->SetClipRegion(aClipRgn);
+ vcl::Region oldRgn(rRenderContext.GetClipRegion());
+ rRenderContext.SetClipRegion(aClipRgn);
- pBorder->Paint(*pBorder, Rectangle()); // FIXME
+ pBorder->Paint(rRenderContext, Rectangle());
- pBorder->SetClipRegion(oldRgn);
+ rRenderContext.SetClipRegion(oldRgn);
}
else
{
- pBorder->Paint(*pBorder, Rectangle()); // FIXME
+ pBorder->Paint(rRenderContext, Rectangle());
}
}
}
commit 15afb15227667aa573a38249d3a24f962ecef9ce
Author: Jan Holesovsky <kendy at collabora.com>
Date: Sat May 23 18:52:00 2015 +0200
rendercontext: Add asserts to easily catch the direct rendering cases.
Change-Id: I5e05b08e30930740be0fdbb18169bf350e2eab9f
diff --git a/vcl/source/outdev/bitmap.cxx b/vcl/source/outdev/bitmap.cxx
index a924d5b..f59e441 100644
--- a/vcl/source/outdev/bitmap.cxx
+++ b/vcl/source/outdev/bitmap.cxx
@@ -24,6 +24,7 @@
#include <vcl/outdev.hxx>
#include <vcl/virdev.hxx>
#include <vcl/image.hxx>
+#include <vcl/window.hxx>
#include <bmpfast.hxx>
#include <salgdi.hxx>
@@ -35,12 +36,16 @@
void OutputDevice::DrawBitmap( const Point& rDestPt, const Bitmap& rBitmap )
{
+ assert(!dynamic_cast<vcl::Window*>(this) || !dynamic_cast<vcl::Window*>(this)->SupportsDoubleBuffering());
+
const Size aSizePix( rBitmap.GetSizePixel() );
DrawBitmap( rDestPt, PixelToLogic( aSizePix ), Point(), aSizePix, rBitmap, MetaActionType::BMP );
}
void OutputDevice::DrawBitmap( const Point& rDestPt, const Size& rDestSize, const Bitmap& rBitmap )
{
+ assert(!dynamic_cast<vcl::Window*>(this) || !dynamic_cast<vcl::Window*>(this)->SupportsDoubleBuffering());
+
DrawBitmap( rDestPt, rDestSize, Point(), rBitmap.GetSizePixel(), rBitmap, MetaActionType::BMPSCALE );
}
@@ -49,6 +54,8 @@ void OutputDevice::DrawBitmap( const Point& rDestPt, const Size& rDestSize,
const Point& rSrcPtPixel, const Size& rSrcSizePixel,
const Bitmap& rBitmap, const MetaActionType nAction )
{
+ assert(!dynamic_cast<vcl::Window*>(this) || !dynamic_cast<vcl::Window*>(this)->SupportsDoubleBuffering());
+
if( ImplIsRecordLayout() )
return;
@@ -229,6 +236,8 @@ Bitmap OutputDevice::GetDownsampledBitmap( const Size& rDstSz,
void OutputDevice::DrawBitmapEx( const Point& rDestPt,
const BitmapEx& rBitmapEx )
{
+ assert(!dynamic_cast<vcl::Window*>(this) || !dynamic_cast<vcl::Window*>(this)->SupportsDoubleBuffering());
+
if( ImplIsRecordLayout() )
return;
@@ -246,6 +255,8 @@ void OutputDevice::DrawBitmapEx( const Point& rDestPt,
void OutputDevice::DrawBitmapEx( const Point& rDestPt, const Size& rDestSize,
const BitmapEx& rBitmapEx )
{
+ assert(!dynamic_cast<vcl::Window*>(this) || !dynamic_cast<vcl::Window*>(this)->SupportsDoubleBuffering());
+
if( ImplIsRecordLayout() )
return;
@@ -264,6 +275,7 @@ void OutputDevice::DrawBitmapEx( const Point& rDestPt, const Size& rDestSize,
const Point& rSrcPtPixel, const Size& rSrcSizePixel,
const BitmapEx& rBitmapEx, const MetaActionType nAction )
{
+ assert(!dynamic_cast<vcl::Window*>(this) || !dynamic_cast<vcl::Window*>(this)->SupportsDoubleBuffering());
if( ImplIsRecordLayout() )
return;
@@ -480,6 +492,8 @@ void OutputDevice::DrawDeviceBitmap( const Point& rDestPt, const Size& rDestSize
const Point& rSrcPtPixel, const Size& rSrcSizePixel,
BitmapEx& rBitmapEx )
{
+ assert(!dynamic_cast<vcl::Window*>(this) || !dynamic_cast<vcl::Window*>(this)->SupportsDoubleBuffering());
+
if (rBitmapEx.IsAlpha())
{
DrawDeviceAlphaBitmap(rBitmapEx.GetBitmap(), rBitmapEx.GetAlpha(), rDestPt, rDestSize, rSrcPtPixel, rSrcSizePixel);
@@ -608,6 +622,8 @@ void OutputDevice::DrawDeviceAlphaBitmap( const Bitmap& rBmp, const AlphaMask& r
const Point& rDestPt, const Size& rDestSize,
const Point& rSrcPtPixel, const Size& rSrcSizePixel )
{
+ assert(!dynamic_cast<vcl::Window*>(this) || !dynamic_cast<vcl::Window*>(this)->SupportsDoubleBuffering());
+
Point aOutPt(LogicToPixel(rDestPt));
Size aOutSz(LogicToPixel(rDestSize));
Rectangle aDstRect(Point(), GetOutputSizePixel());
@@ -902,6 +918,8 @@ private:
void OutputDevice::DrawDeviceAlphaBitmapSlowPath(const Bitmap& rBitmap, const AlphaMask& rAlpha, Rectangle aDstRect, Rectangle aBmpRect, Size& aOutSize, Point& aOutPoint)
{
+ assert(!dynamic_cast<vcl::Window*>(this) || !dynamic_cast<vcl::Window*>(this)->SupportsDoubleBuffering());
+
VirtualDevice* pOldVDev = mpAlphaVDev;
const bool bHMirr = aOutSize.Width() < 0;
@@ -1018,6 +1036,8 @@ bool OutputDevice::DrawTransformBitmapExDirect(
const basegfx::B2DHomMatrix& aFullTransform,
const BitmapEx& rBitmapEx)
{
+ assert(!dynamic_cast<vcl::Window*>(this) || !dynamic_cast<vcl::Window*>(this)->SupportsDoubleBuffering());
+
bool bDone = false;
// try to paint directly
@@ -1137,6 +1157,8 @@ void OutputDevice::DrawTransformedBitmapEx(
const basegfx::B2DHomMatrix& rTransformation,
const BitmapEx& rBitmapEx)
{
+ assert(!dynamic_cast<vcl::Window*>(this) || !dynamic_cast<vcl::Window*>(this)->SupportsDoubleBuffering());
+
if( ImplIsRecordLayout() )
return;
@@ -1308,12 +1330,16 @@ namespace
void OutputDevice::DrawImage( const Point& rPos, const Image& rImage, DrawImageFlags nStyle )
{
+ assert(!dynamic_cast<vcl::Window*>(this) || !dynamic_cast<vcl::Window*>(this)->SupportsDoubleBuffering());
+
DrawImage( rPos, Size(), rImage, nStyle );
}
void OutputDevice::DrawImage( const Point& rPos, const Size& rSize,
const Image& rImage, DrawImageFlags nStyle )
{
+ assert(!dynamic_cast<vcl::Window*>(this) || !dynamic_cast<vcl::Window*>(this)->SupportsDoubleBuffering());
+
bool bIsSizeValid = rSize.getWidth() != 0 && rSize.getHeight() != 0;
if( rImage.mpImplData && !ImplIsRecordLayout() )
diff --git a/vcl/source/outdev/curvedshapes.cxx b/vcl/source/outdev/curvedshapes.cxx
index 92697ff..db8f7d6 100644
--- a/vcl/source/outdev/curvedshapes.cxx
+++ b/vcl/source/outdev/curvedshapes.cxx
@@ -19,11 +19,14 @@
#include <vcl/outdev.hxx>
#include <vcl/virdev.hxx>
+#include <vcl/window.hxx>
#include <salgdi.hxx>
void OutputDevice::DrawEllipse( const Rectangle& rRect )
{
+ assert(!dynamic_cast<vcl::Window*>(this) || !dynamic_cast<vcl::Window*>(this)->SupportsDoubleBuffering());
+
if ( mpMetaFile )
mpMetaFile->AddAction( new MetaEllipseAction( rRect ) );
@@ -70,6 +73,8 @@ void OutputDevice::DrawEllipse( const Rectangle& rRect )
void OutputDevice::DrawArc( const Rectangle& rRect,
const Point& rStartPt, const Point& rEndPt )
{
+ assert(!dynamic_cast<vcl::Window*>(this) || !dynamic_cast<vcl::Window*>(this)->SupportsDoubleBuffering());
+
if ( mpMetaFile )
mpMetaFile->AddAction( new MetaArcAction( rRect, rStartPt, rEndPt ) );
@@ -112,6 +117,8 @@ void OutputDevice::DrawArc( const Rectangle& rRect,
void OutputDevice::DrawPie( const Rectangle& rRect,
const Point& rStartPt, const Point& rEndPt )
{
+ assert(!dynamic_cast<vcl::Window*>(this) || !dynamic_cast<vcl::Window*>(this)->SupportsDoubleBuffering());
+
if ( mpMetaFile )
mpMetaFile->AddAction( new MetaPieAction( rRect, rStartPt, rEndPt ) );
@@ -161,6 +168,8 @@ void OutputDevice::DrawPie( const Rectangle& rRect,
void OutputDevice::DrawChord( const Rectangle& rRect,
const Point& rStartPt, const Point& rEndPt )
{
+ assert(!dynamic_cast<vcl::Window*>(this) || !dynamic_cast<vcl::Window*>(this)->SupportsDoubleBuffering());
+
if ( mpMetaFile )
mpMetaFile->AddAction( new MetaChordAction( rRect, rStartPt, rEndPt ) );
diff --git a/vcl/source/outdev/gradient.cxx b/vcl/source/outdev/gradient.cxx
index 981cfac..ca0e949 100644
--- a/vcl/source/outdev/gradient.cxx
+++ b/vcl/source/outdev/gradient.cxx
@@ -20,9 +20,10 @@
#include <tools/poly.hxx>
#include <vcl/gradient.hxx>
-#include <vcl/virdev.hxx>
-#include <vcl/outdev.hxx>
#include <vcl/settings.hxx>
+#include <vcl/outdev.hxx>
+#include <vcl/virdev.hxx>
+#include <vcl/window.hxx>
#include "salgdi.hxx"
@@ -31,6 +32,8 @@
void OutputDevice::DrawGradient( const Rectangle& rRect,
const Gradient& rGradient )
{
+ assert(!dynamic_cast<vcl::Window*>(this) || !dynamic_cast<vcl::Window*>(this)->SupportsDoubleBuffering());
+
// Convert rectangle to a tools::PolyPolygon by first converting to a Polygon
Polygon aPolygon ( rRect );
tools::PolyPolygon aPolyPoly ( aPolygon );
@@ -41,6 +44,8 @@ void OutputDevice::DrawGradient( const Rectangle& rRect,
void OutputDevice::DrawGradient( const tools::PolyPolygon& rPolyPoly,
const Gradient& rGradient )
{
+ assert(!dynamic_cast<vcl::Window*>(this) || !dynamic_cast<vcl::Window*>(this)->SupportsDoubleBuffering());
+
if ( mnDrawMode & DrawModeFlags::NoGradient )
return; // nothing to draw!
@@ -167,6 +172,8 @@ void OutputDevice::ClipAndDrawGradientMetafile ( const Gradient &rGradient, cons
void OutputDevice::DrawGradientToMetafile ( const tools::PolyPolygon& rPolyPoly,
const Gradient& rGradient )
{
+ assert(!dynamic_cast<vcl::Window*>(this) || !dynamic_cast<vcl::Window*>(this)->SupportsDoubleBuffering());
+
if ( !mpMetaFile )
return;
@@ -253,6 +260,8 @@ void OutputDevice::DrawLinearGradient( const Rectangle& rRect,
const Gradient& rGradient,
const tools::PolyPolygon* pClixPolyPoly )
{
+ assert(!dynamic_cast<vcl::Window*>(this) || !dynamic_cast<vcl::Window*>(this)->SupportsDoubleBuffering());
+
// get BoundRect of rotated rectangle
Rectangle aRect;
Point aCenter;
@@ -433,6 +442,8 @@ void OutputDevice::DrawComplexGradient( const Rectangle& rRect,
const Gradient& rGradient,
const tools::PolyPolygon* pClixPolyPoly )
{
+ assert(!dynamic_cast<vcl::Window*>(this) || !dynamic_cast<vcl::Window*>(this)->SupportsDoubleBuffering());
+
// Determine if we output via Polygon or PolyPolygon
// For all rasteroperations other then Overpaint always use PolyPolygon,
// as we will get wrong results if we output multiple times on top of each other.
@@ -597,6 +608,8 @@ void OutputDevice::DrawComplexGradient( const Rectangle& rRect,
void OutputDevice::DrawLinearGradientToMetafile( const Rectangle& rRect,
const Gradient& rGradient )
{
+ assert(!dynamic_cast<vcl::Window*>(this) || !dynamic_cast<vcl::Window*>(this)->SupportsDoubleBuffering());
+
// get BoundRect of rotated rectangle
Rectangle aRect;
Point aCenter;
@@ -775,6 +788,8 @@ void OutputDevice::DrawLinearGradientToMetafile( const Rectangle& rRect,
void OutputDevice::DrawComplexGradientToMetafile( const Rectangle& rRect,
const Gradient& rGradient )
{
+ assert(!dynamic_cast<vcl::Window*>(this) || !dynamic_cast<vcl::Window*>(this)->SupportsDoubleBuffering());
+
// Determine if we output via Polygon or PolyPolygon
// For all rasteroperations other then Overpaint always use PolyPolygon,
// as we will get wrong results if we output multiple times on top of each other.
diff --git a/vcl/source/outdev/hatch.cxx b/vcl/source/outdev/hatch.cxx
index 928c07f..a33fae3 100644
--- a/vcl/source/outdev/hatch.cxx
+++ b/vcl/source/outdev/hatch.cxx
@@ -19,11 +19,12 @@
#include <tools/line.hxx>
-#include <vcl/salbtype.hxx>
#include <vcl/hatch.hxx>
-#include <vcl/virdev.hxx>
-#include <vcl/outdev.hxx>
+#include <vcl/salbtype.hxx>
#include <vcl/settings.hxx>
+#include <vcl/outdev.hxx>
+#include <vcl/virdev.hxx>
+#include <vcl/window.hxx>
#include "../gdi/pdfwriter_impl.hxx"
@@ -43,6 +44,7 @@ extern "C" int SAL_CALL HatchCmpFnc( const void* p1, const void* p2 )
void OutputDevice::DrawHatch( const tools::PolyPolygon& rPolyPoly, const Hatch& rHatch )
{
+ assert(!dynamic_cast<vcl::Window*>(this) || !dynamic_cast<vcl::Window*>(this)->SupportsDoubleBuffering());
Hatch aHatch( rHatch );
@@ -137,6 +139,8 @@ void OutputDevice::AddHatchActions( const tools::PolyPolygon& rPolyPoly, const H
void OutputDevice::DrawHatch( const tools::PolyPolygon& rPolyPoly, const Hatch& rHatch, bool bMtf )
{
+ assert(!dynamic_cast<vcl::Window*>(this) || !dynamic_cast<vcl::Window*>(this)->SupportsDoubleBuffering());
+
if(rPolyPoly.Count())
{
// #i115630# DrawHatch does not work with beziers included in the polypolygon, take care of that
@@ -318,6 +322,8 @@ void OutputDevice::CalcHatchValues( const Rectangle& rRect, long nDist, sal_uInt
void OutputDevice::DrawHatchLine( const Line& rLine, const tools::PolyPolygon& rPolyPoly,
Point* pPtBuffer, bool bMtf )
{
+ assert(!dynamic_cast<vcl::Window*>(this) || !dynamic_cast<vcl::Window*>(this)->SupportsDoubleBuffering());
+
double fX, fY;
long nAdd, nPCounter = 0;
diff --git a/vcl/source/outdev/line.cxx b/vcl/source/outdev/line.cxx
index 790c285..f37280f 100644
--- a/vcl/source/outdev/line.cxx
+++ b/vcl/source/outdev/line.cxx
@@ -19,8 +19,9 @@
#include <numeric>
-#include <vcl/virdev.hxx>
#include <vcl/outdev.hxx>
+#include <vcl/virdev.hxx>
+#include <vcl/window.hxx>
#include <salgdi.hxx>
@@ -34,6 +35,7 @@
void OutputDevice::DrawLine( const Point& rStartPt, const Point& rEndPt,
const LineInfo& rLineInfo )
{
+ assert(!dynamic_cast<vcl::Window*>(this) || !dynamic_cast<vcl::Window*>(this)->SupportsDoubleBuffering());
if ( rLineInfo.IsDefault() )
{
@@ -87,6 +89,7 @@ void OutputDevice::DrawLine( const Point& rStartPt, const Point& rEndPt,
void OutputDevice::DrawLine( const Point& rStartPt, const Point& rEndPt )
{
+ assert(!dynamic_cast<vcl::Window*>(this) || !dynamic_cast<vcl::Window*>(this)->SupportsDoubleBuffering());
if ( mpMetaFile )
mpMetaFile->AddAction( new MetaLineAction( rStartPt, rEndPt ) );
diff --git a/vcl/source/outdev/mask.cxx b/vcl/source/outdev/mask.cxx
index b61115e..29737a1 100644
--- a/vcl/source/outdev/mask.cxx
+++ b/vcl/source/outdev/mask.cxx
@@ -19,6 +19,7 @@
#include <vcl/outdev.hxx>
#include <vcl/virdev.hxx>
+#include <vcl/window.hxx>
#include <salgdi.hxx>
#include <impbmp.hxx>
@@ -33,6 +34,8 @@ extern const sal_uLong nVCLLut[ 256 ];
void OutputDevice::DrawMask( const Point& rDestPt,
const Bitmap& rBitmap, const Color& rMaskColor )
{
+ assert(!dynamic_cast<vcl::Window*>(this) || !dynamic_cast<vcl::Window*>(this)->SupportsDoubleBuffering());
+
const Size aSizePix( rBitmap.GetSizePixel() );
DrawMask( rDestPt, PixelToLogic( aSizePix ), Point(), aSizePix, rBitmap, rMaskColor, MetaActionType::MASK );
}
@@ -40,6 +43,8 @@ void OutputDevice::DrawMask( const Point& rDestPt,
void OutputDevice::DrawMask( const Point& rDestPt, const Size& rDestSize,
const Bitmap& rBitmap, const Color& rMaskColor )
{
+ assert(!dynamic_cast<vcl::Window*>(this) || !dynamic_cast<vcl::Window*>(this)->SupportsDoubleBuffering());
+
DrawMask( rDestPt, rDestSize, Point(), rBitmap.GetSizePixel(), rBitmap, rMaskColor, MetaActionType::MASKSCALE );
}
@@ -48,6 +53,8 @@ void OutputDevice::DrawMask( const Point& rDestPt, const Size& rDestSize,
const Bitmap& rBitmap, const Color& rMaskColor,
const MetaActionType nAction )
{
+ assert(!dynamic_cast<vcl::Window*>(this) || !dynamic_cast<vcl::Window*>(this)->SupportsDoubleBuffering());
+
if( ImplIsRecordLayout() )
return;
@@ -101,6 +108,8 @@ void OutputDevice::DrawDeviceMask( const Bitmap& rMask, const Color& rMaskColor,
const Point& rDestPt, const Size& rDestSize,
const Point& rSrcPtPixel, const Size& rSrcSizePixel )
{
+ assert(!dynamic_cast<vcl::Window*>(this) || !dynamic_cast<vcl::Window*>(this)->SupportsDoubleBuffering());
+
const ImpBitmap* pImpBmp = rMask.ImplGetImpBitmap();
if ( pImpBmp )
{
diff --git a/vcl/source/outdev/nativecontrols.cxx b/vcl/source/outdev/nativecontrols.cxx
index e46df33..6fc43f6 100644
--- a/vcl/source/outdev/nativecontrols.cxx
+++ b/vcl/source/outdev/nativecontrols.cxx
@@ -272,6 +272,8 @@ bool OutputDevice::DrawNativeControl( ControlType nType,
const ImplControlValue& aValue,
const OUString& aCaption )
{
+ assert(!dynamic_cast<vcl::Window*>(this) || !dynamic_cast<vcl::Window*>(this)->SupportsDoubleBuffering());
+
if( !EnableNativeWidget( *this ) )
return false;
diff --git a/vcl/source/outdev/pixel.cxx b/vcl/source/outdev/pixel.cxx
index aeb34e8..c4f6528 100644
--- a/vcl/source/outdev/pixel.cxx
+++ b/vcl/source/outdev/pixel.cxx
@@ -57,6 +57,7 @@ Color OutputDevice::GetPixel( const Point& rPt ) const
void OutputDevice::DrawPixel( const Point& rPt )
{
+ assert(!dynamic_cast<vcl::Window*>(this) || !dynamic_cast<vcl::Window*>(this)->SupportsDoubleBuffering());
if ( mpMetaFile )
mpMetaFile->AddAction( new MetaPointAction( rPt ) );
@@ -86,6 +87,7 @@ void OutputDevice::DrawPixel( const Point& rPt )
void OutputDevice::DrawPixel( const Point& rPt, const Color& rColor )
{
+ assert(!dynamic_cast<vcl::Window*>(this) || !dynamic_cast<vcl::Window*>(this)->SupportsDoubleBuffering());
Color aColor = ImplDrawModeToColor( rColor );
@@ -114,6 +116,8 @@ void OutputDevice::DrawPixel( const Point& rPt, const Color& rColor )
void OutputDevice::DrawPixel( const Polygon& rPts, const Color* pColors )
{
+ assert(!dynamic_cast<vcl::Window*>(this) || !dynamic_cast<vcl::Window*>(this)->SupportsDoubleBuffering());
+
if ( !pColors )
{
DrawPixel( rPts, GetLineColor() );
@@ -159,6 +163,8 @@ void OutputDevice::DrawPixel( const Polygon& rPts, const Color* pColors )
void OutputDevice::DrawPixel( const Polygon& rPts, const Color& rColor )
{
+ assert(!dynamic_cast<vcl::Window*>(this) || !dynamic_cast<vcl::Window*>(this)->SupportsDoubleBuffering());
+
if( rColor != COL_TRANSPARENT && ! ImplIsRecordLayout() )
{
const sal_uInt16 nSize = rPts.GetSize();
diff --git a/vcl/source/outdev/polygon.cxx b/vcl/source/outdev/polygon.cxx
index 9741ffa..c25025c 100644
--- a/vcl/source/outdev/polygon.cxx
+++ b/vcl/source/outdev/polygon.cxx
@@ -25,14 +25,15 @@
#include <tools/poly.hxx>
#include <vcl/outdev.hxx>
#include <vcl/virdev.hxx>
+#include <vcl/window.hxx>
#include "salgdi.hxx"
-
#define OUTDEV_POLYPOLY_STACKBUF 32
void OutputDevice::DrawPolyPolygon( const tools::PolyPolygon& rPolyPoly )
{
+ assert(!dynamic_cast<vcl::Window*>(this) || !dynamic_cast<vcl::Window*>(this)->SupportsDoubleBuffering());
if( mpMetaFile )
mpMetaFile->AddAction( new MetaPolyPolygonAction( rPolyPoly ) );
@@ -130,6 +131,8 @@ void OutputDevice::DrawPolyPolygon( const tools::PolyPolygon& rPolyPoly )
void OutputDevice::DrawPolygon( const basegfx::B2DPolygon& rB2DPolygon)
{
+ assert(!dynamic_cast<vcl::Window*>(this) || !dynamic_cast<vcl::Window*>(this)->SupportsDoubleBuffering());
+
// AW: Do NOT paint empty polygons
if(rB2DPolygon.count())
{
@@ -140,6 +143,7 @@ void OutputDevice::DrawPolygon( const basegfx::B2DPolygon& rB2DPolygon)
void OutputDevice::DrawPolygon( const Polygon& rPoly )
{
+ assert(!dynamic_cast<vcl::Window*>(this) || !dynamic_cast<vcl::Window*>(this)->SupportsDoubleBuffering());
if( mpMetaFile )
mpMetaFile->AddAction( new MetaPolygonAction( rPoly ) );
@@ -235,6 +239,7 @@ void OutputDevice::DrawPolygon( const Polygon& rPoly )
void OutputDevice::DrawPolyPolygon( const basegfx::B2DPolyPolygon& rB2DPolyPoly )
{
+ assert(!dynamic_cast<vcl::Window*>(this) || !dynamic_cast<vcl::Window*>(this)->SupportsDoubleBuffering());
if( mpMetaFile )
mpMetaFile->AddAction( new MetaPolyPolygonAction( tools::PolyPolygon( rB2DPolyPoly ) ) );
diff --git a/vcl/source/outdev/polyline.cxx b/vcl/source/outdev/polyline.cxx
index b304913..236d2cd 100644
--- a/vcl/source/outdev/polyline.cxx
+++ b/vcl/source/outdev/polyline.cxx
@@ -23,13 +23,15 @@
#include <basegfx/polygon/b2dlinegeometry.hxx>
#include <vcl/outdev.hxx>
-#include <vcl/virdev.hxx>
#include <vcl/settings.hxx>
+#include <vcl/virdev.hxx>
+#include <vcl/window.hxx>
#include "salgdi.hxx"
void OutputDevice::DrawPolyLine( const Polygon& rPoly )
{
+ assert(!dynamic_cast<vcl::Window*>(this) || !dynamic_cast<vcl::Window*>(this)->SupportsDoubleBuffering());
if( mpMetaFile )
mpMetaFile->AddAction( new MetaPolyLineAction( rPoly ) );
@@ -99,6 +101,7 @@ void OutputDevice::DrawPolyLine( const Polygon& rPoly )
void OutputDevice::DrawPolyLine( const Polygon& rPoly, const LineInfo& rLineInfo )
{
+ assert(!dynamic_cast<vcl::Window*>(this) || !dynamic_cast<vcl::Window*>(this)->SupportsDoubleBuffering());
if ( rLineInfo.IsDefault() )
{
@@ -126,6 +129,7 @@ void OutputDevice::DrawPolyLine( const basegfx::B2DPolygon& rB2DPolygon,
basegfx::B2DLineJoin eLineJoin,
css::drawing::LineCap eLineCap)
{
+ assert(!dynamic_cast<vcl::Window*>(this) || !dynamic_cast<vcl::Window*>(this)->SupportsDoubleBuffering());
if( mpMetaFile )
{
@@ -271,6 +275,8 @@ bool OutputDevice::DrawPolyLineDirect( const basegfx::B2DPolygon& rB2DPolygon,
css::drawing::LineCap eLineCap,
bool bBypassAACheck )
{
+ assert(!dynamic_cast<vcl::Window*>(this) || !dynamic_cast<vcl::Window*>(this)->SupportsDoubleBuffering());
+
// AW: Do NOT paint empty PolyPolygons
if(!rB2DPolygon.count())
return true;
diff --git a/vcl/source/outdev/rect.cxx b/vcl/source/outdev/rect.cxx
index ceb91cd..4492352 100644
--- a/vcl/source/outdev/rect.cxx
+++ b/vcl/source/outdev/rect.cxx
@@ -21,13 +21,16 @@
#include <tools/poly.hxx>
#include <tools/helpers.hxx>
-#include <vcl/virdev.hxx>
#include <vcl/outdev.hxx>
+#include <vcl/virdev.hxx>
+#include <vcl/window.hxx>
#include "salgdi.hxx"
void OutputDevice::DrawRect( const Rectangle& rRect )
{
+ assert(!dynamic_cast<vcl::Window*>(this) || !dynamic_cast<vcl::Window*>(this)->SupportsDoubleBuffering());
+
if ( mpMetaFile )
mpMetaFile->AddAction( new MetaRectAction( rRect ) );
@@ -65,6 +68,8 @@ void OutputDevice::DrawRect( const Rectangle& rRect )
void OutputDevice::DrawRect( const Rectangle& rRect,
sal_uLong nHorzRound, sal_uLong nVertRound )
{
+ assert(!dynamic_cast<vcl::Window*>(this) || !dynamic_cast<vcl::Window*>(this)->SupportsDoubleBuffering());
+
if ( mpMetaFile )
mpMetaFile->AddAction( new MetaRoundRectAction( rRect, nHorzRound, nVertRound ) );
@@ -123,6 +128,8 @@ void OutputDevice::DrawRect( const Rectangle& rRect,
void OutputDevice::DrawCheckered(const Point& rPos, const Size& rSize, sal_uInt32 nLen, Color aStart, Color aEnd)
{
+ assert(!dynamic_cast<vcl::Window*>(this) || !dynamic_cast<vcl::Window*>(this)->SupportsDoubleBuffering());
+
const sal_uInt32 nMaxX(rPos.X() + rSize.Width());
const sal_uInt32 nMaxY(rPos.Y() + rSize.Height());
@@ -147,6 +154,8 @@ void OutputDevice::DrawCheckered(const Point& rPos, const Size& rSize, sal_uInt3
void OutputDevice::DrawGrid( const Rectangle& rRect, const Size& rDist, DrawGridFlags nFlags )
{
+ assert(!dynamic_cast<vcl::Window*>(this) || !dynamic_cast<vcl::Window*>(this)->SupportsDoubleBuffering());
+
Rectangle aDstRect( PixelToLogic( Point() ), GetOutputSize() );
aDstRect.Intersection( rRect );
diff --git a/vcl/source/outdev/text.cxx b/vcl/source/outdev/text.cxx
index cda2ba2..5c1749f 100644
--- a/vcl/source/outdev/text.cxx
+++ b/vcl/source/outdev/text.cxx
@@ -838,7 +838,7 @@ void OutputDevice::DrawText( const Point& rStartPt, const OUString& rStr,
MetricVector* pVector, OUString* pDisplayText
)
{
-
+ assert(!dynamic_cast<vcl::Window*>(this) || !dynamic_cast<vcl::Window*>(this)->SupportsDoubleBuffering());
if(nLen == 0x0FFFF)
{
@@ -961,6 +961,8 @@ void OutputDevice::DrawTextArray( const Point& rStartPt, const OUString& rStr,
const long* pDXAry,
sal_Int32 nIndex, sal_Int32 nLen, SalLayoutFlags flags )
{
+ assert(!dynamic_cast<vcl::Window*>(this) || !dynamic_cast<vcl::Window*>(this)->SupportsDoubleBuffering());
+
if(nLen == 0x0FFFF)
{
SAL_INFO("sal.rtl.xub",
@@ -1164,6 +1166,8 @@ void OutputDevice::DrawStretchText( const Point& rStartPt, sal_uLong nWidth,
const OUString& rStr,
sal_Int32 nIndex, sal_Int32 nLen)
{
+ assert(!dynamic_cast<vcl::Window*>(this) || !dynamic_cast<vcl::Window*>(this)->SupportsDoubleBuffering());
+
if(nIndex < 0 || nIndex == 0x0FFFF || nLen == 0x0FFFF)
{
SAL_INFO("sal.rtl.xub",
@@ -1836,6 +1840,8 @@ void OutputDevice::DrawText( const Rectangle& rRect, const OUString& rOrigStr, D
MetricVector* pVector, OUString* pDisplayText,
vcl::ITextLayout* _pTextLayout )
{
+ assert(!dynamic_cast<vcl::Window*>(this) || !dynamic_cast<vcl::Window*>(this)->SupportsDoubleBuffering());
+
if (mpOutDevData->mpRecordLayout)
{
pVector = &mpOutDevData->mpRecordLayout->m_aUnicodeBoundRects;
@@ -2142,6 +2148,7 @@ void OutputDevice::DrawCtrlText( const Point& rPos, const OUString& rStr,
sal_Int32 nIndex, sal_Int32 nLen,
DrawTextFlags nStyle, MetricVector* pVector, OUString* pDisplayText )
{
+ assert(!dynamic_cast<vcl::Window*>(this) || !dynamic_cast<vcl::Window*>(this)->SupportsDoubleBuffering());
if(nLen == 0x0FFFF)
{
diff --git a/vcl/source/outdev/textline.cxx b/vcl/source/outdev/textline.cxx
index 9f3820f..8e55eca 100644
--- a/vcl/source/outdev/textline.cxx
+++ b/vcl/source/outdev/textline.cxx
@@ -19,8 +19,9 @@
#include <sal/types.h>
#include <vcl/outdev.hxx>
-#include <vcl/virdev.hxx>
#include <vcl/settings.hxx>
+#include <vcl/virdev.hxx>
+#include <vcl/window.hxx>
#include <tools/helpers.hxx>
@@ -940,6 +941,7 @@ void OutputDevice::DrawTextLine( const Point& rPos, long nWidth,
FontUnderline eOverline,
bool bUnderlineAbove )
{
+ assert(!dynamic_cast<vcl::Window*>(this) || !dynamic_cast<vcl::Window*>(this)->SupportsDoubleBuffering());
if ( mpMetaFile )
mpMetaFile->AddAction( new MetaTextLineAction( rPos, nWidth, eStrikeout, eUnderline, eOverline ) );
@@ -983,6 +985,7 @@ void OutputDevice::DrawTextLine( const Point& rPos, long nWidth,
void OutputDevice::DrawWaveLine( const Point& rStartPos, const Point& rEndPos )
{
+ assert(!dynamic_cast<vcl::Window*>(this) || !dynamic_cast<vcl::Window*>(this)->SupportsDoubleBuffering());
if ( !IsDeviceOutputNecessary() || ImplIsRecordLayout() )
return;
diff --git a/vcl/source/outdev/transparent.cxx b/vcl/source/outdev/transparent.cxx
index f51bb64..7d4e027 100644
--- a/vcl/source/outdev/transparent.cxx
+++ b/vcl/source/outdev/transparent.cxx
@@ -21,10 +21,11 @@
#include <basegfx/matrix/b2dhommatrixtools.hxx>
#include <boost/scoped_array.hpp>
-#include <vcl/outdev.hxx>
-#include <vcl/virdev.hxx>
#include <vcl/bmpacc.hxx>
+#include <vcl/outdev.hxx>
#include <vcl/settings.hxx>
+#include <vcl/virdev.hxx>
+#include <vcl/window.hxx>
#include "outdata.hxx"
#include "salgdi.hxx"
@@ -217,6 +218,8 @@ void OutputDevice::ImplPrintTransparent( const Bitmap& rBmp, const Bitmap& rMask
void OutputDevice::DrawTransparent( const basegfx::B2DPolyPolygon& rB2DPolyPoly, double fTransparency)
{
+ assert(!dynamic_cast<vcl::Window*>(this) || !dynamic_cast<vcl::Window*>(this)->SupportsDoubleBuffering());
+
// AW: Do NOT paint empty PolyPolygons
if(!rB2DPolyPoly.count())
return;
@@ -279,6 +282,8 @@ void OutputDevice::DrawTransparent( const basegfx::B2DPolyPolygon& rB2DPolyPoly,
void OutputDevice::DrawInvisiblePolygon( const tools::PolyPolygon& rPolyPoly )
{
+ assert(!dynamic_cast<vcl::Window*>(this) || !dynamic_cast<vcl::Window*>(this)->SupportsDoubleBuffering());
+
// short circuit if the polygon border is invisible too
if( !mbLineColor )
return;
@@ -293,6 +298,8 @@ void OutputDevice::DrawInvisiblePolygon( const tools::PolyPolygon& rPolyPoly )
bool OutputDevice::DrawTransparentNatively ( const tools::PolyPolygon& rPolyPoly,
sal_uInt16 nTransparencePercent )
{
+ assert(!dynamic_cast<vcl::Window*>(this) || !dynamic_cast<vcl::Window*>(this)->SupportsDoubleBuffering());
+
bool bDrawn = false;
// debug helper:
@@ -600,6 +607,8 @@ void OutputDevice::EmulateDrawTransparent ( const tools::PolyPolygon& rPolyPoly,
void OutputDevice::DrawTransparent( const tools::PolyPolygon& rPolyPoly,
sal_uInt16 nTransparencePercent )
{
+ assert(!dynamic_cast<vcl::Window*>(this) || !dynamic_cast<vcl::Window*>(this)->SupportsDoubleBuffering());
+
// short circuit for drawing an opaque polygon
if( (nTransparencePercent < 1) || (mnDrawMode & DrawModeFlags::NoTransparency) )
{
@@ -650,6 +659,7 @@ void OutputDevice::DrawTransparent( const tools::PolyPolygon& rPolyPoly,
void OutputDevice::DrawTransparent( const GDIMetaFile& rMtf, const Point& rPos,
const Size& rSize, const Gradient& rTransparenceGradient )
{
+ assert(!dynamic_cast<vcl::Window*>(this) || !dynamic_cast<vcl::Window*>(this)->SupportsDoubleBuffering());
const Color aBlack( COL_BLACK );
diff --git a/vcl/source/outdev/wallpaper.cxx b/vcl/source/outdev/wallpaper.cxx
index ba7928b..c9f3c4c 100644
--- a/vcl/source/outdev/wallpaper.cxx
+++ b/vcl/source/outdev/wallpaper.cxx
@@ -19,12 +19,15 @@
#include <vcl/outdev.hxx>
#include <vcl/virdev.hxx>
+#include <vcl/window.hxx>
#include <wall2.hxx>
void OutputDevice::DrawWallpaper( const Rectangle& rRect,
const Wallpaper& rWallpaper )
{
+ assert(!dynamic_cast<vcl::Window*>(this) || !dynamic_cast<vcl::Window*>(this)->SupportsDoubleBuffering());
+
if ( mpMetaFile )
mpMetaFile->AddAction( new MetaWallpaperAction( rRect, rWallpaper ) );
@@ -51,6 +54,8 @@ void OutputDevice::DrawWallpaper( long nX, long nY,
long nWidth, long nHeight,
const Wallpaper& rWallpaper )
{
+ assert(!dynamic_cast<vcl::Window*>(this) || !dynamic_cast<vcl::Window*>(this)->SupportsDoubleBuffering());
+
if( rWallpaper.IsBitmap() )
DrawBitmapWallpaper( nX, nY, nWidth, nHeight, rWallpaper );
else if( rWallpaper.IsGradient() )
@@ -63,6 +68,8 @@ void OutputDevice::DrawColorWallpaper( long nX, long nY,
long nWidth, long nHeight,
const Wallpaper& rWallpaper )
{
+ assert(!dynamic_cast<vcl::Window*>(this) || !dynamic_cast<vcl::Window*>(this)->SupportsDoubleBuffering());
+
// draw wallpaper without border
Color aOldLineColor = GetLineColor();
Color aOldFillColor = GetFillColor();
@@ -100,6 +107,8 @@ void OutputDevice::DrawBitmapWallpaper( long nX, long nY,
long nWidth, long nHeight,
const Wallpaper& rWallpaper )
{
+ assert(!dynamic_cast<vcl::Window*>(this) || !dynamic_cast<vcl::Window*>(this)->SupportsDoubleBuffering());
+
BitmapEx aBmpEx;
const BitmapEx* pCached = rWallpaper.ImplGetImpWallpaper()->ImplGetCachedBitmap();
Point aPos;
@@ -336,6 +345,8 @@ void OutputDevice::DrawGradientWallpaper( long nX, long nY,
long nWidth, long nHeight,
const Wallpaper& rWallpaper )
{
+ assert(!dynamic_cast<vcl::Window*>(this) || !dynamic_cast<vcl::Window*>(this)->SupportsDoubleBuffering());
+
Rectangle aBound;
GDIMetaFile* pOldMetaFile = mpMetaFile;
const bool bOldMap = mbMap;
commit 5b42e32dcf0142b8ea3ffcfc2c7bbf9e4325465f
Author: Jan Holesovsky <kendy at collabora.com>
Date: Sat May 23 18:24:47 2015 +0200
rendercontext: PushPaintHelper needs the buffer as param too.
Change-Id: I4e787356bd17fcaffdbe0dc51a549b359f416766
diff --git a/vcl/source/window/paint.cxx b/vcl/source/window/paint.cxx
index e220a37..9776721 100644
--- a/vcl/source/window/paint.cxx
+++ b/vcl/source/window/paint.cxx
@@ -227,7 +227,7 @@ void PaintHelper::DoPaint(const vcl::Region* pRegion)
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->PushPaintHelper(this, *m_pBuffer.get());
m_pWindow->Paint(*m_pBuffer.get(), m_aPaintRect);
// restore the mnOutOffX/Y value
commit b0cd381de11340de8e72020f774a64d3ade6bbd9
Author: Jan Holesovsky <kendy at collabora.com>
Date: Sat May 23 15:31:51 2015 +0200
rendercontext: Initialize X11SalVirtualDevice with appropriate SalGraphics.
Change-Id: I4230412ccc389b8ba6768229b569d7075e7ac466
diff --git a/vcl/inc/opengl/x11/salvd.hxx b/vcl/inc/opengl/x11/salvd.hxx
index 2d60898..e4e6ecd 100644
--- a/vcl/inc/opengl/x11/salvd.hxx
+++ b/vcl/inc/opengl/x11/salvd.hxx
@@ -18,6 +18,7 @@
class SalDisplay;
class X11OpenGLSalGraphics;
+class X11SalGraphics;
class X11OpenGLSalVirtualDevice : public SalVirtualDevice
{
diff --git a/vcl/inc/unx/gtk/gtkgdi.hxx b/vcl/inc/unx/gtk/gtkgdi.hxx
index e0d0881..60b1513 100644
--- a/vcl/inc/unx/gtk/gtkgdi.hxx
+++ b/vcl/inc/unx/gtk/gtkgdi.hxx
@@ -26,12 +26,13 @@
#include <gdk/gdkkeysyms.h>
#include <postx.h>
+#include <unx/gtk/gtkframe.hxx>
+
#if GTK_CHECK_VERSION(3,0,0)
#include <headless/svpgdi.hxx>
#include "textrender.hxx"
-class GtkSalFrame;
class GtkSalGraphics : public SvpSalGraphics
{
GtkSalFrame *mpFrame;
diff --git a/vcl/inc/unx/salinst.h b/vcl/inc/unx/salinst.h
index b8feb71..381ddda 100644
--- a/vcl/inc/unx/salinst.h
+++ b/vcl/inc/unx/salinst.h
@@ -34,6 +34,8 @@ namespace com { namespace sun { namespace star { namespace datatransfer {
} } } }
class SalXLib;
+class X11SalGraphics;
+
class VCLPLUG_GEN_PUBLIC X11SalInstance : public SalGenericInstance
{
private:
@@ -53,6 +55,10 @@ public:
virtual SalObject* CreateObject( SalFrame* pParent, SystemWindowData* pWindowData, bool bShow = true ) SAL_OVERRIDE;
virtual void DestroyObject( SalObject* pObject ) SAL_OVERRIDE;
+ /// Gtk vclplug needs to pass GtkSalGraphics to X11SalVirtualDevice, so create it, and pass as pNewGraphics.
+ virtual SalVirtualDevice* CreateX11VirtualDevice(SalGraphics* pGraphics, long &nDX, long &nDY,
+ sal_uInt16 nBitCount, const SystemGraphicsData* pData, X11SalGraphics* pNewGraphics);
+
virtual SalVirtualDevice* CreateVirtualDevice( SalGraphics* pGraphics,
long &nDX, long &nDY,
sal_uInt16 nBitCount, const SystemGraphicsData *pData = NULL ) SAL_OVERRIDE;
diff --git a/vcl/inc/unx/salvd.h b/vcl/inc/unx/salvd.h
index 4f98c0c..14ad97e 100644
--- a/vcl/inc/unx/salvd.h
+++ b/vcl/inc/unx/salvd.h
@@ -44,10 +44,9 @@ class X11SalVirtualDevice : public SalVirtualDevice
bool bExternPixmap_;
public:
- X11SalVirtualDevice( SalGraphics *pGraphics,
- long &nDX, long &nDY,
- sal_uInt16 nBitCount,
- const SystemGraphicsData *pData );
+ X11SalVirtualDevice(SalGraphics *pGraphics, long &nDX, long &nDY,
+ sal_uInt16 nBitCount, const SystemGraphicsData *pData, X11SalGraphics* pNewGraphics);
+
virtual ~X11SalVirtualDevice();
Display *GetXDisplay() const
diff --git a/vcl/unx/generic/gdi/salvd.cxx b/vcl/unx/generic/gdi/salvd.cxx
index f64612b..847ea9d 100644
--- a/vcl/unx/generic/gdi/salvd.cxx
+++ b/vcl/unx/generic/gdi/salvd.cxx
@@ -35,14 +35,20 @@
#include <vcl/opengl/OpenGLHelper.hxx>
#include <opengl/x11/salvd.hxx>
-SalVirtualDevice* X11SalInstance::CreateVirtualDevice( SalGraphics* pGraphics,
- long &nDX, long &nDY,
- sal_uInt16 nBitCount, const SystemGraphicsData *pData )
+SalVirtualDevice* X11SalInstance::CreateX11VirtualDevice(SalGraphics* pGraphics,
+ long &nDX, long &nDY, sal_uInt16 nBitCount, const SystemGraphicsData *pData,
+ X11SalGraphics* pNewGraphics)
{
if (OpenGLHelper::isVCLOpenGLEnabled())
return new X11OpenGLSalVirtualDevice( pGraphics, nDX, nDY, nBitCount, pData );
else
- return new X11SalVirtualDevice( pGraphics, nDX, nDY, nBitCount, pData );
+ return new X11SalVirtualDevice(pGraphics, nDX, nDY, nBitCount, pData, pNewGraphics);
+}
+
+SalVirtualDevice* X11SalInstance::CreateVirtualDevice(SalGraphics* pGraphics,
+ long &nDX, long &nDY, sal_uInt16 nBitCount, const SystemGraphicsData *pData)
+{
+ return CreateX11VirtualDevice(pGraphics, nDX, nDY, nBitCount, pData, new X11SalGraphics());
}
void X11SalGraphics::Init( X11SalVirtualDevice *pDevice, SalColormap* pColormap,
@@ -81,12 +87,12 @@ void X11SalGraphics::Init( X11SalVirtualDevice *pDevice, SalColormap* pColormap,
mxImpl->Init();
}
-X11SalVirtualDevice::X11SalVirtualDevice( SalGraphics* pGraphics,
- long &nDX, long &nDY,
- sal_uInt16 nBitCount,
- const SystemGraphicsData *pData ) :
- m_nXScreen( 0 ),
- bGraphics_( false )
+X11SalVirtualDevice::X11SalVirtualDevice(SalGraphics* pGraphics, long &nDX, long &nDY,
+ sal_uInt16 nBitCount, const SystemGraphicsData *pData,
+ X11SalGraphics* pNewGraphics) :
+ pGraphics_(pNewGraphics),
+ m_nXScreen(0),
+ bGraphics_(false)
{
SalColormap* pColormap = NULL;
bool bDeleteColormap = false;
@@ -95,7 +101,6 @@ X11SalVirtualDevice::X11SalVirtualDevice( SalGraphics* pGraphics,
nBitCount = pGraphics->GetBitCount();
pDisplay_ = vcl_sal::getSalDisplay(GetGenericData());
- pGraphics_ = new X11SalGraphics();
nDepth_ = nBitCount;
if( pData && pData->hDrawable != None )
diff --git a/vcl/unx/gtk/app/gtkinst.cxx b/vcl/unx/gtk/app/gtkinst.cxx
index f9883c8..11a18e5 100644
--- a/vcl/unx/gtk/app/gtkinst.cxx
+++ b/vcl/unx/gtk/app/gtkinst.cxx
@@ -23,6 +23,7 @@
#include <unx/gtk/gtkdata.hxx>
#include <unx/gtk/gtkinst.hxx>
#include <unx/salobj.h>
+#include <unx/gtk/gtkgdi.hxx>
#include <unx/gtk/gtkframe.hxx>
#include <unx/gtk/gtkobject.hxx>
#include <unx/gtk/atkbridge.hxx>
@@ -320,7 +321,10 @@ SalVirtualDevice* GtkInstance::CreateVirtualDevice( SalGraphics *pG,
pNew->SetSize( nDX, nDY );
return pNew;
#else
- return X11SalInstance::CreateVirtualDevice( pG, nDX, nDY, nBitCount, pGd );
+ GtkSalGraphics *pGtkSalGraphics = dynamic_cast<GtkSalGraphics*>(pG);
+ assert(pGtkSalGraphics);
+ return CreateX11VirtualDevice(pG, nDX, nDY, nBitCount, pGd,
+ new GtkSalGraphics(pGtkSalGraphics->GetGtkFrame(), pGtkSalGraphics->GetGtkWidget()));
#endif
}
More information about the Libreoffice-commits
mailing list