diff options
Diffstat (limited to 'vcl')
-rw-r--r-- | vcl/Library_vcl.mk | 1 | ||||
-rw-r--r-- | vcl/source/bitmap/BitmapSeparableUnsharpenFilter.cxx | 76 | ||||
-rw-r--r-- | vcl/source/gdi/bitmap4.cxx | 53 |
3 files changed, 81 insertions, 49 deletions
diff --git a/vcl/Library_vcl.mk b/vcl/Library_vcl.mk index dc3b8a3318c6..8a2edf75b2b4 100644 --- a/vcl/Library_vcl.mk +++ b/vcl/Library_vcl.mk @@ -318,6 +318,7 @@ $(eval $(call gb_Library_add_exception_objects,vcl,\ vcl/source/bitmap/BitmapColorizeFilter \ vcl/source/bitmap/bitmappaint \ vcl/source/bitmap/BitmapGaussianSeparableBlurFilter \ + vcl/source/bitmap/BitmapSeparableUnsharpenFilter \ vcl/source/bitmap/BitmapFastScaleFilter \ vcl/source/bitmap/BitmapScaleSuperFilter \ vcl/source/bitmap/BitmapScaleConvolutionFilter \ diff --git a/vcl/source/bitmap/BitmapSeparableUnsharpenFilter.cxx b/vcl/source/bitmap/BitmapSeparableUnsharpenFilter.cxx new file mode 100644 index 000000000000..f594a808cc14 --- /dev/null +++ b/vcl/source/bitmap/BitmapSeparableUnsharpenFilter.cxx @@ -0,0 +1,76 @@ +/* -*- 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 <basegfx/color/bcolortools.hxx> + +#include <vcl/bitmap.hxx> +#include <vcl/bitmapex.hxx> +#include <vcl/bitmapaccess.hxx> +#include <vcl/BitmapGaussianSeparableBlurFilter.hxx> +#include <vcl/BitmapSeparableUnsharpenFilter.hxx> + +#include <bitmapwriteaccess.hxx> + +BitmapEx BitmapSeparableUnsharpenFilter::execute(BitmapEx const& rBitmapEx) +{ + Bitmap aBitmap(rBitmapEx.GetBitmap()); + + const long nWidth = aBitmap.GetSizePixel().Width(); + const long nHeight = aBitmap.GetSizePixel().Height(); + + Bitmap aBlur(aBitmap); + BitmapEx aBlurEx(aBlur); + + BitmapFilter::Filter(aBlurEx, BitmapGaussianSeparableBlurFilter(-mfRadius)); + aBlur = aBlurEx.GetBitmap(); + + // Amount of unsharpening effect on image - currently set to a fixed value + double aAmount = 2.0; + + Bitmap aResultBitmap(Size(nWidth, nHeight), 24); + + Bitmap::ScopedReadAccess pReadAccBlur(aBlur); + Bitmap::ScopedReadAccess pReadAcc(aBitmap); + BitmapScopedWriteAccess pWriteAcc(aResultBitmap); + + BitmapColor aColor, aColorBlur; + + // For all pixels in original image subtract pixels values from blurred image + for (long y = 0; y < nHeight; y++) + { + Scanline pScanline = pWriteAcc->GetScanline(y); + for (long x = 0; x < nWidth; x++) + { + aColorBlur = pReadAccBlur->GetColor(y, x); + aColor = pReadAcc->GetColor(y, x); + + BitmapColor aResultColor( + static_cast<sal_uInt8>(MinMax( + aColor.GetRed() + (aColor.GetRed() - aColorBlur.GetRed()) * aAmount, 0, 255)), + static_cast<sal_uInt8>(MinMax( + aColor.GetGreen() + (aColor.GetGreen() - aColorBlur.GetGreen()) * aAmount, 0, + 255)), + static_cast<sal_uInt8>( + MinMax(aColor.GetBlue() + (aColor.GetBlue() - aColorBlur.GetBlue()) * aAmount, + 0, 255))); + + pWriteAcc->SetPixelOnData(pScanline, x, aResultColor); + } + } + + pWriteAcc.reset(); + pReadAcc.reset(); + pReadAccBlur.reset(); + aBitmap.ReassignWithSize(aResultBitmap); + + return BitmapEx(aBitmap); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/source/gdi/bitmap4.cxx b/vcl/source/gdi/bitmap4.cxx index e48a2edae9b3..1c739c380bc7 100644 --- a/vcl/source/gdi/bitmap4.cxx +++ b/vcl/source/gdi/bitmap4.cxx @@ -21,6 +21,7 @@ #include <vcl/bitmapaccess.hxx> #include <vcl/bitmap.hxx> #include <vcl/BitmapGaussianSeparableBlurFilter.hxx> +#include <vcl/BitmapSeparableUnsharpenFilter.hxx> #include <bitmapwriteaccess.hxx> @@ -61,7 +62,9 @@ bool Bitmap::Filter( BmpFilter eFilter, const BmpFilterParam* pFilterParam ) // Unsharpen Mask for negative values of mnRadius else if (pFilterParam->mnRadius < 0.0) { - bRet = ImplSeparableUnsharpenFilter(pFilterParam->mnRadius); + BitmapEx aBmpEx(*this); + bRet = BitmapFilter::Filter(aBmpEx, BitmapSeparableUnsharpenFilter(pFilterParam->mnRadius)); + *this = aBmpEx.GetBitmap(); } else { @@ -1067,54 +1070,6 @@ bool Bitmap::ImplPopArt() return bRet; } -// Separable Unsharpen Mask filter is actually a subtracted blurred -// image from the original image. -bool Bitmap::ImplSeparableUnsharpenFilter(const double radius) { - const long nWidth = GetSizePixel().Width(); - const long nHeight = GetSizePixel().Height(); - - Bitmap aBlur( *this ); - BitmapEx aBlurEx(aBlur); - - BitmapFilter::Filter(aBlurEx, BitmapGaussianSeparableBlurFilter(-radius)); - aBlur = aBlurEx.GetBitmap(); - - // Amount of unsharpening effect on image - currently set to a fixed value - double aAmount = 2.0; - - Bitmap aResultBitmap( Size( nWidth, nHeight ), 24); - - ScopedReadAccess pReadAccBlur(aBlur); - ScopedReadAccess pReadAcc(*this); - BitmapScopedWriteAccess pWriteAcc(aResultBitmap); - - BitmapColor aColor, aColorBlur; - - // For all pixels in original image subtract pixels values from blurred image - for( long y = 0; y < nHeight; y++ ) - { - Scanline pScanline = pWriteAcc->GetScanline(y); - for( long x = 0; x < nWidth; x++ ) - { - aColorBlur = pReadAccBlur->GetColor( y , x ); - aColor = pReadAcc->GetColor( y , x ); - - BitmapColor aResultColor( - static_cast<sal_uInt8>(MinMax( aColor.GetRed() + (aColor.GetRed() - aColorBlur.GetRed()) * aAmount, 0, 255 )), - static_cast<sal_uInt8>(MinMax( aColor.GetGreen() + (aColor.GetGreen() - aColorBlur.GetGreen()) * aAmount, 0, 255 )), - static_cast<sal_uInt8>(MinMax( aColor.GetBlue() + (aColor.GetBlue() - aColorBlur.GetBlue()) * aAmount, 0, 255 )) ); - - pWriteAcc->SetPixelOnData( pScanline, x, aResultColor ); - } - } - - pWriteAcc.reset(); - pReadAcc.reset(); - pReadAccBlur.reset(); - ReassignWithSize(aResultBitmap); - return true; -} - bool Bitmap::ImplDuotoneFilter( const sal_uLong nColorOne, const sal_uLong nColorTwo ) { const long nWidth = GetSizePixel().Width(); |