Kaydet (Commit) 4b183ae9 authored tarafından Chris Sherlock's avatar Chris Sherlock Kaydeden (comit) Tomaž Vajngerl

vcl: ImplEmbossGrey() -> BitmapEmbossGreyFilter

Change-Id: I6e541e9ca9cf61dfa8df9638a4ba4b8bd1d3ad71
Reviewed-on: https://gerrit.libreoffice.org/53204Tested-by: 's avatarJenkins <ci@libreoffice.org>
Reviewed-by: 's avatarTomaž Vajngerl <quikee@gmail.com>
üst df996068
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
*/
#ifndef INCLUDED_VCL_BITMAPEMBOSSGREYFILTER_HXX
#define INCLUDED_VCL_BITMAPEMBOSSGREYFILTER_HXX
#include <vcl/BitmapFilter.hxx>
class BitmapEx;
class VCL_DLLPUBLIC BitmapEmbossGreyFilter : public BitmapFilter
{
public:
BitmapEmbossGreyFilter(sal_uInt16 nAzimuthAngle100, sal_uInt16 nElevationAngle100)
: mnAzimuthAngle100(nAzimuthAngle100)
, mnElevationAngle100(nElevationAngle100)
{
}
virtual BitmapEx execute(BitmapEx const& rBitmapEx) override;
private:
sal_uInt16 mnAzimuthAngle100;
sal_uInt16 mnElevationAngle100;
};
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
...@@ -658,7 +658,6 @@ public: ...@@ -658,7 +658,6 @@ public:
SAL_DLLPRIVATE bool ImplDitherFloyd(); SAL_DLLPRIVATE bool ImplDitherFloyd();
SAL_DLLPRIVATE bool ImplDitherFloyd16(); SAL_DLLPRIVATE bool ImplDitherFloyd16();
SAL_DLLPRIVATE bool ImplEmbossGrey( const BmpFilterParam* pFilterParam );
SAL_DLLPRIVATE bool ImplDuotoneFilter( const sal_uLong nColorOne, sal_uLong nColorTwo ); SAL_DLLPRIVATE bool ImplDuotoneFilter( const sal_uLong nColorOne, sal_uLong nColorTwo );
public: public:
......
...@@ -316,6 +316,7 @@ $(eval $(call gb_Library_add_exception_objects,vcl,\ ...@@ -316,6 +316,7 @@ $(eval $(call gb_Library_add_exception_objects,vcl,\
vcl/source/bitmap/BitmapSolarizeFilter \ vcl/source/bitmap/BitmapSolarizeFilter \
vcl/source/bitmap/BitmapSepiaFilter \ vcl/source/bitmap/BitmapSepiaFilter \
vcl/source/bitmap/BitmapMosaicFilter \ vcl/source/bitmap/BitmapMosaicFilter \
vcl/source/bitmap/BitmapEmbossGreyFilter \
vcl/source/bitmap/BitmapPopArtFilter \ vcl/source/bitmap/BitmapPopArtFilter \
vcl/source/bitmap/BitmapConvolutionMatrixFilter \ vcl/source/bitmap/BitmapConvolutionMatrixFilter \
vcl/source/bitmap/BitmapMedianFilter \ vcl/source/bitmap/BitmapMedianFilter \
......
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
*/
#include <vcl/bitmap.hxx>
#include <vcl/bitmapex.hxx>
#include <vcl/bitmapaccess.hxx>
#include <vcl/BitmapEmbossGreyFilter.hxx>
#include <bitmapwriteaccess.hxx>
BitmapEx BitmapEmbossGreyFilter::execute(BitmapEx const& rBitmapEx)
{
Bitmap aBitmap(rBitmapEx.GetBitmap());
bool bRet = aBitmap.ImplMakeGreyscales(256);
if (bRet)
{
bRet = false;
Bitmap::ScopedReadAccess pReadAcc(aBitmap);
if (pReadAcc)
{
Bitmap aNewBmp(aBitmap.GetSizePixel(), 8, &pReadAcc->GetPalette());
BitmapScopedWriteAccess pWriteAcc(aNewBmp);
if (pWriteAcc)
{
BitmapColor aGrey(sal_uInt8(0));
const long nWidth = pWriteAcc->Width();
const long nHeight = pWriteAcc->Height();
long nGrey11, nGrey12, nGrey13;
long nGrey21, nGrey22, nGrey23;
long nGrey31, nGrey32, nGrey33;
double fAzim = mnAzimuthAngle100 * 0.01 * F_PI180;
double fElev = mnElevationAngle100 * 0.01 * F_PI180;
long* pHMap = new long[nWidth + 2];
long* pVMap = new long[nHeight + 2];
long nX, nY, nNx, nNy, nDotL;
const long nLx = FRound(cos(fAzim) * cos(fElev) * 255.0);
const long nLy = FRound(sin(fAzim) * cos(fElev) * 255.0);
const long nLz = FRound(sin(fElev) * 255.0);
const auto nZ2 = ((6 * 255) / 4) * ((6 * 255) / 4);
const long nNzLz = ((6 * 255) / 4) * nLz;
const sal_uInt8 cLz = static_cast<sal_uInt8>(SAL_BOUND(nLz, 0, 255));
// fill mapping tables
pHMap[0] = 0;
for (nX = 1; nX <= nWidth; nX++)
{
pHMap[nX] = nX - 1;
}
pHMap[nWidth + 1] = nWidth - 1;
pVMap[0] = 0;
for (nY = 1; nY <= nHeight; nY++)
{
pVMap[nY] = nY - 1;
}
pVMap[nHeight + 1] = nHeight - 1;
for (nY = 0; nY < nHeight; nY++)
{
nGrey11 = pReadAcc->GetPixel(pVMap[nY], pHMap[0]).GetIndex();
nGrey12 = pReadAcc->GetPixel(pVMap[nY], pHMap[1]).GetIndex();
nGrey13 = pReadAcc->GetPixel(pVMap[nY], pHMap[2]).GetIndex();
nGrey21 = pReadAcc->GetPixel(pVMap[nY + 1], pHMap[0]).GetIndex();
nGrey22 = pReadAcc->GetPixel(pVMap[nY + 1], pHMap[1]).GetIndex();
nGrey23 = pReadAcc->GetPixel(pVMap[nY + 1], pHMap[2]).GetIndex();
nGrey31 = pReadAcc->GetPixel(pVMap[nY + 2], pHMap[0]).GetIndex();
nGrey32 = pReadAcc->GetPixel(pVMap[nY + 2], pHMap[1]).GetIndex();
nGrey33 = pReadAcc->GetPixel(pVMap[nY + 2], pHMap[2]).GetIndex();
Scanline pScanline = pWriteAcc->GetScanline(nY);
for (nX = 0; nX < nWidth; nX++)
{
nNx = nGrey11 + nGrey21 + nGrey31 - nGrey13 - nGrey23 - nGrey33;
nNy = nGrey31 + nGrey32 + nGrey33 - nGrey11 - nGrey12 - nGrey13;
if (!nNx && !nNy)
{
aGrey.SetIndex(cLz);
}
else if ((nDotL = nNx * nLx + nNy * nLy + nNzLz) < 0)
{
aGrey.SetIndex(0);
}
else
{
const double fGrey
= nDotL / sqrt(static_cast<double>(nNx * nNx + nNy * nNy + nZ2));
aGrey.SetIndex(static_cast<sal_uInt8>(SAL_BOUND(fGrey, 0, 255)));
}
pWriteAcc->SetPixelOnData(pScanline, nX, aGrey);
if (nX < (nWidth - 1))
{
const long nNextX = pHMap[nX + 3];
nGrey11 = nGrey12;
nGrey12 = nGrey13;
nGrey13 = pReadAcc->GetPixel(pVMap[nY], nNextX).GetIndex();
nGrey21 = nGrey22;
nGrey22 = nGrey23;
nGrey23 = pReadAcc->GetPixel(pVMap[nY + 1], nNextX).GetIndex();
nGrey31 = nGrey32;
nGrey32 = nGrey33;
nGrey33 = pReadAcc->GetPixel(pVMap[nY + 2], nNextX).GetIndex();
}
}
}
delete[] pHMap;
delete[] pVMap;
pWriteAcc.reset();
bRet = true;
}
pReadAcc.reset();
if (bRet)
{
const MapMode aMap(aBitmap.GetPrefMapMode());
const Size aPrefSize(aBitmap.GetPrefSize());
aBitmap = aNewBmp;
aBitmap.SetPrefMapMode(aMap);
aBitmap.SetPrefSize(aPrefSize);
}
}
}
if (bRet)
return BitmapEx(rBitmapEx);
return BitmapEx();
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
...@@ -27,6 +27,7 @@ ...@@ -27,6 +27,7 @@
#include <vcl/BitmapSolarizeFilter.hxx> #include <vcl/BitmapSolarizeFilter.hxx>
#include <vcl/BitmapSepiaFilter.hxx> #include <vcl/BitmapSepiaFilter.hxx>
#include <vcl/BitmapMosaicFilter.hxx> #include <vcl/BitmapMosaicFilter.hxx>
#include <vcl/BitmapEmbossGreyFilter.hxx>
#include <vcl/BitmapSepiaFilter.hxx> #include <vcl/BitmapSepiaFilter.hxx>
#include <vcl/BitmapPopArtFilter.hxx> #include <vcl/BitmapPopArtFilter.hxx>
...@@ -108,7 +109,12 @@ bool Bitmap::Filter( BmpFilter eFilter, const BmpFilterParam* pFilterParam ) ...@@ -108,7 +109,12 @@ bool Bitmap::Filter( BmpFilter eFilter, const BmpFilterParam* pFilterParam )
break; break;
case BmpFilter::EmbossGrey: case BmpFilter::EmbossGrey:
bRet = ImplEmbossGrey( pFilterParam ); {
BitmapEx aBmpEx(*this);
bRet = BitmapFilter::Filter(aBmpEx, BitmapEmbossGreyFilter(pFilterParam->maEmbossAngles.mnAzimuthAngle100,
pFilterParam->maEmbossAngles.mnElevationAngle100));
*this = aBmpEx.GetBitmap();
}
break; break;
case BmpFilter::PopArt: case BmpFilter::PopArt:
...@@ -131,119 +137,6 @@ bool Bitmap::Filter( BmpFilter eFilter, const BmpFilterParam* pFilterParam ) ...@@ -131,119 +137,6 @@ bool Bitmap::Filter( BmpFilter eFilter, const BmpFilterParam* pFilterParam )
return bRet; return bRet;
} }
bool Bitmap::ImplEmbossGrey( const BmpFilterParam* pFilterParam )
{
bool bRet = ImplMakeGreyscales( 256 );
if( bRet )
{
bRet = false;
ScopedReadAccess pReadAcc(*this);
if( pReadAcc )
{
Bitmap aNewBmp( GetSizePixel(), 8, &pReadAcc->GetPalette() );
BitmapScopedWriteAccess pWriteAcc(aNewBmp);
if( pWriteAcc )
{
BitmapColor aGrey( sal_uInt8(0) );
const long nWidth = pWriteAcc->Width();
const long nHeight = pWriteAcc->Height();
long nGrey11, nGrey12, nGrey13;
long nGrey21, nGrey22, nGrey23;
long nGrey31, nGrey32, nGrey33;
double fAzim = ( ( pFilterParam && pFilterParam->meFilter == BmpFilter::EmbossGrey ) ?
( pFilterParam->maEmbossAngles.mnAzimuthAngle100 * 0.01 ) : 0.0 ) * F_PI180;
double fElev = ( ( pFilterParam && pFilterParam->meFilter == BmpFilter::EmbossGrey ) ?
( pFilterParam->maEmbossAngles.mnElevationAngle100 * 0.01 ) : 90.0 ) * F_PI180;
long* pHMap = new long[ nWidth + 2 ];
long* pVMap = new long[ nHeight + 2 ];
long nX, nY, nNx, nNy, nDotL;
const long nLx = FRound( cos( fAzim ) * cos( fElev ) * 255.0 );
const long nLy = FRound( sin( fAzim ) * cos( fElev ) * 255.0 );
const long nLz = FRound( sin( fElev ) * 255.0 );
const auto nZ2 = ( ( 6 * 255 ) / 4 ) * ( ( 6 * 255 ) / 4 );
const long nNzLz = ( ( 6 * 255 ) / 4 ) * nLz;
const sal_uInt8 cLz = static_cast<sal_uInt8>(SAL_BOUND( nLz, 0, 255 ));
// fill mapping tables
pHMap[ 0 ] = 0;
for( nX = 1; nX <= nWidth; nX++ )
pHMap[ nX ] = nX - 1;
pHMap[ nWidth + 1 ] = nWidth - 1;
pVMap[ 0 ] = 0;
for( nY = 1; nY <= nHeight; nY++ )
pVMap[ nY ] = nY - 1;
pVMap[ nHeight + 1 ] = nHeight - 1;
for( nY = 0; nY < nHeight ; nY++ )
{
nGrey11 = pReadAcc->GetPixel( pVMap[ nY ], pHMap[ 0 ] ).GetIndex();
nGrey12 = pReadAcc->GetPixel( pVMap[ nY ], pHMap[ 1 ] ).GetIndex();
nGrey13 = pReadAcc->GetPixel( pVMap[ nY ], pHMap[ 2 ] ).GetIndex();
nGrey21 = pReadAcc->GetPixel( pVMap[ nY + 1 ], pHMap[ 0 ] ).GetIndex();
nGrey22 = pReadAcc->GetPixel( pVMap[ nY + 1 ], pHMap[ 1 ] ).GetIndex();
nGrey23 = pReadAcc->GetPixel( pVMap[ nY + 1 ], pHMap[ 2 ] ).GetIndex();
nGrey31 = pReadAcc->GetPixel( pVMap[ nY + 2 ], pHMap[ 0 ] ).GetIndex();
nGrey32 = pReadAcc->GetPixel( pVMap[ nY + 2 ], pHMap[ 1 ] ).GetIndex();
nGrey33 = pReadAcc->GetPixel( pVMap[ nY + 2 ], pHMap[ 2 ] ).GetIndex();
Scanline pScanline = pWriteAcc->GetScanline(nY);
for( nX = 0; nX < nWidth; nX++ )
{
nNx = nGrey11 + nGrey21 + nGrey31 - nGrey13 - nGrey23 - nGrey33;
nNy = nGrey31 + nGrey32 + nGrey33 - nGrey11 - nGrey12 - nGrey13;
if( !nNx && !nNy )
aGrey.SetIndex( cLz );
else if( ( nDotL = nNx * nLx + nNy * nLy +nNzLz ) < 0 )
aGrey.SetIndex( 0 );
else
{
const double fGrey = nDotL / sqrt( static_cast<double>(nNx * nNx + nNy * nNy + nZ2) );
aGrey.SetIndex( static_cast<sal_uInt8>(SAL_BOUND( fGrey, 0, 255 )) );
}
pWriteAcc->SetPixelOnData( pScanline, nX, aGrey );
if( nX < ( nWidth - 1 ) )
{
const long nNextX = pHMap[ nX + 3 ];
nGrey11 = nGrey12; nGrey12 = nGrey13; nGrey13 = pReadAcc->GetPixel( pVMap[ nY ], nNextX ).GetIndex();
nGrey21 = nGrey22; nGrey22 = nGrey23; nGrey23 = pReadAcc->GetPixel( pVMap[ nY + 1 ], nNextX ).GetIndex();
nGrey31 = nGrey32; nGrey32 = nGrey33; nGrey33 = pReadAcc->GetPixel( pVMap[ nY + 2 ], nNextX ).GetIndex();
}
}
}
delete[] pHMap;
delete[] pVMap;
pWriteAcc.reset();
bRet = true;
}
pReadAcc.reset();
if( bRet )
{
const MapMode aMap( maPrefMapMode );
const Size aSize( maPrefSize );
*this = aNewBmp;
maPrefMapMode = aMap;
maPrefSize = aSize;
}
}
}
return bRet;
}
bool Bitmap::ImplDuotoneFilter( const sal_uLong nColorOne, const sal_uLong nColorTwo ) bool Bitmap::ImplDuotoneFilter( const sal_uLong nColorOne, const sal_uLong nColorTwo )
{ {
const long nWidth = GetSizePixel().Width(); const long nWidth = GetSizePixel().Width();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment