summaryrefslogtreecommitdiff
path: root/cppcanvas/source/wrapper/vclfactory.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'cppcanvas/source/wrapper/vclfactory.cxx')
-rw-r--r--cppcanvas/source/wrapper/vclfactory.cxx363
1 files changed, 363 insertions, 0 deletions
diff --git a/cppcanvas/source/wrapper/vclfactory.cxx b/cppcanvas/source/wrapper/vclfactory.cxx
new file mode 100644
index 000000000000..7983f081b2a9
--- /dev/null
+++ b/cppcanvas/source/wrapper/vclfactory.cxx
@@ -0,0 +1,363 @@
+/*************************************************************************
+ *
+ * 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_cppcanvas.hxx"
+#include <rtl/instance.hxx>
+#include <osl/getglobalmutex.hxx>
+#include <osl/diagnose.h>
+#include <com/sun/star/rendering/InterpolationMode.hpp>
+#include <vcl/window.hxx>
+#include <vcl/graph.hxx>
+#include <vcl/canvastools.hxx>
+#include <basegfx/polygon/b2dpolypolygon.hxx>
+
+#include <cppcanvas/vclfactory.hxx>
+
+#include <implbitmapcanvas.hxx>
+#include <implspritecanvas.hxx>
+#include <implpolypolygon.hxx>
+#include <implbitmap.hxx>
+#include <implrenderer.hxx>
+#include <impltext.hxx>
+#include <implsprite.hxx>
+
+
+using namespace ::com::sun::star;
+
+namespace cppcanvas
+{
+ /* Singleton handling */
+ struct InitInstance
+ {
+ VCLFactory* operator()()
+ {
+ return new VCLFactory();
+ }
+ };
+
+ VCLFactory& VCLFactory::getInstance()
+ {
+ return *rtl_Instance< VCLFactory, InitInstance, ::osl::MutexGuard,
+ ::osl::GetGlobalMutex >::create(
+ InitInstance(), ::osl::GetGlobalMutex());
+ }
+
+ VCLFactory::VCLFactory()
+ {
+ }
+
+ VCLFactory::~VCLFactory()
+ {
+ }
+
+ BitmapCanvasSharedPtr VCLFactory::createCanvas( const ::Window& rVCLWindow )
+ {
+ return BitmapCanvasSharedPtr(
+ new internal::ImplBitmapCanvas(
+ uno::Reference< rendering::XBitmapCanvas >(
+ rVCLWindow.GetCanvas(),
+ uno::UNO_QUERY) ) );
+ }
+
+ BitmapCanvasSharedPtr VCLFactory::createCanvas( const uno::Reference< rendering::XBitmapCanvas >& xCanvas )
+ {
+ return BitmapCanvasSharedPtr(
+ new internal::ImplBitmapCanvas( xCanvas ) );
+ }
+
+ SpriteCanvasSharedPtr VCLFactory::createSpriteCanvas( const ::Window& rVCLWindow ) const
+ {
+ return SpriteCanvasSharedPtr(
+ new internal::ImplSpriteCanvas(
+ uno::Reference< rendering::XSpriteCanvas >(
+ rVCLWindow.GetSpriteCanvas(),
+ uno::UNO_QUERY) ) );
+ }
+
+ SpriteCanvasSharedPtr VCLFactory::createSpriteCanvas( const uno::Reference< rendering::XSpriteCanvas >& xCanvas ) const
+ {
+ return SpriteCanvasSharedPtr(
+ new internal::ImplSpriteCanvas( xCanvas ) );
+ }
+
+ SpriteCanvasSharedPtr VCLFactory::createFullscreenSpriteCanvas( const ::Window& rVCLWindow,
+ const Size& rFullscreenSize ) const
+ {
+ return SpriteCanvasSharedPtr(
+ new internal::ImplSpriteCanvas(
+ uno::Reference< rendering::XSpriteCanvas >(
+ rVCLWindow.GetFullscreenSpriteCanvas( rFullscreenSize ),
+ uno::UNO_QUERY) ) );
+ }
+
+ PolyPolygonSharedPtr VCLFactory::createPolyPolygon( const CanvasSharedPtr& rCanvas,
+ const ::Polygon& rPoly ) const
+ {
+ OSL_ENSURE( rCanvas.get() != NULL &&
+ rCanvas->getUNOCanvas().is(),
+ "VCLFactory::createPolyPolygon(): Invalid canvas" );
+
+ if( rCanvas.get() == NULL )
+ return PolyPolygonSharedPtr();
+
+ uno::Reference< rendering::XCanvas > xCanvas( rCanvas->getUNOCanvas() );
+ if( !xCanvas.is() )
+ return PolyPolygonSharedPtr();
+
+ return PolyPolygonSharedPtr(
+ new internal::ImplPolyPolygon( rCanvas,
+ ::vcl::unotools::xPolyPolygonFromPolygon(
+ xCanvas->getDevice(),
+ rPoly) ) );
+ }
+
+ PolyPolygonSharedPtr VCLFactory::createPolyPolygon( const CanvasSharedPtr& rCanvas,
+ const ::PolyPolygon& rPolyPoly ) const
+ {
+ OSL_ENSURE( rCanvas.get() != NULL &&
+ rCanvas->getUNOCanvas().is(),
+ "VCLFactory::createPolyPolygon(): Invalid canvas" );
+
+ if( rCanvas.get() == NULL )
+ return PolyPolygonSharedPtr();
+
+ uno::Reference< rendering::XCanvas > xCanvas( rCanvas->getUNOCanvas() );
+ if( !xCanvas.is() )
+ return PolyPolygonSharedPtr();
+
+ return PolyPolygonSharedPtr(
+ new internal::ImplPolyPolygon( rCanvas,
+ ::vcl::unotools::xPolyPolygonFromPolyPolygon(
+ xCanvas->getDevice(),
+ rPolyPoly) ) );
+ }
+
+ BitmapSharedPtr VCLFactory::createBitmap( const CanvasSharedPtr& rCanvas,
+ const ::Size& rSize ) const
+ {
+ OSL_ENSURE( rCanvas.get() != NULL &&
+ rCanvas->getUNOCanvas().is(),
+ "VCLFactory::createBitmap(): Invalid canvas" );
+
+ if( rCanvas.get() == NULL )
+ return BitmapSharedPtr();
+
+ uno::Reference< rendering::XCanvas > xCanvas( rCanvas->getUNOCanvas() );
+ if( !xCanvas.is() )
+ return BitmapSharedPtr();
+
+ return BitmapSharedPtr(
+ new internal::ImplBitmap( rCanvas,
+ xCanvas->getDevice()->createCompatibleBitmap(
+ ::vcl::unotools::integerSize2DFromSize(rSize) ) ) );
+ }
+
+ BitmapSharedPtr VCLFactory::createAlphaBitmap( const CanvasSharedPtr& rCanvas,
+ const ::Size& rSize ) const
+ {
+ OSL_ENSURE( rCanvas.get() != NULL &&
+ rCanvas->getUNOCanvas().is(),
+ "VCLFactory::createBitmap(): Invalid canvas" );
+
+ if( rCanvas.get() == NULL )
+ return BitmapSharedPtr();
+
+ uno::Reference< rendering::XCanvas > xCanvas( rCanvas->getUNOCanvas() );
+ if( !xCanvas.is() )
+ return BitmapSharedPtr();
+
+ return BitmapSharedPtr(
+ new internal::ImplBitmap( rCanvas,
+ xCanvas->getDevice()->createCompatibleAlphaBitmap(
+ ::vcl::unotools::integerSize2DFromSize(rSize) ) ) );
+ }
+
+ BitmapSharedPtr VCLFactory::createBitmap( const CanvasSharedPtr& rCanvas,
+ const ::Bitmap& rBitmap ) const
+ {
+ OSL_ENSURE( rCanvas.get() != NULL &&
+ rCanvas->getUNOCanvas().is(),
+ "VCLFactory::createBitmap(): Invalid canvas" );
+
+ if( rCanvas.get() == NULL )
+ return BitmapSharedPtr();
+
+ uno::Reference< rendering::XCanvas > xCanvas( rCanvas->getUNOCanvas() );
+ if( !xCanvas.is() )
+ return BitmapSharedPtr();
+
+ return BitmapSharedPtr( new internal::ImplBitmap( rCanvas,
+ ::vcl::unotools::xBitmapFromBitmap(
+ xCanvas->getDevice(),
+ rBitmap) ) );
+ }
+
+ BitmapSharedPtr VCLFactory::createBitmap( const CanvasSharedPtr& rCanvas,
+ const ::BitmapEx& rBmpEx ) const
+ {
+ OSL_ENSURE( rCanvas.get() != NULL &&
+ rCanvas->getUNOCanvas().is(),
+ "VCLFactory::createBitmap(): Invalid canvas" );
+
+ if( rCanvas.get() == NULL )
+ return BitmapSharedPtr();
+
+ uno::Reference< rendering::XCanvas > xCanvas( rCanvas->getUNOCanvas() );
+ if( !xCanvas.is() )
+ return BitmapSharedPtr();
+
+ return BitmapSharedPtr( new internal::ImplBitmap( rCanvas,
+ ::vcl::unotools::xBitmapFromBitmapEx(
+ xCanvas->getDevice(),
+ rBmpEx) ) );
+ }
+
+ RendererSharedPtr VCLFactory::createRenderer( const CanvasSharedPtr& rCanvas,
+ const ::Graphic& rGraphic,
+ const Renderer::Parameters& rParms ) const
+ {
+ OSL_ENSURE( rCanvas.get() != NULL &&
+ rCanvas->getUNOCanvas().is(),
+ "VCLFactory::createRenderer(): Invalid canvas" );
+
+ if( rCanvas.get() == NULL )
+ return RendererSharedPtr();
+
+ uno::Reference< rendering::XCanvas > xCanvas( rCanvas->getUNOCanvas() );
+ if( !xCanvas.is() )
+ return RendererSharedPtr();
+
+ if( rGraphic.GetType() == GRAPHIC_GDIMETAFILE )
+ return RendererSharedPtr( new internal::ImplRenderer( rCanvas,
+ rGraphic.GetGDIMetaFile(),
+ rParms ) );
+ else
+ return RendererSharedPtr( new internal::ImplRenderer( rCanvas,
+ rGraphic.GetBitmapEx(),
+ rParms ) );
+ }
+
+ RendererSharedPtr VCLFactory::createRenderer( const CanvasSharedPtr& rCanvas,
+ const ::GDIMetaFile& rMtf,
+ const Renderer::Parameters& rParms ) const
+ {
+ return RendererSharedPtr( new internal::ImplRenderer( rCanvas,
+ rMtf,
+ rParms ) );
+ }
+
+ SpriteSharedPtr VCLFactory::createAnimatedSprite( const SpriteCanvasSharedPtr& rCanvas, const ::Animation& rAnim ) const
+ {
+ OSL_ENSURE( rCanvas.get() != NULL &&
+ rCanvas->getUNOCanvas().is(),
+ "VCLFactory::createAnimatedSprite(): Invalid canvas" );
+
+ if( rCanvas.get() == NULL )
+ return SpriteSharedPtr();
+
+ uno::Reference< rendering::XCanvas > xCanvas( rCanvas->getUNOCanvas() );
+ if( !xCanvas.is() )
+ return SpriteSharedPtr();
+
+ uno::Reference< rendering::XSpriteCanvas > xSpriteCanvas( rCanvas->getUNOSpriteCanvas() );
+ if( !xSpriteCanvas.is() )
+ return SpriteSharedPtr();
+
+ if( rAnim.IsEmpty() )
+ return SpriteSharedPtr();
+
+ internal::ImplSpriteCanvas* pSpriteCanvas = dynamic_cast< internal::ImplSpriteCanvas* >( rCanvas.get() );
+ if( !pSpriteCanvas )
+ return SpriteSharedPtr();
+
+ const USHORT nBitmaps( rAnim.Count() );
+ uno::Sequence< uno::Reference< rendering::XBitmap > > aBitmapSequence( nBitmaps );
+ uno::Reference< rendering::XBitmap >* pBitmaps = aBitmapSequence.getArray();
+
+ unsigned int i;
+ BitmapEx aBmpEx;
+ BitmapEx aRestoreBuffer;
+ aBmpEx.SetSizePixel( rAnim.GetDisplaySizePixel() );
+ aRestoreBuffer.SetSizePixel( rAnim.GetDisplaySizePixel() );
+ aBmpEx.Erase( ::Color( 255, 0,0,0 ) ); // clear alpha channel
+ aRestoreBuffer = aBmpEx;
+ const Point aEmptyPoint;
+
+ for( i=0; i<nBitmaps; ++i )
+ {
+ const AnimationBitmap& rAnimBmp( rAnim.Get((USHORT)i) );
+
+ // Handle dispose according to GIF spec: a
+ // DISPOSE_PREVIOUS does _not_ mean to revert to the
+ // previous frame, but to revert to the last frame with
+ // DISPOSE_NOT
+
+ // dispose previous
+ if( rAnimBmp.eDisposal == DISPOSE_BACK )
+ {
+ // simply clear bitmap to transparent
+ aBmpEx.Erase( ::Color( 255, 0,0,0 ) );
+ }
+ else if( rAnimBmp.eDisposal == DISPOSE_PREVIOUS )
+ {
+ // copy in last known full frame
+ aBmpEx = aRestoreBuffer;
+ }
+ // I have exactly _no_ idea what DISPOSE_FULL is supposed
+ // to do. It's apparently not set anywhere in our code
+ OSL_ENSURE( rAnimBmp.eDisposal!=DISPOSE_FULL,
+ "VCLFactory::createAnimatedSprite(): Somebody set the deprecated DISPOSE_FULL at the Animation" );
+
+ // update display
+ aBmpEx.CopyPixel( Rectangle( rAnimBmp.aPosPix,
+ rAnimBmp.aSizePix ),
+ Rectangle( aEmptyPoint,
+ rAnimBmp.aSizePix ),
+ &rAnimBmp.aBmpEx );
+
+ // store last DISPOSE_NOT frame, for later
+ // DISPOSE_PREVIOUS updates
+ if( rAnimBmp.eDisposal == DISPOSE_NOT )
+ aRestoreBuffer = aBmpEx;
+
+ pBitmaps[i] = ::vcl::unotools::xBitmapFromBitmapEx(
+ xCanvas->getDevice(),
+ aBmpEx);
+ }
+
+ return pSpriteCanvas->createSpriteFromBitmaps( aBitmapSequence,
+ rendering::InterpolationMode::NEAREST_NEIGHBOR );
+ }
+
+ TextSharedPtr VCLFactory::createText( const CanvasSharedPtr& rCanvas, const ::rtl::OUString& rText ) const
+ {
+ return TextSharedPtr( new internal::ImplText( rCanvas,
+ rText ) );
+ }
+
+}