use RawBitmap in BPixelRasterToBitmapEx

part of making BitmapWriteAccess an internal detail of vcl/

Change-Id: I28b9e0e0b414489c564fb2f23c4de2390ad175c1
Reviewed-on: https://gerrit.libreoffice.org/49964
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
Tested-by: Noel Grandin <noel.grandin@collabora.co.uk>
This commit is contained in:
Noel Grandin
2018-02-19 09:15:04 +02:00
parent 55cdba99f6
commit b10c7022f1

View File

@@ -33,7 +33,7 @@
#include <drawinglayer/processor3d/geometry2dextractor.hxx> #include <drawinglayer/processor3d/geometry2dextractor.hxx>
#include <drawinglayer/primitive2d/polygonprimitive2d.hxx> #include <drawinglayer/primitive2d/polygonprimitive2d.hxx>
#include <basegfx/raster/bzpixelraster.hxx> #include <basegfx/raster/bzpixelraster.hxx>
#include <vcl/bitmapaccess.hxx> #include <vcl/BitmapTools.hxx>
#include <comphelper/threadpool.hxx> #include <comphelper/threadpool.hxx>
using namespace com::sun::star; using namespace com::sun::star;
@@ -49,83 +49,68 @@ namespace
if(nWidth && nHeight) if(nWidth && nHeight)
{ {
const Size aDestSize(nWidth, nHeight); const Size aDestSize(nWidth, nHeight);
sal_uInt8 nInitAlpha(255); vcl::bitmap::RawBitmap aContent(aDestSize);
Bitmap aContent(aDestSize, 24);
AlphaMask aAlpha(aDestSize, &nInitAlpha);
Bitmap::ScopedWriteAccess pContent(aContent);
AlphaMask::ScopedWriteAccess pAlpha(aAlpha);
if (pContent && pAlpha) if(mnAntiAlialize)
{ {
if(mnAntiAlialize) const sal_uInt16 nDivisor(mnAntiAlialize * mnAntiAlialize);
for(sal_uInt32 y(0); y < nHeight; y++)
{ {
const sal_uInt16 nDivisor(mnAntiAlialize * mnAntiAlialize); for(sal_uInt32 x(0); x < nWidth; x++)
for(sal_uInt32 y(0); y < nHeight; y++)
{ {
Scanline pScanlineContent = pContent->GetScanline( y ); sal_uInt16 nRed(0);
Scanline pScanlineAlpha = pAlpha->GetScanline( y ); sal_uInt16 nGreen(0);
for(sal_uInt32 x(0); x < nWidth; x++) sal_uInt16 nBlue(0);
sal_uInt16 nOpacity(0);
sal_uInt32 nIndex(rRaster.getIndexFromXY(x * mnAntiAlialize, y * mnAntiAlialize));
for(sal_uInt32 c(0); c < mnAntiAlialize; c++)
{ {
sal_uInt16 nRed(0); for(sal_uInt32 d(0); d < mnAntiAlialize; d++)
sal_uInt16 nGreen(0);
sal_uInt16 nBlue(0);
sal_uInt16 nOpacity(0);
sal_uInt32 nIndex(rRaster.getIndexFromXY(x * mnAntiAlialize, y * mnAntiAlialize));
for(sal_uInt32 c(0); c < mnAntiAlialize; c++)
{ {
for(sal_uInt32 d(0); d < mnAntiAlialize; d++) const basegfx::BPixel& rPixel(rRaster.getBPixel(nIndex++));
{ nRed = nRed + rPixel.getRed();
const basegfx::BPixel& rPixel(rRaster.getBPixel(nIndex++)); nGreen = nGreen + rPixel.getGreen();
nRed = nRed + rPixel.getRed(); nBlue = nBlue + rPixel.getBlue();
nGreen = nGreen + rPixel.getGreen(); nOpacity = nOpacity + rPixel.getOpacity();
nBlue = nBlue + rPixel.getBlue();
nOpacity = nOpacity + rPixel.getOpacity();
}
nIndex += rRaster.getWidth() - mnAntiAlialize;
} }
nOpacity = nOpacity / nDivisor; nIndex += rRaster.getWidth() - mnAntiAlialize;
}
if(nOpacity) nOpacity = nOpacity / nDivisor;
{
pContent->SetPixelOnData(pScanlineContent, x, BitmapColor( if(nOpacity)
static_cast<sal_uInt8>(nRed / nDivisor), {
static_cast<sal_uInt8>(nGreen / nDivisor), aContent.SetPixel(y, x, Color(
static_cast<sal_uInt8>(nBlue / nDivisor))); static_cast<sal_uInt8>(nRed / nDivisor),
pAlpha->SetPixelOnData(pScanlineAlpha, x, BitmapColor(255 - static_cast<sal_uInt8>(nOpacity))); static_cast<sal_uInt8>(nGreen / nDivisor),
} static_cast<sal_uInt8>(nBlue / nDivisor),
255 - static_cast<sal_uInt8>(nOpacity)));
} }
} }
} }
else }
else
{
sal_uInt32 nIndex(0);
for(sal_uInt32 y(0); y < nHeight; y++)
{ {
sal_uInt32 nIndex(0); for(sal_uInt32 x(0); x < nWidth; x++)
for(sal_uInt32 y(0); y < nHeight; y++)
{ {
Scanline pScanlineContent = pContent->GetScanline( y ); const basegfx::BPixel& rPixel(rRaster.getBPixel(nIndex++));
Scanline pScanlineAlpha = pAlpha->GetScanline( y );
for(sal_uInt32 x(0); x < nWidth; x++)
{
const basegfx::BPixel& rPixel(rRaster.getBPixel(nIndex++));
if(rPixel.getOpacity()) if(rPixel.getOpacity())
{ {
pContent->SetPixelOnData(pScanlineContent, x, BitmapColor(rPixel.getRed(), rPixel.getGreen(), rPixel.getBlue())); aContent.SetPixel(y, x, Color(rPixel.getRed(), rPixel.getGreen(), rPixel.getBlue(), 255 - rPixel.getOpacity()));
pAlpha->SetPixelOnData(pScanlineAlpha, x, BitmapColor(255 - rPixel.getOpacity()));
}
} }
} }
} }
} }
pAlpha.reset(); aRetval = vcl::bitmap::CreateFromData(std::move(aContent));
pContent.reset();
aRetval = BitmapEx(aContent, aAlpha);
// #i101811# set PrefMapMode and PrefSize at newly created Bitmap // #i101811# set PrefMapMode and PrefSize at newly created Bitmap
aRetval.SetPrefMapMode(MapMode(MapUnit::MapPixel)); aRetval.SetPrefMapMode(MapMode(MapUnit::MapPixel));