diff options
author | Oliver Bolte <obo@openoffice.org> | 2008-01-10 12:23:05 +0000 |
---|---|---|
committer | Oliver Bolte <obo@openoffice.org> | 2008-01-10 12:23:05 +0000 |
commit | f33b266e59c6ccf458933d07c9d33a14c56c44a8 (patch) | |
tree | 2bca9168153bbb9f5b0678033b8fc8c8648684b5 /goodies | |
parent | 0dc96989dd3c718c438a48a1c63e1aee6458a034 (diff) |
INTEGRATION: CWS xmlfilter02 (1.1.2); FILE ADDED
2007/10/05 13:49:02 os 1.1.2.3: static_int_cast used
2007/10/05 13:12:15 os 1.1.2.2: sal_Int8 cast fixed
2007/09/24 15:52:10 sj 1.1.2.1: initial version
Diffstat (limited to 'goodies')
-rw-r--r-- | goodies/source/unographic/transformer.cxx | 177 |
1 files changed, 177 insertions, 0 deletions
diff --git a/goodies/source/unographic/transformer.cxx b/goodies/source/unographic/transformer.cxx new file mode 100644 index 000000000000..854b1c3e0175 --- /dev/null +++ b/goodies/source/unographic/transformer.cxx @@ -0,0 +1,177 @@ +/************************************************************************* + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: transformer.cxx,v $ + * + * $Revision: 1.2 $ + * + * last change: $Author: obo $ $Date: 2008-01-10 13:23:05 $ + * + * The Contents of this file are made available subject to + * the terms of GNU Lesser General Public License Version 2.1. + * + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2005 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_goodies.hxx" + +#ifndef _RTL_UUID_H_ +#include <rtl/uuid.h> +#endif +#ifndef _VOS_MUTEX_HXX_ +#include <vos/mutex.hxx> +#endif +#ifndef _SV_SVAPP_HXX_ +#include <vcl/svapp.hxx> +#endif +#ifndef _SV_IMAGE_HXX_ +#include <vcl/image.hxx> +#endif +#ifndef _SV_METAACT_HXX +#include <vcl/metaact.hxx> +#endif +#include <tools/rcid.h> +#include <tools/resid.hxx> +#include <tools/resmgr.hxx> +#include <unotools/ucbstreamhelper.hxx> +#include <svtools/solar.hrc> +#include <vcl/salbtype.hxx> +#include <vcl/virdev.hxx> +#include <vcl/bmpacc.hxx> + +#ifndef _COM_SUN_STAR_TEXT_GRAPHICCROP_HPP_ +#include <com/sun/star/text/GraphicCrop.hpp> +#endif + +#include "graphic.hxx" +#include "transformer.hxx" + +using namespace com::sun::star; + +namespace unographic { + +// ---------------------- +// - GraphicTransformer - +// ---------------------- + +GraphicTransformer::GraphicTransformer() +{ +} + +// ------------------------------------------------------------------------------ + +GraphicTransformer::~GraphicTransformer() +{ +} + +// ------------------------------------------------------------------------------ + +void setAlpha( Bitmap& rBitmap, AlphaMask& rAlpha, sal_Int32 nColorFrom, sal_Int8 nAlphaTo ) +{ + BitmapWriteAccess* pWriteAccess = rAlpha.AcquireWriteAccess(); + BitmapReadAccess* pReadAccess = rBitmap.AcquireReadAccess(); + BitmapColor aColorFrom( static_cast< sal_uInt8 >( nColorFrom >> 16 ), + static_cast< sal_uInt8 >( nColorFrom >> 8 ), + static_cast< sal_uInt8 >( nColorFrom ) ); + if ( pReadAccess && pWriteAccess ) + { + for ( sal_Int32 nY = 0; nY < pReadAccess->Height(); nY++ ) + { + for ( sal_Int32 nX = 0; nX < pReadAccess->Width(); nX++ ) + { + BitmapColor aColor( pReadAccess->GetPixel( nY, nX ) ); + if ( aColor == aColorFrom ) + pWriteAccess->SetPixel( nY, nX, nAlphaTo ); + } + } + } + rBitmap.ReleaseAccess( pReadAccess ); + rAlpha.ReleaseAccess( pWriteAccess ); +} + +// XGraphicTransformer +uno::Reference< graphic::XGraphic > SAL_CALL GraphicTransformer::colorChange( + const uno::Reference< graphic::XGraphic >& rxGraphic, sal_Int32 nColorFrom, sal_Int8 nTolerance, sal_Int32 nColorTo, sal_Int8 nAlphaTo ) + throw ( lang::IllegalArgumentException, uno::RuntimeException) +{ + const uno::Reference< uno::XInterface > xIFace( rxGraphic, uno::UNO_QUERY ); + ::Graphic aGraphic( *::unographic::Graphic::getImplementation( xIFace ) ); + + BitmapColor aColorFrom( static_cast< sal_uInt8 >( nColorFrom ), static_cast< sal_uInt8 >( nColorFrom >> 16 ), static_cast< sal_uInt8 >( nColorFrom >> 24 ) ); + BitmapColor aColorTo( static_cast< sal_uInt8 >( nColorTo ), static_cast< sal_uInt8 >( nColorTo >> 16 ), static_cast< sal_uInt8 >( nColorTo >> 24 ) ); + + if ( aGraphic.GetType() == GRAPHIC_BITMAP ) + { + BitmapEx aBitmapEx( aGraphic.GetBitmapEx() ); + Bitmap aBitmap( aBitmapEx.GetBitmap() ); + + if ( aBitmapEx.IsAlpha() ) + { + AlphaMask aAlphaMask( aBitmapEx.GetAlpha() ); + setAlpha( aBitmap, aAlphaMask, aColorFrom, nAlphaTo ); + aBitmap.Replace( aColorFrom, aColorTo, nTolerance ); + aGraphic = ::Graphic( BitmapEx( aBitmap, aAlphaMask ) ); + } + else if ( aBitmapEx.IsTransparent() ) + { + if ( ( nAlphaTo == 0 ) || ( nAlphaTo == sal::static_int_cast<sal_Int8>(0xff) ) ) + { + Bitmap aMask( aBitmapEx.GetMask() ); + Bitmap aMask2( aBitmap.CreateMask( aColorFrom, nTolerance ) ); + aMask.CombineSimple( aMask2, BMP_COMBINE_OR ); + aBitmap.Replace( aColorFrom, aColorTo, nTolerance ); + aGraphic = ::Graphic( BitmapEx( aBitmap, aMask ) ); + } + else + { + AlphaMask aAlphaMask( aBitmapEx.GetMask() ); + setAlpha( aBitmap, aAlphaMask, aColorFrom, nAlphaTo ); + aBitmap.Replace( aColorFrom, aColorTo, nTolerance ); + aGraphic = ::Graphic( BitmapEx( aBitmap, aAlphaMask ) ); + } + } + else + { + if ( ( nAlphaTo == 0 ) || ( nAlphaTo == sal::static_int_cast<sal_Int8>(0xff) ) ) + { + Bitmap aMask( aBitmap.CreateMask( aColorFrom, nTolerance ) ); + aBitmap.Replace( aColorFrom, aColorTo, nTolerance ); + aGraphic = ::Graphic( BitmapEx( aBitmap, aMask ) ); + } + else + { + AlphaMask aAlphaMask( aBitmapEx.GetSizePixel() ); + setAlpha( aBitmap, aAlphaMask, aColorFrom, nAlphaTo ); + aBitmap.Replace( aColorFrom, aColorTo, nTolerance ); + aGraphic = ::Graphic( BitmapEx( aBitmap, aAlphaMask ) ); + } + } + } + ::unographic::Graphic* pUnoGraphic = new ::unographic::Graphic(); + pUnoGraphic->init( aGraphic ); + uno::Reference< graphic::XGraphic > xRet( pUnoGraphic ); + return xRet; +} + +} |