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:
@@ -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));
|
||||||
|
Reference in New Issue
Block a user