[Libreoffice-commits] core.git: 6 commits - canvas/source chart2/source cppcanvas/source desktop/CppunitTest_desktop_lib.mk desktop/qa desktop/source drawinglayer/source external/cairo filter/source include/LibreOfficeKit include/vcl libreofficekit/source sc/source sd/source svl/source svtools/source svx/source sw/source vcl/generic vcl/headless vcl/inc vcl/Library_vcl.mk vcl/Library_vclplug_gtk3.mk vcl/opengl vcl/qa vcl/quartz vcl/source vcl/unx vcl/win vcl/workben

Laurent Balland-Poirier laurent.balland-poirier at laposte.net
Mon Nov 23 06:28:32 PST 2015


 canvas/source/directx/dx_textlayout_drawhelper.cxx             |   28 
 canvas/source/vcl/backbuffer.cxx                               |    2 
 canvas/source/vcl/bitmapbackbuffer.cxx                         |    2 
 chart2/source/view/main/3DChartObjects.cxx                     |    3 
 chart2/source/view/main/DummyXShape.cxx                        |    3 
 cppcanvas/source/mtfrenderer/transparencygroupaction.cxx       |    2 
 desktop/CppunitTest_desktop_lib.mk                             |    1 
 desktop/qa/desktop_lib/test_desktop_lib.cxx                    |    6 
 desktop/source/lib/init.cxx                                    |   27 
 drawinglayer/source/primitive2d/graphicprimitivehelper2d.cxx   |    3 
 drawinglayer/source/processor2d/vclhelperbufferdevice.cxx      |   19 
 external/cairo/UnpackedTarball_cairo.mk                        |    1 
 external/cairo/cairo/cairo.GL_RGBA.patch                       |   41 
 filter/source/graphicfilter/eps/eps.cxx                        |    2 
 filter/source/msfilter/msdffimp.cxx                            |    2 
 include/LibreOfficeKit/LibreOfficeKitEnums.h                   |    2 
 include/vcl/salgtype.hxx                                       |    9 
 include/vcl/virdev.hxx                                         |   47 
 libreofficekit/source/gtk/lokdocview.cxx                       |   22 
 libreofficekit/source/gtk/tilebuffer.cxx                       |    9 
 libreofficekit/source/gtk/tilebuffer.hxx                       |   17 
 sc/source/core/data/documen8.cxx                               |    4 
 sd/source/ui/presenter/PresenterTextView.cxx                   |    5 
 sd/source/ui/slidesorter/view/SlsInsertionIndicatorOverlay.cxx |    2 
 svl/source/numbers/zformat.cxx                                 |    5 
 svtools/source/table/gridtablerenderer.cxx                     |    3 
 svx/source/customshapes/EnhancedCustomShapeFontWork.cxx        |    4 
 svx/source/dialog/dialcontrol.cxx                              |    2 
 sw/source/core/doc/DocumentDeviceManager.cxx                   |    4 
 sw/source/uibase/uno/unotxdoc.cxx                              |    4 
 vcl/Library_vcl.mk                                             |    6 
 vcl/Library_vclplug_gtk3.mk                                    |    1 
 vcl/generic/glyphs/gcach_ftyp.cxx                              |  272 -----
 vcl/generic/glyphs/gcach_rbmp.cxx                              |  251 -----
 vcl/headless/svpbmp.cxx                                        |    2 
 vcl/headless/svpcairotextrender.cxx                            |   43 
 vcl/headless/svpcairotextrender.hxx                            |   34 
 vcl/headless/svpgdi.cxx                                        |   43 
 vcl/headless/svpglyphcache.cxx                                 |   71 +
 vcl/headless/svpinst.cxx                                       |   46 
 vcl/headless/svptext.cxx                                       |   14 
 vcl/headless/svptextrender.cxx                                 |  500 ----------
 vcl/headless/svpvd.cxx                                         |   11 
 vcl/inc/cairotextrender.hxx                                    |    4 
 vcl/inc/generic/glyphcache.hxx                                 |   29 
 vcl/inc/headless/svpbmp.hxx                                    |    2 
 vcl/inc/headless/svpgdi.hxx                                    |   12 
 vcl/inc/headless/svpinst.hxx                                   |   15 
 vcl/inc/headless/svptextrender.hxx                             |   85 -
 vcl/inc/headless/svpvd.hxx                                     |    4 
 vcl/inc/opengl/x11/salvd.hxx                                   |    2 
 vcl/inc/osx/salinst.h                                          |    2 
 vcl/inc/quartz/salvd.h                                         |    2 
 vcl/inc/salinst.hxx                                            |    3 
 vcl/inc/unx/gtk/gtkinst.hxx                                    |    2 
 vcl/inc/unx/salinst.h                                          |    4 
 vcl/inc/unx/salvd.h                                            |    2 
 vcl/inc/win/salinst.h                                          |    2 
 vcl/opengl/x11/salvd.cxx                                       |   17 
 vcl/qa/cppunit/lifecycle.cxx                                   |    2 
 vcl/quartz/salvd.cxx                                           |   27 
 vcl/source/gdi/bitmapex.cxx                                    |    3 
 vcl/source/gdi/gdimtf.cxx                                      |    2 
 vcl/source/gdi/pdfwriter_impl.cxx                              |    2 
 vcl/source/gdi/virdev.cxx                                      |   64 -
 vcl/source/outdev/text.cxx                                     |    6 
 vcl/source/outdev/transparent.cxx                              |    2 
 vcl/source/window/paint.cxx                                    |    4 
 vcl/unx/generic/gdi/cairo_xlib_cairo.cxx                       |   23 
 vcl/unx/generic/gdi/cairo_xlib_cairo.hxx                       |    4 
 vcl/unx/generic/gdi/cairotextrender.cxx                        |    2 
 vcl/unx/generic/gdi/salvd.cxx                                  |   25 
 vcl/unx/gtk/gtkinst.cxx                                        |    6 
 vcl/unx/gtk/gtksalframe.cxx                                    |    4 
 vcl/unx/gtk3/cairo_gtk3_cairo.cxx                              |    2 
 vcl/unx/gtk3/gtk3cairotextrender.cxx                           |   43 
 vcl/unx/gtk3/gtk3cairotextrender.hxx                           |   34 
 vcl/unx/gtk3/gtk3salnativewidgets-gtk.cxx                      |    3 
 vcl/win/source/gdi/salvd.cxx                                   |   13 
 vcl/workben/vcldemo.cxx                                        |    2 
 80 files changed, 536 insertions(+), 1499 deletions(-)

New commits:
commit 96ff6372e15fa17211650ec6f0da13771a572a42
Author: Laurent Balland-Poirier <laurent.balland-poirier at laposte.net>
Date:   Thu Nov 19 22:49:59 2015 +0100

    tdf#95677 Force sign to exponent for Excel export
    
    Change-Id: I7896d1d064cd92fd45a6b32ac64f534f68213169
    Reviewed-on: https://gerrit.libreoffice.org/20064
    Reviewed-by: Eike Rathke <erack at redhat.com>
    Tested-by: Eike Rathke <erack at redhat.com>

