canvas/source/directx/dx_vcltools.cxx             |    4 +
 include/vcl/Scanline.hxx                          |   12 ++-
 include/vcl/cairo.hxx                             |    6 -
 vcl/headless/CairoCommon.cxx                      |   12 +--
 vcl/qt5/QtBitmap.cxx                              |   10 ++-
 vcl/quartz/salbmp.cxx                             |    4 -
 vcl/skia/salbmp.cxx                               |    6 +
 vcl/source/bitmap/BitmapBasicMorphologyFilter.cxx |    1 
 vcl/source/bitmap/BitmapFilterStackBlur.cxx       |    6 +
 vcl/source/bitmap/BitmapReadAccess.cxx            |   73 ++++++++++++----------
 vcl/source/bitmap/BitmapScaleSuperFilter.cxx      |    4 +
 vcl/source/bitmap/BitmapTools.cxx                 |    2 
 vcl/source/bitmap/BitmapWriteAccess.cxx           |   40 +++++++-----
 vcl/source/bitmap/bmpfast.cxx                     |   28 ++++++++
 vcl/source/filter/png/PngImageWriter.cxx          |    2 
 vcl/source/filter/webp/reader.cxx                 |    3 
 vcl/source/gdi/salmisc.cxx                        |    6 +
 vcl/source/helper/canvasbitmap.cxx                |    4 +
 18 files changed, 155 insertions(+), 68 deletions(-)

New commits:
commit b29e161488f0291f381f04e2533106321f357c1e
Author:     Noel Grandin <[email protected]>
AuthorDate: Fri Jan 10 21:19:54 2025 +0200
Commit:     Noel Grandin <[email protected]>
CommitDate: Sat Jan 11 17:29:40 2025 +0100

    make the ScanlineFormat values more explicit
    
    instead of cleverly deciding that one format is actually another
    format, depending on the current state of the supportsBitmap32()
    call, just have explicit values that say what the actual format is.
    
    This patch should have no functional affect, but will make
    upcoming patches simpler.
    
    Change-Id: I07f127a3e36800aa4cee034261c2e1216d8e8da1
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/180089
    Reviewed-by: Noel Grandin <[email protected]>
    Tested-by: Jenkins

diff --git a/canvas/source/directx/dx_vcltools.cxx 
b/canvas/source/directx/dx_vcltools.cxx
index 31b05be58e9c..9b0da87842a2 100644
--- a/canvas/source/directx/dx_vcltools.cxx
+++ b/canvas/source/directx/dx_vcltools.cxx
@@ -258,6 +258,10 @@ namespace dxcanvas::tools
                         case ScanlineFormat::N32BitTcArgb:
                         case ScanlineFormat::N32BitTcBgra:
                         case ScanlineFormat::N32BitTcRgba:
+                        case ScanlineFormat::N32BitTcXbgr:
+                        case ScanlineFormat::N32BitTcXrgb:
+                        case ScanlineFormat::N32BitTcBgrx:
+                        case ScanlineFormat::N32BitTcRgbx:
                         default:
                             ENSURE_OR_THROW( false,
                                             
"::dxcanvas::tools::bitmapFromVCLBitmapEx(): "
diff --git a/include/vcl/Scanline.hxx b/include/vcl/Scanline.hxx
index 2e47ad025379..9dc7af46b904 100644
--- a/include/vcl/Scanline.hxx
+++ b/include/vcl/Scanline.hxx
@@ -36,10 +36,14 @@ enum class ScanlineFormat : sal_uInt8
     N24BitTcBgr,
     N24BitTcRgb,
     // 32 Bit
-    N32BitTcAbgr,
-    N32BitTcArgb,
-    N32BitTcBgra,
-    N32BitTcRgba,
+    N32BitTcAbgr, // premultiplied
+    N32BitTcXbgr, // ignore alpha channel
+    N32BitTcArgb, // premultiplied
+    N32BitTcXrgb, // ignore alpha channel
+    N32BitTcBgra, // premultiplied
+    N32BitTcBgrx, // ignore alpha channel
+    N32BitTcRgba, // premultiplied
+    N32BitTcRgbx, // ignore alpha channel
     N32BitTcMask,
 };
 
diff --git a/include/vcl/cairo.hxx b/include/vcl/cairo.hxx
index e9978526915d..5ea81835d3ae 100644
--- a/include/vcl/cairo.hxx
+++ b/include/vcl/cairo.hxx
@@ -37,21 +37,21 @@
 */
 #if ENABLE_CAIRO_RGBA
 #define SVP_24BIT_FORMAT (ScanlineFormat::N24BitTcRgb)
-#define SVP_CAIRO_FORMAT (ScanlineFormat::N32BitTcRgba)
+#define SVP_CAIRO_FORMAT (ScanlineFormat::N32BitTcRgbx)
 #define SVP_CAIRO_BLUE 1
 #define SVP_CAIRO_GREEN 2
 #define SVP_CAIRO_RED 0
 #define SVP_CAIRO_ALPHA 3
 #elif defined OSL_BIGENDIAN
 #define SVP_24BIT_FORMAT (ScanlineFormat::N24BitTcRgb)
