drawinglayer/source/primitive2d/sceneprimitive2d.cxx | 2 - emfio/source/reader/wmfreader.cxx | 2 - filter/source/graphicfilter/icgm/bitmap.cxx | 2 - filter/source/graphicfilter/ieps/ieps.cxx | 2 - filter/source/graphicfilter/ipbm/ipbm.cxx | 6 +-- filter/source/graphicfilter/ipcd/ipcd.cxx | 2 - filter/source/graphicfilter/ipcx/ipcx.cxx | 2 - filter/source/graphicfilter/ipict/ipict.cxx | 10 ++--- filter/source/graphicfilter/ipsd/ipsd.cxx | 2 - filter/source/graphicfilter/iras/iras.cxx | 2 - filter/source/graphicfilter/itga/itga.cxx | 2 - filter/source/msfilter/msdffimp.cxx | 4 +- include/vcl/BitmapTools.hxx | 23 ++++++++---- svx/source/xoutdev/xattrbmp.cxx | 2 - vcl/source/bitmap/BitmapTools.cxx | 35 +++++++++++++++---- 15 files changed, 65 insertions(+), 33 deletions(-)
New commits: commit 3d400321910ff0fe89ab8c70c59432e676cb1340 Author: Noel Grandin <noel.gran...@collabora.co.uk> Date: Thu Mar 1 12:00:24 2018 +0200 tdf#116001 Incorrect Colors in Chart Wall Area regression from commit b10c7022f1be6e4825269bd5872575b5b53744ef "use RawBitmap in BPixelRasterToBitmapEx" we need to implement alpha support in vcl::bitmap::CreateFromData Change-Id: I68bebbe1dd15e3bb04de312309c1631d6bb7fe2d Reviewed-on: https://gerrit.libreoffice.org/50556 Tested-by: Jenkins <c...@libreoffice.org> Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk> diff --git a/drawinglayer/source/primitive2d/sceneprimitive2d.cxx b/drawinglayer/source/primitive2d/sceneprimitive2d.cxx index 5d3e972a6592..98fb19bfe172 100644 --- a/drawinglayer/source/primitive2d/sceneprimitive2d.cxx +++ b/drawinglayer/source/primitive2d/sceneprimitive2d.cxx @@ -49,7 +49,7 @@ namespace if(nWidth && nHeight) { const Size aDestSize(nWidth, nHeight); - vcl::bitmap::RawBitmap aContent(aDestSize); + vcl::bitmap::RawBitmap aContent(aDestSize, 32); if(mnAntiAlialize) { diff --git a/emfio/source/reader/wmfreader.cxx b/emfio/source/reader/wmfreader.cxx index 7b5d8c6eb7ac..e82d756f28b2 100644 --- a/emfio/source/reader/wmfreader.cxx +++ b/emfio/source/reader/wmfreader.cxx @@ -715,7 +715,7 @@ namespace emfio } if (bOk) { - vcl::bitmap::RawBitmap aBmp( Size( nWidth, nHeight ) ); + vcl::bitmap::RawBitmap aBmp( Size( nWidth, nHeight ), 24 ); for (sal_uInt16 y = 0; y < nHeight && mpInputStream->good(); ++y) { sal_uInt16 x = 0; diff --git a/filter/source/graphicfilter/icgm/bitmap.cxx b/filter/source/graphicfilter/icgm/bitmap.cxx index c98a6b5ac76e..a1ee269a408c 100644 --- a/filter/source/graphicfilter/icgm/bitmap.cxx +++ b/filter/source/graphicfilter/icgm/bitmap.cxx @@ -69,7 +69,7 @@ void CGMBitmap::ImplGetBitmap( CGMBitmapDescriptor& rDesc ) if (!(ImplGetDimensions(rDesc) && rDesc.mpBuf && isLegalBitsPerPixel(rDesc.mnDstBitsPerPixel))) return; - vcl::bitmap::RawBitmap aBitmap( Size( rDesc.mnX, rDesc.mnY ) ); + vcl::bitmap::RawBitmap aBitmap( Size( rDesc.mnX, rDesc.mnY ), 24 ); // the picture may either be read from left to right or right to left, from top to bottom ... diff --git a/filter/source/graphicfilter/ieps/ieps.cxx b/filter/source/graphicfilter/ieps/ieps.cxx index ee634180c1f1..cf398e481e78 100644 --- a/filter/source/graphicfilter/ieps/ieps.cxx +++ b/filter/source/graphicfilter/ieps/ieps.cxx @@ -662,7 +662,7 @@ ipsGraphicImport( SvStream & rStream, Graphic & rGraphic, FilterConfigItem* ) { rStream.Seek( nBufStartPos + ( pDest - pBuf.get() ) ); - vcl::bitmap::RawBitmap aBitmap( Size( nWidth, nHeight ) ); + vcl::bitmap::RawBitmap aBitmap( Size( nWidth, nHeight ), 24 ); { bool bIsValid = true; sal_uInt8 nDat = 0; diff --git a/filter/source/graphicfilter/ipbm/ipbm.cxx b/filter/source/graphicfilter/ipbm/ipbm.cxx index 06f51d0e9bac..ee50754e30ae 100644 --- a/filter/source/graphicfilter/ipbm/ipbm.cxx +++ b/filter/source/graphicfilter/ipbm/ipbm.cxx @@ -92,7 +92,7 @@ bool PBMReader::ReadPBM(Graphic & rGraphic ) if (nRemainingSize < nPixelsRequired / 8) return false; - mpRawBmp.reset( new vcl::bitmap::RawBitmap( Size( mnWidth, mnHeight ) ) ); + mpRawBmp.reset( new vcl::bitmap::RawBitmap( Size( mnWidth, mnHeight ), 24 ) ); mvPalette.resize( 2 ); mvPalette[0] = Color( 0xff, 0xff, 0xff ); mvPalette[1] = Color( 0x00, 0x00, 0x00 ); @@ -102,7 +102,7 @@ bool PBMReader::ReadPBM(Graphic & rGraphic ) if (nRemainingSize < nPixelsRequired) return false; - mpRawBmp.reset( new vcl::bitmap::RawBitmap( Size( mnWidth, mnHeight ) ) ); + mpRawBmp.reset( new vcl::bitmap::RawBitmap( Size( mnWidth, mnHeight ), 24 ) ); mnCol = static_cast<sal_uInt16>(mnMaxVal) + 1; if ( mnCol > 256 ) mnCol = 256; @@ -118,7 +118,7 @@ bool PBMReader::ReadPBM(Graphic & rGraphic ) if (nRemainingSize / 3 < nPixelsRequired) return false; - mpRawBmp.reset( new vcl::bitmap::RawBitmap( Size( mnWidth, mnHeight ) ) ); + mpRawBmp.reset( new vcl::bitmap::RawBitmap( Size( mnWidth, mnHeight ), 24 ) ); break; } diff --git a/filter/source/graphicfilter/ipcd/ipcd.cxx b/filter/source/graphicfilter/ipcd/ipcd.cxx index 18b6d99b2c42..cd2f306b499d 100644 --- a/filter/source/graphicfilter/ipcd/ipcd.cxx +++ b/filter/source/graphicfilter/ipcd/ipcd.cxx @@ -148,7 +148,7 @@ bool PCDReader::ReadPCD( Graphic & rGraphic, FilterConfigItem* pConfigItem ) nBMPWidth = nHeight; nBMPHeight = nWidth; } - mpBitmap.reset(new vcl::bitmap::RawBitmap( Size( nBMPWidth, nBMPHeight ) )); + mpBitmap.reset(new vcl::bitmap::RawBitmap( Size( nBMPWidth, nBMPHeight ), 24 )); ReadImage(); diff --git a/filter/source/graphicfilter/ipcx/ipcx.cxx b/filter/source/graphicfilter/ipcx/ipcx.cxx index 51b50be2fa56..3a4e8a64b73f 100644 --- a/filter/source/graphicfilter/ipcx/ipcx.cxx +++ b/filter/source/graphicfilter/ipcx/ipcx.cxx @@ -105,7 +105,7 @@ bool PCXReader::ReadPCX(Graphic & rGraphic) // Write BMP header and conditionally (maybe invalid for now) color palette: if (bStatus) { - mpBitmap.reset( new vcl::bitmap::RawBitmap( Size( nWidth, nHeight ) ) ); + mpBitmap.reset( new vcl::bitmap::RawBitmap( Size( nWidth, nHeight ), 24 ) ); if ( nDestBitsPerPixel <= 8 ) { diff --git a/filter/source/graphicfilter/ipict/ipict.cxx b/filter/source/graphicfilter/ipict/ipict.cxx index 193c18656d62..d6e37740dff1 100644 --- a/filter/source/graphicfilter/ipict/ipict.cxx +++ b/filter/source/graphicfilter/ipict/ipict.cxx @@ -850,7 +850,7 @@ sal_uLong PictReader::ReadPixMapEtc( BitmapEx &rBitmap, bool bBaseAddr, bool bCo return 0xffffffff; } - pBitmap.reset(new vcl::bitmap::RawBitmap( Size(nWidth, nHeight) )); + pBitmap.reset(new vcl::bitmap::RawBitmap( Size(nWidth, nHeight), 24 )); for (sal_uInt16 ny = 0; ny < nHeight; ++ny) { @@ -932,7 +932,7 @@ sal_uLong PictReader::ReadPixMapEtc( BitmapEx &rBitmap, bool bBaseAddr, bool bCo return 0xffffffff; } - pBitmap.reset(new vcl::bitmap::RawBitmap( Size(nWidth, nHeight) )); + pBitmap.reset(new vcl::bitmap::RawBitmap( Size(nWidth, nHeight), 24 )); for (sal_uInt16 ny = 0; ny < nHeight; ++ny) { @@ -1027,7 +1027,7 @@ sal_uLong PictReader::ReadPixMapEtc( BitmapEx &rBitmap, bool bBaseAddr, bool bCo if (nWidth > nMaxCols) return 0xffffffff; - pBitmap.reset(new vcl::bitmap::RawBitmap( Size(nWidth, nHeight) )); + pBitmap.reset(new vcl::bitmap::RawBitmap( Size(nWidth, nHeight), 24 )); for (sal_uInt16 ny = 0; ny < nHeight; ++ny) { @@ -1050,7 +1050,7 @@ sal_uLong PictReader::ReadPixMapEtc( BitmapEx &rBitmap, bool bBaseAddr, bool bCo if (nWidth > nMaxCols) return 0xffffffff; - pBitmap.reset(new vcl::bitmap::RawBitmap( Size(nWidth, nHeight) )); + pBitmap.reset(new vcl::bitmap::RawBitmap( Size(nWidth, nHeight), 24 )); for (sal_uInt16 ny = 0; ny < nHeight; ++ny) { @@ -1072,7 +1072,7 @@ sal_uLong PictReader::ReadPixMapEtc( BitmapEx &rBitmap, bool bBaseAddr, bool bCo if (nHeight > pPict->remainingSize() / nByteCountSize) return 0xffffffff; - pBitmap.reset(new vcl::bitmap::RawBitmap( Size(nWidth, nHeight) )); + pBitmap.reset(new vcl::bitmap::RawBitmap( Size(nWidth, nHeight), 24 )); size_t nByteWidth = static_cast<size_t>(nWidth) * nCmpCount; std::vector<sal_uInt8> aScanline(nByteWidth); diff --git a/filter/source/graphicfilter/ipsd/ipsd.cxx b/filter/source/graphicfilter/ipsd/ipsd.cxx index 8510ee9b583e..b5b4a81d3bf2 100644 --- a/filter/source/graphicfilter/ipsd/ipsd.cxx +++ b/filter/source/graphicfilter/ipsd/ipsd.cxx @@ -115,7 +115,7 @@ bool PSDReader::ReadPSD(Graphic & rGraphic ) } Size aBitmapSize( mpFileHeader->nColumns, mpFileHeader->nRows ); - mpBitmap.reset( new vcl::bitmap::RawBitmap( aBitmapSize ) ); + mpBitmap.reset( new vcl::bitmap::RawBitmap( aBitmapSize, 24 ) ); if ( mpPalette && mbStatus ) { mvPalette.resize( 256 ); diff --git a/filter/source/graphicfilter/iras/iras.cxx b/filter/source/graphicfilter/iras/iras.cxx index d12e4f92ad82..1908afb6273c 100644 --- a/filter/source/graphicfilter/iras/iras.cxx +++ b/filter/source/graphicfilter/iras/iras.cxx @@ -173,7 +173,7 @@ bool RASReader::ReadRAS(Graphic & rGraphic) if (m_rRAS.remainingSize() * nMaxCompression < nBitSize / 8) return false; - vcl::bitmap::RawBitmap aBmp(Size(mnWidth, mnHeight)); + vcl::bitmap::RawBitmap aBmp(Size(mnWidth, mnHeight), 24); // read in the bitmap data mbStatus = ImplReadBody(aBmp, aPalette); diff --git a/filter/source/graphicfilter/itga/itga.cxx b/filter/source/graphicfilter/itga/itga.cxx index 28cfb8dd25b8..000237069556 100644 --- a/filter/source/graphicfilter/itga/itga.cxx +++ b/filter/source/graphicfilter/itga/itga.cxx @@ -146,7 +146,7 @@ bool TGAReader::ReadTGA(Graphic & rGraphic) if (nSize > SAL_MAX_INT32/2/3) return false; - mpBitmap.reset( new vcl::bitmap::RawBitmap( Size( mpFileHeader->nImageWidth, mpFileHeader->nImageHeight ) ) ); + mpBitmap.reset( new vcl::bitmap::RawBitmap( Size( mpFileHeader->nImageWidth, mpFileHeader->nImageHeight ), 24 ) ); if ( mbIndexing ) mbStatus = ImplReadPalette(); if ( mbStatus ) diff --git a/filter/source/msfilter/msdffimp.cxx b/filter/source/msfilter/msdffimp.cxx index 12e8cdb6b005..89404f1a986a 100644 --- a/filter/source/msfilter/msdffimp.cxx +++ b/filter/source/msfilter/msdffimp.cxx @@ -1109,7 +1109,7 @@ void ApplyRectangularGradientAsBitmap( const SvxMSDffManager& rManager, SvStream double fFocusX = rManager.GetPropertyValue( DFF_Prop_fillToRight, 0 ) / 65536.0; double fFocusY = rManager.GetPropertyValue( DFF_Prop_fillToBottom, 0 ) / 65536.0; - vcl::bitmap::RawBitmap aBitmap(aBitmapSizePixel); + vcl::bitmap::RawBitmap aBitmap(aBitmapSizePixel, 24); for ( long nY = 0; nY < aBitmapSizePixel.Height(); nY++ ) { @@ -1364,7 +1364,7 @@ void DffPropertyReader::ApplyFillAttributes( SvStream& rIn, SfxItemSet& rSet, co aCol2 = rManager.MSO_CLR_ToColor( GetPropertyValue( DFF_Prop_fillBackColor, 0 ), DFF_Prop_fillBackColor ); // Create a bitmap for the pattern with expected colors - vcl::bitmap::RawBitmap aResult(Size(8, 8)); + vcl::bitmap::RawBitmap aResult(Size(8, 8), 24); { Bitmap::ScopedReadAccess pRead(aBmp); diff --git a/include/vcl/BitmapTools.hxx b/include/vcl/BitmapTools.hxx index cf790e85be14..51088b0fefa1 100644 --- a/include/vcl/BitmapTools.hxx +++ b/include/vcl/BitmapTools.hxx @@ -30,28 +30,37 @@ class VCL_DLLPUBLIC RawBitmap friend BitmapEx VCL_DLLPUBLIC CreateFromData( RawBitmap&& rawBitmap ); std::unique_ptr<sal_uInt8[]> mpData; Size maSize; + sal_uInt8 mnBitCount; public: - RawBitmap(Size const & rSize) - : mpData(new sal_uInt8[ rSize.getWidth() * 3 * rSize.getHeight()]), - maSize(rSize) + RawBitmap(Size const & rSize, sal_uInt8 nBitCount) + : mpData(new sal_uInt8[ rSize.getWidth() * nBitCount/8 * rSize.getHeight()]), + maSize(rSize), + mnBitCount(nBitCount) { + assert(nBitCount == 24 || nBitCount == 32); } void SetPixel(long nY, long nX, Color nColor) { - long p = (nY * maSize.getWidth() + nX) * 3; + long p = (nY * maSize.getWidth() + nX) * (mnBitCount/8); mpData[ p++ ] = nColor.GetRed(); mpData[ p++ ] = nColor.GetGreen(); - mpData[ p ] = nColor.GetBlue(); + mpData[ p++ ] = nColor.GetBlue(); + if (mnBitCount == 32) + mpData[ p ] = nColor.GetTransparency(); } Color GetPixel(long nY, long nX) const { - long p = (nY * maSize.getWidth() + nX) * 3; - return Color( mpData[p], mpData[p+1], mpData[p+2]); + long p = (nY * maSize.getWidth() + nX) * mnBitCount/8; + if (mnBitCount == 24) + return Color( mpData[p], mpData[p+1], mpData[p+2]); + else + return Color( mpData[p+3], mpData[p], mpData[p+1], mpData[p+2]); } // so we don't accidentally leave any code in that uses palette color indexes void SetPixel(long nY, long nX, BitmapColor nColor) = delete; long Height() { return maSize.Height(); } long Width() { return maSize.Width(); } + sal_uInt8 GetBitCount() { return mnBitCount; } }; BitmapEx VCL_DLLPUBLIC loadFromName(const OUString& rFileName, const ImageLoadFlags eFlags = ImageLoadFlags::NONE); diff --git a/svx/source/xoutdev/xattrbmp.cxx b/svx/source/xoutdev/xattrbmp.cxx index ed65981097f3..bad890bdc1a5 100644 --- a/svx/source/xoutdev/xattrbmp.cxx +++ b/svx/source/xoutdev/xattrbmp.cxx @@ -145,7 +145,7 @@ XFillBitmapItem::XFillBitmapItem(const XFillBitmapItem& rItem) BitmapEx createHistorical8x8FromArray(std::array<sal_uInt8,64> const & pArray, Color aColorPix, Color aColorBack) { - vcl::bitmap::RawBitmap aBitmap(Size(8, 8)); + vcl::bitmap::RawBitmap aBitmap(Size(8, 8), 24); for(sal_uInt16 a(0); a < 8; a++) { diff --git a/vcl/source/bitmap/BitmapTools.cxx b/vcl/source/bitmap/BitmapTools.cxx index a171fd848a39..beda990e5b03 100644 --- a/vcl/source/bitmap/BitmapTools.cxx +++ b/vcl/source/bitmap/BitmapTools.cxx @@ -148,7 +148,7 @@ BitmapEx CreateFromData( sal_uInt8 const *pData, sal_Int32 nWidth, sal_Int32 nHe { for( long y = 0; y < nHeight; ++y ) { - sal_uInt8 const *p = pData + y * nStride; + sal_uInt8 const *p = pData + (y * nStride); Scanline pScanline = pWrite->GetScanline(y); for (long x = 0; x < nWidth; ++x) { @@ -158,7 +158,7 @@ BitmapEx CreateFromData( sal_uInt8 const *pData, sal_Int32 nWidth, sal_Int32 nHe } if (nBitCount == 32) { - p = pData + y * nStride + 3; + p = pData + (y * nStride) + 3; Scanline pMaskScanLine = xMaskAcc->GetScanline(y); for (long x = 0; x < nWidth; ++x) { @@ -179,27 +179,50 @@ BitmapEx CreateFromData( sal_uInt8 const *pData, sal_Int32 nWidth, sal_Int32 nHe */ BitmapEx CreateFromData( RawBitmap&& rawBitmap ) { - Bitmap aBmp( rawBitmap.maSize, /*nBitCount*/24 ); + auto nBitCount = rawBitmap.GetBitCount(); + assert( nBitCount == 24 || nBitCount == 32); + Bitmap aBmp( rawBitmap.maSize, nBitCount ); Bitmap::ScopedWriteAccess pWrite(aBmp); assert(pWrite.get()); if( !pWrite ) return BitmapEx(); + std::unique_ptr<AlphaMask> pAlphaMask; + AlphaMask::ScopedWriteAccess xMaskAcc; + if (nBitCount == 32) + { + pAlphaMask.reset( new AlphaMask( rawBitmap.maSize ) ); + xMaskAcc = AlphaMask::ScopedWriteAccess(*pAlphaMask); + } auto nHeight = rawBitmap.maSize.getHeight(); auto nWidth = rawBitmap.maSize.getWidth(); + auto nStride = nWidth * nBitCount / 8; for( long y = 0; y < nHeight; ++y ) { - sal_uInt8 const *p = rawBitmap.mpData.get() + (y * nWidth * 3); + sal_uInt8 const *p = rawBitmap.mpData.get() + (y * nStride); Scanline pScanline = pWrite->GetScanline(y); for (long x = 0; x < nWidth; ++x) { BitmapColor col(p[0], p[1], p[2]); pWrite->SetPixelOnData(pScanline, x, col); - p += 3; + p += nBitCount/8; + } + if (nBitCount == 32) + { + p = rawBitmap.mpData.get() + (y * nStride) + 3; + Scanline pMaskScanLine = xMaskAcc->GetScanline(y); + for (long x = 0; x < nWidth; ++x) + { + xMaskAcc->SetPixelOnData(pMaskScanLine, x, BitmapColor(*p)); + p += 4; + } } } - return aBmp; + if (nBitCount == 32) + return BitmapEx(aBmp, *pAlphaMask); + else + return aBmp; } #if ENABLE_CAIRO_CANVAS _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits