diff options
author | Chris Sherlock <chris.sherlock79@gmail.com> | 2018-04-20 20:32:23 +1000 |
---|---|---|
committer | Tomaž Vajngerl <quikee@gmail.com> | 2018-04-22 05:33:39 +0200 |
commit | 1ab12471f3a69c4d502e6271e84ddf8a981f507f (patch) | |
tree | 6652276229ad1c3ffca48f7a31e1b77d2ea04b07 /vcl | |
parent | c38485279cd36da96ac81107d567ea4e779b2b96 (diff) |
vcl: ImplSepia -> BitmapSepiaFilter
Change-Id: I96a4072bf919bd37b30c01ab16d98779c76717ab
Reviewed-on: https://gerrit.libreoffice.org/53202
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Tomaž Vajngerl <quikee@gmail.com>
Diffstat (limited to 'vcl')
-rw-r--r-- | vcl/Library_vcl.mk | 1 | ||||
-rw-r--r-- | vcl/source/bitmap/BitmapSepiaFilter.cxx | 106 | ||||
-rw-r--r-- | vcl/source/gdi/bitmap4.cxx | 91 |
3 files changed, 113 insertions, 85 deletions
diff --git a/vcl/Library_vcl.mk b/vcl/Library_vcl.mk index 940bd8b35974..82f67dd845b9 100644 --- a/vcl/Library_vcl.mk +++ b/vcl/Library_vcl.mk @@ -314,6 +314,7 @@ $(eval $(call gb_Library_add_exception_objects,vcl,\ vcl/source/bitmap/bitmapfilter \ vcl/source/bitmap/BitmapSobelGreyFilter \ vcl/source/bitmap/BitmapSolarizeFilter \ + vcl/source/bitmap/BitmapSepiaFilter \ vcl/source/bitmap/BitmapPopArtFilter \ vcl/source/bitmap/BitmapConvolutionMatrixFilter \ vcl/source/bitmap/BitmapMedianFilter \ diff --git a/vcl/source/bitmap/BitmapSepiaFilter.cxx b/vcl/source/bitmap/BitmapSepiaFilter.cxx new file mode 100644 index 000000000000..a953fcbee2a8 --- /dev/null +++ b/vcl/source/bitmap/BitmapSepiaFilter.cxx @@ -0,0 +1,106 @@ +/* -*- 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/BitmapSepiaFilter.hxx> + +#include <bitmapwriteaccess.hxx> + +BitmapEx BitmapSepiaFilter::execute(BitmapEx const& rBitmapEx) +{ + Bitmap aBitmap(rBitmapEx.GetBitmap()); + Bitmap::ScopedReadAccess pReadAcc(aBitmap); + bool bRet = false; + + if (pReadAcc) + { + const long nSepia = 10000 - 100 * SAL_BOUND(mnSepiaPercent, 0, 100); + BitmapPalette aSepiaPal(256); + + for (sal_uInt16 i = 0; i < 256; i++) + { + BitmapColor& rCol = aSepiaPal[i]; + const sal_uInt8 cSepiaValue = static_cast<sal_uInt8>(nSepia * i / 10000); + + rCol.SetRed(static_cast<sal_uInt8>(i)); + rCol.SetGreen(cSepiaValue); + rCol.SetBlue(cSepiaValue); + } + + Bitmap aNewBmp(aBitmap.GetSizePixel(), 8, &aSepiaPal); + BitmapScopedWriteAccess pWriteAcc(aNewBmp); + + if (pWriteAcc) + { + BitmapColor aCol(sal_uInt8(0)); + const long nWidth = pWriteAcc->Width(); + const long nHeight = pWriteAcc->Height(); + + if (pReadAcc->HasPalette()) + { + const sal_uInt16 nPalCount = pReadAcc->GetPaletteEntryCount(); + std::unique_ptr<sal_uInt8[]> pIndexMap(new sal_uInt8[nPalCount]); + for (sal_uInt16 i = 0; i < nPalCount; i++) + { + pIndexMap[i] = pReadAcc->GetPaletteColor(i).GetLuminance(); + } + + for (long nY = 0; nY < nHeight; nY++) + { + Scanline pScanline = pWriteAcc->GetScanline(nY); + Scanline pScanlineRead = pReadAcc->GetScanline(nY); + for (long nX = 0; nX < nWidth; nX++) + { + aCol.SetIndex(pIndexMap[pReadAcc->GetIndexFromData(pScanlineRead, nX)]); + pWriteAcc->SetPixelOnData(pScanline, nX, aCol); + } + } + } + else + { + for (long nY = 0; nY < nHeight; nY++) + { + Scanline pScanline = pWriteAcc->GetScanline(nY); + Scanline pScanlineRead = pReadAcc->GetScanline(nY); + for (long nX = 0; nX < nWidth; nX++) + { + aCol.SetIndex(pReadAcc->GetPixelFromData(pScanlineRead, nX).GetLuminance()); + pWriteAcc->SetPixelOnData(pScanline, nX, aCol); + } + } + } + + 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: */ diff --git a/vcl/source/gdi/bitmap4.cxx b/vcl/source/gdi/bitmap4.cxx index adaa3f846f7f..ea8fec2d4d49 100644 --- a/vcl/source/gdi/bitmap4.cxx +++ b/vcl/source/gdi/bitmap4.cxx @@ -25,6 +25,7 @@ #include <vcl/BitmapMedianFilter.hxx> #include <vcl/BitmapSobelGreyFilter.hxx> #include <vcl/BitmapSolarizeFilter.hxx> +#include <vcl/BitmapSepiaFilter.hxx> #include <vcl/BitmapPopArtFilter.hxx> #include <bitmapwriteaccess.hxx> @@ -87,7 +88,11 @@ bool Bitmap::Filter( BmpFilter eFilter, const BmpFilterParam* pFilterParam ) break; case BmpFilter::Sepia: - bRet = ImplSepia( pFilterParam ); + { + BitmapEx aBmpEx(*this); + bRet = BitmapFilter::Filter(aBmpEx, BitmapSepiaFilter(pFilterParam->mnSepiaPercent)); + *this = aBmpEx.GetBitmap(); + } break; case BmpFilter::Mosaic: @@ -231,90 +236,6 @@ bool Bitmap::ImplEmbossGrey( const BmpFilterParam* pFilterParam ) return bRet; } -bool Bitmap::ImplSepia( const BmpFilterParam* pFilterParam ) -{ - ScopedReadAccess pReadAcc(*this); - bool bRet = false; - - if( pReadAcc ) - { - long nSepiaPercent = ( pFilterParam && pFilterParam->meFilter == BmpFilter::Sepia ) ? - pFilterParam->mnSepiaPercent : 10; - const long nSepia = 10000 - 100 * SAL_BOUND( nSepiaPercent, 0, 100 ); - BitmapPalette aSepiaPal( 256 ); - - for( sal_uInt16 i = 0; i < 256; i++ ) - { - BitmapColor& rCol = aSepiaPal[ i ]; - const sal_uInt8 cSepiaValue = static_cast<sal_uInt8>( nSepia * i / 10000 ); - - rCol.SetRed( static_cast<sal_uInt8>(i) ); - rCol.SetGreen( cSepiaValue ); - rCol.SetBlue( cSepiaValue ); - } - - Bitmap aNewBmp( GetSizePixel(), 8, &aSepiaPal ); - BitmapScopedWriteAccess pWriteAcc(aNewBmp); - - if( pWriteAcc ) - { - BitmapColor aCol( sal_uInt8(0) ); - const long nWidth = pWriteAcc->Width(); - const long nHeight = pWriteAcc->Height(); - - if( pReadAcc->HasPalette() ) - { - const sal_uInt16 nPalCount = pReadAcc->GetPaletteEntryCount(); - std::unique_ptr<sal_uInt8[]> pIndexMap( new sal_uInt8[ nPalCount ] ); - for( sal_uInt16 i = 0; i < nPalCount; i++ ) - pIndexMap[ i ] = pReadAcc->GetPaletteColor( i ).GetLuminance(); - - for( long nY = 0; nY < nHeight ; nY++ ) - { - Scanline pScanline = pWriteAcc->GetScanline(nY); - Scanline pScanlineRead = pReadAcc->GetScanline(nY); - for( long nX = 0; nX < nWidth; nX++ ) - { - aCol.SetIndex( pIndexMap[ pReadAcc->GetIndexFromData( pScanlineRead, nX ) ] ); - pWriteAcc->SetPixelOnData( pScanline, nX, aCol ); - } - } - } - else - { - for( long nY = 0; nY < nHeight ; nY++ ) - { - Scanline pScanline = pWriteAcc->GetScanline(nY); - Scanline pScanlineRead = pReadAcc->GetScanline(nY); - for( long nX = 0; nX < nWidth; nX++ ) - { - aCol.SetIndex( pReadAcc->GetPixelFromData( pScanlineRead, nX ).GetLuminance() ); - pWriteAcc->SetPixelOnData( pScanline, nX, aCol ); - } - } - } - - 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::ImplMosaic( const BmpFilterParam* pFilterParam ) { sal_uLong nTileWidth = ( pFilterParam && pFilterParam->meFilter == BmpFilter::Mosaic ) ? |