-#define SVP_CAIRO_FORMAT (ScanlineFormat::N32BitTcArgb)
+#define SVP_CAIRO_FORMAT (ScanlineFormat::N32BitTcXrgb)
 #define SVP_CAIRO_BLUE 3
 #define SVP_CAIRO_GREEN 2
 #define SVP_CAIRO_RED 1
 #define SVP_CAIRO_ALPHA 0
 #else
 #define SVP_24BIT_FORMAT (ScanlineFormat::N24BitTcBgr)
-#define SVP_CAIRO_FORMAT (ScanlineFormat::N32BitTcBgra)
+#define SVP_CAIRO_FORMAT (ScanlineFormat::N32BitTcBgrx)
 #define SVP_CAIRO_BLUE 0
 #define SVP_CAIRO_GREEN 1
 #define SVP_CAIRO_RED 2
diff --git a/vcl/headless/CairoCommon.cxx b/vcl/headless/CairoCommon.cxx
index 6b6fd6dedcd7..78a16b729a9e 100644
--- a/vcl/headless/CairoCommon.cxx
+++ b/vcl/headless/CairoCommon.cxx
@@ -2021,8 +2021,8 @@ std::optional<BitmapBuffer> 
FastConvert24BitRgbTo32BitCairo(const BitmapBuffer*
         for (tools::Long x = 0; x < nWidth; ++x)
         {
 #if ENABLE_CAIRO_RGBA
-            static_assert(SVP_CAIRO_FORMAT == ScanlineFormat::N32BitTcRgba,
-                          "Expected SVP_CAIRO_FORMAT set to N32BitTcRgba");
+            static_assert(SVP_CAIRO_FORMAT == ScanlineFormat::N32BitTcRgbx,
+                          "Expected SVP_CAIRO_FORMAT set to N32BitTcRgbx");
             static_assert(SVP_24BIT_FORMAT == ScanlineFormat::N24BitTcRgb,
                           "Expected SVP_24BIT_FORMAT set to N24BitTcRgb");
             pD[0] = pS[0];
@@ -2030,8 +2030,8 @@ std::optional<BitmapBuffer> 
FastConvert24BitRgbTo32BitCairo(const BitmapBuffer*
             pD[2] = pS[2];
             pD[3] = 0xff; // Alpha
 #elif defined OSL_BIGENDIAN
-            static_assert(SVP_CAIRO_FORMAT == ScanlineFormat::N32BitTcArgb,
-                          "Expected SVP_CAIRO_FORMAT set to N32BitTcArgb");
+            static_assert(SVP_CAIRO_FORMAT == ScanlineFormat::N32BitTcXrgb,
+                          "Expected SVP_CAIRO_FORMAT set to N32BitTcXrgb");
             static_assert(SVP_24BIT_FORMAT == ScanlineFormat::N24BitTcRgb,
                           "Expected SVP_24BIT_FORMAT set to N24BitTcRgb");
             pD[0] = 0xff; // Alpha
@@ -2039,8 +2039,8 @@ std::optional<BitmapBuffer> 
FastConvert24BitRgbTo32BitCairo(const BitmapBuffer*
             pD[2] = pS[1];
             pD[3] = pS[2];
 #else
-            static_assert(SVP_CAIRO_FORMAT == ScanlineFormat::N32BitTcBgra,
-                          "Expected SVP_CAIRO_FORMAT set to N32BitTcBgra");
+            static_assert(SVP_CAIRO_FORMAT == ScanlineFormat::N32BitTcBgrx,
+                          "Expected SVP_CAIRO_FORMAT set to N32BitTcBgrx");
             static_assert(SVP_24BIT_FORMAT == ScanlineFormat::N24BitTcBgr,
                           "Expected SVP_24BIT_FORMAT set to N24BitTcBgr");
             pD[0] = pS[0];
diff --git a/vcl/qt5/QtBitmap.cxx b/vcl/qt5/QtBitmap.cxx
index 7e24dd703a84..235f94715e04 100644
--- a/vcl/qt5/QtBitmap.cxx
+++ b/vcl/qt5/QtBitmap.cxx
@@ -28,6 +28,8 @@
 #include <o3tl/safeint.hxx>
 #include <sal/log.hxx>
 #include <tools/helpers.hxx>
+#include <svdata.hxx>
+#include <salinst.hxx>
 
 QtBitmap::QtBitmap() {}
 
@@ -137,9 +139,13 @@ BitmapBuffer* QtBitmap::AcquireBuffer(BitmapAccessMode 
/*nMode*/)
         case 32:
         {
 #ifdef OSL_BIGENDIAN
-            pBuffer->meFormat = ScanlineFormat::N32BitTcArgb;
+            pBuffer->meFormat = ImplGetSVData()->mpDefInst->supportsBitmap32()
+                                    ? ScanlineFormat::N32BitTcArgb
+                                    : ScanlineFormat::N32BitTcXrgb;
 #else
-            pBuffer->meFormat = ScanlineFormat::N32BitTcBgra;
+            pBuffer->meFormat = ImplGetSVData()->mpDefInst->supportsBitmap32()
+                                    ? ScanlineFormat::N32BitTcBgra
+                                    : ScanlineFormat::N32BitTcBgrx;
 #endif
             pBuffer->maPalette = aEmptyPalette;
             break;
diff --git a/vcl/quartz/salbmp.cxx b/vcl/quartz/salbmp.cxx
index b5395e8f30f6..ca286b3fc434 100644
--- a/vcl/quartz/salbmp.cxx
+++ b/vcl/quartz/salbmp.cxx
@@ -281,7 +281,7 @@ void QuartzSalBitmap::ConvertBitmapData( sal_uInt32 nWidth, 
sal_uInt32 nHeight,
         aSrcBuf.mnBitCount = nSrcBits;
         aSrcBuf.mnScanlineSize = nSrcBytesPerRow;
         BitmapBuffer aDstBuf;
-        aDstBuf.meFormat = ScanlineFormat::N32BitTcArgb;
+        aDstBuf.meFormat = ImplGetSVData()->mpDefInst->supportsBitmap32() ? 
ScanlineFormat::N32BitTcArgb : ScanlineFormat::N32BitTcXrgb;
         aDstBuf.mpBits = pDestData;
         aDstBuf.mnBitCount = nDestBits;
         aDstBuf.mnScanlineSize = nDestBytesPerRow;
@@ -445,7 +445,7 @@ BitmapBuffer* QuartzSalBitmap::AcquireBuffer( 
BitmapAccessMode /*nMode*/ )
             break;
         case 32:
         {
-            pBuffer->meFormat = ScanlineFormat::N32BitTcArgb;
+            pBuffer->meFormat = ImplGetSVData()->mpDefInst->supportsBitmap32() 
? ScanlineFormat::N32BitTcArgb : ScanlineFormat::N32BitTcXrgb;
             ColorMaskElement aRedMask(k32BitRedColorMask);
             aRedMask.CalcMaskShift();
             ColorMaskElement aGreenMask(k32BitGreenColorMask);
diff --git a/vcl/skia/salbmp.cxx b/vcl/skia/salbmp.cxx
index d517d425eaf1..144f3496d44b 100644
--- a/vcl/skia/salbmp.cxx
+++ b/vcl/skia/salbmp.cxx
@@ -300,8 +300,14 @@ BitmapBuffer* 
SkiaSalBitmap::AcquireBuffer(BitmapAccessMode nMode)
                                                       : 
ScanlineFormat::N24BitTcRgb;
             break;
         case 32:
+#if SKIA_USE_BITMAP32
+            // this tracks the m_bSupportsBitmap32 field
             buffer->meFormat = kN32_SkColorTypeIsBGRA ? 
ScanlineFormat::N32BitTcBgra
                                                       : 
ScanlineFormat::N32BitTcRgba;
+#else
+            buffer->meFormat = kN32_SkColorTypeIsBGRA ? 
ScanlineFormat::N32BitTcBgrx
+                                                      : 
ScanlineFormat::N32BitTcRgbx;
+#endif
             break;
         default:
             abort();
diff --git a/vcl/source/bitmap/BitmapBasicMorphologyFilter.cxx 
b/vcl/source/bitmap/BitmapBasicMorphologyFilter.cxx
index 240c1753b988..36c9d6d19c69 100644
--- a/vcl/source/bitmap/BitmapBasicMorphologyFilter.cxx
+++ b/vcl/source/bitmap/BitmapBasicMorphologyFilter.cxx
@@ -353,6 +353,7 @@ Bitmap BitmapBasicMorphologyFilter::filter(Bitmap const& 
rBitmap) const
             break;
         case ScanlineFormat::N32BitTcMask:
         case ScanlineFormat::N32BitTcBgra:
+        case ScanlineFormat::N32BitTcBgrx:
             runFilter<32>(bitmapCopy, m_eOp, m_nRadius, m_bUseValueOutside, 
m_nValueOutside);
             break;
         case ScanlineFormat::N8BitPal:
diff --git a/vcl/source/bitmap/BitmapFilterStackBlur.cxx 
b/vcl/source/bitmap/BitmapFilterStackBlur.cxx
index 59aadf971485..298265266041 100644
--- a/vcl/source/bitmap/BitmapFilterStackBlur.cxx
+++ b/vcl/source/bitmap/BitmapFilterStackBlur.cxx
@@ -620,10 +620,12 @@ Bitmap BitmapFilterStackBlur::filter(Bitmap const& 
rBitmap) const
     if (nScanlineFormat == ScanlineFormat::N24BitTcRgb
         || nScanlineFormat == ScanlineFormat::N24BitTcBgr
         || nScanlineFormat == ScanlineFormat::N32BitTcMask
-        || nScanlineFormat == ScanlineFormat::N32BitTcBgra)
+        || nScanlineFormat == ScanlineFormat::N32BitTcBgra
+        || nScanlineFormat == ScanlineFormat::N32BitTcBgrx)
     {
         int nComponentWidth = (nScanlineFormat == ScanlineFormat::N32BitTcMask
-                               || nScanlineFormat == 
ScanlineFormat::N32BitTcBgra)
+                               || nScanlineFormat == 
ScanlineFormat::N32BitTcBgra
+                               || nScanlineFormat == 
ScanlineFormat::N32BitTcBgrx)
                                   ? 4
                                   : 3;
 
diff --git a/vcl/source/bitmap/BitmapReadAccess.cxx 
b/vcl/source/bitmap/BitmapReadAccess.cxx
index 9a7c8082ed2d..7688e0db8f64 100644
--- a/vcl/source/bitmap/BitmapReadAccess.cxx
+++ b/vcl/source/bitmap/BitmapReadAccess.cxx
@@ -70,25 +70,29 @@ FncGetPixel 
BitmapReadAccess::GetPixelFunction(ScanlineFormat nFormat)
         case ScanlineFormat::N24BitTcRgb:
             return GetPixelForN24BitTcRgb;
         case ScanlineFormat::N32BitTcAbgr:
-            if (Bitmap32IsPreMultipled())
-                return GetPixelForN32BitTcAbgr;
-            else
-                return GetPixelForN32BitTcXbgr;
+            assert(Bitmap32IsPreMultipled());
+            return GetPixelForN32BitTcAbgr;
+        case ScanlineFormat::N32BitTcXbgr:
+            assert(!Bitmap32IsPreMultipled());
+            return GetPixelForN32BitTcXbgr;
         case ScanlineFormat::N32BitTcArgb:
-            if (Bitmap32IsPreMultipled())
-                return GetPixelForN32BitTcArgb;
-            else
-                return GetPixelForN32BitTcXrgb;
+            assert(Bitmap32IsPreMultipled());
+            return GetPixelForN32BitTcArgb;
+        case ScanlineFormat::N32BitTcXrgb:
+            assert(!Bitmap32IsPreMultipled());
+            return GetPixelForN32BitTcXrgb;
         case ScanlineFormat::N32BitTcBgra:
-            if (Bitmap32IsPreMultipled())
-                return GetPixelForN32BitTcBgra;
-            else
-                return GetPixelForN32BitTcBgrx;
+            assert(Bitmap32IsPreMultipled());
+            return GetPixelForN32BitTcBgra;
+        case ScanlineFormat::N32BitTcBgrx:
+            assert(!Bitmap32IsPreMultipled());
+            return GetPixelForN32BitTcBgrx;
         case ScanlineFormat::N32BitTcRgba:
-            if (Bitmap32IsPreMultipled())
-                return GetPixelForN32BitTcRgba;
-            else
-                return GetPixelForN32BitTcRgbx;
+            assert(Bitmap32IsPreMultipled());
+            return GetPixelForN32BitTcRgba;
+        case ScanlineFormat::N32BitTcRgbx:
+            assert(!Bitmap32IsPreMultipled());
+            return GetPixelForN32BitTcRgbx;
         case ScanlineFormat::N32BitTcMask:
             return GetPixelForN32BitTcMask;
 
@@ -110,29 +114,34 @@ FncSetPixel 
BitmapReadAccess::SetPixelFunction(ScanlineFormat nFormat)
         case ScanlineFormat::N24BitTcRgb:
             return SetPixelForN24BitTcRgb;
         case ScanlineFormat::N32BitTcAbgr:
-            if (Bitmap32IsPreMultipled())
-                return SetPixelForN32BitTcAbgr;
-            else
-                return SetPixelForN32BitTcXbgr;
+            assert(Bitmap32IsPreMultipled());
+            return SetPixelForN32BitTcAbgr;
+        case ScanlineFormat::N32BitTcXbgr:
+            assert(!Bitmap32IsPreMultipled());
+            return SetPixelForN32BitTcXbgr;
         case ScanlineFormat::N32BitTcArgb:
-            if (Bitmap32IsPreMultipled())
-                return SetPixelForN32BitTcArgb;
-            else
-                return SetPixelForN32BitTcXrgb;
+            assert(Bitmap32IsPreMultipled());
+            return SetPixelForN32BitTcArgb;
+        case ScanlineFormat::N32BitTcXrgb:
+            assert(!Bitmap32IsPreMultipled());
+            return SetPixelForN32BitTcXrgb;
         case ScanlineFormat::N32BitTcBgra:
-            if (Bitmap32IsPreMultipled())
-                return SetPixelForN32BitTcBgra;
-            else
-                return SetPixelForN32BitTcBgrx;
+            assert(Bitmap32IsPreMultipled());
+            return SetPixelForN32BitTcBgra;
+        case ScanlineFormat::N32BitTcBgrx:
+            assert(!Bitmap32IsPreMultipled());
+            return SetPixelForN32BitTcBgrx;
         case ScanlineFormat::N32BitTcRgba:
-            if (Bitmap32IsPreMultipled())
-                return SetPixelForN32BitTcRgba;
-            else
-                return SetPixelForN32BitTcRgbx;
+            assert(Bitmap32IsPreMultipled());
+            return SetPixelForN32BitTcRgba;
+        case ScanlineFormat::N32BitTcRgbx:
+            assert(!Bitmap32IsPreMultipled());
+            return SetPixelForN32BitTcRgbx;
         case ScanlineFormat::N32BitTcMask:
             return SetPixelForN32BitTcMask;
 
         default:
+            assert(false);
             return nullptr;
     }
 }
diff --git a/vcl/source/bitmap/BitmapScaleSuperFilter.cxx 
b/vcl/source/bitmap/BitmapScaleSuperFilter.cxx
index a5f478948c04..3b4c92df31ec 100644
--- a/vcl/source/bitmap/BitmapScaleSuperFilter.cxx
+++ b/vcl/source/bitmap/BitmapScaleSuperFilter.cxx
@@ -968,6 +968,10 @@ BitmapEx BitmapScaleSuperFilter::execute(BitmapEx const& 
rBitmap) const
                 case ScanlineFormat::N32BitTcBgra:
                 case ScanlineFormat::N32BitTcArgb:
                 case ScanlineFormat::N32BitTcAbgr:
+                case ScanlineFormat::N32BitTcRgbx:
+                case ScanlineFormat::N32BitTcBgrx:
+                case ScanlineFormat::N32BitTcXrgb:
+                case ScanlineFormat::N32BitTcXbgr:
                     pScaleRangeFn = bScaleUp ? scaleUp<32> : scaleDown<32>;
                     break;
                 default:
diff --git a/vcl/source/bitmap/BitmapTools.cxx 
b/vcl/source/bitmap/BitmapTools.cxx
index e55575e8b934..1faa619f8efc 100644
--- a/vcl/source/bitmap/BitmapTools.cxx
+++ b/vcl/source/bitmap/BitmapTools.cxx
@@ -886,6 +886,7 @@ void CanvasCairoExtractBitmapData( BitmapEx const & aBmpEx, 
Bitmap & aBitmap, un
             }
             break;
         case ScanlineFormat::N32BitTcBgra:
+        case ScanlineFormat::N32BitTcBgrx:
             pReadScan = pBitmapReadAcc->GetScanline( nY );
             if( pAlphaReadAcc )
                 if( readAlpha( pAlphaReadAcc.get(), nY, nWidth, data, nOff ) )
@@ -928,6 +929,7 @@ void CanvasCairoExtractBitmapData( BitmapEx const & aBmpEx, 
Bitmap & aBitmap, un
             }
             break;
         case ScanlineFormat::N32BitTcRgba:
+        case ScanlineFormat::N32BitTcRgbx:
             pReadScan = pBitmapReadAcc->GetScanline( nY );
             if( pAlphaReadAcc )
                 if( readAlpha( pAlphaReadAcc.get(), nY, nWidth, data, nOff ) )
diff --git a/vcl/source/bitmap/BitmapWriteAccess.cxx 
b/vcl/source/bitmap/BitmapWriteAccess.cxx
index 183a481e708e..f2fc5424eb0e 100644
--- a/vcl/source/bitmap/BitmapWriteAccess.cxx
+++ b/vcl/source/bitmap/BitmapWriteAccess.cxx
@@ -103,28 +103,36 @@ void BitmapWriteAccess::CopyScanline(tools::Long nY, 
ConstScanline aSrcScanline,
                 pFncGetPixel = GetPixelForN24BitTcRgb;
                 break;
             case ScanlineFormat::N32BitTcAbgr:
-                if (Bitmap32IsPreMultipled())
-                    pFncGetPixel = GetPixelForN32BitTcAbgr;
-                else
-                    pFncGetPixel = GetPixelForN32BitTcXbgr;
+                assert(Bitmap32IsPreMultipled());
+                pFncGetPixel = GetPixelForN32BitTcAbgr;
+                break;
+            case ScanlineFormat::N32BitTcXbgr:
+                assert(!Bitmap32IsPreMultipled());
+                pFncGetPixel = GetPixelForN32BitTcXbgr;
                 break;
             case ScanlineFormat::N32BitTcArgb:
-                if (Bitmap32IsPreMultipled())
-                    pFncGetPixel = GetPixelForN32BitTcArgb;
-                else
-                    pFncGetPixel = GetPixelForN32BitTcXrgb;
+                assert(Bitmap32IsPreMultipled());
+                pFncGetPixel = GetPixelForN32BitTcArgb;
+                break;
+            case ScanlineFormat::N32BitTcXrgb:
+                assert(!Bitmap32IsPreMultipled());
+                pFncGetPixel = GetPixelForN32BitTcXrgb;
                 break;
             case ScanlineFormat::N32BitTcBgra:
-                if (Bitmap32IsPreMultipled())
-                    pFncGetPixel = GetPixelForN32BitTcBgra;
-                else
-                    pFncGetPixel = GetPixelForN32BitTcBgrx;
+                assert(Bitmap32IsPreMultipled());
+                pFncGetPixel = GetPixelForN32BitTcBgra;
+                break;
+            case ScanlineFormat::N32BitTcBgrx:
+                assert(!Bitmap32IsPreMultipled());
+                pFncGetPixel = GetPixelForN32BitTcBgrx;
                 break;
             case ScanlineFormat::N32BitTcRgba:
-                if (Bitmap32IsPreMultipled())
-                    pFncGetPixel = GetPixelForN32BitTcRgba;
-                else
-                    pFncGetPixel = GetPixelForN32BitTcRgbx;
+                assert(Bitmap32IsPreMultipled());
+                pFncGetPixel = GetPixelForN32BitTcRgba;
+                break;
+            case ScanlineFormat::N32BitTcRgbx:
+                assert(!Bitmap32IsPreMultipled());
+                pFncGetPixel = GetPixelForN32BitTcRgbx;
                 break;
             case ScanlineFormat::N32BitTcMask:
                 pFncGetPixel = GetPixelForN32BitTcMask;
diff --git a/vcl/source/bitmap/bmpfast.cxx b/vcl/source/bitmap/bmpfast.cxx
index 15afb55c7ca3..74da808b96cb 100644
--- a/vcl/source/bitmap/bmpfast.cxx
+++ b/vcl/source/bitmap/bmpfast.cxx
@@ -347,12 +347,16 @@ static bool ImplConvertFromBitmap( BitmapBuffer& rDst, 
const BitmapBuffer& rSrc
             return ImplConvertToBitmap<ScanlineFormat::N24BitTcRgb>( aSrcType, 
rDst, rSrc );
 
         case ScanlineFormat::N32BitTcAbgr:
+        case ScanlineFormat::N32BitTcXbgr:
             return ImplConvertToBitmap<ScanlineFormat::N32BitTcAbgr>( 
aSrcType, rDst, rSrc );
         case ScanlineFormat::N32BitTcArgb:
+        case ScanlineFormat::N32BitTcXrgb:
             return ImplConvertToBitmap<ScanlineFormat::N32BitTcArgb>( 
aSrcType, rDst, rSrc );
         case ScanlineFormat::N32BitTcBgra:
+        case ScanlineFormat::N32BitTcBgrx:
             return ImplConvertToBitmap<ScanlineFormat::N32BitTcBgra>( 
aSrcType, rDst, rSrc );
         case ScanlineFormat::N32BitTcRgba:
+        case ScanlineFormat::N32BitTcRgbx:
             return ImplConvertToBitmap<ScanlineFormat::N32BitTcRgba>( 
aSrcType, rDst, rSrc );
         default: break;
     }
@@ -435,12 +439,16 @@ bool ImplFastBitmapConversion( BitmapBuffer& rDst, const 
BitmapBuffer& rSrc,
             return ImplConvertFromBitmap<ScanlineFormat::N24BitTcRgb>( rDst, 
rSrc );
 
         case ScanlineFormat::N32BitTcAbgr:
+        case ScanlineFormat::N32BitTcXbgr:
             return ImplConvertFromBitmap<ScanlineFormat::N32BitTcAbgr>( rDst, 
rSrc );
         case ScanlineFormat::N32BitTcArgb:
+        case ScanlineFormat::N32BitTcXrgb:
             return ImplConvertFromBitmap<ScanlineFormat::N32BitTcArgb>( rDst, 
rSrc );
         case ScanlineFormat::N32BitTcBgra:
+        case ScanlineFormat::N32BitTcBgrx:
             return ImplConvertFromBitmap<ScanlineFormat::N32BitTcBgra>( rDst, 
rSrc );
         case ScanlineFormat::N32BitTcRgba:
+        case ScanlineFormat::N32BitTcRgbx:
             return ImplConvertFromBitmap<ScanlineFormat::N32BitTcRgba>( rDst, 
rSrc );
         default: break;
     }
@@ -489,12 +497,16 @@ static bool ImplCopyFromScanline( tools::Long nY, 
BitmapBuffer& rDst, ConstScanl
             return ImplCopyToScanline<ScanlineFormat::N24BitTcRgb>( nY, rDst, 
aSrcType, nSrcWidth );
 
         case ScanlineFormat::N32BitTcAbgr:
+        case ScanlineFormat::N32BitTcXbgr:
             return ImplCopyToScanline<ScanlineFormat::N32BitTcAbgr>( nY, rDst, 
aSrcType, nSrcWidth );
         case ScanlineFormat::N32BitTcArgb:
+        case ScanlineFormat::N32BitTcXrgb:
             return ImplCopyToScanline<ScanlineFormat::N32BitTcArgb>( nY, rDst, 
aSrcType, nSrcWidth );
         case ScanlineFormat::N32BitTcBgra:
+        case ScanlineFormat::N32BitTcBgrx:
             return ImplCopyToScanline<ScanlineFormat::N32BitTcBgra>( nY, rDst, 
aSrcType, nSrcWidth );
         case ScanlineFormat::N32BitTcRgba:
+        case ScanlineFormat::N32BitTcRgbx:
             return ImplCopyToScanline<ScanlineFormat::N32BitTcRgba>( nY, rDst, 
aSrcType, nSrcWidth );
         default:
             break;
@@ -528,12 +540,16 @@ bool ImplFastCopyScanline( tools::Long nY, BitmapBuffer& 
rDst, ConstScanline aSr
             return ImplCopyFromScanline<ScanlineFormat::N24BitTcRgb>( nY, 
rDst, aSrcScanline, nSrcScanlineSize / 3 );
 
         case ScanlineFormat::N32BitTcAbgr:
+        case ScanlineFormat::N32BitTcXbgr:
             return ImplCopyFromScanline<ScanlineFormat::N32BitTcAbgr>( nY, 
rDst, aSrcScanline, nSrcScanlineSize / 4 );
         case ScanlineFormat::N32BitTcArgb:
+        case ScanlineFormat::N32BitTcXrgb:
             return ImplCopyFromScanline<ScanlineFormat::N32BitTcArgb>( nY, 
rDst, aSrcScanline, nSrcScanlineSize / 4 );
         case ScanlineFormat::N32BitTcBgra:
+        case ScanlineFormat::N32BitTcBgrx:
             return ImplCopyFromScanline<ScanlineFormat::N32BitTcBgra>( nY, 
rDst, aSrcScanline, nSrcScanlineSize / 4 );
         case ScanlineFormat::N32BitTcRgba:
+        case ScanlineFormat::N32BitTcRgbx:
             return ImplCopyFromScanline<ScanlineFormat::N32BitTcRgba>( nY, 
rDst, aSrcScanline, nSrcScanlineSize / 4 );
         default:
             break;
@@ -647,12 +663,16 @@ static bool ImplBlendFromBitmap( BitmapBuffer& rDst, 
const BitmapBuffer& rSrc, c
             return ImplBlendToBitmap<ScanlineFormat::N24BitTcRgb>( aSrcType, 
rDst, rSrc, rMsk );
 
         case ScanlineFormat::N32BitTcAbgr:
+        case ScanlineFormat::N32BitTcXbgr:
             return ImplBlendToBitmap<ScanlineFormat::N32BitTcAbgr>( aSrcType, 
rDst, rSrc, rMsk );
         case ScanlineFormat::N32BitTcArgb:
+        case ScanlineFormat::N32BitTcXrgb:
             return ImplBlendToBitmap<ScanlineFormat::N32BitTcArgb>( aSrcType, 
rDst, rSrc, rMsk );
         case ScanlineFormat::N32BitTcBgra:
+        case ScanlineFormat::N32BitTcBgrx:
             return ImplBlendToBitmap<ScanlineFormat::N32BitTcBgra>( aSrcType, 
rDst, rSrc, rMsk );
         case ScanlineFormat::N32BitTcRgba:
+        case ScanlineFormat::N32BitTcRgbx:
             return ImplBlendToBitmap<ScanlineFormat::N32BitTcRgba>( aSrcType, 
rDst, rSrc, rMsk );
         default: break;
     }
@@ -739,12 +759,16 @@ bool ImplFastBitmapBlending( BitmapWriteAccess const & 
rDstWA,
             return ImplBlendFromBitmap<ScanlineFormat::N24BitTcRgb>( rDst, 
rSrc, rMsk );
 
         case ScanlineFormat::N32BitTcAbgr:
+        case ScanlineFormat::N32BitTcXbgr:
             return ImplBlendFromBitmap<ScanlineFormat::N32BitTcAbgr>( rDst, 
rSrc, rMsk );
         case ScanlineFormat::N32BitTcArgb:
+        case ScanlineFormat::N32BitTcXrgb:
             return ImplBlendFromBitmap<ScanlineFormat::N32BitTcArgb>( rDst, 
rSrc, rMsk );
         case ScanlineFormat::N32BitTcBgra:
+        case ScanlineFormat::N32BitTcBgrx:
             return ImplBlendFromBitmap<ScanlineFormat::N32BitTcBgra>( rDst, 
rSrc, rMsk );
         case ScanlineFormat::N32BitTcRgba:
+        case ScanlineFormat::N32BitTcRgbx:
             return ImplBlendFromBitmap<ScanlineFormat::N32BitTcRgba>( rDst, 
rSrc, rMsk );
         default: break;
     }
@@ -806,6 +830,10 @@ bool ImplFastEraseBitmap( BitmapBuffer& rDst, const 
BitmapColor& rColor )
         case ScanlineFormat::N32BitTcArgb:
         case ScanlineFormat::N32BitTcBgra:
         case ScanlineFormat::N32BitTcRgba:
+        case ScanlineFormat::N32BitTcXbgr:
+        case ScanlineFormat::N32BitTcXrgb:
+        case ScanlineFormat::N32BitTcBgrx:
+        case ScanlineFormat::N32BitTcRgbx:
             break;
 
         default:
diff --git a/vcl/source/filter/png/PngImageWriter.cxx 
b/vcl/source/filter/png/PngImageWriter.cxx
index 54334469f65e..41931fc6b5d9 100644
--- a/vcl/source/filter/png/PngImageWriter.cxx
+++ b/vcl/source/filter/png/PngImageWriter.cxx
@@ -247,11 +247,13 @@ static bool pngWrite(SvStream& rStream, const Graphic& 
rGraphic, int nCompressio
                 break;
             }
             case ScanlineFormat::N32BitTcBgra:
+            case ScanlineFormat::N32BitTcBgrx:
             {
                 png_set_bgr(pPng);
                 [[fallthrough]];
             }
             case ScanlineFormat::N32BitTcRgba:
+            case ScanlineFormat::N32BitTcRgbx:
             {
                 colorType = PNG_COLOR_TYPE_RGBA;
                 bitDepth = 8;
diff --git a/vcl/source/filter/webp/reader.cxx 
b/vcl/source/filter/webp/reader.cxx
index 11dabefbb7de..cfc28a18440b 100644
--- a/vcl/source/filter/webp/reader.cxx
+++ b/vcl/source/filter/webp/reader.cxx
@@ -110,14 +110,17 @@ static bool readWebp(SvStream& stream, Graphic& graphic)
         {
             // Our bitmap32 code expects premultiplied.
             case ScanlineFormat::N32BitTcRgba:
+            case ScanlineFormat::N32BitTcRgbx:
                 config.output.colorspace = MODE_rgbA;
                 pixelMode = PixelMode::DirectRead;
                 break;
             case ScanlineFormat::N32BitTcBgra:
+            case ScanlineFormat::N32BitTcBgrx:
                 config.output.colorspace = MODE_bgrA;
                 pixelMode = PixelMode::DirectRead;
                 break;
             case ScanlineFormat::N32BitTcArgb:
+            case ScanlineFormat::N32BitTcXrgb:
                 config.output.colorspace = MODE_Argb;
                 pixelMode = PixelMode::DirectRead;
                 break;
diff --git a/vcl/source/gdi/salmisc.cxx b/vcl/source/gdi/salmisc.cxx
index b1833855ab8c..79d976ac25db 100644
--- a/vcl/source/gdi/salmisc.cxx
+++ b/vcl/source/gdi/salmisc.cxx
@@ -255,9 +255,13 @@ std::optional<BitmapBuffer> StretchAndConvert(
         IMPL_CASE_SET_FORMAT( N24BitTcBgr, 24 );
         IMPL_CASE_SET_FORMAT( N24BitTcRgb, 24 );
         IMPL_CASE_SET_FORMAT( N32BitTcAbgr, 32 );
+        IMPL_CASE_SET_FORMAT( N32BitTcXbgr, 32 );
         IMPL_CASE_SET_FORMAT( N32BitTcArgb, 32 );
+        IMPL_CASE_SET_FORMAT( N32BitTcXrgb, 32 );
         IMPL_CASE_SET_FORMAT( N32BitTcBgra, 32 );
+        IMPL_CASE_SET_FORMAT( N32BitTcBgrx, 32 );
         IMPL_CASE_SET_FORMAT( N32BitTcRgba, 32 );
+        IMPL_CASE_SET_FORMAT( N32BitTcRgbx, 32 );
         IMPL_CASE_SET_FORMAT( N32BitTcMask, 32 );
 
         default:
@@ -266,7 +270,7 @@ std::optional<BitmapBuffer> StretchAndConvert(
             // least likely to crash
             pFncSetPixel = BitmapReadAccess::SetPixelForN1BitMsbPal;
             pDstBuffer->mnBitCount = 1;
-            OSL_FAIL( "unknown write format" );
+            assert(false && "unknown write format" );
         break;
     }
 
diff --git a/vcl/source/helper/canvasbitmap.cxx 
b/vcl/source/helper/canvasbitmap.cxx
index 2806aa0726cf..fc260b591773 100644
--- a/vcl/source/helper/canvasbitmap.cxx
+++ b/vcl/source/helper/canvasbitmap.cxx
@@ -180,6 +180,7 @@ VclCanvasBitmap::VclCanvasBitmap( const BitmapEx& rBitmap ) 
:
             break;
 
         case ScanlineFormat::N32BitTcAbgr:
+        case ScanlineFormat::N32BitTcXbgr:
         {
             m_bPalette           = false;
             m_nBitsPerInputPixel = 32;
@@ -203,6 +204,7 @@ VclCanvasBitmap::VclCanvasBitmap( const BitmapEx& rBitmap ) 
:
         break;
 
         case ScanlineFormat::N32BitTcArgb:
+        case ScanlineFormat::N32BitTcXrgb:
         {
             m_bPalette           = false;
             m_nBitsPerInputPixel = 32;
@@ -226,6 +228,7 @@ VclCanvasBitmap::VclCanvasBitmap( const BitmapEx& rBitmap ) 
:
         break;
 
         case ScanlineFormat::N32BitTcBgra:
+        case ScanlineFormat::N32BitTcBgrx:
         {
             m_bPalette           = false;
             m_nBitsPerInputPixel = 32;
@@ -249,6 +252,7 @@ VclCanvasBitmap::VclCanvasBitmap( const BitmapEx& rBitmap ) 
:
         break;
 
         case ScanlineFormat::N32BitTcRgba:
+        case ScanlineFormat::N32BitTcRgbx:
         {
             m_bPalette           = false;
             m_nBitsPerInputPixel = 32;

Reply via email to