diff --git a/svl/source/numbers/zformat.cxx b/svl/source/numbers/zformat.cxx
index 479b28a..690e045 100644
--- a/svl/source/numbers/zformat.cxx
+++ b/svl/source/numbers/zformat.cxx
@@ -4861,6 +4861,11 @@ OUString SvNumberformat::GetMappedFormatstring( const NfKeywordTable& rKeywords,
                     case NF_SYMBOLTYPE_THSEP :
                         aStr.append( rLocWrp.getNumThousandSep() );
                         break;
+                    case NF_SYMBOLTYPE_EXP :
+                        // tdf#95677: Excel does not support exponent without sign
+                        aStr.append( rKeywords[NF_KEY_E] );
+                        aStr.append( "+" );
+                        break;
                     case NF_SYMBOLTYPE_DATESEP :
                         aStr.append( rLocWrp.getDateSep() );
                         break;
commit d058765ff3c4f3aaa84c3f9bec774aed8a8b32a3
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Mon Nov 23 11:04:26 2015 +0000

    updae getTileMode
    
    Change-Id: Ic8d67f08d40f475020c0534570fe3bea07aa431b

diff --git a/desktop/source/lib/init.cxx b/desktop/source/lib/init.cxx
index 69ff1c3..0a1844a 100644
--- a/desktop/source/lib/init.cxx
+++ b/desktop/source/lib/init.cxx
@@ -963,7 +963,7 @@ void doc_paintTile (LibreOfficeKitDocument* pThis,
 
 static int doc_getTileMode(LibreOfficeKitDocument* /*pThis*/)
 {
-    return LOK_TILEMODE_RGBA;
+    return LOK_TILEMODE_BGRA;
 }
 
 static void doc_getDocumentSize(LibreOfficeKitDocument* pThis,
diff --git a/include/LibreOfficeKit/LibreOfficeKitEnums.h b/include/LibreOfficeKit/LibreOfficeKitEnums.h
index b713f0e..a0f5e88 100644
--- a/include/LibreOfficeKit/LibreOfficeKitEnums.h
+++ b/include/LibreOfficeKit/LibreOfficeKitEnums.h
@@ -36,7 +36,7 @@ LibreOfficeKitPartMode;
 typedef enum
 {
     LOK_TILEMODE_RGBA,
-    LOK_TILEMODE_ARGB
+    LOK_TILEMODE_BGRA
 }
 LibreOfficeKitTileMode;
 
commit 3dc8907dd32281192c47030d16c5628eccc23564
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Thu Nov 19 12:07:27 2015 +0000

    we always have cairo and top down devices now
    
    Change-Id: I0eb3083bf402e86f95206e619e5da2e76aa627a8

diff --git a/vcl/headless/svpgdi.cxx b/vcl/headless/svpgdi.cxx
index 1fd0820..1a625fc 100644
--- a/vcl/headless/svpgdi.cxx
+++ b/vcl/headless/svpgdi.cxx
@@ -184,14 +184,7 @@ bool SvpSalGraphics::drawAlphaRect(long nX, long nY, long nWidth, long nHeight,
     }
 
     cairo_t* cr = getCairoContext();
-    if (!cr)
-        return bRet;
-
-    if (!m_aDevice->isTopDown())
-    {
-        cairo_scale(cr, 1, -1.0);
-        cairo_translate(cr, 0.0, -m_aDevice->getSize().getY());
-    }
+    assert(cr && m_aDevice->isTopDown());
 
     clipRegion(cr);
 
@@ -739,14 +732,7 @@ bool SvpSalGraphics::drawPolyPolygon(const basegfx::B2DPolyPolygon& rPolyPoly, d
     }
 
     cairo_t* cr = getCairoContext();
-    if (!cr)
-        return false;
-
-    if (!m_aDevice->isTopDown())
-    {
-        cairo_scale(cr, 1, -1.0);
-        cairo_translate(cr, 0.0, -m_aDevice->getSize().getY());
-    }
+    assert(cr && m_aDevice->isTopDown());
 
     clipRegion(cr);
 
commit b639fe60eab2a221e23dc9d509f9281857d656a3
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Thu Nov 19 11:51:47 2015 +0000

    VirtualDevices either match another device depth, or are 1 bit
    
    cairo can therefore always render to a svp virtual device with
    need for a fallback
    
    Change-Id: I5d03ae541820389e26f7448444444be009fb28a4

diff --git a/canvas/source/directx/dx_textlayout_drawhelper.cxx b/canvas/source/directx/dx_textlayout_drawhelper.cxx
index 574a969..c530aaa 100644
--- a/canvas/source/directx/dx_textlayout_drawhelper.cxx
+++ b/canvas/source/directx/dx_textlayout_drawhelper.cxx
@@ -84,7 +84,7 @@ namespace dxcanvas
         SystemGraphicsData aSystemGraphicsData;
         aSystemGraphicsData.nSize = sizeof(SystemGraphicsData);
         aSystemGraphicsData.hDC = reinterpret_cast< ::HDC >(hdc);
-        ScopedVclPtrInstance<VirtualDevice> xVirtualDevice(&aSystemGraphicsData, Size(1, 1), DeviceFormat::FULLCOLOR);
+        ScopedVclPtrInstance<VirtualDevice> xVirtualDevice(&aSystemGraphicsData, Size(1, 1), DeviceFormat::DEFAULT);
 
         // disable font antialiasing - GDI does not handle alpha
         // surfaces properly.
@@ -240,7 +240,7 @@ namespace dxcanvas
         SystemGraphicsData aSystemGraphicsData;
         aSystemGraphicsData.nSize = sizeof(SystemGraphicsData);
         aSystemGraphicsData.hDC = reinterpret_cast< ::HDC >(GetDC( NULL ));
-        ScopedVclPtrInstance<VirtualDevice> xVirtualDevice(&aSystemGraphicsData, Size(1, 1), DeviceFormat::FULLCOLOR);
+        ScopedVclPtrInstance<VirtualDevice> xVirtualDevice(&aSystemGraphicsData, Size(1, 1), DeviceFormat::DEFAULT);
 
         // create the font
         const css::rendering::FontRequest& rFontRequest = rCanvasFont->getFontRequest();
diff --git a/canvas/source/vcl/backbuffer.cxx b/canvas/source/vcl/backbuffer.cxx
index 39a1b67..143f7a2 100644
--- a/canvas/source/vcl/backbuffer.cxx
+++ b/canvas/source/vcl/backbuffer.cxx
@@ -27,7 +27,7 @@ namespace vclcanvas
     BackBuffer::BackBuffer( const OutputDevice& rRefDevice,
                             bool                bMonochromeBuffer ) :
         maVDev( VclPtr<VirtualDevice>::Create( rRefDevice,
-                                   bMonochromeBuffer ? DeviceFormat::BITMASK : DeviceFormat::FULLCOLOR ) )
+                                   bMonochromeBuffer ? DeviceFormat::BITMASK : DeviceFormat::DEFAULT ) )
     {
         if( !bMonochromeBuffer )
         {
diff --git a/canvas/source/vcl/bitmapbackbuffer.cxx b/canvas/source/vcl/bitmapbackbuffer.cxx
index 1fb22b0..c746b18 100644
--- a/canvas/source/vcl/bitmapbackbuffer.cxx
+++ b/canvas/source/vcl/bitmapbackbuffer.cxx
@@ -112,7 +112,7 @@ namespace vclcanvas
             // VDev not yet created, do it now. Create an alpha-VDev,
             // if bitmap has transparency.
             mpVDev = maBitmap->IsTransparent() ?
-                VclPtr<VirtualDevice>::Create( mrRefDevice, DeviceFormat::FULLCOLOR, DeviceFormat::FULLCOLOR ) :
+                VclPtr<VirtualDevice>::Create( mrRefDevice, DeviceFormat::DEFAULT, DeviceFormat::DEFAULT ) :
                 VclPtr<VirtualDevice>::Create( mrRefDevice );
 
             OSL_ENSURE( mpVDev,
diff --git a/chart2/source/view/main/3DChartObjects.cxx b/chart2/source/view/main/3DChartObjects.cxx
index 9a72479..e8bb046 100644
--- a/chart2/source/view/main/3DChartObjects.cxx
+++ b/chart2/source/view/main/3DChartObjects.cxx
@@ -77,7 +77,7 @@ const TextCacheItem& TextCache::getText(OUString const & rText, bool bIs3dText)
         return *itr->second;
 
     ScopedVclPtrInstance< VirtualDevice > pDevice(*Application::GetDefaultDevice(),
-                                                  DeviceFormat::FULLCOLOR, DeviceFormat::FULLCOLOR);
+                                                  DeviceFormat::DEFAULT, DeviceFormat::DEFAULT);
     vcl::Font aFont;
     if(bIs3dText)
         aFont = vcl::Font("Brillante St",Size(0,0));
diff --git a/chart2/source/view/main/DummyXShape.cxx b/chart2/source/view/main/DummyXShape.cxx
index add14b3..a6f9ed1 100644
--- a/chart2/source/view/main/DummyXShape.cxx
+++ b/chart2/source/view/main/DummyXShape.cxx
@@ -836,7 +836,7 @@ DummyText::DummyText(const OUString& rText, const tNameSequence& rNames,
         vcl::Font aFont;
         std::for_each(maProperties.begin(), maProperties.end(), FontAttribSetter(aFont));
         ScopedVclPtrInstance< VirtualDevice > pDevice(*Application::GetDefaultDevice(),
-                                                      DeviceFormat::FULLCOLOR, DeviceFormat::FULLCOLOR);
+                                                      DeviceFormat::DEFAULT, DeviceFormat::DEFAULT);
         pDevice->Erase();
         Rectangle aRect;
         pDevice->SetFont(aFont);
diff --git a/cppcanvas/source/mtfrenderer/transparencygroupaction.cxx b/cppcanvas/source/mtfrenderer/transparencygroupaction.cxx
index 7962877..9d75134a 100644
--- a/cppcanvas/source/mtfrenderer/transparencygroupaction.cxx
+++ b/cppcanvas/source/mtfrenderer/transparencygroupaction.cxx
@@ -241,7 +241,7 @@ namespace cppcanvas
                     // render our content into an appropriately sized
                     // VirtualDevice with alpha channel
                     ScopedVclPtrInstance<VirtualDevice> aVDev(
-                        *::Application::GetDefaultDevice(), DeviceFormat::FULLCOLOR, DeviceFormat::FULLCOLOR );
+                        *::Application::GetDefaultDevice(), DeviceFormat::DEFAULT, DeviceFormat::DEFAULT );
                     aVDev->SetOutputSizePixel( aBitmapSizePixel );
                     aVDev->SetMapMode();
 
diff --git a/desktop/CppunitTest_desktop_lib.mk b/desktop/CppunitTest_desktop_lib.mk
index bbedfdc..2119e15 100644
--- a/desktop/CppunitTest_desktop_lib.mk
+++ b/desktop/CppunitTest_desktop_lib.mk
@@ -16,6 +16,7 @@ $(eval $(call gb_CppunitTest_add_exception_objects,desktop_lib, \
 ))
 
 $(eval $(call gb_CppunitTest_use_libraries,desktop_lib, \
+	basebmp \
 	comphelper \
 	cppu \
 	cppuhelper \
diff --git a/desktop/qa/desktop_lib/test_desktop_lib.cxx b/desktop/qa/desktop_lib/test_desktop_lib.cxx
index 0874eed..07607dd 100644
--- a/desktop/qa/desktop_lib/test_desktop_lib.cxx
+++ b/desktop/qa/desktop_lib/test_desktop_lib.cxx
@@ -14,7 +14,7 @@
 #include <com/sun/star/awt/Key.hpp>
 #include <com/sun/star/awt/XReschedule.hpp>
 #include <com/sun/star/awt/Toolkit.hpp>
-
+#include <basebmp/bitmapdevice.hxx>
 #include <boost/property_tree/json_parser.hpp>
 #include <comphelper/processfactory.hxx>
 #include <sfx2/objsh.hxx>
@@ -316,7 +316,9 @@ void DesktopLOKTest::testPaintTile()
     LibLODocument_Impl* pDocument = loadDoc("blank_text.odt");
     int nCanvasWidth = 100;
     int nCanvasHeight = 300;
-    std::vector<unsigned char> aBuffer(nCanvasWidth * nCanvasHeight * 4);
+    sal_Int32 nStride = basebmp::getBitmapDeviceStrideForWidth(basebmp::Format::ThirtyTwoBitTcMaskBGRX,
+                                                               nCanvasWidth);
+    std::vector<unsigned char> aBuffer(nStride * nCanvasHeight);
     int nTilePosX = 0;
     int nTilePosY = 0;
     int nTileWidth = 1000;
diff --git a/desktop/source/lib/init.cxx b/desktop/source/lib/init.cxx
index 68eb01d..69ff1c3 100644
--- a/desktop/source/lib/init.cxx
+++ b/desktop/source/lib/init.cxx
@@ -882,12 +882,12 @@ void doc_paintTile (LibreOfficeKitDocument* pThis,
     SystemGraphicsData aData;
     aData.rCGContext = reinterpret_cast<CGContextRef>(pBuffer);
     // the Size argument is irrelevant, I hope
-    ScopedVclPtrInstance<VirtualDevice> pDevice(&aData, Size(1, 1), DeviceFormat::FULLCOLOR);
+    ScopedVclPtrInstance<VirtualDevice> pDevice(&aData, Size(1, 1), DeviceFormat::DEFAULT);
 
     pDoc->paintTile(*pDevice.get(), nCanvasWidth, nCanvasHeight,
                     nTilePosX, nTilePosY, nTileWidth, nTileHeight);
 #elif defined(ANDROID)
-    ScopedVclPtrInstance< VirtualDevice > pDevice(nullptr, Size(1, 1), DeviceFormat::FULLCOLOR) ;
+    ScopedVclPtrInstance< VirtualDevice > pDevice(nullptr, Size(1, 1), DeviceFormat::DEFAULT) ;
 
     boost::shared_array<sal_uInt8> aBuffer(pBuffer, NoDelete< sal_uInt8 >());
 
@@ -900,20 +900,19 @@ void doc_paintTile (LibreOfficeKitDocument* pThis,
     pDoc->paintTile(*pDevice.get(), nCanvasWidth, nCanvasHeight,
                     nTilePosX, nTilePosY, nTileWidth, nTileHeight);
 #else
-    ScopedVclPtrInstance< VirtualDevice > pDevice(nullptr, Size(1, 1), DeviceFormat::FULLCOLOR) ;
+    ScopedVclPtrInstance< VirtualDevice > pDevice(nullptr, Size(1, 1), DeviceFormat::DEFAULT) ;
 
     // Set background to transparent by default.
-    memset(pBuffer, 0, nCanvasWidth * nCanvasHeight * 4);
     pDevice->SetBackground(Wallpaper(Color(COL_TRANSPARENT)));
 
     boost::shared_array< sal_uInt8 > aBuffer( pBuffer, NoDelete< sal_uInt8 >() );
 
     // Allocate a separate buffer for the alpha device.
-    std::vector<sal_uInt8> aAlpha(nCanvasWidth * nCanvasHeight);
-    memset(aAlpha.data(), 0, nCanvasWidth * nCanvasHeight);
-// TO_DO: enable alpha
-//    boost::shared_array<sal_uInt8> aAlphaBuffer(aAlpha.data(), NoDelete<sal_uInt8>());
-    boost::shared_array<sal_uInt8> aAlphaBuffer;
+    sal_Int32 nStride = basebmp::getBitmapDeviceStrideForWidth(basebmp::Format::ThirtyTwoBitTcMaskBGRX,
+                                                               nCanvasWidth);
+    std::vector<sal_uInt8> aAlpha(nCanvasHeight * nStride);
+
+    boost::shared_array<sal_uInt8> aAlphaBuffer(aAlpha.data(), NoDelete<sal_uInt8>());
 
     pDevice->SetOutputSizePixelScaleOffsetAndBuffer(
                 Size(nCanvasWidth, nCanvasHeight), Fraction(1.0), Point(),
@@ -927,11 +926,15 @@ void doc_paintTile (LibreOfficeKitDocument* pThis,
     {
         for (int nCol = 0; nCol < nCanvasWidth; ++nCol)
         {
-            const int nOffset = (nCanvasWidth * nRow) + nCol;
+            const int nOffset = (nRow * nStride) + nCol * 4;
             // VCL's transparent is 0, RGBA's transparent is 0xff.
-            pBuffer[nOffset * 4 +3] = 0xff - aAlpha[nOffset];
+            pBuffer[nOffset + 3] = 0xff - aAlpha[nOffset];
+            double fAlpha = pBuffer[nOffset + 3]/255.0;
+            for (int i = 0; i < 3; ++i)
+                pBuffer[nOffset + i] *= fAlpha;
         }
     }
+
 #endif
 
     static bool bDebug = getenv("LOK_DEBUG") != nullptr;
diff --git a/drawinglayer/source/processor2d/vclhelperbufferdevice.cxx b/drawinglayer/source/processor2d/vclhelperbufferdevice.cxx
index 2d1d498..e7ff5a1 100644
--- a/drawinglayer/source/processor2d/vclhelperbufferdevice.cxx
+++ b/drawinglayer/source/processor2d/vclhelperbufferdevice.cxx
@@ -162,7 +162,7 @@ namespace
         // no success yet, create new buffer
         if(!pRetval)
         {
-            pRetval = VclPtr<VirtualDevice>::Create(rOutDev, bMonoChrome ? DeviceFormat::BITMASK : DeviceFormat::FULLCOLOR);
+            pRetval = VclPtr<VirtualDevice>::Create(rOutDev, bMonoChrome ? DeviceFormat::BITMASK : DeviceFormat::DEFAULT);
             pRetval->SetOutputSizePixel(rSizePixel, bClear);
         }
         else
diff --git a/include/vcl/salgtype.hxx b/include/vcl/salgtype.hxx
index 59654f6..a43a19d 100644
--- a/include/vcl/salgtype.hxx
+++ b/include/vcl/salgtype.hxx
@@ -22,7 +22,14 @@
 
 #include <sal/types.h>
 
-enum class DeviceFormat { NONE = -1, FULLCOLOR = 0, BITMASK = 1, GRAYSCALE = 8 };
+enum class DeviceFormat {
+                            NONE = -1,
+                            DEFAULT = 0,
+                            BITMASK = 1,
+#ifdef IOS
+                            GRAYSCALE = 8
+#endif
+                        };
 
 typedef sal_uInt32 SalColor;
 #define MAKE_SALCOLOR( r, g, b )    ((SalColor)(((sal_uInt32)((sal_uInt8)(b))))|(((sal_uInt32)((sal_uInt8)(g)))<<8)|(((sal_uInt32)((sal_uInt8)(r)))<<16))
diff --git a/include/vcl/virdev.hxx b/include/vcl/virdev.hxx
index 76076ba..cd6db85 100644
--- a/include/vcl/virdev.hxx
+++ b/include/vcl/virdev.hxx
@@ -74,38 +74,39 @@ public:
     /** Create a virtual device of size 1x1
 
         @param nBitCount
-        Bit depth of the generated virtual device. Use 0 here, to
-        indicate: take default screen depth. Only 0, 1 and 8
-        are allowed here, with 1 denoting binary mask and 8 a graylevel mask.
+        Device format of the generated virtual device. Use DeviceFormat::DEFAULT here, to
+        indicate: take default screen depth. Only DeviceFormat::BITMASK
+        is the other possibility to denote a binary mask.
      */
-    explicit            VirtualDevice(DeviceFormat eFormat = DeviceFormat::FULLCOLOR);
+    explicit            VirtualDevice(DeviceFormat eFormat = DeviceFormat::DEFAULT);
 
     /** Create a virtual device of size 1x1
 
         @param rCompDev
         The generated vdev will be compatible to this device.
 
-        @param nBitCount
-        Bit depth of the generated virtual device. Use 0 here, to
-        indicate: take default screen depth.
+        @param eFormat
+        Device format of the generated virtual device. Use DeviceFormat::DEFAULT here, to
+        indicate: take default screen depth. Only DeviceFormat::BITMASK
+        is the other possibility to denote a binary mask.
      */
      explicit           VirtualDevice(const OutputDevice& rCompDev,
-                                      DeviceFormat eFormat = DeviceFormat::FULLCOLOR);
+                                      DeviceFormat eFormat = DeviceFormat::DEFAULT);
 
     /** Create a virtual device  of size 1x1 with alpha channel
 
         @param rCompDev
         The generated vdev will be compatible to this device.
 
-        @param nBitCount
-        Bit depth of the generated virtual device. Use 0 here, to
-        indicate: take default screen depth. Only 0 and 1
-        are allowed here, with 1 denoting binary mask.
-
-        @param nAlphaBitCount
-        Bit depth of the generated virtual device. Use 0 here, to
-        indicate: take default screen depth. Only 0 and 1
-        are allowed here, with 1 denoting binary mask.
+        @param eFormat
+        Device format of the generated virtual device. Use DeviceFormat::DEFAULT here, to
+        indicate: take default screen depth. Only DeviceFormat::BITMASK
+        is the other possibility to denote a binary mask.
+
+        @param eAlphaFormat
+        Device format of the generated virtual device. Use DeviceFormat::DEFAULT here, to
+        indicate: take default screen depth. Only DeviceFormat::BITMASK
+        is the other possibility to denote a binary mask.
      */
      explicit           VirtualDevice( const OutputDevice& rCompDev,
                                        DeviceFormat eFormat, DeviceFormat eAlphaFormat);
diff --git a/sd/source/ui/presenter/PresenterTextView.cxx b/sd/source/ui/presenter/PresenterTextView.cxx
index db281d6..02f0b31 100644
--- a/sd/source/ui/presenter/PresenterTextView.cxx
+++ b/sd/source/ui/presenter/PresenterTextView.cxx
@@ -242,7 +242,7 @@ PresenterTextView::Implementation::Implementation()
       msTotalHeightPropertyName("TotalHeight"),
       mxBitmap(),
       mpCanvas(),
-      mpOutputDevice(VclPtr<VirtualDevice>::Create(*Application::GetDefaultDevice(), DeviceFormat::FULLCOLOR, DeviceFormat::FULLCOLOR)),
+      mpOutputDevice(VclPtr<VirtualDevice>::Create(*Application::GetDefaultDevice(), DeviceFormat::DEFAULT, DeviceFormat::DEFAULT)),
       mpEditEngine(nullptr),
       mpEditEngineItemPool(EditEngine::CreatePool()),
       maSize(100,100),
@@ -455,7 +455,7 @@ Reference<rendering::XBitmap> PresenterTextView::Implementation::GetBitmap()
     {
         mpOutputDevice.disposeAndClear();
         mpOutputDevice = VclPtr<VirtualDevice>::Create(*Application::GetDefaultDevice(),
-                                                       DeviceFormat::FULLCOLOR, DeviceFormat::FULLCOLOR);
+                                                       DeviceFormat::DEFAULT, DeviceFormat::DEFAULT);
         mpOutputDevice->SetMapMode(MAP_PIXEL);
         mpOutputDevice->SetOutputSizePixel(maSize);
         mpOutputDevice->SetLineColor();
diff --git a/sd/source/ui/slidesorter/view/SlsInsertionIndicatorOverlay.cxx b/sd/source/ui/slidesorter/view/SlsInsertionIndicatorOverlay.cxx
index 84590d8..fdef07a 100644
--- a/sd/source/ui/slidesorter/view/SlsInsertionIndicatorOverlay.cxx
+++ b/sd/source/ui/slidesorter/view/SlsInsertionIndicatorOverlay.cxx
@@ -135,7 +135,7 @@ void InsertionIndicatorOverlay::Create (
     // Create virtual devices for bitmap and mask whose bitmaps later be
     // combined to form the BitmapEx of the icon.
     ScopedVclPtrInstance<VirtualDevice> pContent(
-        *mrSlideSorter.GetContentWindow(), DeviceFormat::FULLCOLOR, DeviceFormat::FULLCOLOR);
+        *mrSlideSorter.GetContentWindow(), DeviceFormat::DEFAULT, DeviceFormat::DEFAULT);
     pContent->SetOutputSizePixel(aIconSize);
 
     pContent->SetFillColor();
diff --git a/svtools/source/table/gridtablerenderer.cxx b/svtools/source/table/gridtablerenderer.cxx
index bae4ee3..3c935ab 100644
--- a/svtools/source/table/gridtablerenderer.cxx
+++ b/svtools/source/table/gridtablerenderer.cxx
@@ -84,8 +84,8 @@ namespace svt { namespace table
 
             Point const aBitmapPos( 0, 0 );
             Size const aBitmapSize( nSortIndicatorWidth, nSortIndicatorHeight );
-            ScopedVclPtrInstance< VirtualDevice > aDevice(i_device, DeviceFormat::FULLCOLOR,
-                                                          DeviceFormat::FULLCOLOR);
+            ScopedVclPtrInstance< VirtualDevice > aDevice(i_device, DeviceFormat::DEFAULT,
+                                                          DeviceFormat::DEFAULT);
             aDevice->SetOutputSizePixel( aBitmapSize );
 
             DecorationView aDecoView(aDevice.get());
diff --git a/svx/source/dialog/dialcontrol.cxx b/svx/source/dialog/dialcontrol.cxx
index c93c0ac..77f62b1 100644
--- a/svx/source/dialog/dialcontrol.cxx
+++ b/svx/source/dialog/dialcontrol.cxx
@@ -35,7 +35,7 @@ namespace svx {
 const long DIAL_OUTER_WIDTH = 8;
 
 DialControlBmp::DialControlBmp(vcl::Window& rParent) :
-    VirtualDevice(rParent, DeviceFormat::FULLCOLOR, DeviceFormat::FULLCOLOR),
+    VirtualDevice(rParent, DeviceFormat::DEFAULT, DeviceFormat::DEFAULT),
     mbEnabled(true),
     mrParent(rParent),
     mnCenterX(0),
diff --git a/sw/source/uibase/uno/unotxdoc.cxx b/sw/source/uibase/uno/unotxdoc.cxx
index 738be4b..a8ddf71 100644
--- a/sw/source/uibase/uno/unotxdoc.cxx
+++ b/sw/source/uibase/uno/unotxdoc.cxx
@@ -3426,7 +3426,7 @@ void SAL_CALL SwXTextDocument::paintTile( const ::css::uno::Any& Parent, ::sal_I
     sal_Int64 nWindowHandle;
     Parent >>= nWindowHandle;
     aData.hWnd = (HWND) nWindowHandle;
-    ScopedVclPtrInstance<VirtualDevice> xDevice(&aData, Size(1, 1), DeviceFormat::FULLCOLOR);
+    ScopedVclPtrInstance<VirtualDevice> xDevice(&aData, Size(1, 1), DeviceFormat::DEFAULT);
     paintTile(*xDevice, nOutputWidth, nOutputHeight, nTilePosX, nTilePosY, nTileWidth, nTileHeight);
     #else
     // TODO: support other platforms
diff --git a/vcl/headless/svpcairotextrender.cxx b/vcl/headless/svpcairotextrender.cxx
index 06abf0c..681d65d 100644
--- a/vcl/headless/svpcairotextrender.cxx
+++ b/vcl/headless/svpcairotextrender.cxx
@@ -22,13 +22,7 @@ GlyphCache& SvpCairoTextRender::getPlatformGlyphCache()
 
 cairo_t* SvpCairoTextRender::getCairoContext()
 {
-    cairo_t* pRet = mrParent.getCairoContext();
-    if (!pRet)
-    {
-        mxTmpSurface = mrParent.createSimpleMask();
-        pRet = SvpSalGraphics::createCairoContext(mxTmpSurface);
-    }
-    return pRet;
+    return mrParent.getCairoContext();
 }
 
 void SvpCairoTextRender::getSurfaceOffset(double& nDX, double& nDY)
@@ -42,22 +36,8 @@ void SvpCairoTextRender::clipRegion(cairo_t* cr)
     mrParent.clipRegion(cr);
 }
 
-basebmp::BitmapDeviceSharedPtr SvpCairoTextRender::createSimpleMask()
-{
-    return mrParent.createSimpleMask();
-}
-
 void SvpCairoTextRender::drawSurface(cairo_t*)
 {
-    //typically we have drawn directly to the real surface, in edge-cases of
-    //strange surface depths, we'll have drawn into a tmp surface, so flush
-    //it
-    if (mxTmpSurface)
-    {
-        // blend text color into target using the glyph's mask
-        mrParent.BlendTextColor(basebmp::Color(GetTextColor()), mxTmpSurface, basegfx::B2IPoint(0, 0));
-        mxTmpSurface.reset();
-    }
 }
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/headless/svpcairotextrender.hxx b/vcl/headless/svpcairotextrender.hxx
index daae42c..1a0a1ec 100644
--- a/vcl/headless/svpcairotextrender.hxx
+++ b/vcl/headless/svpcairotextrender.hxx
@@ -17,7 +17,6 @@ class SvpSalGraphics;
 class SvpCairoTextRender : public CairoTextRender
 {
 protected:
-    basebmp::BitmapDeviceSharedPtr mxTmpSurface;
     SvpSalGraphics& mrParent;
 
 public:
@@ -28,7 +27,6 @@ public:
     virtual void getSurfaceOffset(double& nDX, double& nDY) override;
     virtual void clipRegion(cairo_t* cr) override;
     virtual void drawSurface(cairo_t* cr) override;
-    virtual basebmp::BitmapDeviceSharedPtr createSimpleMask() override;
 };
 
 #endif
diff --git a/vcl/headless/svpgdi.cxx b/vcl/headless/svpgdi.cxx
index 05e673c..1fd0820 100644
--- a/vcl/headless/svpgdi.cxx
+++ b/vcl/headless/svpgdi.cxx
@@ -122,12 +122,6 @@ namespace
 
 #endif
 
-basebmp::BitmapDeviceSharedPtr SvpSalGraphics::createSimpleMask() const
-{
-    return basebmp::createBitmapDevice(m_aOrigDevice->getSize(), true, basebmp::Format::OneBitLsbGrey,
-                cairo_format_stride_for_width(CAIRO_FORMAT_A1, m_aOrigDevice->getSize().getX()));
-}
-
 void SvpSalGraphics::clipRegion(cairo_t* cr)
 {
     RectangleVector aRectangles;
diff --git a/vcl/headless/svpinst.cxx b/vcl/headless/svpinst.cxx
index fe381fb..ec7039a 100644
--- a/vcl/headless/svpinst.cxx
+++ b/vcl/headless/svpinst.cxx
@@ -446,12 +446,9 @@ Format SvpSalInstance::getBaseBmpFormatForDeviceFormat(DeviceFormat eFormat)
     {
         case DeviceFormat::BITMASK:
             return Format::OneBitMsbPal;
-        case DeviceFormat::GRAYSCALE:
-            return Format::EightBitPal;
         default:
             return SVP_CAIRO_FORMAT;
     }
-
 }
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/headless/svptext.cxx b/vcl/headless/svptext.cxx
index 9eb39f26..cb6720c 100644
--- a/vcl/headless/svptext.cxx
+++ b/vcl/headless/svptext.cxx
@@ -133,18 +133,4 @@ SystemFontData SvpSalGraphics::GetSysFontData( int nFallbacklevel ) const
 
 #endif // ENABLE_CAIRO_CANVAS
 
-void SvpSalGraphics::BlendTextColor(const basebmp::Color &rTextColor, const basebmp::BitmapDeviceSharedPtr &rAlphaMask,
-                                    const basegfx::B2IPoint &rDstPoint)
-{
-    // blend text color into target using the glyph's mask
-    const basegfx::B2IBox aSrcRect(basegfx::B2ITuple(0,0), rAlphaMask->getSize());
-    const basegfx::B2IBox aClipRect(rDstPoint, rAlphaMask->getSize());
-
-    SvpSalGraphics::ClipUndoHandle aUndo(this);
-    if (isClippedSetup(aClipRect, aUndo))
-        return;
-
-    m_aDevice->drawMaskedColor(rTextColor, rAlphaMask, aSrcRect, rDstPoint, m_aClipMap);
-}
-
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/inc/cairotextrender.hxx b/vcl/inc/cairotextrender.hxx
index 1ff7d94..60b1b8f 100644
--- a/vcl/inc/cairotextrender.hxx
+++ b/vcl/inc/cairotextrender.hxx
@@ -81,10 +81,6 @@ protected:
     virtual cairo_t*            getCairoContext() = 0;
     virtual void                getSurfaceOffset(double& nDX, double& nDY) = 0;
     virtual void                drawSurface(cairo_t* cr) = 0;
-    virtual basebmp::BitmapDeviceSharedPtr createSimpleMask()
-    {
-        return basebmp::BitmapDeviceSharedPtr();
-    }
 
     bool                        setFont( const FontSelectPattern *pEntry, int nFallbackLevel );
 
diff --git a/vcl/inc/headless/svpgdi.hxx b/vcl/inc/headless/svpgdi.hxx
index 5320909..686301d 100644
--- a/vcl/inc/headless/svpgdi.hxx
+++ b/vcl/inc/headless/svpgdi.hxx
@@ -64,9 +64,6 @@ class VCL_DLLPUBLIC SvpSalGraphics : public SalGraphics
 
 public:
     static GlyphCache& getPlatformGlyphCache();
-    void BlendTextColor(const basebmp::Color &rTextColor, const basebmp::BitmapDeviceSharedPtr &rAlphaMask,
-                        const basegfx::B2IPoint &rDstPoint);
-    basebmp::BitmapDeviceSharedPtr createSimpleMask() const;
     void setDevice(basebmp::BitmapDeviceSharedPtr& rDevice);
 
 private:
diff --git a/vcl/opengl/x11/salvd.cxx b/vcl/opengl/x11/salvd.cxx
index 627661a..d6b8eaf 100644
--- a/vcl/opengl/x11/salvd.cxx
+++ b/vcl/opengl/x11/salvd.cxx
@@ -44,16 +44,12 @@ X11OpenGLSalVirtualDevice::X11OpenGLSalVirtualDevice( SalGraphics* pGraphics,
 {
     assert(mpGraphics);
 
-    // TODO Do we really need the requested bit count?
     sal_uInt16 nBitCount;
     switch (eFormat)
     {
         case DeviceFormat::BITMASK:
             nBitCount = 1;
             break;
-        case DeviceFormat::GRAYSCALE:
-            nBitCount = 8;
-            break;
         default:
             nBitCount = pGraphics->GetBitCount();
             break;
diff --git a/vcl/quartz/salvd.cxx b/vcl/quartz/salvd.cxx
index b7717fa..c09dd44 100644
--- a/vcl/quartz/salvd.cxx
+++ b/vcl/quartz/salvd.cxx
@@ -115,9 +115,11 @@ AquaSalVirtualDevice::AquaSalVirtualDevice( AquaSalGraphics* pGraphic, long &nDX
             case DeviceFormat::BITMASK:
                 mnBitmapDepth = 1;
                 break;
+#ifdef IOS
             case DeviceFormat::GRAYSCALE:
                 mnBitmapDepth = 8;
                 break;
+#endif
             default:
                 mnBitmapDepth = 0;
                 break;
diff --git a/vcl/source/gdi/bitmapex.cxx b/vcl/source/gdi/bitmapex.cxx
index a75afd6..f390855 100644
--- a/vcl/source/gdi/bitmapex.cxx
+++ b/vcl/source/gdi/bitmapex.cxx
@@ -698,7 +698,7 @@ BitmapEx BitmapEx:: AutoScaleBitmap(BitmapEx & aBitmap, const long aStandardSize
     Rectangle aRect(aEmptyPoint, aStdSize );
 
     ScopedVclPtrInstance< VirtualDevice > aVirDevice(*Application::GetDefaultDevice(),
-                                                     DeviceFormat::FULLCOLOR, DeviceFormat::BITMASK);
+                                                     DeviceFormat::DEFAULT, DeviceFormat::BITMASK);
     aVirDevice->SetOutputSizePixel( aStdSize );
     aVirDevice->SetFillColor( COL_TRANSPARENT );
     aVirDevice->SetLineColor( COL_TRANSPARENT );
diff --git a/vcl/source/gdi/gdimtf.cxx b/vcl/source/gdi/gdimtf.cxx
index b7be53b..21d1f11 100644
--- a/vcl/source/gdi/gdimtf.cxx
+++ b/vcl/source/gdi/gdimtf.cxx
@@ -886,7 +886,7 @@ void GDIMetaFile::ImplAddGradientEx( GDIMetaFile&         rMtf,
                                      const Gradient&      rGrad     )
 {
     // Generate comment, GradientEx and Gradient actions (within DrawGradient)
-    ScopedVclPtrInstance< VirtualDevice > aVDev(rMapDev, DeviceFormat::FULLCOLOR);
+    ScopedVclPtrInstance< VirtualDevice > aVDev(rMapDev, DeviceFormat::DEFAULT);
     aVDev->EnableOutput( false );
     GDIMetaFile aGradMtf;
 
diff --git a/vcl/source/gdi/pdfwriter_impl.cxx b/vcl/source/gdi/pdfwriter_impl.cxx
index a454704..13906b4 100644
--- a/vcl/source/gdi/pdfwriter_impl.cxx
+++ b/vcl/source/gdi/pdfwriter_impl.cxx
@@ -2222,7 +2222,7 @@ OutputDevice* PDFWriterImpl::getReferenceDevice()
 {
     if( ! m_pReferenceDevice )
     {
-        VclPtrInstance<VirtualDevice> pVDev(DeviceFormat::FULLCOLOR);
+        VclPtrInstance<VirtualDevice> pVDev(DeviceFormat::DEFAULT);
 
         m_pReferenceDevice = pVDev;
 
diff --git a/vcl/source/gdi/virdev.cxx b/vcl/source/gdi/virdev.cxx
index 4557dc2..cab8fa3 100644
--- a/vcl/source/gdi/virdev.cxx
+++ b/vcl/source/gdi/virdev.cxx
@@ -165,8 +165,6 @@ void VirtualDevice::ImplInitVirDev( const OutputDevice* pOutDev,
     {
         case DeviceFormat::BITMASK:
             mnBitCount = 1;
-        case DeviceFormat::GRAYSCALE:
-            mnBitCount = 8;
         default:
             mnBitCount = pOutDev->GetBitCount();
             break;
@@ -453,7 +451,7 @@ bool VirtualDevice::SetOutputSizePixelScaleOffsetAndBuffer(
     const basebmp::RawMemorySharedArray &pBuffer, const basebmp::RawMemorySharedArray &pAlphaBuffer )
 {
     if (pAlphaBuffer)
-        meAlphaFormat = DeviceFormat::GRAYSCALE;
+        meAlphaFormat = DeviceFormat::DEFAULT;
 
     if (pBuffer) {
         MapMode mm = GetMapMode();
diff --git a/vcl/source/window/paint.cxx b/vcl/source/window/paint.cxx
index d2b452c..6402639 100644
--- a/vcl/source/window/paint.cxx
+++ b/vcl/source/window/paint.cxx
@@ -1437,8 +1437,8 @@ void Window::ImplPaintToDevice( OutputDevice* i_pTargetOutDev, const Point& i_rP
 
     // paint metafile to VDev
     VclPtrInstance<VirtualDevice> pMaskedDevice(*i_pTargetOutDev,
-                                                DeviceFormat::FULLCOLOR,
-                                                DeviceFormat::FULLCOLOR);
+                                                DeviceFormat::DEFAULT,
+                                                DeviceFormat::DEFAULT);
     pMaskedDevice->SetOutputSizePixel( GetOutputSizePixel() );
     pMaskedDevice->EnableRTL( IsRTLEnabled() );
     aMtf.WindStart();
diff --git a/vcl/unx/generic/gdi/cairo_xlib_cairo.cxx b/vcl/unx/generic/gdi/cairo_xlib_cairo.cxx
index a45faa4..11d4e6c 100644
--- a/vcl/unx/generic/gdi/cairo_xlib_cairo.cxx
+++ b/vcl/unx/generic/gdi/cairo_xlib_cairo.cxx
@@ -301,9 +301,8 @@ namespace cairo
      **/
     int X11Surface::getDepth() const
     {
-        if( maSysData.pRenderFormat )
+        if (maSysData.pRenderFormat)
             return static_cast<XRenderPictFormat*>(maSysData.pRenderFormat)->depth;
-
         return -1;
     }
 
@@ -315,15 +314,13 @@ namespace cairo
     DeviceFormat X11Surface::getFormat() const
     {
         if (!maSysData.pRenderFormat)
-            return DeviceFormat::FULLCOLOR;
+            return DeviceFormat::DEFAULT;
         switch (static_cast<XRenderPictFormat*>(maSysData.pRenderFormat)->depth)
         {
             case 1:
                 return DeviceFormat::BITMASK;
-            case 8:
-                return DeviceFormat::GRAYSCALE;
             default:
-                return DeviceFormat::FULLCOLOR;
+                return DeviceFormat::DEFAULT;
         }
     }
 }
diff --git a/vcl/unx/generic/gdi/salvd.cxx b/vcl/unx/generic/gdi/salvd.cxx
index d86677b..97b1d3b 100644
--- a/vcl/unx/generic/gdi/salvd.cxx
+++ b/vcl/unx/generic/gdi/salvd.cxx
@@ -104,9 +104,6 @@ X11SalVirtualDevice::X11SalVirtualDevice(SalGraphics* pGraphics, long &nDX, long
         case DeviceFormat::BITMASK:
             nBitCount = 1;
             break;
-        case DeviceFormat::GRAYSCALE:
-            nBitCount = 8;
-            break;
         default:
             nBitCount = pGraphics->GetBitCount();
             break;
diff --git a/vcl/unx/gtk/gtksalframe.cxx b/vcl/unx/gtk/gtksalframe.cxx
index 09ce9a0..39c3453 100644
--- a/vcl/unx/gtk/gtksalframe.cxx
+++ b/vcl/unx/gtk/gtksalframe.cxx
@@ -406,7 +406,7 @@ void GtkSalFrame::doKeyCallback( guint state,
     if (keyval == GDK_0)
     {
         fprintf( stderr, "force widget_queue_draw\n");
-        gtk_widget_queue_draw (m_pFixedContainer);
+        gtk_widget_queue_draw(GTK_WIDGET(m_pFixedContainer));
         return;
     }
     else if (keyval == GDK_1)
diff --git a/vcl/unx/gtk3/cairo_gtk3_cairo.cxx b/vcl/unx/gtk3/cairo_gtk3_cairo.cxx
index 25e5a0c..4f6c793 100644
--- a/vcl/unx/gtk3/cairo_gtk3_cairo.cxx
+++ b/vcl/unx/gtk3/cairo_gtk3_cairo.cxx
@@ -109,7 +109,7 @@ namespace cairo
 
     VclPtr<VirtualDevice> Gtk3Surface::createVirtualDevice() const
     {
-        return VclPtrInstance<VirtualDevice>(nullptr, Size(1, 1), DeviceFormat::FULLCOLOR);
+        return VclPtrInstance<VirtualDevice>(nullptr, Size(1, 1), DeviceFormat::DEFAULT);
     }
 
 }
diff --git a/vcl/win/source/gdi/salvd.cxx b/vcl/win/source/gdi/salvd.cxx
index 9b2136c..2cfef6f 100644
--- a/vcl/win/source/gdi/salvd.cxx
+++ b/vcl/win/source/gdi/salvd.cxx
@@ -79,9 +79,6 @@ SalVirtualDevice* WinSalInstance::CreateVirtualDevice( SalGraphics* pSGraphics,
         case DeviceFormat::BITMASK:
             nBitCount = 1;
             break;
-        case DeviceFormat::GRAYSCALE:
-            nBitCount = 8;
-            break;
         default:
             nBitCount = 0;
             break;
diff --git a/vcl/workben/vcldemo.cxx b/vcl/workben/vcldemo.cxx
index 7e398ed..768e725 100644
--- a/vcl/workben/vcldemo.cxx
+++ b/vcl/workben/vcldemo.cxx
@@ -789,7 +789,7 @@ public:
             if ((int)eType < RENDER_AS_BITMAPEX)
                 pNested = VclPtr<VirtualDevice>::Create(rDev).get();
             else
-                pNested = VclPtr<VirtualDevice>::Create(rDev,DeviceFormat::FULLCOLOR,DeviceFormat::FULLCOLOR).get();
+                pNested = VclPtr<VirtualDevice>::Create(rDev,DeviceFormat::DEFAULT,DeviceFormat::DEFAULT).get();
 
             pNested->SetOutputSizePixel(r.GetSize());
             Rectangle aWhole(Point(0,0), r.GetSize());
commit c43a3a58677b467274ce6c21d7db1a6c0cc65cb4
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Tue Nov 17 13:03:23 2015 +0000

    establish that Virtual Devices either match Physical Device depth or ...
    
    are 1 or (rarely) 8 bit and lock that down.
    
    Change-Id: I3d946ebef34ffb71c5adea7aa420af50e9584e05

diff --git a/canvas/source/directx/dx_textlayout_drawhelper.cxx b/canvas/source/directx/dx_textlayout_drawhelper.cxx
index 3db3996..574a969 100644
--- a/canvas/source/directx/dx_textlayout_drawhelper.cxx
+++ b/canvas/source/directx/dx_textlayout_drawhelper.cxx
@@ -84,12 +84,12 @@ namespace dxcanvas
         SystemGraphicsData aSystemGraphicsData;
         aSystemGraphicsData.nSize = sizeof(SystemGraphicsData);
         aSystemGraphicsData.hDC = reinterpret_cast< ::HDC >(hdc);
-        VirtualDevice aVirtualDevice(&aSystemGraphicsData, Size(1, 1), 0);
+        ScopedVclPtrInstance<VirtualDevice> xVirtualDevice(&aSystemGraphicsData, Size(1, 1), DeviceFormat::FULLCOLOR);
 
         // disable font antialiasing - GDI does not handle alpha
         // surfaces properly.
         if( bAlphaSurface )
-            aVirtualDevice.SetAntialiasing(AntialiasingFlags::DisableText);
+            xVirtualDevice->SetAntialiasing(AntialiasingFlags::DisableText);
 
         if(rText.Length)
         {
@@ -105,7 +105,7 @@ namespace dxcanvas
                     rRenderState.DeviceColor,
                     mxGraphicDevice->getDeviceColorSpace());
             aColor.SetTransparency(0);
-            aVirtualDevice.SetTextColor(aColor);
+            xVirtualDevice->SetTextColor(aColor);
 
             // create the font
             const css::rendering::FontRequest& rFontRequest = rCanvasFont->getFontRequest();
@@ -132,7 +132,7 @@ namespace dxcanvas
             // adjust to stretched font
             if(!::rtl::math::approxEqual(rFontMatrix.m00, rFontMatrix.m11))
             {
-                const Size aSize = aVirtualDevice.GetFontMetric( aFont ).GetSize();
+                const Size aSize = xVirtualDevice->GetFontMetric( aFont ).GetSize();
                 const double fDividend( rFontMatrix.m10 + rFontMatrix.m11 );
                 double fStretch = (rFontMatrix.m00 + rFontMatrix.m01);
 
@@ -145,7 +145,7 @@ namespace dxcanvas
             }
 
             // set font
-            aVirtualDevice.SetFont(aFont);
+            xVirtualDevice->SetFont(aFont);
 
             // create world transformation matrix
             ::basegfx::B2DHomMatrix aWorldTransform;
@@ -170,7 +170,7 @@ namespace dxcanvas
 
                 aClipPoly.transform(aMatrix);
                 const vcl::Region& rClipRegion = vcl::Region(::tools::PolyPolygon(aClipPoly));
-                aVirtualDevice.IntersectClipRegion(rClipRegion);
+                xVirtualDevice->IntersectClipRegion(rClipRegion);
             }
 
             if(rRenderState.Clip.is())
@@ -178,7 +178,7 @@ namespace dxcanvas
                 ::basegfx::B2DPolyPolygon aClipPoly(dxcanvas::tools::polyPolygonFromXPolyPolygon2D(rRenderState.Clip));
                 aClipPoly.transform(aWorldTransform);
                 const vcl::Region& rClipRegion = vcl::Region(::tools::PolyPolygon(aClipPoly));
-                aVirtualDevice.IntersectClipRegion(rClipRegion);
+                xVirtualDevice->IntersectClipRegion(rClipRegion);
             }
 
             // set world transform
@@ -210,7 +210,7 @@ namespace dxcanvas
                     pDXArray[i] = basegfx::fround( rLogicalAdvancements[i] );
 
                 // draw the String
-                aVirtualDevice.DrawTextArray( aEmptyPoint,
+                xVirtualDevice->DrawTextArray( aEmptyPoint,
                                               aText,
                                               pDXArray.get(),
                                               rText.StartPosition,
@@ -219,7 +219,7 @@ namespace dxcanvas
             else
             {
                 // draw the String
-                aVirtualDevice.DrawText( aEmptyPoint,
+                xVirtualDevice->DrawText( aEmptyPoint,
                                          aText,
                                          rText.StartPosition,
                                          rText.Length );
@@ -240,7 +240,7 @@ namespace dxcanvas
         SystemGraphicsData aSystemGraphicsData;
         aSystemGraphicsData.nSize = sizeof(SystemGraphicsData);
         aSystemGraphicsData.hDC = reinterpret_cast< ::HDC >(GetDC( NULL ));
-        VirtualDevice aVirtualDevice(&aSystemGraphicsData, Size(1, 1), 0);
+        ScopedVclPtrInstance<VirtualDevice> xVirtualDevice(&aSystemGraphicsData, Size(1, 1), DeviceFormat::FULLCOLOR);
 
         // create the font
         const css::rendering::FontRequest& rFontRequest = rCanvasFont->getFontRequest();
@@ -261,7 +261,7 @@ namespace dxcanvas
         // adjust to stretched font
         if(!::rtl::math::approxEqual(rFontMatrix.m00, rFontMatrix.m11))
         {
-            const Size aSize = aVirtualDevice.GetFontMetric( aFont ).GetSize();
+            const Size aSize = xVirtualDevice->GetFontMetric( aFont ).GetSize();
             const double fDividend( rFontMatrix.m10 + rFontMatrix.m11 );
             double fStretch = (rFontMatrix.m00 + rFontMatrix.m01);
 
@@ -274,11 +274,11 @@ namespace dxcanvas
         }
 
         // set font
-        aVirtualDevice.SetFont(aFont);
+        xVirtualDevice->SetFont(aFont);
 
         // need metrics for Y offset, the XCanvas always renders
         // relative to baseline
-        const ::FontMetric& aMetric( aVirtualDevice.GetFontMetric() );
+        const ::FontMetric& aMetric( xVirtualDevice->GetFontMetric() );
 
         const sal_Int32 nAboveBaseline( -aMetric.GetIntLeading() - aMetric.GetAscent() );
         const sal_Int32 nBelowBaseline( aMetric.GetDescent() );
@@ -292,7 +292,7 @@ namespace dxcanvas
         else
         {
             return geometry::RealRectangle2D( 0, nAboveBaseline,
-                                              aVirtualDevice.GetTextWidth(
+                                              xVirtualDevice->GetTextWidth(
                                                   rText.Text,
                                                   ::canvas::tools::numeric_cast<sal_uInt16>(rText.StartPosition),
                                                   ::canvas::tools::numeric_cast<sal_uInt16>(rText.Length) ),
diff --git a/canvas/source/vcl/backbuffer.cxx b/canvas/source/vcl/backbuffer.cxx
index 64ddc44..39a1b67 100644
--- a/canvas/source/vcl/backbuffer.cxx
+++ b/canvas/source/vcl/backbuffer.cxx
@@ -27,7 +27,7 @@ namespace vclcanvas
     BackBuffer::BackBuffer( const OutputDevice& rRefDevice,
                             bool                bMonochromeBuffer ) :
         maVDev( VclPtr<VirtualDevice>::Create( rRefDevice,
-                                   sal_uInt16(bMonochromeBuffer) ) )
+                                   bMonochromeBuffer ? DeviceFormat::BITMASK : DeviceFormat::FULLCOLOR ) )
     {
         if( !bMonochromeBuffer )
         {
diff --git a/canvas/source/vcl/bitmapbackbuffer.cxx b/canvas/source/vcl/bitmapbackbuffer.cxx
index 3f7fdd0..1fb22b0 100644
--- a/canvas/source/vcl/bitmapbackbuffer.cxx
+++ b/canvas/source/vcl/bitmapbackbuffer.cxx
@@ -112,7 +112,7 @@ namespace vclcanvas
             // VDev not yet created, do it now. Create an alpha-VDev,
             // if bitmap has transparency.
             mpVDev = maBitmap->IsTransparent() ?
-                VclPtr<VirtualDevice>::Create( mrRefDevice, 0, 0 ) :
+                VclPtr<VirtualDevice>::Create( mrRefDevice, DeviceFormat::FULLCOLOR, DeviceFormat::FULLCOLOR ) :
                 VclPtr<VirtualDevice>::Create( mrRefDevice );
 
             OSL_ENSURE( mpVDev,
diff --git a/chart2/source/view/main/3DChartObjects.cxx b/chart2/source/view/main/3DChartObjects.cxx
index 1b8cc7b..9a72479 100644
--- a/chart2/source/view/main/3DChartObjects.cxx
+++ b/chart2/source/view/main/3DChartObjects.cxx
@@ -76,7 +76,8 @@ const TextCacheItem& TextCache::getText(OUString const & rText, bool bIs3dText)
     if(itr != maTextCache.end())
         return *itr->second;
 
-    ScopedVclPtrInstance< VirtualDevice > pDevice(*Application::GetDefaultDevice(), 0, 0);
+    ScopedVclPtrInstance< VirtualDevice > pDevice(*Application::GetDefaultDevice(),
+                                                  DeviceFormat::FULLCOLOR, DeviceFormat::FULLCOLOR);
     vcl::Font aFont;
     if(bIs3dText)
         aFont = vcl::Font("Brillante St",Size(0,0));
diff --git a/chart2/source/view/main/DummyXShape.cxx b/chart2/source/view/main/DummyXShape.cxx
index ae242c2..add14b3 100644
--- a/chart2/source/view/main/DummyXShape.cxx
+++ b/chart2/source/view/main/DummyXShape.cxx
@@ -835,7 +835,8 @@ DummyText::DummyText(const OUString& rText, const tNameSequence& rNames,
     {
         vcl::Font aFont;
         std::for_each(maProperties.begin(), maProperties.end(), FontAttribSetter(aFont));
-        ScopedVclPtrInstance< VirtualDevice > pDevice(*Application::GetDefaultDevice(), 0, 0);
+        ScopedVclPtrInstance< VirtualDevice > pDevice(*Application::GetDefaultDevice(),
+                                                      DeviceFormat::FULLCOLOR, DeviceFormat::FULLCOLOR);
         pDevice->Erase();
         Rectangle aRect;
         pDevice->SetFont(aFont);
diff --git a/cppcanvas/source/mtfrenderer/transparencygroupaction.cxx b/cppcanvas/source/mtfrenderer/transparencygroupaction.cxx
index 11885b0..7962877 100644
--- a/cppcanvas/source/mtfrenderer/transparencygroupaction.cxx
+++ b/cppcanvas/source/mtfrenderer/transparencygroupaction.cxx
@@ -241,7 +241,7 @@ namespace cppcanvas
                     // render our content into an appropriately sized
                     // VirtualDevice with alpha channel
                     ScopedVclPtrInstance<VirtualDevice> aVDev(
-                        *::Application::GetDefaultDevice(), 0, 0 );
+                        *::Application::GetDefaultDevice(), DeviceFormat::FULLCOLOR, DeviceFormat::FULLCOLOR );
                     aVDev->SetOutputSizePixel( aBitmapSizePixel );
                     aVDev->SetMapMode();
 
diff --git a/desktop/source/lib/init.cxx b/desktop/source/lib/init.cxx
index 211371e..68eb01d 100644
--- a/desktop/source/lib/init.cxx
+++ b/desktop/source/lib/init.cxx
@@ -882,12 +882,12 @@ void doc_paintTile (LibreOfficeKitDocument* pThis,
     SystemGraphicsData aData;
     aData.rCGContext = reinterpret_cast<CGContextRef>(pBuffer);
     // the Size argument is irrelevant, I hope
-    ScopedVclPtrInstance<VirtualDevice> pDevice(&aData, Size(1, 1), (sal_uInt16)0);
+    ScopedVclPtrInstance<VirtualDevice> pDevice(&aData, Size(1, 1), DeviceFormat::FULLCOLOR);
 
     pDoc->paintTile(*pDevice.get(), nCanvasWidth, nCanvasHeight,
                     nTilePosX, nTilePosY, nTileWidth, nTileHeight);
 #elif defined(ANDROID)
-    ScopedVclPtrInstance< VirtualDevice > pDevice(nullptr, Size(1, 1), (sal_uInt16)0) ;
+    ScopedVclPtrInstance< VirtualDevice > pDevice(nullptr, Size(1, 1), DeviceFormat::FULLCOLOR) ;
 
     boost::shared_array<sal_uInt8> aBuffer(pBuffer, NoDelete< sal_uInt8 >());
 
@@ -900,7 +900,7 @@ void doc_paintTile (LibreOfficeKitDocument* pThis,
     pDoc->paintTile(*pDevice.get(), nCanvasWidth, nCanvasHeight,
                     nTilePosX, nTilePosY, nTileWidth, nTileHeight);
 #else
-    ScopedVclPtrInstance< VirtualDevice > pDevice(nullptr, Size(1, 1), (sal_uInt16)0) ;
+    ScopedVclPtrInstance< VirtualDevice > pDevice(nullptr, Size(1, 1), DeviceFormat::FULLCOLOR) ;
 
     // Set background to transparent by default.
     memset(pBuffer, 0, nCanvasWidth * nCanvasHeight * 4);
diff --git a/drawinglayer/source/primitive2d/graphicprimitivehelper2d.cxx b/drawinglayer/source/primitive2d/graphicprimitivehelper2d.cxx
index 21bd6c6..be7ff65 100644
--- a/drawinglayer/source/primitive2d/graphicprimitivehelper2d.cxx
+++ b/drawinglayer/source/primitive2d/graphicprimitivehelper2d.cxx
@@ -96,7 +96,8 @@ namespace
         if(maAnimation.Count())
         {
             ScopedVclPtrInstance< VirtualDevice > aVirtualDevice(*Application::GetDefaultDevice());
-            ScopedVclPtrInstance< VirtualDevice > aVirtualDeviceMask(*Application::GetDefaultDevice(), 1L);
+            ScopedVclPtrInstance< VirtualDevice > aVirtualDeviceMask(*Application::GetDefaultDevice(),
+                                                                     DeviceFormat::BITMASK);
 
             // Prepare VirtualDevices and their states
             aVirtualDevice->EnableMapMode(false);
diff --git a/drawinglayer/source/processor2d/vclhelperbufferdevice.cxx b/drawinglayer/source/processor2d/vclhelperbufferdevice.cxx
index 06b7b5b..2d1d498 100644
--- a/drawinglayer/source/processor2d/vclhelperbufferdevice.cxx
+++ b/drawinglayer/source/processor2d/vclhelperbufferdevice.cxx
@@ -47,7 +47,7 @@ namespace
         VDevBuffer();
         virtual ~VDevBuffer();
 
-        VirtualDevice* alloc(OutputDevice& rOutDev, const Size& rSizePixel, bool bClear, sal_Int32 nBits);
+        VirtualDevice* alloc(OutputDevice& rOutDev, const Size& rSizePixel, bool bClear, bool bMonoChrome);
         void free(VirtualDevice& rDevice);
 
         // Timer virtuals
@@ -80,13 +80,12 @@ namespace
         }
     }
 
-    VirtualDevice* VDevBuffer::alloc(OutputDevice& rOutDev, const Size& rSizePixel, bool bClear, sal_Int32 nBits)
+    VirtualDevice* VDevBuffer::alloc(OutputDevice& rOutDev, const Size& rSizePixel, bool bClear, bool bMonoChrome)
     {
         ::osl::MutexGuard aGuard(m_aMutex);
         VirtualDevice* pRetval = nullptr;
 
-        if (nBits == 0)
-            nBits = rOutDev.GetBitCount();
+        sal_Int32 nBits = bMonoChrome ? 1 : rOutDev.GetBitCount();
 
         if(!maFreeBuffers.empty())
         {
@@ -97,7 +96,7 @@ namespace
             {
                 OSL_ENSURE(*a, "Empty pointer in VDevBuffer (!)");
 
-                if(nBits == (*a)->GetBitCount())
+                if (nBits == (*a)->GetBitCount())
                 {
                     // candidate is valid due to bit depth
                     if(aFound != maFreeBuffers.end())
@@ -163,7 +162,7 @@ namespace
         // no success yet, create new buffer
         if(!pRetval)
         {
-            pRetval = VclPtr<VirtualDevice>::Create(rOutDev, nBits);
+            pRetval = VclPtr<VirtualDevice>::Create(rOutDev, bMonoChrome ? DeviceFormat::BITMASK : DeviceFormat::FULLCOLOR);
             pRetval->SetOutputSizePixel(rSizePixel, bClear);
         }
         else
@@ -243,9 +242,9 @@ namespace drawinglayer
             // rendering, especially shadows, is broken on iOS unless
             // we pass 'true' here. Are virtual devices always de
             // facto cleared when created on other platforms?
-            mpContent = getVDevBuffer().alloc(mrOutDev, maDestPixel.GetSize(), true, 0);
+            mpContent = getVDevBuffer().alloc(mrOutDev, maDestPixel.GetSize(), true, false);
 #else
-            mpContent = getVDevBuffer().alloc(mrOutDev, maDestPixel.GetSize(), false, 0);
+            mpContent = getVDevBuffer().alloc(mrOutDev, maDestPixel.GetSize(), false, false);
 #endif
 
             // #i93485# assert when copying from window to VDev is used
@@ -361,7 +360,7 @@ namespace drawinglayer
         assert(mpContent && "impBufferDevice: No content, check isVisible() before accessing (!)");
         if (!mpMask)
         {
-            mpMask = getVDevBuffer().alloc(mrOutDev, maDestPixel.GetSize(), true, 1);
+            mpMask = getVDevBuffer().alloc(mrOutDev, maDestPixel.GetSize(), true, true);
             mpMask->SetMapMode(mpContent->GetMapMode());
 
             // do NOT copy AA flag for mask!
@@ -375,7 +374,7 @@ namespace drawinglayer
         OSL_ENSURE(mpContent, "impBufferDevice: No content, check isVisible() before accessing (!)");
         if(!mpAlpha)
         {
-            mpAlpha = getVDevBuffer().alloc(mrOutDev, maDestPixel.GetSize(), true, 0);
+            mpAlpha = getVDevBuffer().alloc(mrOutDev, maDestPixel.GetSize(), true, false);
             mpAlpha->SetMapMode(mpContent->GetMapMode());
 
             // copy AA flag for new target; masking needs to be smooth
diff --git a/filter/source/graphicfilter/eps/eps.cxx b/filter/source/graphicfilter/eps/eps.cxx
index 3c63a76..8bc304e 100644
--- a/filter/source/graphicfilter/eps/eps.cxx
+++ b/filter/source/graphicfilter/eps/eps.cxx
@@ -2125,7 +2125,7 @@ void PSWriter::ImplText( const OUString& rUniString, const Point& rPos, const lo
         vcl::Font    aNotRotatedFont( maFont );
         aNotRotatedFont.SetOrientation( 0 );
 
-        ScopedVclPtrInstance< VirtualDevice > pVirDev( 1 );
+        ScopedVclPtrInstance< VirtualDevice > pVirDev(DeviceFormat::BITMASK);
         pVirDev->SetMapMode( rVDev.GetMapMode() );
         pVirDev->SetFont( aNotRotatedFont );
         pVirDev->SetTextAlign( eTextAlign );
diff --git a/filter/source/msfilter/msdffimp.cxx b/filter/source/msfilter/msdffimp.cxx
index 235c274..55951e8 100644
--- a/filter/source/msfilter/msdffimp.cxx
+++ b/filter/source/msfilter/msdffimp.cxx
@@ -4394,7 +4394,7 @@ SdrObject* SvxMSDffManager::ImportShape( const DffRecordHeader& rHd, SvStream& r
                                 rOutliner.SetStyleSheetPool( static_cast<SfxStyleSheetPool*>(pModel->GetStyleSheetPool()) );
                             rOutliner.SetUpdateMode( false );
                             rOutliner.SetText( *pParaObj );
-                            ScopedVclPtrInstance< VirtualDevice > pVirDev( 1 );
+                            ScopedVclPtrInstance< VirtualDevice > pVirDev(DeviceFormat::BITMASK);
                             pVirDev->SetMapMode( MAP_100TH_MM );
                             sal_Int32 i, nParagraphs = rOutliner.GetParagraphCount();
                             if ( nParagraphs )
diff --git a/include/vcl/salgtype.hxx b/include/vcl/salgtype.hxx
index 8a34009..59654f6 100644
--- a/include/vcl/salgtype.hxx
+++ b/include/vcl/salgtype.hxx
@@ -22,6 +22,8 @@
 
 #include <sal/types.h>
 
+enum class DeviceFormat { NONE = -1, FULLCOLOR = 0, BITMASK = 1, GRAYSCALE = 8 };
+
 typedef sal_uInt32 SalColor;
 #define MAKE_SALCOLOR( r, g, b )    ((SalColor)(((sal_uInt32)((sal_uInt8)(b))))|(((sal_uInt32)((sal_uInt8)(g)))<<8)|(((sal_uInt32)((sal_uInt8)(r)))<<16))
 #define SALCOLOR_RED( n )           ((sal_uInt8)((n)>>16))
diff --git a/include/vcl/virdev.hxx b/include/vcl/virdev.hxx
index 740b9bf..76076ba 100644
--- a/include/vcl/virdev.hxx
+++ b/include/vcl/virdev.hxx
@@ -22,6 +22,7 @@
 
 #include <basebmp/bitmapdevice.hxx>
 #include <vcl/dllapi.h>
+#include <vcl/salgtype.hxx>
 #include <vcl/outdev.hxx>
 
 class SalVirtualDevice;
@@ -39,10 +40,11 @@ private:
     VclPtr<VirtualDevice>  mpNext;
     sal_uInt16          mnBitCount;
     bool                mbScreenComp;
-    sal_Int8            mnAlphaDepth;
+    DeviceFormat        meFormat;
+    DeviceFormat        meAlphaFormat;
     sal_uInt8           meRefDevMode;
 
-    SAL_DLLPRIVATE void ImplInitVirDev( const OutputDevice* pOutDev, long nDX, long nDY, sal_uInt16 nBitCount, const SystemGraphicsData *pData = nullptr );
+    SAL_DLLPRIVATE void ImplInitVirDev( const OutputDevice* pOutDev, long nDX, long nDY, DeviceFormat eFormat, const SystemGraphicsData *pData = nullptr );
     SAL_DLLPRIVATE bool InnerImplSetOutputSizePixel( const Size& rNewSize, bool bErase,
                                                      const basebmp::RawMemorySharedArray &pBuffer );
     SAL_DLLPRIVATE bool ImplSetOutputSizePixel( const Size& rNewSize, bool bErase,
@@ -76,7 +78,7 @@ public:
         indicate: take default screen depth. Only 0, 1 and 8
         are allowed here, with 1 denoting binary mask and 8 a graylevel mask.
      */
-    explicit            VirtualDevice( sal_uInt16 nBitCount = 0 );
+    explicit            VirtualDevice(DeviceFormat eFormat = DeviceFormat::FULLCOLOR);
 
     /** Create a virtual device of size 1x1
 
@@ -87,8 +89,8 @@ public:
         Bit depth of the generated virtual device. Use 0 here, to
         indicate: take default screen depth.
      */
-     explicit           VirtualDevice( const OutputDevice& rCompDev,
-                                       sal_uInt16 nBitCount = 0 );
+     explicit           VirtualDevice(const OutputDevice& rCompDev,
+                                      DeviceFormat eFormat = DeviceFormat::FULLCOLOR);
 
     /** Create a virtual device  of size 1x1 with alpha channel
 
@@ -106,14 +108,14 @@ public:
         are allowed here, with 1 denoting binary mask.
      */
      explicit           VirtualDevice( const OutputDevice& rCompDev,
-                                       sal_uInt16 nBitCount, sal_uInt16 nAlphaBitCount );
+                                       DeviceFormat eFormat, DeviceFormat eAlphaFormat);
 
     /** Create a virtual device using an existing system dependent device or graphics context
         Any rendering will happen directly on the context and not on any intermediate bitmap.
         Note: This might not be supported on all platforms !
     */
     explicit            VirtualDevice(const SystemGraphicsData *pData, const Size &rSize,
-                                      sal_uInt16 nBitCount);
+                                      DeviceFormat eFormat);
 
     virtual             ~VirtualDevice();
     virtual void        dispose() override;
diff --git a/sc/source/core/data/documen8.cxx b/sc/source/core/data/documen8.cxx
index d975c3f..12be826 100644
--- a/sc/source/core/data/documen8.cxx
+++ b/sc/source/core/data/documen8.cxx
@@ -193,9 +193,9 @@ VirtualDevice* ScDocument::GetVirtualDevice_100th_mm()
     if (!pVirtualDevice_100th_mm)
     {
 #ifdef IOS
-        pVirtualDevice_100th_mm = VclPtr<VirtualDevice>::Create( 8 );
+        pVirtualDevice_100th_mm = VclPtr<VirtualDevice>::Create(DeviceFormat::GRAYSCALE);
 #else
-        pVirtualDevice_100th_mm = VclPtr<VirtualDevice>::Create( 1 );
+        pVirtualDevice_100th_mm = VclPtr<VirtualDevice>::Create(DeviceFormat::BITMASK);
 #endif
         pVirtualDevice_100th_mm->SetReferenceDevice(VirtualDevice::REFDEV_MODE_MSO1);
         MapMode aMapMode( pVirtualDevice_100th_mm->GetMapMode() );
diff --git a/sd/source/ui/presenter/PresenterTextView.cxx b/sd/source/ui/presenter/PresenterTextView.cxx
index face96dd..db281d6 100644
--- a/sd/source/ui/presenter/PresenterTextView.cxx
+++ b/sd/source/ui/presenter/PresenterTextView.cxx
@@ -242,7 +242,7 @@ PresenterTextView::Implementation::Implementation()
       msTotalHeightPropertyName("TotalHeight"),
       mxBitmap(),
       mpCanvas(),
-      mpOutputDevice(VclPtr<VirtualDevice>::Create(*Application::GetDefaultDevice(), 0, 0)),
+      mpOutputDevice(VclPtr<VirtualDevice>::Create(*Application::GetDefaultDevice(), DeviceFormat::FULLCOLOR, DeviceFormat::FULLCOLOR)),
       mpEditEngine(nullptr),
       mpEditEngineItemPool(EditEngine::CreatePool()),
       maSize(100,100),
@@ -454,7 +454,8 @@ Reference<rendering::XBitmap> PresenterTextView::Implementation::GetBitmap()
     if ( ! mxBitmap.is())
     {
         mpOutputDevice.disposeAndClear();
-        mpOutputDevice = VclPtr<VirtualDevice>::Create(*Application::GetDefaultDevice(), 0, 0);
+        mpOutputDevice = VclPtr<VirtualDevice>::Create(*Application::GetDefaultDevice(),
+                                                       DeviceFormat::FULLCOLOR, DeviceFormat::FULLCOLOR);
         mpOutputDevice->SetMapMode(MAP_PIXEL);
         mpOutputDevice->SetOutputSizePixel(maSize);
         mpOutputDevice->SetLineColor();
diff --git a/sd/source/ui/slidesorter/view/SlsInsertionIndicatorOverlay.cxx b/sd/source/ui/slidesorter/view/SlsInsertionIndicatorOverlay.cxx
index 7e06c12..84590d8 100644
--- a/sd/source/ui/slidesorter/view/SlsInsertionIndicatorOverlay.cxx
+++ b/sd/source/ui/slidesorter/view/SlsInsertionIndicatorOverlay.cxx
@@ -135,7 +135,7 @@ void InsertionIndicatorOverlay::Create (
     // Create virtual devices for bitmap and mask whose bitmaps later be
     // combined to form the BitmapEx of the icon.
     ScopedVclPtrInstance<VirtualDevice> pContent(
-        *mrSlideSorter.GetContentWindow(), 0, 0);
+        *mrSlideSorter.GetContentWindow(), DeviceFormat::FULLCOLOR, DeviceFormat::FULLCOLOR);
     pContent->SetOutputSizePixel(aIconSize);
 
     pContent->SetFillColor();
diff --git a/svtools/source/table/gridtablerenderer.cxx b/svtools/source/table/gridtablerenderer.cxx
index b3eca3e..bae4ee3 100644
--- a/svtools/source/table/gridtablerenderer.cxx
+++ b/svtools/source/table/gridtablerenderer.cxx
@@ -84,7 +84,8 @@ namespace svt { namespace table
 
             Point const aBitmapPos( 0, 0 );
             Size const aBitmapSize( nSortIndicatorWidth, nSortIndicatorHeight );
-            ScopedVclPtrInstance< VirtualDevice > aDevice( i_device, 0, 0 );
+            ScopedVclPtrInstance< VirtualDevice > aDevice(i_device, DeviceFormat::FULLCOLOR,
+                                                          DeviceFormat::FULLCOLOR);
             aDevice->SetOutputSizePixel( aBitmapSize );
 
             DecorationView aDecoView(aDevice.get());
diff --git a/svx/source/customshapes/EnhancedCustomShapeFontWork.cxx b/svx/source/customshapes/EnhancedCustomShapeFontWork.cxx
index 9fa46c5..5deea95 100644
--- a/svx/source/customshapes/EnhancedCustomShapeFontWork.cxx
+++ b/svx/source/customshapes/EnhancedCustomShapeFontWork.cxx
@@ -166,7 +166,7 @@ void CalculateHorizontalScalingFactor( const SdrObject* pCustomShape,
     aFont.SetOrientation( 0 );
     // initializing virtual device
 
-    ScopedVclPtrInstance< VirtualDevice > pVirDev( 1 );
+    ScopedVclPtrInstance< VirtualDevice > pVirDev(DeviceFormat::BITMASK);
     pVirDev->SetMapMode( MAP_100TH_MM );
     pVirDev->SetFont( aFont );
 
@@ -260,7 +260,7 @@ void GetTextAreaOutline( const FWData& rFWData, const SdrObject* pCustomShape, F
             aFont.SetWeight( rWeightItem.GetWeight() );
 
             // initializing virtual device
-            ScopedVclPtrInstance< VirtualDevice > pVirDev( 1 );
+            ScopedVclPtrInstance< VirtualDevice > pVirDev(DeviceFormat::BITMASK);
             pVirDev->SetMapMode( MAP_100TH_MM );
             pVirDev->SetFont( aFont );
             pVirDev->EnableRTL();
diff --git a/svx/source/dialog/dialcontrol.cxx b/svx/source/dialog/dialcontrol.cxx
index 18f6a5c..c93c0ac 100644
--- a/svx/source/dialog/dialcontrol.cxx
+++ b/svx/source/dialog/dialcontrol.cxx
@@ -35,7 +35,7 @@ namespace svx {
 const long DIAL_OUTER_WIDTH = 8;
 
 DialControlBmp::DialControlBmp(vcl::Window& rParent) :
-    VirtualDevice(rParent, 0, 0),
+    VirtualDevice(rParent, DeviceFormat::FULLCOLOR, DeviceFormat::FULLCOLOR),
     mbEnabled(true),
     mrParent(rParent),
     mnCenterX(0),
diff --git a/sw/source/core/doc/DocumentDeviceManager.cxx b/sw/source/core/doc/DocumentDeviceManager.cxx
index 234a0e2..1b47d29 100644
--- a/sw/source/core/doc/DocumentDeviceManager.cxx
+++ b/sw/source/core/doc/DocumentDeviceManager.cxx
@@ -261,9 +261,9 @@ DocumentDeviceManager::~DocumentDeviceManager()
 VirtualDevice& DocumentDeviceManager::CreateVirtualDevice_() const
 {
 #ifdef IOS
-    VclPtr<VirtualDevice> pNewVir = VclPtr<VirtualDevice>::Create( 8 );
+    VclPtr<VirtualDevice> pNewVir = VclPtr<VirtualDevice>::Create(DeviceFormat::GRAYSCALE);
 #else
-    VclPtr<VirtualDevice> pNewVir = VclPtr<VirtualDevice>::Create( 1 );
+    VclPtr<VirtualDevice> pNewVir = VclPtr<VirtualDevice>::Create(DeviceFormat::BITMASK);
 #endif
 
     pNewVir->SetReferenceDevice( VirtualDevice::REFDEV_MODE_MSO1 );
diff --git a/sw/source/uibase/uno/unotxdoc.cxx b/sw/source/uibase/uno/unotxdoc.cxx
index 4bede99..738be4b 100644
--- a/sw/source/uibase/uno/unotxdoc.cxx
+++ b/sw/source/uibase/uno/unotxdoc.cxx
@@ -3426,8 +3426,8 @@ void SAL_CALL SwXTextDocument::paintTile( const ::css::uno::Any& Parent, ::sal_I
     sal_Int64 nWindowHandle;
     Parent >>= nWindowHandle;
     aData.hWnd = (HWND) nWindowHandle;
-    VirtualDevice aDevice(&aData, Size(1, 1), (sal_uInt16)32);
-    paintTile( aDevice, nOutputWidth, nOutputHeight, nTilePosX, nTilePosY, nTileWidth, nTileHeight );
+    ScopedVclPtrInstance<VirtualDevice> xDevice(&aData, Size(1, 1), DeviceFormat::FULLCOLOR);
+    paintTile(*xDevice, nOutputWidth, nOutputHeight, nTilePosX, nTilePosY, nTileWidth, nTileHeight);
     #else
     // TODO: support other platforms
     (void)Parent;
diff --git a/vcl/headless/svpbmp.cxx b/vcl/headless/svpbmp.cxx
index 8c0363b..722b4dd 100644
--- a/vcl/headless/svpbmp.cxx
+++ b/vcl/headless/svpbmp.cxx
@@ -45,7 +45,7 @@ bool SvpSalBitmap::Create( const Size& rSize,
 
     SvpSalInstance* pInst = SvpSalInstance::s_pDefaultInstance;
     assert( pInst );
-    basebmp::Format nFormat = pInst->getFormatForBitCount( nBitCount );
+    basebmp::Format nFormat = pInst->getBaseBmpFormatForBitCount( nBitCount );
 
     B2IVector aSize( rSize.Width(), rSize.Height() );
     if( aSize.getX() == 0 )
diff --git a/vcl/headless/svpinst.cxx b/vcl/headless/svpinst.cxx
index fc24200..fe381fb 100644
--- a/vcl/headless/svpinst.cxx
+++ b/vcl/headless/svpinst.cxx
@@ -227,10 +227,10 @@ void SvpSalInstance::DestroyObject( SalObject* pObject )
 
 SalVirtualDevice* SvpSalInstance::CreateVirtualDevice( SalGraphics* /* pGraphics */,
                                                        long &nDX, long &nDY,
-                                                       sal_uInt16 nBitCount,
+                                                       DeviceFormat eFormat,
                                                        const SystemGraphicsData* /* pData */ )
 {
-    SvpSalVirtualDevice* pNew = new SvpSalVirtualDevice( nBitCount );
+    SvpSalVirtualDevice* pNew = new SvpSalVirtualDevice(eFormat);
     pNew->SetSize( nDX, nDY );
     return pNew;
 }
@@ -416,7 +416,7 @@ void SvpSalTimer::Start( sal_uLong nMS )
     m_pInstance->StartTimer( nMS );
 }
 
-Format SvpSalInstance::getFormatForBitCount( sal_uInt16 nBitCount )
+Format SvpSalInstance::getBaseBmpFormatForBitCount( sal_uInt16 nBitCount )
 {
     switch( nBitCount )
     {
@@ -439,4 +439,19 @@ Format SvpSalInstance::getFormatForBitCount( sal_uInt16 nBitCount )
      }
 
 }
+
+Format SvpSalInstance::getBaseBmpFormatForDeviceFormat(DeviceFormat eFormat)
+{
+    switch (eFormat)
+    {
+        case DeviceFormat::BITMASK:
+            return Format::OneBitMsbPal;
+        case DeviceFormat::GRAYSCALE:
+            return Format::EightBitPal;
+        default:
+            return SVP_CAIRO_FORMAT;
+    }
+
+}
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/headless/svpvd.cxx b/vcl/headless/svpvd.cxx
index f861ac7..3cc8b5f 100644
--- a/vcl/headless/svpvd.cxx
+++ b/vcl/headless/svpvd.cxx
@@ -67,10 +67,10 @@ bool SvpSalVirtualDevice::SetSizeUsingBuffer( long nNewDX, long nNewDY,
     {
         SvpSalInstance* pInst = SvpSalInstance::s_pDefaultInstance;
         assert( pInst );
-        basebmp::Format nFormat = pInst->getFormatForBitCount( m_nBitCount );
+        basebmp::Format nFormat = pInst->getBaseBmpFormatForDeviceFormat(m_eFormat);
         sal_Int32 nStride = basebmp::getBitmapDeviceStrideForWidth(nFormat, aDevSize.getX());
 
-        if ( m_nBitCount == 1 )
+        if (m_eFormat == DeviceFormat::BITMASK)
         {
             std::vector< basebmp::Color > aDevPal(2);
             aDevPal[0] = basebmp::Color( 0, 0, 0 );
diff --git a/vcl/inc/headless/svpinst.hxx b/vcl/inc/headless/svpinst.hxx
index 5d926f5..cf30aae 100644
--- a/vcl/inc/headless/svpinst.hxx
+++ b/vcl/inc/headless/svpinst.hxx
@@ -125,7 +125,7 @@ public:
     // pData allows for using a system dependent graphics or device context
     virtual SalVirtualDevice*   CreateVirtualDevice( SalGraphics* pGraphics,
                                                      long &nDX, long &nDY,
-                                                     sal_uInt16 nBitCount, const SystemGraphicsData *pData = nullptr ) override;
+                                                     DeviceFormat eFormat, const SystemGraphicsData *pData = nullptr ) override;
 
     // Printer
     // pSetupData->mpDriverData can be 0
@@ -167,7 +167,8 @@ public:
 
     virtual GenPspGraphics *CreatePrintGraphics() override;
 
-    ::basebmp::Format getFormatForBitCount( sal_uInt16 );
+    ::basebmp::Format getBaseBmpFormatForBitCount(sal_uInt16);
+    ::basebmp::Format getBaseBmpFormatForDeviceFormat(DeviceFormat);
 };
 
 #endif // INCLUDED_VCL_INC_HEADLESS_SVPINST_HXX
diff --git a/vcl/inc/headless/svpvd.hxx b/vcl/inc/headless/svpvd.hxx
index bfa055f..4241d38 100644
--- a/vcl/inc/headless/svpvd.hxx
+++ b/vcl/inc/headless/svpvd.hxx
@@ -28,12 +28,12 @@ class SvpSalGraphics;
 
 class VCL_DLLPUBLIC SvpSalVirtualDevice : public SalVirtualDevice
 {
-    sal_uInt16                          m_nBitCount;
+    DeviceFormat                        m_eFormat;
     basebmp::BitmapDeviceSharedPtr      m_aDevice;
     std::list< SvpSalGraphics* >        m_aGraphics;
 
 public:
-    SvpSalVirtualDevice( sal_uInt16 nBitCount ) : m_nBitCount(nBitCount) {}
+    SvpSalVirtualDevice(DeviceFormat eFormat) : m_eFormat(eFormat) {}
     virtual ~SvpSalVirtualDevice();
 
     // SalVirtualDevice
diff --git a/vcl/inc/opengl/x11/salvd.hxx b/vcl/inc/opengl/x11/salvd.hxx
index 0ab611e..4993194 100644
--- a/vcl/inc/opengl/x11/salvd.hxx
+++ b/vcl/inc/opengl/x11/salvd.hxx
@@ -33,7 +33,7 @@ class X11OpenGLSalVirtualDevice : public SalVirtualDevice
 public:
     X11OpenGLSalVirtualDevice( SalGraphics *pGraphics,
                                long &nDX, long &nDY,
-                               sal_uInt16 nBitCount,
+                               DeviceFormat eFormat,
                                const SystemGraphicsData *pData,
                                X11SalGraphics* pNewGraphics);
     virtual ~X11OpenGLSalVirtualDevice();
diff --git a/vcl/inc/osx/salinst.h b/vcl/inc/osx/salinst.h
index 2e909ee..151da02 100644
--- a/vcl/inc/osx/salinst.h
+++ b/vcl/inc/osx/salinst.h
@@ -88,7 +88,7 @@ public:
     virtual void            DestroyObject( SalObject* pObject ) override;
     virtual SalVirtualDevice* CreateVirtualDevice( SalGraphics* pGraphics,
                                                    long &nDX, long &nDY,
-                                                   sal_uInt16 nBitCount,
+                                                   DeviceFormat eFormat,
                                                    const SystemGraphicsData *pData ) override;
     virtual SalInfoPrinter* CreateInfoPrinter( SalPrinterQueueInfo* pQueueInfo,
                                                ImplJobSetup* pSetupData ) override;
diff --git a/vcl/inc/quartz/salvd.h b/vcl/inc/quartz/salvd.h
index 7159d16..4dec371 100644
--- a/vcl/inc/quartz/salvd.h
+++ b/vcl/inc/quartz/salvd.h
@@ -53,7 +53,7 @@ private:
     void Destroy();
 
 public:
-    AquaSalVirtualDevice( AquaSalGraphics* pGraphic, long &nDX, long &nDY, sal_uInt16 nBitCount, const SystemGraphicsData *pData );
+    AquaSalVirtualDevice( AquaSalGraphics* pGraphic, long &nDX, long &nDY, DeviceFormat eFormat, const SystemGraphicsData *pData );
     virtual ~AquaSalVirtualDevice();
 
     virtual SalGraphics*            AcquireGraphics() override;
diff --git a/vcl/inc/salinst.hxx b/vcl/inc/salinst.hxx
index a5f8806..6ed84b9 100644
--- a/vcl/inc/salinst.hxx
+++ b/vcl/inc/salinst.hxx
@@ -28,6 +28,7 @@
 #include "tools/solar.h"
 #include "displayconnectiondispatch.hxx"
 #include "vcl/dllapi.h"
+#include "vcl/salgtype.hxx"
 #include <sal/types.h>
 
 #include "rtl/ref.hxx"
@@ -90,7 +91,7 @@ public:
     virtual SalVirtualDevice*
                             CreateVirtualDevice( SalGraphics* pGraphics,
                                                  long &rDX, long &rDY,
-                                                 sal_uInt16 nBitCount, const SystemGraphicsData *pData = nullptr ) = 0;
+                                                 DeviceFormat eFormat, const SystemGraphicsData *pData = nullptr ) = 0;
 
     // Printer
     // pSetupData->mpDriverData can be 0
diff --git a/vcl/inc/unx/gtk/gtkinst.hxx b/vcl/inc/unx/gtk/gtkinst.hxx
index ca469a2..3dd8f0d 100644
--- a/vcl/inc/unx/gtk/gtkinst.hxx
+++ b/vcl/inc/unx/gtk/gtkinst.hxx
@@ -76,7 +76,7 @@ public:
     virtual void                AddToRecentDocumentList(const OUString& rFileUrl, const OUString& rMimeType, const OUString& rDocumentService) override;
     virtual SalVirtualDevice*   CreateVirtualDevice( SalGraphics*,
                                                      long &nDX, long &nDY,
-                                                     sal_uInt16 nBitCount,
+                                                     DeviceFormat eFormat,
                                                      const SystemGraphicsData* ) override;
     virtual SalBitmap*          CreateSalBitmap() override;
 
diff --git a/vcl/inc/unx/salinst.h b/vcl/inc/unx/salinst.h
index e736faa..5ccb9a1 100644
--- a/vcl/inc/unx/salinst.h
+++ b/vcl/inc/unx/salinst.h
@@ -57,11 +57,11 @@ public:
 
     /// 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);
+            DeviceFormat eFormat, const SystemGraphicsData* pData, X11SalGraphics* pNewGraphics);
 
     virtual SalVirtualDevice*   CreateVirtualDevice( SalGraphics* pGraphics,
                                                      long &nDX, long &nDY,
-                                                     sal_uInt16 nBitCount, const SystemGraphicsData *pData = NULL ) override;
+                                                     DeviceFormat eFormat, const SystemGraphicsData *pData = NULL ) override;
     virtual void                PostPrintersChanged() override;
     virtual GenPspGraphics     *CreatePrintGraphics() override;
 
diff --git a/vcl/inc/unx/salvd.h b/vcl/inc/unx/salvd.h
index fbe173f..ca83c84 100644
--- a/vcl/inc/unx/salvd.h
+++ b/vcl/inc/unx/salvd.h
@@ -45,7 +45,7 @@ class X11SalVirtualDevice : public SalVirtualDevice
 
 public:
     X11SalVirtualDevice(SalGraphics *pGraphics, long &nDX, long &nDY,
-            sal_uInt16 nBitCount, const SystemGraphicsData *pData, X11SalGraphics* pNewGraphics);
+            DeviceFormat eFormat, const SystemGraphicsData *pData, X11SalGraphics* pNewGraphics);
 
     virtual ~X11SalVirtualDevice();
 
diff --git a/vcl/inc/win/salinst.h b/vcl/inc/win/salinst.h
index 4c1bc7f..c50aaa5 100644
--- a/vcl/inc/win/salinst.h
+++ b/vcl/inc/win/salinst.h
@@ -53,7 +53,7 @@ public:
     virtual void            DestroyObject( SalObject* pObject ) override;
     virtual SalVirtualDevice*   CreateVirtualDevice( SalGraphics* pGraphics,
                                                      long &nDX, long &nDY,
-                                                     sal_uInt16 nBitCount, const SystemGraphicsData *pData ) override;
+                                                     DeviceFormat eFormat, const SystemGraphicsData *pData ) override;
     virtual SalInfoPrinter* CreateInfoPrinter( SalPrinterQueueInfo* pQueueInfo,
                                                ImplJobSetup* pSetupData ) override;
     virtual void            DestroyInfoPrinter( SalInfoPrinter* pPrinter ) override;
diff --git a/vcl/opengl/x11/salvd.cxx b/vcl/opengl/x11/salvd.cxx
index 9c8c20e..627661a 100644
--- a/vcl/opengl/x11/salvd.cxx
+++ b/vcl/opengl/x11/salvd.cxx
@@ -35,7 +35,7 @@ void X11SalGraphics::Init( X11OpenGLSalVirtualDevice *pDevice )
 
 X11OpenGLSalVirtualDevice::X11OpenGLSalVirtualDevice( SalGraphics* pGraphics,
                                                       long &nDX, long &nDY,
-                                                      sal_uInt16 nBitCount,
+                                                      DeviceFormat eFormat,
                                                       const SystemGraphicsData *pData,
                                                       X11SalGraphics* pNewGraphics) :
     mpGraphics(pNewGraphics),
@@ -43,9 +43,22 @@ X11OpenGLSalVirtualDevice::X11OpenGLSalVirtualDevice( SalGraphics* pGraphics,
     mnXScreen( 0 )
 {
     assert(mpGraphics);
+
     // TODO Do we really need the requested bit count?
-    if( !nBitCount && pGraphics )
-        nBitCount = pGraphics->GetBitCount();
+    sal_uInt16 nBitCount;
+    switch (eFormat)
+    {
+        case DeviceFormat::BITMASK:
+            nBitCount = 1;
+            break;
+        case DeviceFormat::GRAYSCALE:
+            nBitCount = 8;
+            break;
+        default:
+            nBitCount = pGraphics->GetBitCount();
+            break;
+
+    }
 
     // TODO Check where a VirtualDevice is created from SystemGraphicsData
     assert( pData == nullptr ); (void)pData;
diff --git a/vcl/qa/cppunit/lifecycle.cxx b/vcl/qa/cppunit/lifecycle.cxx
index 748f603..0d6c0c1 100644
--- a/vcl/qa/cppunit/lifecycle.cxx
+++ b/vcl/qa/cppunit/lifecycle.cxx
@@ -74,7 +74,7 @@ void LifecycleTest::testVirtualDevice()
     VclPtr<VirtualDevice> pVDev = VclPtr< VirtualDevice >::Create();
     ScopedVclPtrInstance< VirtualDevice > pVDev2;
     VclPtrInstance<VirtualDevice> pVDev3;
-    VclPtrInstance<VirtualDevice> pVDev4( 1 );
+    VclPtrInstance<VirtualDevice> pVDev4(DeviceFormat::BITMASK);
     CPPUNIT_ASSERT(!!pVDev && !!pVDev2 && !!pVDev3 && !!pVDev4);
 }
 
diff --git a/vcl/quartz/salvd.cxx b/vcl/quartz/salvd.cxx
index 485ac20..b7717fa 100644
--- a/vcl/quartz/salvd.cxx
+++ b/vcl/quartz/salvd.cxx
@@ -38,7 +38,7 @@
 
 SalVirtualDevice* AquaSalInstance::CreateVirtualDevice( SalGraphics* pGraphics,
                                                         long &nDX, long &nDY,
-                                                        sal_uInt16 nBitCount,
+                                                        DeviceFormat eFormat,
                                                         const SystemGraphicsData *pData )
 {
     // #i92075# can be called first in a thread
@@ -48,29 +48,29 @@ SalVirtualDevice* AquaSalInstance::CreateVirtualDevice( SalGraphics* pGraphics,
     if( pData )
     {
         return new AquaSalVirtualDevice( static_cast< AquaSalGraphics* >( pGraphics ),
-                                         nDX, nDY, nBitCount, pData );
+                                         nDX, nDY, eFormat, pData );
     }
     else
     {
-        AquaSalVirtualDevice* pNew = new AquaSalVirtualDevice( NULL, nDX, nDY, nBitCount, NULL );
+        AquaSalVirtualDevice* pNew = new AquaSalVirtualDevice( NULL, nDX, nDY, eFormat, NULL );
         pNew->SetSize( nDX, nDY );
         return pNew;
     }
 #else
     return new AquaSalVirtualDevice( static_cast< AquaSalGraphics* >( pGraphics ),
-                                     nDX, nDY, nBitCount, pData );
+                                     nDX, nDY, eFormat, pData );
 #endif
 }
 
 AquaSalVirtualDevice::AquaSalVirtualDevice( AquaSalGraphics* pGraphic, long &nDX, long &nDY,
-                                            sal_uInt16 nBitCount, const SystemGraphicsData *pData )
+                                            DeviceFormat eFormat, const SystemGraphicsData *pData )
   : mbGraphicsUsed( false )
   , mxBitmapContext( nullptr )
   , mnBitmapDepth( 0 )
   , mxLayer( nullptr )
 {
     SAL_INFO( "vcl.virdev", "AquaSalVirtualDevice::AquaSalVirtualDevice() this=" << this
-              << " size=(" << nDX << "x" << nDY << ") bitcount=" << nBitCount <<
+              << " size=(" << nDX << "x" << nDY << ") bitcount=" << static_cast<int>(eFormat) <<
               " pData=" << pData << " context=" << (pData ? pData->rCGContext : nullptr) );
 
     if( pGraphic && pData && pData->rCGContext )
@@ -110,7 +110,18 @@ AquaSalVirtualDevice::AquaSalVirtualDevice( AquaSalGraphics* pGraphic, long &nDX
         // create empty new virtual device
         mbForeignContext = false;           // the mxContext is created within VCL
         mpGraphics = new AquaSalGraphics(); // never fails
-        mnBitmapDepth = nBitCount;
+        switch (eFormat)
+        {
+            case DeviceFormat::BITMASK:
+                mnBitmapDepth = 1;
+                break;
+            case DeviceFormat::GRAYSCALE:
+                mnBitmapDepth = 8;
+                break;
+            default:
+                mnBitmapDepth = 0;
+                break;
+        }
 #ifdef MACOSX
         // inherit resolution from reference device
         if( pGraphic )
diff --git a/vcl/source/gdi/bitmapex.cxx b/vcl/source/gdi/bitmapex.cxx
index 906d3eb..a75afd6 100644
--- a/vcl/source/gdi/bitmapex.cxx
+++ b/vcl/source/gdi/bitmapex.cxx
@@ -697,7 +697,8 @@ BitmapEx BitmapEx:: AutoScaleBitmap(BitmapEx & aBitmap, const long aStandardSize
     Size aStdSize( aStandardSize, aStandardSize );
     Rectangle aRect(aEmptyPoint, aStdSize );
 
-    ScopedVclPtrInstance< VirtualDevice > aVirDevice( *Application::GetDefaultDevice(), 0, 1 );
+    ScopedVclPtrInstance< VirtualDevice > aVirDevice(*Application::GetDefaultDevice(),
+                                                     DeviceFormat::FULLCOLOR, DeviceFormat::BITMASK);
     aVirDevice->SetOutputSizePixel( aStdSize );
     aVirDevice->SetFillColor( COL_TRANSPARENT );
     aVirDevice->SetLineColor( COL_TRANSPARENT );
diff --git a/vcl/source/gdi/gdimtf.cxx b/vcl/source/gdi/gdimtf.cxx
index 51fb545..b7be53b 100644
--- a/vcl/source/gdi/gdimtf.cxx
+++ b/vcl/source/gdi/gdimtf.cxx
@@ -886,7 +886,7 @@ void GDIMetaFile::ImplAddGradientEx( GDIMetaFile&         rMtf,
                                      const Gradient&      rGrad     )
 {
     // Generate comment, GradientEx and Gradient actions (within DrawGradient)
-    ScopedVclPtrInstance< VirtualDevice > aVDev(  rMapDev, 0  );
+    ScopedVclPtrInstance< VirtualDevice > aVDev(rMapDev, DeviceFormat::FULLCOLOR);
     aVDev->EnableOutput( false );
     GDIMetaFile aGradMtf;
 
diff --git a/vcl/source/gdi/pdfwriter_impl.cxx b/vcl/source/gdi/pdfwriter_impl.cxx
index 2384ef3..a454704 100644
--- a/vcl/source/gdi/pdfwriter_impl.cxx
+++ b/vcl/source/gdi/pdfwriter_impl.cxx
@@ -2222,7 +2222,7 @@ OutputDevice* PDFWriterImpl::getReferenceDevice()
 {
     if( ! m_pReferenceDevice )
     {
-        VclPtrInstance<VirtualDevice> pVDev( 0 );
+        VclPtrInstance<VirtualDevice> pVDev(DeviceFormat::FULLCOLOR);
 
         m_pReferenceDevice = pVDev;
 
diff --git a/vcl/source/gdi/virdev.cxx b/vcl/source/gdi/virdev.cxx
index 41a604b..4557dc2 100644
--- a/vcl/source/gdi/virdev.cxx
+++ b/vcl/source/gdi/virdev.cxx
@@ -125,9 +125,9 @@ void VirtualDevice::ReleaseGraphics( bool bRelease )
 }
 
 void VirtualDevice::ImplInitVirDev( const OutputDevice* pOutDev,
-                                    long nDX, long nDY, sal_uInt16 nBitCount, const SystemGraphicsData *pData )
+                                    long nDX, long nDY, DeviceFormat eFormat, const SystemGraphicsData *pData )
 {
-    SAL_INFO( "vcl.virdev", "ImplInitVirDev(" << nDX << "," << nDY << "," << nBitCount << ")" );
+    SAL_INFO( "vcl.virdev", "ImplInitVirDev(" << nDX << "," << nDY << "," << static_cast<int>(eFormat) << ")" );
 
     bool bErase = nDX > 0 && nDY > 0;
 
@@ -149,7 +149,7 @@ void VirtualDevice::ImplInitVirDev( const OutputDevice* pOutDev,
         (void)pOutDev->AcquireGraphics();
     pGraphics = pOutDev->mpGraphics;
     if ( pGraphics )
-        mpVirDev = pSVData->mpDefInst->CreateVirtualDevice( pGraphics, nDX, nDY, nBitCount, pData );
+        mpVirDev = pSVData->mpDefInst->CreateVirtualDevice(pGraphics, nDX, nDY, eFormat, pData);
     else
         mpVirDev = nullptr;
     if ( !mpVirDev )
@@ -160,13 +160,23 @@ void VirtualDevice::ImplInitVirDev( const OutputDevice* pOutDev,
             css::uno::Reference< css::uno::XInterface >() );
     }
 
-    mnBitCount      = ( nBitCount ? nBitCount : pOutDev->GetBitCount() );
+    meFormat        = eFormat;
+    switch (meFormat)
+    {
+        case DeviceFormat::BITMASK:
+            mnBitCount = 1;
+        case DeviceFormat::GRAYSCALE:
+            mnBitCount = 8;
+        default:
+            mnBitCount = pOutDev->GetBitCount();
+            break;
+    }
     mnOutWidth      = nDX;
     mnOutHeight     = nDY;
     mbScreenComp    = true;
-    mnAlphaDepth    = -1;
+    meAlphaFormat   = DeviceFormat::NONE;
 
-    if( mnBitCount < 8 )
+    if (meFormat == DeviceFormat::BITMASK)
         SetAntialiasing( AntialiasingFlags::DisableText );
 
     if ( pOutDev->GetOutDevType() == OUTDEV_PRINTER )
@@ -206,52 +216,46 @@ void VirtualDevice::ImplInitVirDev( const OutputDevice* pOutDev,
     pSVData->maGDIData.mpFirstVirDev = this;
 }
 
-VirtualDevice::VirtualDevice( sal_uInt16 nBitCount )
+VirtualDevice::VirtualDevice(DeviceFormat eFormat)
 :   mpVirDev( nullptr ),
     meRefDevMode( REFDEV_NONE )
 {
-    SAL_WARN_IF( nBitCount > 1 && nBitCount != 8, "vcl.gdi",
-                 "VirtualDevice::VirtualDevice(): Only 0, 1 or 8 allowed for BitCount, not " << nBitCount );
-    SAL_INFO( "vcl.gdi", "VirtualDevice::VirtualDevice( " << nBitCount << " )" );
+    SAL_INFO( "vcl.gdi", "VirtualDevice::VirtualDevice( " << static_cast<int>(eFormat) << " )" );
 
-    ImplInitVirDev( Application::GetDefaultDevice(), 0, 0, nBitCount );
+    ImplInitVirDev(Application::GetDefaultDevice(), 0, 0, eFormat);
 }
 
-VirtualDevice::VirtualDevice( const OutputDevice& rCompDev, sal_uInt16 nBitCount )
+VirtualDevice::VirtualDevice(const OutputDevice& rCompDev, DeviceFormat eFormat)
     : mpVirDev( nullptr ),
     meRefDevMode( REFDEV_NONE )
 {
-    SAL_WARN_IF( nBitCount > 1 && nBitCount != 8 && nBitCount != rCompDev.GetBitCount(), "vcl.gdi",
-                 "VirtualDevice::VirtualDevice(): Only 0, 1 or 8 allowed for BitCount, not " << nBitCount );
-    SAL_INFO( "vcl.gdi", "VirtualDevice::VirtualDevice( " << nBitCount << " )" );
+    SAL_INFO( "vcl.gdi", "VirtualDevice::VirtualDevice( " << static_cast<int>(eFormat) << " )" );
 
-    ImplInitVirDev( &rCompDev, 0, 0, nBitCount );
+    ImplInitVirDev(&rCompDev, 0, 0, eFormat);
 }
 
-VirtualDevice::VirtualDevice( const OutputDevice& rCompDev, sal_uInt16 nBitCount, sal_uInt16 nAlphaBitCount )
-    : mpVirDev( nullptr ),
-    meRefDevMode( REFDEV_NONE )
+VirtualDevice::VirtualDevice(const OutputDevice& rCompDev, DeviceFormat eFormat, DeviceFormat eAlphaFormat)
+    : mpVirDev( nullptr )
+    , meRefDevMode( REFDEV_NONE )
 {
-    SAL_WARN_IF( nBitCount > 1 && nBitCount != 8, "vcl.gdi",
-                 "VirtualDevice::VirtualDevice(): Only 0, 1 or 8 allowed for BitCount, not " << nBitCount );
     SAL_INFO( "vcl.gdi",
-            "VirtualDevice::VirtualDevice( " << nBitCount << ", " << nAlphaBitCount << " )" );
+            "VirtualDevice::VirtualDevice( " << static_cast<int>(eFormat) << ", " << static_cast<int>(eAlphaFormat) << " )" );
 
-    ImplInitVirDev( &rCompDev, 0, 0, nBitCount );
+    ImplInitVirDev(&rCompDev, 0, 0, eFormat);
 
     // Enable alpha channel
-    mnAlphaDepth = sal::static_int_cast<sal_Int8>(nAlphaBitCount);
+    meAlphaFormat = eAlphaFormat;
 }
 
 VirtualDevice::VirtualDevice(const SystemGraphicsData *pData, const Size &rSize,
-                             sal_uInt16 nBitCount)
+                             DeviceFormat eFormat)
 :   mpVirDev( nullptr ),
     meRefDevMode( REFDEV_NONE )
 {
-    SAL_INFO( "vcl.gdi", "VirtualDevice::VirtualDevice( " << nBitCount << " )" );
+    SAL_INFO( "vcl.gdi", "VirtualDevice::VirtualDevice( " << static_cast<int>(eFormat) << " )" );
 
     ImplInitVirDev(Application::GetDefaultDevice(), rSize.Width(), rSize.Height(),
-                   nBitCount, pData);
+                   eFormat, pData);
 }
 
 VirtualDevice::~VirtualDevice()
@@ -337,7 +341,7 @@ bool VirtualDevice::InnerImplSetOutputSizePixel( const Size& rNewSize, bool bEra
                 return false;
         }
 
-        pNewVirDev = pSVData->mpDefInst->CreateVirtualDevice( mpGraphics, nNewWidth, nNewHeight, mnBitCount );
+        pNewVirDev = pSVData->mpDefInst->CreateVirtualDevice(mpGraphics, nNewWidth, nNewHeight, meFormat);
         if ( pNewVirDev )
         {
             SalGraphics* pGraphics = pNewVirDev->AcquireGraphics();
@@ -396,7 +400,7 @@ bool VirtualDevice::ImplSetOutputSizePixel( const Size& rNewSize, bool bErase,
 {
     if( InnerImplSetOutputSizePixel(rNewSize, bErase, pBuffer) )
     {
-        if( mnAlphaDepth != -1 )
+        if (meAlphaFormat != DeviceFormat::NONE)
         {
             // #110958# Setup alpha bitmap
             if(mpAlphaVDev && mpAlphaVDev->GetOutputSizePixel() != rNewSize)
@@ -406,7 +410,7 @@ bool VirtualDevice::ImplSetOutputSizePixel( const Size& rNewSize, bool bErase,
 
             if( !mpAlphaVDev )
             {
-                mpAlphaVDev = VclPtr<VirtualDevice>::Create( *this, mnAlphaDepth );
+                mpAlphaVDev = VclPtr<VirtualDevice>::Create(*this, meAlphaFormat);
                 mpAlphaVDev->InnerImplSetOutputSizePixel(rNewSize, bErase,
                                                          pAlphaBuffer);
             }
@@ -449,7 +453,7 @@ bool VirtualDevice::SetOutputSizePixelScaleOffsetAndBuffer(
     const basebmp::RawMemorySharedArray &pBuffer, const basebmp::RawMemorySharedArray &pAlphaBuffer )
 {
     if (pAlphaBuffer)
-        mnAlphaDepth = 8;
+        meAlphaFormat = DeviceFormat::GRAYSCALE;
 
     if (pBuffer) {
         MapMode mm = GetMapMode();
diff --git a/vcl/source/outdev/text.cxx b/vcl/source/outdev/text.cxx
index 9a745be..097d21c 100644
--- a/vcl/source/outdev/text.cxx
+++ b/vcl/source/outdev/text.cxx
@@ -236,7 +236,7 @@ bool OutputDevice::ImplDrawRotateText( SalLayout& rSalLayout )
 
     // cache virtual device for rotation
     if (!mpOutDevData->mpRotateDev)
-        mpOutDevData->mpRotateDev = VclPtr<VirtualDevice>::Create( *this, 1 );
+        mpOutDevData->mpRotateDev = VclPtr<VirtualDevice>::Create(*this, DeviceFormat::BITMASK);
     VirtualDevice* pVDev = mpOutDevData->mpRotateDev;
 
     // size it accordingly
@@ -2508,7 +2508,7 @@ bool OutputDevice::GetTextBoundRect( Rectangle& rRect,
 
     // fall back to bitmap method to get the bounding rectangle,
     // so we need a monochrome virtual device with matching font
-    ScopedVclPtrInstance< VirtualDevice > aVDev(  1  );
+    ScopedVclPtrInstance< VirtualDevice > aVDev(DeviceFormat::BITMASK);
     vcl::Font aFont( GetFont() );
     aFont.SetShadow( false );
     aFont.SetOutline( false );
@@ -2732,7 +2732,7 @@ bool OutputDevice::GetTextOutlines( ::basegfx::B2DPolyPolygonVector& rVector,
         + mnEmphasisDescent;
     pSalLayout->Release();
 
-    ScopedVclPtrInstance< VirtualDevice > aVDev( 1 );
+    ScopedVclPtrInstance< VirtualDevice > aVDev(DeviceFormat::BITMASK);
 
     vcl::Font aFont(GetFont());
     aFont.SetShadow(false);
diff --git a/vcl/source/outdev/transparent.cxx b/vcl/source/outdev/transparent.cxx
index d53303d..4c8a405 100644
--- a/vcl/source/outdev/transparent.cxx
+++ b/vcl/source/outdev/transparent.cxx
@@ -431,7 +431,7 @@ void OutputDevice::EmulateDrawTransparent ( const tools::PolyPolygon& rPolyPoly,
 
         if( !bDrawn )
         {
-            ScopedVclPtrInstance< VirtualDevice > aVDev(  *this, 1  );
+            ScopedVclPtrInstance< VirtualDevice > aVDev(*this, DeviceFormat::BITMASK);
             const Size aDstSz( aDstRect.GetSize() );
             const sal_uInt8 cTrans = (sal_uInt8) MinMax( FRound( nTransparencePercent * 2.55 ), 0, 255 );
 
diff --git a/vcl/source/window/paint.cxx b/vcl/source/window/paint.cxx
index 22f9849..d2b452c 100644
--- a/vcl/source/window/paint.cxx
+++ b/vcl/source/window/paint.cxx
@@ -1436,7 +1436,9 @@ void Window::ImplPaintToDevice( OutputDevice* i_pTargetOutDev, const Point& i_rP
     mpWindowImpl->mbReallyVisible = bRVisible;
 
     // paint metafile to VDev
-    VclPtrInstance<VirtualDevice> pMaskedDevice( *i_pTargetOutDev, 0, 0 );
+    VclPtrInstance<VirtualDevice> pMaskedDevice(*i_pTargetOutDev,
+                                                DeviceFormat::FULLCOLOR,
+                                                DeviceFormat::FULLCOLOR);
     pMaskedDevice->SetOutputSizePixel( GetOutputSizePixel() );
     pMaskedDevice->EnableRTL( IsRTLEnabled() );
     aMtf.WindStart();
diff --git a/vcl/unx/generic/gdi/cairo_xlib_cairo.cxx b/vcl/unx/generic/gdi/cairo_xlib_cairo.cxx
index 71cba58..a45faa4 100644
--- a/vcl/unx/generic/gdi/cairo_xlib_cairo.cxx
+++ b/vcl/unx/generic/gdi/cairo_xlib_cairo.cxx
@@ -271,7 +271,7 @@ namespace cairo
         return VclPtr<VirtualDevice>(
             VclPtr<VirtualDevice>::Create(&aSystemGraphicsData,
                               Size(width, height),
-                              std::max(getDepth(), 0)));
+                              getFormat()));
     }
 
     /**
@@ -306,6 +306,26 @@ namespace cairo
 
         return -1;
     }
+
+    /**
+     * Surface::getFormat:  Get the device format of the Canvas surface.
+     *
+     * @return color format
+     **/
+    DeviceFormat X11Surface::getFormat() const
+    {
+        if (!maSysData.pRenderFormat)
+            return DeviceFormat::FULLCOLOR;
+        switch (static_cast<XRenderPictFormat*>(maSysData.pRenderFormat)->depth)
+        {
+            case 1:
+                return DeviceFormat::BITMASK;
+            case 8:
+                return DeviceFormat::GRAYSCALE;
+            default:
+                return DeviceFormat::FULLCOLOR;
+        }
+    }
 }
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/unx/generic/gdi/cairo_xlib_cairo.hxx b/vcl/unx/generic/gdi/cairo_xlib_cairo.hxx
index 3193447..0ccf98a 100644
--- a/vcl/unx/generic/gdi/cairo_xlib_cairo.hxx
+++ b/vcl/unx/generic/gdi/cairo_xlib_cairo.hxx
@@ -21,10 +21,9 @@
 #define INCLUDED_CANVAS_SOURCE_CAIRO_CAIRO_XLIB_CAIRO_HXX
 
 #include <sal/config.h>
-
 #include <sal/types.h>
-
 #include <vcl/cairo.hxx>
+#include <vcl/salgtype.hxx>
 
 struct BitmapSystemData;
 struct SystemEnvData;
@@ -92,6 +91,7 @@ namespace cairo {
         virtual void flush() const override;
 
         int getDepth() const;
+        DeviceFormat getFormat() const;
         X11PixmapSharedPtr getPixmap() const { return mpPixmap; }
         void* getRenderFormat() const { return maSysData.pRenderFormat; }
         long getDrawable() const { return mpPixmap ? mpPixmap->mhDrawable : maSysData.hDrawable; }
diff --git a/vcl/unx/generic/gdi/salvd.cxx b/vcl/unx/generic/gdi/salvd.cxx
index 8aa87bf..d86677b 100644
--- a/vcl/unx/generic/gdi/salvd.cxx
+++ b/vcl/unx/generic/gdi/salvd.cxx
@@ -36,20 +36,20 @@
 #include <opengl/x11/salvd.hxx>
 
 SalVirtualDevice* X11SalInstance::CreateX11VirtualDevice(SalGraphics* pGraphics,
-        long &nDX, long &nDY, sal_uInt16 nBitCount, const SystemGraphicsData *pData,
+        long &nDX, long &nDY, DeviceFormat eFormat, const SystemGraphicsData *pData,
         X11SalGraphics* pNewGraphics)
 {
     assert(pNewGraphics);
     if (OpenGLHelper::isVCLOpenGLEnabled())
-        return new X11OpenGLSalVirtualDevice( pGraphics, nDX, nDY, nBitCount, pData, pNewGraphics );
+        return new X11OpenGLSalVirtualDevice( pGraphics, nDX, nDY, eFormat, pData, pNewGraphics );
     else
-        return new X11SalVirtualDevice(pGraphics, nDX, nDY, nBitCount, pData, pNewGraphics);
+        return new X11SalVirtualDevice(pGraphics, nDX, nDY, eFormat, pData, pNewGraphics);
 }
 
 SalVirtualDevice* X11SalInstance::CreateVirtualDevice(SalGraphics* pGraphics,
-        long &nDX, long &nDY, sal_uInt16 nBitCount, const SystemGraphicsData *pData)
+        long &nDX, long &nDY, DeviceFormat eFormat, const SystemGraphicsData *pData)
 {
-    return CreateX11VirtualDevice(pGraphics, nDX, nDY, nBitCount, pData, new X11SalGraphics());
+    return CreateX11VirtualDevice(pGraphics, nDX, nDY, eFormat, pData, new X11SalGraphics());
 }
 
 void X11SalGraphics::Init( X11SalVirtualDevice *pDevice, SalColormap* pColormap,
@@ -89,7 +89,7 @@ void X11SalGraphics::Init( X11SalVirtualDevice *pDevice, SalColormap* pColormap,
 }
 
 X11SalVirtualDevice::X11SalVirtualDevice(SalGraphics* pGraphics, long &nDX, long &nDY,
-                                         sal_uInt16 nBitCount, const SystemGraphicsData *pData,
+                                         DeviceFormat eFormat, const SystemGraphicsData *pData,
                                          X11SalGraphics* pNewGraphics) :
     pGraphics_(pNewGraphics),
     m_nXScreen(0),
@@ -98,8 +98,20 @@ X11SalVirtualDevice::X11SalVirtualDevice(SalGraphics* pGraphics, long &nDX, long
     SalColormap* pColormap = nullptr;
     bool bDeleteColormap = false;
 
-    if( !nBitCount && pGraphics )
-        nBitCount = pGraphics->GetBitCount();
+    sal_uInt16 nBitCount;
+    switch (eFormat)
+    {
+        case DeviceFormat::BITMASK:
+            nBitCount = 1;
+            break;
+        case DeviceFormat::GRAYSCALE:
+            nBitCount = 8;
+            break;
+        default:
+            nBitCount = pGraphics->GetBitCount();
+            break;
+
+    }
 
     pDisplay_               = vcl_sal::getSalDisplay(GetGenericData());
     nDepth_                 = nBitCount;
diff --git a/vcl/unx/gtk/gtkinst.cxx b/vcl/unx/gtk/gtkinst.cxx
index 0e7ba5e..ec13855 100644
--- a/vcl/unx/gtk/gtkinst.cxx
+++ b/vcl/unx/gtk/gtkinst.cxx
@@ -315,19 +315,19 @@ void GtkYieldMutex::ThreadsLeave()
 
 SalVirtualDevice* GtkInstance::CreateVirtualDevice( SalGraphics *pG,
                                                     long &nDX, long &nDY,
-                                                    sal_uInt16 nBitCount,
+                                                    DeviceFormat eFormat,
                                                     const SystemGraphicsData *pGd )
 {
     EnsureInit();
 #if GTK_CHECK_VERSION(3,0,0)
     (void)pG; (void) pGd;
-    SvpSalVirtualDevice* pNew = new SvpSalVirtualDevice( nBitCount );
+    SvpSalVirtualDevice* pNew = new SvpSalVirtualDevice(eFormat);
     pNew->SetSize( nDX, nDY );
     return pNew;
 #else
     GtkSalGraphics *pGtkSalGraphics = dynamic_cast<GtkSalGraphics*>(pG);
     assert(pGtkSalGraphics);
-    return CreateX11VirtualDevice(pG, nDX, nDY, nBitCount, pGd,
+    return CreateX11VirtualDevice(pG, nDX, nDY, eFormat, pGd,
             new GtkSalGraphics(pGtkSalGraphics->GetGtkFrame(), pGtkSalGraphics->GetGtkWidget()));
 #endif
 }
diff --git a/vcl/unx/gtk3/cairo_gtk3_cairo.cxx b/vcl/unx/gtk3/cairo_gtk3_cairo.cxx
index ec5e641..25e5a0c 100644
--- a/vcl/unx/gtk3/cairo_gtk3_cairo.cxx
+++ b/vcl/unx/gtk3/cairo_gtk3_cairo.cxx
@@ -109,7 +109,7 @@ namespace cairo
 
     VclPtr<VirtualDevice> Gtk3Surface::createVirtualDevice() const
     {
-        return VclPtrInstance<VirtualDevice>(nullptr, Size(1, 1), 0);
+        return VclPtrInstance<VirtualDevice>(nullptr, Size(1, 1), DeviceFormat::FULLCOLOR);
     }
 
 }
diff --git a/vcl/win/source/gdi/salvd.cxx b/vcl/win/source/gdi/salvd.cxx
index 2a492b8..9b2136c 100644
--- a/vcl/win/source/gdi/salvd.cxx
+++ b/vcl/win/source/gdi/salvd.cxx
@@ -68,11 +68,25 @@ HBITMAP WinSalVirtualDevice::ImplCreateVirDevBitmap(HDC hDC, long nDX, long nDY,
 
 SalVirtualDevice* WinSalInstance::CreateVirtualDevice( SalGraphics* pSGraphics,
                                                        long &nDX, long &nDY,
-                                                       sal_uInt16 nBitCount,
+                                                       DeviceFormat eFormat,
                                                        const SystemGraphicsData* pData )
 {
     WinSalGraphics* pGraphics = static_cast<WinSalGraphics*>(pSGraphics);
 
+    sal_uInt16 nBitCount;
+    switch (eFormat)
+    {
+        case DeviceFormat::BITMASK:
+            nBitCount = 1;
+            break;
+        case DeviceFormat::GRAYSCALE:

... etc. - the rest is truncated


More information about the Libreoffice-commits mailing list