summaryrefslogtreecommitdiff
path: root/vcl/source/gdi/rendergraphic.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'vcl/source/gdi/rendergraphic.cxx')
-rw-r--r--vcl/source/gdi/rendergraphic.cxx240
1 files changed, 240 insertions, 0 deletions
diff --git a/vcl/source/gdi/rendergraphic.cxx b/vcl/source/gdi/rendergraphic.cxx
new file mode 100644
index 000000000000..10b6064cc57c
--- /dev/null
+++ b/vcl/source/gdi/rendergraphic.cxx
@@ -0,0 +1,240 @@
+/*************************************************************************
+ *
+ * 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.
+ *
+ ************************************************************************/
+
+#include <vcl/rendergraphic.hxx>
+#include <vcl/rendergraphicrasterizer.hxx>
+#include <vcl/mapmod.hxx>
+#include <tools/stream.hxx>
+#include <tools/vcompat.hxx>
+
+#include <cstring>
+#include <cstdio>
+
+namespace vcl
+{
+
+// -----------------
+// - RenderGraphic -
+// -----------------
+RenderGraphic::RenderGraphic( ) :
+ mnGraphicDataLength( 0 )
+{
+}
+
+// -------------------------------------------------------------------------
+
+RenderGraphic::RenderGraphic( const RenderGraphic& rRenderGraphic ) :
+ maGraphicData( rRenderGraphic.maGraphicData ),
+ mnGraphicDataLength( rRenderGraphic.mnGraphicDataLength ),
+ maGraphicDataMimeType( rRenderGraphic.maGraphicDataMimeType ),
+ mapPrefMapMode( rRenderGraphic.mapPrefMapMode.get() ? new MapMode( *rRenderGraphic.mapPrefMapMode ) : NULL ),
+ mapPrefSize( rRenderGraphic.mapPrefSize.get() ? new Size( *rRenderGraphic.mapPrefSize ) : NULL )
+{
+}
+
+// -------------------------------------------------------------------------
+
+RenderGraphic::RenderGraphic( const GraphicData& rGraphicData,
+ sal_uInt32 nGraphicDataLength,
+ const rtl::OUString& rGraphicDataMimeType ) :
+ maGraphicData( rGraphicData ),
+ mnGraphicDataLength( nGraphicDataLength ),
+ maGraphicDataMimeType( rGraphicDataMimeType )
+{
+ ImplCheckData( );
+}
+
+// -------------------------------------------------------------------------
+
+RenderGraphic::RenderGraphic( const rtl::OUString& rGraphicDataMimeType,
+ sal_uInt32 nGraphicDataLength,
+ const sal_uInt8* pGraphicData ) :
+ maGraphicData(),
+ mnGraphicDataLength( nGraphicDataLength ),
+ maGraphicDataMimeType( rGraphicDataMimeType )
+{
+ if( rGraphicDataMimeType.getLength( ) && nGraphicDataLength )
+ {
+ maGraphicData.reset( new sal_uInt8[ nGraphicDataLength ] );
+
+ if( pGraphicData )
+ {
+ memcpy( maGraphicData.get(), pGraphicData, nGraphicDataLength );
+ }
+ }
+ else
+ {
+ ImplCheckData( );
+ }
+}
+
+// -------------------------------------------------------------------------
+
+RenderGraphic::~RenderGraphic( )
+{
+}
+
+// -------------------------------------------------------------------------
+
+RenderGraphic& RenderGraphic::operator=(const RenderGraphic& rRenderGraphic )
+{
+ maGraphicData = rRenderGraphic.maGraphicData;
+ mnGraphicDataLength = rRenderGraphic.mnGraphicDataLength;
+ maGraphicDataMimeType = rRenderGraphic.maGraphicDataMimeType;
+ mapPrefMapMode.reset( rRenderGraphic.mapPrefMapMode.get() ? new MapMode( *rRenderGraphic.mapPrefMapMode ) : NULL );
+ mapPrefSize.reset( rRenderGraphic.mapPrefSize.get() ? new Size( *rRenderGraphic.mapPrefSize ) : NULL );
+
+ return( *this );
+}
+
+// -------------------------------------------------------------------------
+
+bool RenderGraphic::operator==(const RenderGraphic& rRenderGraphic ) const
+{
+ return( ( rRenderGraphic.mnGraphicDataLength == mnGraphicDataLength ) &&
+ ( rRenderGraphic.maGraphicData == maGraphicData ) &&
+ ( rRenderGraphic.maGraphicDataMimeType.equalsIgnoreAsciiCase( maGraphicDataMimeType ) ) );
+}
+
+// -------------------------------------------------------------------------
+
+bool RenderGraphic::operator!() const
+{
+ return( ( 0 == maGraphicDataMimeType.getLength( ) ) ||
+ ( 0 == mnGraphicDataLength ) ||
+ !maGraphicData.get( ) );
+}
+
+// -------------------------------------------------------------------------
+
+bool RenderGraphic::IsEqual( const RenderGraphic& rRenderGraphic ) const
+{
+ bool bRet = ( rRenderGraphic.mnGraphicDataLength == mnGraphicDataLength ) &&
+ ( rRenderGraphic.maGraphicDataMimeType.equalsIgnoreAsciiCase( maGraphicDataMimeType ) );
+
+ if( bRet && mnGraphicDataLength && ( rRenderGraphic.maGraphicData != maGraphicData ) )
+ {
+ bRet = ( 0 == memcmp( rRenderGraphic.maGraphicData.get( ),
+ maGraphicData.get( ),
+ mnGraphicDataLength ) );
+ }
+
+ return( bRet );
+}
+
+// -------------------------------------------------------------------------
+
+const MapMode& RenderGraphic::GetPrefMapMode() const
+{
+ ImplGetDefaults();
+ return( *mapPrefMapMode );
+}
+
+// -------------------------------------------------------------------------
+
+const Size& RenderGraphic::GetPrefSize() const
+{
+ ImplGetDefaults();
+ return( *mapPrefSize );
+}
+
+// -------------------------------------------------------------------------
+
+BitmapEx RenderGraphic::GetReplacement() const
+{
+ const RenderGraphicRasterizer aRasterizer( *this );
+
+ return( aRasterizer.GetReplacement() );
+}
+
+// -------------------------------------------------------------------------
+
+void RenderGraphic::ImplCheckData( )
+{
+ if( !( *this ) )
+ {
+ maGraphicData.reset( );
+ mnGraphicDataLength = 0;
+ maGraphicDataMimeType = ::rtl::OUString();
+ mapPrefMapMode.reset();
+ mapPrefSize.reset();
+ }
+}
+
+// -------------------------------------------------------------------------
+
+void RenderGraphic::ImplGetDefaults() const
+{
+ if( !mapPrefMapMode.get() || !mapPrefSize.get() )
+ {
+ const RenderGraphicRasterizer aRasterizer( *this );
+
+ mapPrefMapMode.reset( new MapMode( aRasterizer.GetPrefMapMode() ) );
+ mapPrefSize.reset( new Size( aRasterizer.GetPrefSize() ) );
+ }
+}
+
+// -------------------------------------------------------------------------
+
+::SvStream& operator>>( ::SvStream& rIStm, RenderGraphic& rRenderGraphic )
+{
+ ::VersionCompat aVCompat( rIStm, STREAM_READ );
+ String aGraphicDataMimeType;
+ sal_uInt32 nGraphicDataLength = 0;
+
+ rIStm.ReadByteString( aGraphicDataMimeType, RTL_TEXTENCODING_ASCII_US );
+ rIStm >> nGraphicDataLength;
+
+ rRenderGraphic = RenderGraphic( aGraphicDataMimeType, nGraphicDataLength );
+
+ if( !rRenderGraphic.IsEmpty() )
+ {
+ rIStm.Read( rRenderGraphic.GetGraphicData().get(), nGraphicDataLength );
+ }
+
+ return rIStm;
+}
+
+// ------------------------------------------------------------------
+
+::SvStream& operator<<( ::SvStream& rOStm, const RenderGraphic& rRenderGraphic )
+{
+ ::VersionCompat aVCompat( rOStm, STREAM_WRITE, 1 );
+ const sal_uInt32 nGraphicDataLength = rRenderGraphic.GetGraphicDataLength();
+
+ rOStm.WriteByteString( rRenderGraphic.GetGraphicDataMimeType(), RTL_TEXTENCODING_ASCII_US );
+ rOStm << nGraphicDataLength;
+
+ if( nGraphicDataLength )
+ {
+ rOStm.Write( rRenderGraphic.GetGraphicData().get(), nGraphicDataLength );
+ }
+
+ return rOStm;
+}
+
+} // VCL