office-gobmx/svx/source/xoutdev/xattrbmp.cxx
2011-01-10 16:11:35 +01:00

894 lines
26 KiB
C++

/*************************************************************************
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* Copyright 2000, 2010 Oracle and/or its affiliates.
*
* OpenOffice.org - a multi-platform office productivity suite
*
* This file is part of OpenOffice.org.
*
* OpenOffice.org is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 3
* only, as published by the Free Software Foundation.
*
* OpenOffice.org 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 version 3 for more details
* (a copy is included in the LICENSE file that accompanied this code).
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenOffice.org. If not, see
* <http://www.openoffice.org/license.html>
* for a copy of the LGPLv3 License.
*
************************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_svx.hxx"
#include <com/sun/star/awt/XBitmap.hpp>
#include <com/sun/star/graphic/XGraphic.hpp>
#include <tools/stream.hxx>
#include <vcl/window.hxx>
#include <vcl/virdev.hxx>
#include <vcl/bitmapex.hxx>
#include <toolkit/unohlp.hxx>
#include <svl/style.hxx>
#include <editeng/memberids.hrc>
#include <svx/dialogs.hrc>
#include "svx/xattr.hxx"
#include <svx/xtable.hxx>
#include <svx/xdef.hxx>
#include <svx/unomid.hxx>
#include <editeng/unoprnms.hxx>
#include "svx/unoapi.hxx"
#include <svx/svdmodel.hxx>
#include <com/sun/star/beans/PropertyValue.hpp>
#define GLOBALOVERFLOW
using namespace ::com::sun::star;
// ---------------
// class XOBitmap
// ---------------
/*************************************************************************
|*
|* XOBitmap::XOBitmap()
|*
|* Beschreibung
|* Ersterstellung 27.07.95
|* Letzte Aenderung 27.07.95
|*
*************************************************************************/
XOBitmap::XOBitmap() :
eType ( XBITMAP_NONE ),
eStyle ( XBITMAP_STRETCH ),
pPixelArray ( NULL ),
bGraphicDirty ( sal_False )
{
}
/*************************************************************************
|*
|* XOBitmap::XOBitmap( Bitmap aBitmap, XBitmapStyle eStyle = XBITMAP_TILE )
|*
|* Beschreibung
|* Ersterstellung 26.07.95
|* Letzte Aenderung 26.07.95
|*
*************************************************************************/
XOBitmap::XOBitmap( const Bitmap& rBmp, XBitmapStyle eInStyle ) :
eType ( XBITMAP_IMPORT ),
eStyle ( eInStyle ),
aGraphicObject ( rBmp ),
pPixelArray ( NULL ),
bGraphicDirty ( sal_False )
{
}
/*************************************************************************
|*
|* XOBitmap::XOBitmap( Bitmap aBitmap, XBitmapStyle eStyle = XBITMAP_TILE )
|*
|* Beschreibung
|* Ersterstellung 26.07.95
|* Letzte Aenderung 26.07.95
|*
*************************************************************************/
XOBitmap::XOBitmap( const GraphicObject& rGraphicObject, XBitmapStyle eInStyle ) :
eType ( XBITMAP_IMPORT ),
eStyle ( eInStyle ),
aGraphicObject ( rGraphicObject ),
pPixelArray ( NULL ),
bGraphicDirty ( sal_False )
{
}
/*************************************************************************
|*
|* XOBitmap::XOBitmap( sal_uInt16* pArray, const Color& aPixelColor,
|* const Color& aBckgrColor, const Size& rSize = Size( 8, 8 ),
|* XBitmapStyle eStyle = XBITMAP_TILE )
|*
|* Beschreibung
|* Ersterstellung 26.07.95
|* Letzte Aenderung 26.07.95
|*
*************************************************************************/
XOBitmap::XOBitmap( const sal_uInt16* pArray, const Color& rPixelColor,
const Color& rBckgrColor, const Size& rSize,
XBitmapStyle eInStyle ) :
eStyle ( eInStyle ),
pPixelArray ( NULL ),
aArraySize ( rSize ),
aPixelColor ( rPixelColor ),
aBckgrColor ( rBckgrColor ),
bGraphicDirty ( sal_True )
{
if( aArraySize.Width() == 8 && aArraySize.Height() == 8 )
{
eType = XBITMAP_8X8;
pPixelArray = new sal_uInt16[ 64 ];
for( sal_uInt16 i = 0; i < 64; i++ )
*( pPixelArray + i ) = *( pArray + i );
}
else
{
DBG_ASSERT( 0, "Nicht unterstuetzte Bitmapgroesse" );
}
}
/*************************************************************************
|*
|* XOBitmap::XOBitmap( const XOBitmap& rXBmp )
|*
|* Beschreibung
|* Ersterstellung 27.07.95
|* Letzte Aenderung 27.07.95
|*
*************************************************************************/
XOBitmap::XOBitmap( const XOBitmap& rXBmp ) :
pPixelArray ( NULL )
{
eType = rXBmp.eType;
eStyle = rXBmp.eStyle;
aGraphicObject = rXBmp.aGraphicObject;
aArraySize = rXBmp.aArraySize;
aPixelColor = rXBmp.aPixelColor;
aBckgrColor = rXBmp.aBckgrColor;
bGraphicDirty = rXBmp.bGraphicDirty;
if( rXBmp.pPixelArray )
{
if( eType == XBITMAP_8X8 )
{
pPixelArray = new sal_uInt16[ 64 ];
for( sal_uInt16 i = 0; i < 64; i++ )
*( pPixelArray + i ) = *( rXBmp.pPixelArray + i );
}
}
}
/*************************************************************************
|*
|* XOBitmap::XOBitmap( Bitmap aBitmap, XBitmapStyle eStyle = XBITMAP_TILE )
|*
|* Beschreibung
|* Ersterstellung 26.07.95
|* Letzte Aenderung 26.07.95
|*
*************************************************************************/
XOBitmap::~XOBitmap()
{
if( pPixelArray )
delete []pPixelArray;
}
/*************************************************************************
|*
|* XOBitmap& XOBitmap::operator=( const XOBitmap& rXBmp )
|*
|* Beschreibung
|* Ersterstellung 27.07.95
|* Letzte Aenderung 27.07.95
|*
*************************************************************************/
XOBitmap& XOBitmap::operator=( const XOBitmap& rXBmp )
{
eType = rXBmp.eType;
eStyle = rXBmp.eStyle;
aGraphicObject = rXBmp.aGraphicObject;
aArraySize = rXBmp.aArraySize;
aPixelColor = rXBmp.aPixelColor;
aBckgrColor = rXBmp.aBckgrColor;
bGraphicDirty = rXBmp.bGraphicDirty;
if( rXBmp.pPixelArray )
{
if( eType == XBITMAP_8X8 )
{
pPixelArray = new sal_uInt16[ 64 ];
for( sal_uInt16 i = 0; i < 64; i++ )
*( pPixelArray + i ) = *( rXBmp.pPixelArray + i );
}
}
return( *this );
}
/*************************************************************************
|*
|* int XOBitmap::operator==( const XOBitmap& rXOBitmap ) const
|*
|* Beschreibung
|* Ersterstellung 26.07.95
|* Letzte Aenderung 26.07.95
|*
*************************************************************************/
int XOBitmap::operator==( const XOBitmap& rXOBitmap ) const
{
if( eType != rXOBitmap.eType ||
eStyle != rXOBitmap.eStyle ||
aGraphicObject != rXOBitmap.aGraphicObject ||
aArraySize != rXOBitmap.aArraySize ||
aPixelColor != rXOBitmap.aPixelColor ||
aBckgrColor != rXOBitmap.aBckgrColor ||
bGraphicDirty != rXOBitmap.bGraphicDirty )
{
return( sal_False );
}
if( pPixelArray && rXOBitmap.pPixelArray )
{
sal_uInt16 nCount = (sal_uInt16) ( aArraySize.Width() * aArraySize.Height() );
for( sal_uInt16 i = 0; i < nCount; i++ )
{
if( *( pPixelArray + i ) != *( rXOBitmap.pPixelArray + i ) )
return( sal_False );
}
}
return( sal_True );
}
/*************************************************************************
|*
|* void SetPixelArray( const sal_uInt16* pArray )
|*
|* Beschreibung
|* Ersterstellung 27.07.95
|* Letzte Aenderung 27.07.95
|*
*************************************************************************/
void XOBitmap::SetPixelArray( const sal_uInt16* pArray )
{
if( eType == XBITMAP_8X8 )
{
if( pPixelArray )
delete []pPixelArray;
pPixelArray = new sal_uInt16[ 64 ];
for( sal_uInt16 i = 0; i < 64; i++ )
*( pPixelArray + i ) = *( pArray + i );
bGraphicDirty = sal_True;
}
else
{
DBG_ASSERT( 0, "Nicht unterstuetzter Bitmaptyp" );
}
}
/*************************************************************************
|*
|* Bitmap XOBitmap::GetBitmap()
|*
|* Beschreibung
|* Ersterstellung 26.07.95
|* Letzte Aenderung 26.07.95
|*
*************************************************************************/
Bitmap XOBitmap::GetBitmap() const
{
return GetGraphicObject().GetGraphic().GetBitmap();
}
/*************************************************************************
|*
|* Bitmap XOBitmap::GetGraphicObject()
|*
|* Beschreibung
|* Ersterstellung
|* Letzte Aenderung
|*
*************************************************************************/
const GraphicObject& XOBitmap::GetGraphicObject() const
{
if( bGraphicDirty )
( (XOBitmap*) this )->Array2Bitmap();
return aGraphicObject;
}
/*************************************************************************
|*
|* void XOBitmap::Bitmap2Array()
|*
|* Beschreibung Umwandlung der Bitmap in Array, Hinter- u.
|* Vordergrundfarbe
|* Ersterstellung 27.07.95
|* Letzte Aenderung 27.07.95
|*
*************************************************************************/
void XOBitmap::Bitmap2Array()
{
VirtualDevice aVD;
sal_Bool bPixelColor = sal_False;
const Bitmap aBitmap( GetBitmap() );
const sal_uInt16 nLines = 8; // von Type abhaengig
if( !pPixelArray )
pPixelArray = new sal_uInt16[ nLines * nLines ];
aVD.SetOutputSizePixel( aBitmap.GetSizePixel() );
aVD.DrawBitmap( Point(), aBitmap );
aPixelColor = aBckgrColor = aVD.GetPixel( Point() );
// Aufbau des Arrays und Ermittlung der Vorder-, bzw.
// Hintergrundfarbe
for( sal_uInt16 i = 0; i < nLines; i++ )
{
for( sal_uInt16 j = 0; j < nLines; j++ )
{
if ( aVD.GetPixel( Point( j, i ) ) == aBckgrColor )
*( pPixelArray + j + i * nLines ) = 0;
else
{
*( pPixelArray + j + i * nLines ) = 1;
if( !bPixelColor )
{
aPixelColor = aVD.GetPixel( Point( j, i ) );
bPixelColor = sal_True;
}
}
}
}
}
/*************************************************************************
|*
|* void XOBitmap::Array2Bitmap()
|*
|* Beschreibung Umwandlung des Arrays, Hinter- u.
|* Vordergrundfarbe in eine Bitmap
|* Ersterstellung 27.07.95
|* Letzte Aenderung 27.07.95
|*
*************************************************************************/
void XOBitmap::Array2Bitmap()
{
VirtualDevice aVD;
sal_uInt16 nLines = 8; // von Type abhaengig
if( !pPixelArray )
return;
aVD.SetOutputSizePixel( Size( nLines, nLines ) );
// Aufbau der Bitmap
for( sal_uInt16 i = 0; i < nLines; i++ )
{
for( sal_uInt16 j = 0; j < nLines; j++ )
{
if( *( pPixelArray + j + i * nLines ) == 0 )
aVD.DrawPixel( Point( j, i ), aBckgrColor );
else
aVD.DrawPixel( Point( j, i ), aPixelColor );
}
}
aGraphicObject = GraphicObject( aVD.GetBitmap( Point(), Size( nLines, nLines ) ) );
bGraphicDirty = sal_False;
}
// -----------------------
// class XFillBitmapItem
// -----------------------
TYPEINIT1_AUTOFACTORY(XFillBitmapItem, NameOrIndex);
/*************************************************************************
|*
|* XFillBitmapItem::XFillBitmapItem(long nIndex,
|* const Bitmap& rTheBitmap)
|*
|* Beschreibung
|* Ersterstellung 17.11.94
|* Letzte Aenderung 17.11.94
|*
*************************************************************************/
XFillBitmapItem::XFillBitmapItem(long nIndex,
const XOBitmap& rTheBitmap) :
NameOrIndex( XATTR_FILLBITMAP, nIndex ),
aXOBitmap( rTheBitmap )
{
}
/*************************************************************************
|*
|* XFillBitmapItem::XFillBitmapItem(const XubString& rName,
|* const Bitmap& rTheBitmap)
|*
|* Beschreibung
|* Ersterstellung 17.11.94
|* Letzte Aenderung 17.11.94
|*
*************************************************************************/
XFillBitmapItem::XFillBitmapItem(const XubString& rName,
const XOBitmap& rTheBitmap) :
NameOrIndex( XATTR_FILLBITMAP, rName ),
aXOBitmap( rTheBitmap )
{
}
/*************************************************************************
|*
|* XFillBitmapItem::XFillBitmapItem(const XFillBitmapItem& rItem)
|*
|* Beschreibung
|* Ersterstellung 17.11.94
|* Letzte Aenderung 17.11.94
|*
*************************************************************************/
XFillBitmapItem::XFillBitmapItem(const XFillBitmapItem& rItem) :
NameOrIndex( rItem ),
aXOBitmap( rItem.aXOBitmap )
{
}
/*************************************************************************
|*
|* XFillBitmapItem::XFillBitmapItem(SvStream& rIn)
|*
|* Beschreibung
|* Ersterstellung 17.11.94
|* Letzte Aenderung 26.07.94
|*
*************************************************************************/
XFillBitmapItem::XFillBitmapItem( SvStream& rIn, sal_uInt16 nVer ) :
NameOrIndex( XATTR_FILLBITMAP, rIn )
{
if( nVer == 0 )
{
if (!IsIndex())
{
// Behandlung der alten Bitmaps
Bitmap aBmp;
rIn >> aBmp;
aXOBitmap.SetBitmap( aBmp );
aXOBitmap.SetBitmapStyle( XBITMAP_TILE );
if( aBmp.GetSizePixel().Width() == 8 &&
aBmp.GetSizePixel().Height() == 8 )
{
aXOBitmap.SetBitmapType( XBITMAP_8X8 );
aXOBitmap.Bitmap2Array();
}
else
aXOBitmap.SetBitmapType( XBITMAP_IMPORT );
}
}
else if( nVer == 1 )
{
if (!IsIndex())
{
sal_Int16 iTmp;
rIn >> iTmp;
aXOBitmap.SetBitmapStyle( (XBitmapStyle) iTmp );
rIn >> iTmp;
aXOBitmap.SetBitmapType( (XBitmapType) iTmp );
if( aXOBitmap.GetBitmapType() == XBITMAP_IMPORT )
{
Bitmap aBmp;
rIn >> aBmp;
aXOBitmap.SetBitmap( aBmp );
}
else if( aXOBitmap.GetBitmapType() == XBITMAP_8X8 )
{
sal_uInt16* pArray = new sal_uInt16[ 64 ];
Color aColor;
for( sal_uInt16 i = 0; i < 64; i++ )
rIn >> *( pArray + i );
aXOBitmap.SetPixelArray( pArray );
rIn >> aColor;
aXOBitmap.SetPixelColor( aColor );
rIn >> aColor;
aXOBitmap.SetBackgroundColor( aColor );
delete []pArray;
}
}
}
// #81908# force bitmap to exist
aXOBitmap.GetBitmap();
}
//*************************************************************************
XFillBitmapItem::XFillBitmapItem( SfxItemPool* /*pPool*/, const XOBitmap& rTheBitmap )
: NameOrIndex( XATTR_FILLBITMAP, -1 ),
aXOBitmap( rTheBitmap )
{
}
//*************************************************************************
XFillBitmapItem::XFillBitmapItem( SfxItemPool* /*pPool*/)
: NameOrIndex(XATTR_FILLBITMAP, -1 )
{
}
/*************************************************************************
|*
|* XFillBitmapItem::Clone(SfxItemPool* pPool) const
|*
|* Beschreibung
|* Ersterstellung 17.11.94
|* Letzte Aenderung 17.11.94
|*
*************************************************************************/
SfxPoolItem* XFillBitmapItem::Clone(SfxItemPool* /*pPool*/) const
{
return new XFillBitmapItem(*this);
}
/*************************************************************************
|*
|* int XFillBitmapItem::operator==(const SfxPoolItem& rItem) const
|*
|* Beschreibung
|* Ersterstellung 17.11.94
|* Letzte Aenderung 26.07.95
|*
*************************************************************************/
int XFillBitmapItem::operator==(const SfxPoolItem& rItem) const
{
return ( NameOrIndex::operator==(rItem) &&
aXOBitmap == ((const XFillBitmapItem&) rItem).aXOBitmap );
}
/*************************************************************************
|*
|* SfxPoolItem* XFillBitmapItem::Create(SvStream& rIn, sal_uInt16 nVer) const
|*
|* Beschreibung
|* Ersterstellung 17.11.94
|* Letzte Aenderung 17.11.94
|*
*************************************************************************/
SfxPoolItem* XFillBitmapItem::Create(SvStream& rIn, sal_uInt16 nVer) const
{
return new XFillBitmapItem( rIn, nVer );
}
/*************************************************************************
|*
|* SfxPoolItem* XFillBitmapItem::Store(SvStream& rOut) const
|*
|* Beschreibung
|* Ersterstellung 17.11.94
|* Letzte Aenderung 26.07.94
|*
*************************************************************************/
SvStream& XFillBitmapItem::Store( SvStream& rOut, sal_uInt16 nItemVersion ) const
{
NameOrIndex::Store( rOut, nItemVersion );
if (!IsIndex())
{
rOut << (sal_Int16) aXOBitmap.GetBitmapStyle();
if( !aXOBitmap.GetBitmap() )
rOut << (sal_Int16) XBITMAP_NONE;
else
{
rOut << (sal_Int16) aXOBitmap.GetBitmapType();
if( aXOBitmap.GetBitmapType() == XBITMAP_IMPORT )
{
const sal_uInt16 nOldComprMode = rOut.GetCompressMode();
sal_uInt16 nNewComprMode = nOldComprMode;
if( rOut.GetVersion() >= SOFFICE_FILEFORMAT_50 )
nNewComprMode |= COMPRESSMODE_ZBITMAP;
else
nNewComprMode &= ~COMPRESSMODE_ZBITMAP;
rOut.SetCompressMode( nNewComprMode );
rOut << aXOBitmap.GetBitmap();
rOut.SetCompressMode( nOldComprMode );
}
else if( aXOBitmap.GetBitmapType() == XBITMAP_8X8 )
{
sal_uInt16* pArray = aXOBitmap.GetPixelArray();
for( sal_uInt16 i = 0; i < 64; i++ )
rOut << (sal_uInt16) *( pArray + i );
rOut << aXOBitmap.GetPixelColor();
rOut << aXOBitmap.GetBackgroundColor();
}
}
}
return rOut;
}
/*************************************************************************
|*
|* const Bitmap& XFillBitmapItem::GetValue(const XBitmapTable* pTable) const
|*
|* Beschreibung
|* Ersterstellung 15.11.94
|* Letzte Aenderung 26.07.94
|*
*************************************************************************/
const XOBitmap& XFillBitmapItem::GetBitmapValue(const XBitmapTable* pTable) const // GetValue -> GetBitmapValue
{
if (!IsIndex())
return aXOBitmap;
else
return pTable->GetBitmap(GetIndex())->GetXBitmap();
}
/*************************************************************************
|*
|* sal_uInt16 XFillBitmapItem::GetVersion() const
|*
|* Beschreibung
|* Ersterstellung 26.07.95
|* Letzte Aenderung 26.07.95
|*
*************************************************************************/
sal_uInt16 XFillBitmapItem::GetVersion( sal_uInt16 /*nFileFormatVersion*/) const
{
// 2. Version
return( 1 );
}
//------------------------------------------------------------------------
SfxItemPresentation XFillBitmapItem::GetPresentation
(
SfxItemPresentation ePres,
SfxMapUnit /*eCoreUnit*/,
SfxMapUnit /*ePresUnit*/,
XubString& rText, const IntlWrapper *
) const
{
switch ( ePres )
{
case SFX_ITEM_PRESENTATION_NONE:
rText.Erase();
return ePres;
case SFX_ITEM_PRESENTATION_NAMELESS:
case SFX_ITEM_PRESENTATION_COMPLETE:
rText += GetName();
return ePres;
default:
return SFX_ITEM_PRESENTATION_NONE;
}
}
//------------------------------------------------------------------------
sal_Bool XFillBitmapItem::QueryValue( ::com::sun::star::uno::Any& rVal, sal_uInt8 nMemberId ) const
{
// sal_Bool bConvert = 0!=(nMemberId&CONVERT_TWIPS);
nMemberId &= ~CONVERT_TWIPS;
// needed for MID_NAME
::rtl::OUString aApiName;
// needed for complete item (MID 0)
::rtl::OUString aInternalName;
::rtl::OUString aURL;
::com::sun::star::uno::Reference< ::com::sun::star::awt::XBitmap > xBmp;
if( nMemberId == MID_NAME )
{
SvxUnogetApiNameForItem( Which(), GetName(), aApiName );
}
else if( nMemberId == 0 )
{
aInternalName = GetName();
}
if( nMemberId == MID_GRAFURL ||
nMemberId == 0 )
{
XOBitmap aLocalXOBitmap( GetBitmapValue() );
aURL = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(UNO_NAME_GRAPHOBJ_URLPREFIX));
aURL += ::rtl::OUString::createFromAscii( aLocalXOBitmap.GetGraphicObject().GetUniqueID().GetBuffer() );
}
if( nMemberId == MID_BITMAP ||
nMemberId == 0 )
{
XOBitmap aLocalXOBitmap( GetBitmapValue() );
Bitmap aBmp( aLocalXOBitmap.GetBitmap() );
BitmapEx aBmpEx( aBmp );
xBmp.set( VCLUnoHelper::CreateBitmap( aBmpEx ) );
}
if( nMemberId == MID_NAME )
rVal <<= aApiName;
else if( nMemberId == MID_GRAFURL )
rVal <<= aURL;
else if( nMemberId == MID_BITMAP )
rVal <<= xBmp;
else
{
// member-id 0 => complete item (e.g. for toolbars)
DBG_ASSERT( nMemberId == 0, "invalid member-id" );
uno::Sequence< beans::PropertyValue > aPropSeq( 3 );
aPropSeq[0].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Name" ));
aPropSeq[0].Value = uno::makeAny( aInternalName );
aPropSeq[1].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "FillBitmapURL" ));
aPropSeq[1].Value = uno::makeAny( aURL );
aPropSeq[2].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Bitmap" ));
aPropSeq[2].Value = uno::makeAny( xBmp );
rVal <<= aPropSeq;
}
return sal_True;
}
//------------------------------------------------------------------------
sal_Bool XFillBitmapItem::PutValue( const ::com::sun::star::uno::Any& rVal, sal_uInt8 nMemberId )
{
// sal_Bool bConvert = 0!=(nMemberId&CONVERT_TWIPS);
nMemberId &= ~CONVERT_TWIPS;
::rtl::OUString aName;
::rtl::OUString aURL;
::com::sun::star::uno::Reference< ::com::sun::star::awt::XBitmap > xBmp;
::com::sun::star::uno::Reference< ::com::sun::star::graphic::XGraphic > xGraphic;
bool bSetName = false;
bool bSetURL = false;
bool bSetBitmap = false;
if( nMemberId == MID_NAME )
bSetName = (rVal >>= aName);
else if( nMemberId == MID_GRAFURL )
bSetURL = (rVal >>= aURL);
else if( nMemberId == MID_BITMAP )
{
bSetBitmap = (rVal >>= xBmp);
if ( !bSetBitmap )
bSetBitmap = (rVal >>= xGraphic );
}
else
{
DBG_ASSERT( nMemberId == 0, "invalid member-id" );
uno::Sequence< beans::PropertyValue > aPropSeq;
if( rVal >>= aPropSeq )
{
for ( sal_Int32 n = 0; n < aPropSeq.getLength(); n++ )
{
if( aPropSeq[n].Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "Name" )))
bSetName = (aPropSeq[n].Value >>= aName);
else if( aPropSeq[n].Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "FillBitmapURL" )))
bSetURL = (aPropSeq[n].Value >>= aURL);
else if( aPropSeq[n].Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "Bitmap" )))
bSetBitmap = (aPropSeq[n].Value >>= xBmp);
}
}
}
if( bSetName )
{
SetName( aName );
}
if( bSetURL )
{
GraphicObject aGrafObj( GraphicObject::CreateGraphicObjectFromURL( aURL ) );
XOBitmap aBMP( aGrafObj );
SetBitmapValue( aBMP );
}
if( bSetBitmap )
{
Bitmap aInput;
if ( xBmp.is() )
{
BitmapEx aInputEx( VCLUnoHelper::GetBitmap( xBmp ) );
aInput = aInputEx.GetBitmap();
}
else if ( xGraphic.is() )
{
Graphic aGraphic( xGraphic );
aInput = aGraphic.GetBitmap();
}
// note: aXOBitmap is the member bitmap
aXOBitmap.SetBitmap( aInput );
aXOBitmap.SetBitmapType(XBITMAP_IMPORT);
if(aInput.GetSizePixel().Width() == 8
&& aInput.GetSizePixel().Height() == 8
&& aInput.GetColorCount() == 2)
{
aXOBitmap.Bitmap2Array();
aXOBitmap.SetBitmapType(XBITMAP_8X8);
aXOBitmap.SetPixelSize(aInput.GetSizePixel());
}
}
return (bSetName || bSetURL || bSetBitmap);
}
sal_Bool XFillBitmapItem::CompareValueFunc( const NameOrIndex* p1, const NameOrIndex* p2 )
{
return ((XFillBitmapItem*)p1)->GetBitmapValue().GetGraphicObject().GetUniqueID() ==
((XFillBitmapItem*)p2)->GetBitmapValue().GetGraphicObject().GetUniqueID();
}
XFillBitmapItem* XFillBitmapItem::checkForUniqueItem( SdrModel* pModel ) const
{
if( pModel )
{
const String aUniqueName = NameOrIndex::CheckNamedItem( this,
XATTR_FILLBITMAP,
&pModel->GetItemPool(),
pModel->GetStyleSheetPool() ? &pModel->GetStyleSheetPool()->GetPool() : NULL,
XFillBitmapItem::CompareValueFunc,
RID_SVXSTR_BMP21,
pModel->GetBitmapList() );
// if the given name is not valid, replace it!
if( aUniqueName != GetName() )
{
return new XFillBitmapItem( aUniqueName, aXOBitmap );
}
}
return (XFillBitmapItem*)this;
}