diff options
Diffstat (limited to 'canvas/source/tools')
21 files changed, 0 insertions, 5820 deletions
diff --git a/canvas/source/tools/cachedprimitivebase.cxx b/canvas/source/tools/cachedprimitivebase.cxx deleted file mode 100644 index fcdcffbc92..0000000000 --- a/canvas/source/tools/cachedprimitivebase.cxx +++ /dev/null @@ -1,115 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * 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_canvas.hxx" - -#include <canvas/debug.hxx> -#include <canvas/base/cachedprimitivebase.hxx> - -#include <com/sun/star/rendering/RepaintResult.hpp> - -#include <basegfx/matrix/b2dhommatrix.hxx> -#include <basegfx/tools/canvastools.hxx> - - -using namespace ::com::sun::star; - -#define IMPLEMENTATION_NAME "canvas::CachedPrimitiveBase" -#define SERVICE_NAME "com.sun.star.rendering.CachedBitmap" - -namespace canvas -{ - CachedPrimitiveBase::CachedPrimitiveBase( const rendering::ViewState& rUsedViewState, - const uno::Reference< rendering::XCanvas >& rTarget, - bool bFailForChangedViewTransform ) : - CachedPrimitiveBase_Base( m_aMutex ), - maUsedViewState( rUsedViewState ), - mxTarget( rTarget ), - mbFailForChangedViewTransform( bFailForChangedViewTransform ) - { - } - - CachedPrimitiveBase::~CachedPrimitiveBase() - { - } - - void SAL_CALL CachedPrimitiveBase::disposing() - { - ::osl::MutexGuard aGuard( m_aMutex ); - - maUsedViewState.Clip.clear(); - mxTarget.clear(); - } - - sal_Int8 SAL_CALL CachedPrimitiveBase::redraw( const rendering::ViewState& aState ) throw (lang::IllegalArgumentException, uno::RuntimeException) - { - ::basegfx::B2DHomMatrix aUsedTransformation; - ::basegfx::B2DHomMatrix aNewTransformation; - - ::basegfx::unotools::homMatrixFromAffineMatrix( aUsedTransformation, - maUsedViewState.AffineTransform ); - ::basegfx::unotools::homMatrixFromAffineMatrix( aNewTransformation, - aState.AffineTransform ); - - const bool bSameViewTransforms( aUsedTransformation == aNewTransformation ); - - if( mbFailForChangedViewTransform && - !bSameViewTransforms ) - { - // differing transformations, don't try to draft the - // output, just plain fail here. - return rendering::RepaintResult::FAILED; - } - - return doRedraw( aState, - maUsedViewState, - mxTarget, - bSameViewTransforms ); - } - - ::rtl::OUString SAL_CALL CachedPrimitiveBase::getImplementationName( ) throw (uno::RuntimeException) - { - return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( IMPLEMENTATION_NAME ) ); - } - - sal_Bool SAL_CALL CachedPrimitiveBase::supportsService( const ::rtl::OUString& ServiceName ) throw (uno::RuntimeException) - { - return ServiceName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM ( SERVICE_NAME ) ); - } - - uno::Sequence< ::rtl::OUString > SAL_CALL CachedPrimitiveBase::getSupportedServiceNames( ) throw (uno::RuntimeException) - { - uno::Sequence< ::rtl::OUString > aRet(1); - aRet[0] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM ( SERVICE_NAME ) ); - - return aRet; - } -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/canvas/source/tools/canvascustomspritehelper.cxx b/canvas/source/tools/canvascustomspritehelper.cxx deleted file mode 100644 index 0c7a3e55a2..0000000000 --- a/canvas/source/tools/canvascustomspritehelper.cxx +++ /dev/null @@ -1,499 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * 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_canvas.hxx" - -#include <canvas/debug.hxx> -#include <tools/diagnose_ex.h> -#include <canvas/verbosetrace.hxx> -#include <canvas/canvastools.hxx> - -#include <rtl/math.hxx> - -#include <basegfx/matrix/b2dhommatrix.hxx> -#include <basegfx/point/b2dpoint.hxx> -#include <basegfx/tools/canvastools.hxx> -#include <basegfx/polygon/b2dpolygon.hxx> -#include <basegfx/polygon/b2dpolygontools.hxx> -#include <basegfx/polygon/b2dpolypolygontools.hxx> -#include <basegfx/numeric/ftools.hxx> - -#include <canvas/base/canvascustomspritehelper.hxx> - -using namespace ::com::sun::star; - - -namespace canvas -{ - bool CanvasCustomSpriteHelper::updateClipState( const Sprite::Reference& rSprite ) - { - if( !mxClipPoly.is() ) - { - // empty clip polygon -> everything is visible now - maCurrClipBounds.reset(); - mbIsCurrClipRectangle = true; - } - else - { - const sal_Int32 nNumClipPolygons( mxClipPoly->getNumberOfPolygons() ); - - // clip is not empty - determine actual update area - ::basegfx::B2DPolyPolygon aClipPath( - polyPolygonFromXPolyPolygon2D( mxClipPoly ) ); - - // apply sprite transformation also to clip! - aClipPath.transform( maTransform ); - - // clip which is about to be set, expressed as a - // b2drectangle - const ::basegfx::B2DRectangle& rClipBounds( - ::basegfx::tools::getRange( aClipPath ) ); - - const ::basegfx::B2DRectangle aBounds( 0.0, 0.0, - maSize.getX(), - maSize.getY() ); - - // rectangular area which is actually covered by the sprite. - // coordinates are relative to the sprite origin. - ::basegfx::B2DRectangle aSpriteRectPixel; - ::canvas::tools::calcTransformedRectBounds( aSpriteRectPixel, - aBounds, - maTransform ); - - // aClipBoundsA = new clip bound rect, intersected - // with sprite area - ::basegfx::B2DRectangle aClipBoundsA(rClipBounds); - aClipBoundsA.intersect( aSpriteRectPixel ); - - if( nNumClipPolygons != 1 ) - { - // clip cannot be a single rectangle -> cannot - // optimize update - mbIsCurrClipRectangle = false; - maCurrClipBounds = aClipBoundsA; - } - else - { - // new clip could be a single rectangle - check - // that now: - const bool bNewClipIsRect( - ::basegfx::tools::isRectangle( aClipPath.getB2DPolygon(0) ) ); - - // both new and old clip are truly rectangles - // - can now take the optimized path - const bool bUseOptimizedUpdate( bNewClipIsRect && - mbIsCurrClipRectangle ); - - const ::basegfx::B2DRectangle aOldBounds( maCurrClipBounds ); - - // store new current clip type - maCurrClipBounds = aClipBoundsA; - mbIsCurrClipRectangle = bNewClipIsRect; - - if( mbActive && - bUseOptimizedUpdate ) - { - // aClipBoundsB = maCurrClipBounds, i.e. last - // clip, intersected with sprite area - typedef ::std::vector< ::basegfx::B2DRectangle > VectorOfRects; - VectorOfRects aClipDifferences; - - // get all rectangles covered by exactly one - // of the polygons (aka XOR) - ::basegfx::computeSetDifference(aClipDifferences, - aClipBoundsA, - aOldBounds); - - // aClipDifferences now contains the final - // update areas, coordinates are still relative - // to the sprite origin. before submitting - // this area to 'updateSprite()' we need to - // translate this area to the final position, - // coordinates need to be relative to the - // spritecanvas. - VectorOfRects::const_iterator aCurr( aClipDifferences.begin() ); - const VectorOfRects::const_iterator aEnd( aClipDifferences.end() ); - while( aCurr != aEnd ) - { - mpSpriteCanvas->updateSprite( - rSprite, - maPosition, - ::basegfx::B2DRectangle( - maPosition + aCurr->getMinimum(), - maPosition + aCurr->getMaximum() ) ); - ++aCurr; - } - - // update calls all done - return true; - } - } - } - - // caller needs to perform update calls - return false; - } - - CanvasCustomSpriteHelper::CanvasCustomSpriteHelper() : - mpSpriteCanvas(), - maCurrClipBounds(), - maPosition(), - maSize(), - maTransform(), - mxClipPoly(), - mfPriority(0.0), - mfAlpha(0.0), - mbActive(false), - mbIsCurrClipRectangle(true), - mbIsContentFullyOpaque( false ), - mbAlphaDirty( true ), - mbPositionDirty( true ), - mbTransformDirty( true ), - mbClipDirty( true ), - mbPrioDirty( true ), - mbVisibilityDirty( true ) - { - } - - void CanvasCustomSpriteHelper::init( const geometry::RealSize2D& rSpriteSize, - const SpriteSurface::Reference& rOwningSpriteCanvas ) - { - ENSURE_OR_THROW( rOwningSpriteCanvas.get(), - "CanvasCustomSpriteHelper::init(): Invalid owning sprite canvas" ); - - mpSpriteCanvas = rOwningSpriteCanvas; - maSize.setX( ::std::max( 1.0, - ceil( rSpriteSize.Width ) ) ); // round up to nearest int, - // enforce sprite to have at - // least (1,1) pixel size - maSize.setY( ::std::max( 1.0, - ceil( rSpriteSize.Height ) ) ); - } - - void CanvasCustomSpriteHelper::disposing() - { - mpSpriteCanvas.clear(); - } - - void CanvasCustomSpriteHelper::clearingContent( const Sprite::Reference& /*rSprite*/ ) - { - // about to clear content to fully transparent - mbIsContentFullyOpaque = false; - } - - void CanvasCustomSpriteHelper::checkDrawBitmap( const Sprite::Reference& rSprite, - const uno::Reference< rendering::XBitmap >& xBitmap, - const rendering::ViewState& viewState, - const rendering::RenderState& renderState ) - { - // check whether bitmap is non-alpha, and whether its - // transformed size covers the whole sprite. - if( !xBitmap->hasAlpha() ) - { - const geometry::IntegerSize2D& rInputSize( - xBitmap->getSize() ); - const ::basegfx::B2DSize& rOurSize( - rSprite->getSizePixel() ); - - ::basegfx::B2DHomMatrix aTransform; - if( tools::isInside( - ::basegfx::B2DRectangle( 0.0,0.0, - rOurSize.getX(), - rOurSize.getY() ), - ::basegfx::B2DRectangle( 0.0,0.0, - rInputSize.Width, - rInputSize.Height ), - ::canvas::tools::mergeViewAndRenderTransform(aTransform, - viewState, - renderState) ) ) - { - // bitmap is opaque and will fully cover the sprite, - // set flag appropriately - mbIsContentFullyOpaque = true; - } - } - } - - void CanvasCustomSpriteHelper::setAlpha( const Sprite::Reference& rSprite, - double alpha ) - { - if( !mpSpriteCanvas.get() ) - return; // we're disposed - - if( alpha != mfAlpha ) - { - mfAlpha = alpha; - - if( mbActive ) - { - mpSpriteCanvas->updateSprite( rSprite, - maPosition, - getUpdateArea() ); - } - - mbAlphaDirty = true; - } - } - - void CanvasCustomSpriteHelper::move( const Sprite::Reference& rSprite, - const geometry::RealPoint2D& aNewPos, - const rendering::ViewState& viewState, - const rendering::RenderState& renderState ) - { - if( !mpSpriteCanvas.get() ) - return; // we're disposed - - ::basegfx::B2DHomMatrix aTransform; - ::canvas::tools::mergeViewAndRenderTransform(aTransform, - viewState, - renderState); - - // convert position to device pixel - ::basegfx::B2DPoint aPoint( - ::basegfx::unotools::b2DPointFromRealPoint2D(aNewPos) ); - aPoint *= aTransform; - - if( aPoint != maPosition ) - { - const ::basegfx::B2DRectangle& rBounds( getFullSpriteRect() ); - - if( mbActive ) - { - mpSpriteCanvas->moveSprite( rSprite, - rBounds.getMinimum(), - rBounds.getMinimum() - maPosition + aPoint, - rBounds.getRange() ); - } - - maPosition = aPoint; - mbPositionDirty = true; - } - } - - void CanvasCustomSpriteHelper::transform( const Sprite::Reference& rSprite, - const geometry::AffineMatrix2D& aTransformation ) - { - ::basegfx::B2DHomMatrix aMatrix; - ::basegfx::unotools::homMatrixFromAffineMatrix(aMatrix, - aTransformation); - - if( maTransform != aMatrix ) - { - // retrieve bounds before and after transformation change. - const ::basegfx::B2DRectangle& rPrevBounds( getUpdateArea() ); - - maTransform = aMatrix; - - if( !updateClipState( rSprite ) && - mbActive ) - { - mpSpriteCanvas->updateSprite( rSprite, - maPosition, - rPrevBounds ); - mpSpriteCanvas->updateSprite( rSprite, - maPosition, - getUpdateArea() ); - } - - mbTransformDirty = true; - } - } - - void CanvasCustomSpriteHelper::clip( const Sprite::Reference& rSprite, - const uno::Reference< rendering::XPolyPolygon2D >& xClip ) - { - // NULL xClip explicitely allowed here (to clear clipping) - - // retrieve bounds before and after clip change. - const ::basegfx::B2DRectangle& rPrevBounds( getUpdateArea() ); - - mxClipPoly = xClip; - - if( !updateClipState( rSprite ) && - mbActive ) - { - mpSpriteCanvas->updateSprite( rSprite, - maPosition, - rPrevBounds ); - mpSpriteCanvas->updateSprite( rSprite, - maPosition, - getUpdateArea() ); - } - - mbClipDirty = true; - } - - void CanvasCustomSpriteHelper::setPriority( const Sprite::Reference& rSprite, - double nPriority ) - { - if( !mpSpriteCanvas.get() ) - return; // we're disposed - - if( nPriority != mfPriority ) - { - mfPriority = nPriority; - - if( mbActive ) - { - mpSpriteCanvas->updateSprite( rSprite, - maPosition, - getUpdateArea() ); - } - - mbPrioDirty = true; - } - } - - void CanvasCustomSpriteHelper::show( const Sprite::Reference& rSprite ) - { - if( !mpSpriteCanvas.get() ) - return; // we're disposed - - if( !mbActive ) - { - mpSpriteCanvas->showSprite( rSprite ); - mbActive = true; - - // TODO(P1): if clip is the NULL clip (nothing visible), - // also save us the update call. - - if( mfAlpha != 0.0 ) - { - mpSpriteCanvas->updateSprite( rSprite, - maPosition, - getUpdateArea() ); - } - - mbVisibilityDirty = true; - } - } - - void CanvasCustomSpriteHelper::hide( const Sprite::Reference& rSprite ) - { - if( !mpSpriteCanvas.get() ) - return; // we're disposed - - if( mbActive ) - { - mpSpriteCanvas->hideSprite( rSprite ); - mbActive = false; - - // TODO(P1): if clip is the NULL clip (nothing visible), - // also save us the update call. - - if( mfAlpha != 0.0 ) - { - mpSpriteCanvas->updateSprite( rSprite, - maPosition, - getUpdateArea() ); - } - - mbVisibilityDirty = true; - } - } - - // Sprite interface - bool CanvasCustomSpriteHelper::isAreaUpdateOpaque( const ::basegfx::B2DRange& rUpdateArea ) const - { - if( !mbIsCurrClipRectangle || - !mbIsContentFullyOpaque || - !::rtl::math::approxEqual(mfAlpha, 1.0) ) - { - // sprite either transparent, or clip rect does not - // represent exact bounds -> update might not be fully - // opaque - return false; - } - else - { - // make sure sprite rect fully covers update area - - // although the update area originates from the sprite, - // it's by no means guaranteed that it's limited to this - // sprite's update area - after all, other sprites might - // have been merged, or this sprite is moving. - return getUpdateArea().isInside( rUpdateArea ); - } - } - - ::basegfx::B2DPoint CanvasCustomSpriteHelper::getPosPixel() const - { - return maPosition; - } - - ::basegfx::B2DVector CanvasCustomSpriteHelper::getSizePixel() const - { - return maSize; - } - - ::basegfx::B2DRange CanvasCustomSpriteHelper::getUpdateArea( const ::basegfx::B2DRange& rBounds ) const - { - // Internal! Only call with locked object mutex! - ::basegfx::B2DHomMatrix aTransform( maTransform ); - aTransform.translate( maPosition.getX(), - maPosition.getY() ); - - // transform bounds at origin, as the sprite transformation is - // formulated that way - ::basegfx::B2DRectangle aTransformedBounds; - return ::canvas::tools::calcTransformedRectBounds( aTransformedBounds, - rBounds, - aTransform ); - } - - ::basegfx::B2DRange CanvasCustomSpriteHelper::getUpdateArea() const - { - // Internal! Only call with locked object mutex! - - // return effective sprite rect, i.e. take active clip into - // account - if( maCurrClipBounds.isEmpty() ) - return getUpdateArea( ::basegfx::B2DRectangle( 0.0, 0.0, - maSize.getX(), - maSize.getY() ) ); - else - return ::basegfx::B2DRectangle( - maPosition + maCurrClipBounds.getMinimum(), - maPosition + maCurrClipBounds.getMaximum() ); - } - - double CanvasCustomSpriteHelper::getPriority() const - { - return mfPriority; - } - - ::basegfx::B2DRange CanvasCustomSpriteHelper::getFullSpriteRect() const - { - // Internal! Only call with locked object mutex! - return getUpdateArea( ::basegfx::B2DRectangle( 0.0, 0.0, - maSize.getX(), - maSize.getY() ) ); - } -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/canvas/source/tools/canvastools.cxx b/canvas/source/tools/canvastools.cxx deleted file mode 100644 index c5571b41b8..0000000000 --- a/canvas/source/tools/canvastools.cxx +++ /dev/null @@ -1,1047 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * 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_canvas.hxx" - -#include <canvas/debug.hxx> -#include <tools/diagnose_ex.h> - -#include <com/sun/star/geometry/AffineMatrix2D.hpp> -#include <com/sun/star/geometry/Matrix2D.hpp> -#include <com/sun/star/awt/Rectangle.hpp> -#include <com/sun/star/util/Endianness.hpp> -#include <com/sun/star/rendering/XIntegerBitmapColorSpace.hpp> -#include <com/sun/star/rendering/IntegerBitmapLayout.hpp> -#include <com/sun/star/rendering/ColorSpaceType.hpp> -#include <com/sun/star/rendering/ColorComponentTag.hpp> -#include <com/sun/star/rendering/RenderingIntent.hpp> -#include <com/sun/star/rendering/RenderState.hpp> -#include <com/sun/star/rendering/ViewState.hpp> -#include <com/sun/star/rendering/XCanvas.hpp> -#include <com/sun/star/rendering/XColorSpace.hpp> -#include <com/sun/star/rendering/CompositeOperation.hpp> -#include <com/sun/star/beans/XPropertySet.hpp> -#include <com/sun/star/lang/XServiceInfo.hpp> - -#include <basegfx/matrix/b2dhommatrix.hxx> -#include <basegfx/range/b2drange.hxx> -#include <basegfx/range/b2irange.hxx> -#include <basegfx/range/b2drectangle.hxx> -#include <basegfx/point/b2dpoint.hxx> -#include <basegfx/point/b2ipoint.hxx> -#include <basegfx/vector/b2ivector.hxx> -#include <basegfx/polygon/b2dpolygon.hxx> -#include <basegfx/polygon/b2dpolygontools.hxx> -#include <basegfx/polygon/b2dpolypolygontools.hxx> -#include <basegfx/tools/canvastools.hxx> -#include <basegfx/numeric/ftools.hxx> -#include <basegfx/matrix/b2dhommatrixtools.hxx> - -#include <cppuhelper/compbase1.hxx> -#include <rtl/instance.hxx> -#include <toolkit/helper/vclunohelper.hxx> -#include <vcl/window.hxx> -#include <vcl/canvastools.hxx> - -#include <canvas/canvastools.hxx> - -#include <limits> - - -using namespace ::com::sun::star; - -namespace com { namespace sun { namespace star { namespace rendering -{ - bool operator==( const RenderState& renderState1, - const RenderState& renderState2 ) - { - if( renderState1.Clip != renderState2.Clip ) - return false; - - if( renderState1.DeviceColor != renderState2.DeviceColor ) - return false; - - if( renderState1.CompositeOperation != renderState2.CompositeOperation ) - return false; - - ::basegfx::B2DHomMatrix mat1, mat2; - ::canvas::tools::getRenderStateTransform( mat1, renderState1 ); - ::canvas::tools::getRenderStateTransform( mat2, renderState2 ); - if( mat1 != mat2 ) - return false; - - return true; - } - - bool operator==( const ViewState& viewState1, - const ViewState& viewState2 ) - { - if( viewState1.Clip != viewState2.Clip ) - return false; - - ::basegfx::B2DHomMatrix mat1, mat2; - ::canvas::tools::getViewStateTransform( mat1, viewState1 ); - ::canvas::tools::getViewStateTransform( mat2, viewState2 ); - if( mat1 != mat2 ) - return false; - - return true; - } -}}}} - -namespace canvas -{ - namespace tools - { - geometry::RealSize2D createInfiniteSize2D() - { - return geometry::RealSize2D( - ::std::numeric_limits<double>::infinity(), - ::std::numeric_limits<double>::infinity() ); - } - - rendering::RenderState& initRenderState( rendering::RenderState& renderState ) - { - // setup identity transform - setIdentityAffineMatrix2D( renderState.AffineTransform ); - renderState.Clip = uno::Reference< rendering::XPolyPolygon2D >(); - renderState.DeviceColor = uno::Sequence< double >(); - renderState.CompositeOperation = rendering::CompositeOperation::OVER; - - return renderState; - } - - rendering::ViewState& initViewState( rendering::ViewState& viewState ) - { - // setup identity transform - setIdentityAffineMatrix2D( viewState.AffineTransform ); - viewState.Clip = uno::Reference< rendering::XPolyPolygon2D >(); - - return viewState; - } - - ::basegfx::B2DHomMatrix& getViewStateTransform( ::basegfx::B2DHomMatrix& transform, - const rendering::ViewState& viewState ) - { - return ::basegfx::unotools::homMatrixFromAffineMatrix( transform, viewState.AffineTransform ); - } - - rendering::ViewState& setViewStateTransform( rendering::ViewState& viewState, - const ::basegfx::B2DHomMatrix& transform ) - { - ::basegfx::unotools::affineMatrixFromHomMatrix( viewState.AffineTransform, transform ); - - return viewState; - } - - ::basegfx::B2DHomMatrix& getRenderStateTransform( ::basegfx::B2DHomMatrix& transform, - const rendering::RenderState& renderState ) - { - return ::basegfx::unotools::homMatrixFromAffineMatrix( transform, renderState.AffineTransform ); - } - - rendering::RenderState& setRenderStateTransform( rendering::RenderState& renderState, - const ::basegfx::B2DHomMatrix& transform ) - { - ::basegfx::unotools::affineMatrixFromHomMatrix( renderState.AffineTransform, transform ); - - return renderState; - } - - rendering::RenderState& appendToRenderState( rendering::RenderState& renderState, - const ::basegfx::B2DHomMatrix& rTransform ) - { - ::basegfx::B2DHomMatrix transform; - - getRenderStateTransform( transform, renderState ); - return setRenderStateTransform( renderState, transform * rTransform ); - } - - rendering::ViewState& appendToViewState( rendering::ViewState& viewState, - const ::basegfx::B2DHomMatrix& rTransform ) - { - ::basegfx::B2DHomMatrix transform; - - getViewStateTransform( transform, viewState ); - return setViewStateTransform( viewState, transform * rTransform ); - } - - rendering::RenderState& prependToRenderState( rendering::RenderState& renderState, - const ::basegfx::B2DHomMatrix& rTransform ) - { - ::basegfx::B2DHomMatrix transform; - - getRenderStateTransform( transform, renderState ); - return setRenderStateTransform( renderState, rTransform * transform ); - } - - rendering::ViewState& prependToViewState( rendering::ViewState& viewState, - const ::basegfx::B2DHomMatrix& rTransform ) - { - ::basegfx::B2DHomMatrix transform; - - getViewStateTransform( transform, viewState ); - return setViewStateTransform( viewState, rTransform * transform ); - } - - ::basegfx::B2DHomMatrix& mergeViewAndRenderTransform( ::basegfx::B2DHomMatrix& combinedTransform, - const rendering::ViewState& viewState, - const rendering::RenderState& renderState ) - { - ::basegfx::B2DHomMatrix viewTransform; - - ::basegfx::unotools::homMatrixFromAffineMatrix( combinedTransform, renderState.AffineTransform ); - ::basegfx::unotools::homMatrixFromAffineMatrix( viewTransform, viewState.AffineTransform ); - - // this statement performs combinedTransform = viewTransform * combinedTransform - combinedTransform *= viewTransform; - - return combinedTransform; - } - - rendering::ViewState& mergeViewAndRenderState( rendering::ViewState& resultViewState, - const rendering::ViewState& viewState, - const rendering::RenderState& renderState, - const uno::Reference< rendering::XCanvas >& /*xCanvas*/ ) - { - ::basegfx::B2DHomMatrix aTmpMatrix; - geometry::AffineMatrix2D convertedMatrix; - - resultViewState.Clip = NULL; // TODO(F2): intersect clippings - - return setViewStateTransform( - resultViewState, - mergeViewAndRenderTransform( aTmpMatrix, - viewState, - renderState ) ); - } - - geometry::AffineMatrix2D& setIdentityAffineMatrix2D( geometry::AffineMatrix2D& matrix ) - { - matrix.m00 = 1.0; - matrix.m01 = 0.0; - matrix.m02 = 0.0; - matrix.m10 = 0.0; - matrix.m11 = 1.0; - matrix.m12 = 0.0; - - return matrix; - } - - geometry::Matrix2D& setIdentityMatrix2D( geometry::Matrix2D& matrix ) - { - matrix.m00 = 1.0; - matrix.m01 = 0.0; - matrix.m10 = 0.0; - matrix.m11 = 1.0; - - return matrix; - } - - namespace - { - class StandardColorSpace : public cppu::WeakImplHelper1< com::sun::star::rendering::XIntegerBitmapColorSpace > - { - private: - uno::Sequence< sal_Int8 > maComponentTags; - uno::Sequence< sal_Int32 > maBitCounts; - - virtual ::sal_Int8 SAL_CALL getType( ) throw (uno::RuntimeException) - { - return rendering::ColorSpaceType::RGB; - } - virtual uno::Sequence< ::sal_Int8 > SAL_CALL getComponentTags( ) throw (uno::RuntimeException) - { - return maComponentTags; - } - virtual ::sal_Int8 SAL_CALL getRenderingIntent( ) throw (uno::RuntimeException) - { - return rendering::RenderingIntent::PERCEPTUAL; - } - virtual uno::Sequence< beans::PropertyValue > SAL_CALL getProperties( ) throw (uno::RuntimeException) - { - return uno::Sequence< beans::PropertyValue >(); - } - virtual uno::Sequence< double > SAL_CALL convertColorSpace( const uno::Sequence< double >& deviceColor, - const uno::Reference< rendering::XColorSpace >& targetColorSpace ) throw (lang::IllegalArgumentException, - uno::RuntimeException) - { - // TODO(P3): if we know anything about target - // colorspace, this can be greatly sped up - uno::Sequence<rendering::ARGBColor> aIntermediate( - convertToARGB(deviceColor)); - return targetColorSpace->convertFromARGB(aIntermediate); - } - virtual uno::Sequence< rendering::RGBColor > SAL_CALL convertToRGB( const uno::Sequence< double >& deviceColor ) throw (lang::IllegalArgumentException, uno::RuntimeException) - { - const double* pIn( deviceColor.getConstArray() ); - const sal_Size nLen( deviceColor.getLength() ); - ENSURE_ARG_OR_THROW2(nLen%4==0, - "number of channels no multiple of 4", - static_cast<rendering::XColorSpace*>(this), 0); - - uno::Sequence< rendering::RGBColor > aRes(nLen/4); - rendering::RGBColor* pOut( aRes.getArray() ); - for( sal_Size i=0; i<nLen; i+=4 ) - { - *pOut++ = rendering::RGBColor(pIn[0],pIn[1],pIn[2]); - pIn += 4; - } - return aRes; - } - virtual uno::Sequence< rendering::ARGBColor > SAL_CALL convertToARGB( const uno::Sequence< double >& deviceColor ) throw (lang::IllegalArgumentException, uno::RuntimeException) - { - const double* pIn( deviceColor.getConstArray() ); - const sal_Size nLen( deviceColor.getLength() ); - ENSURE_ARG_OR_THROW2(nLen%4==0, - "number of channels no multiple of 4", - static_cast<rendering::XColorSpace*>(this), 0); - - uno::Sequence< rendering::ARGBColor > aRes(nLen/4); - rendering::ARGBColor* pOut( aRes.getArray() ); - for( sal_Size i=0; i<nLen; i+=4 ) - { - *pOut++ = rendering::ARGBColor(pIn[3],pIn[0],pIn[1],pIn[2]); - pIn += 4; - } - return aRes; - } - virtual uno::Sequence< rendering::ARGBColor > SAL_CALL convertToPARGB( const uno::Sequence< double >& deviceColor ) throw (lang::IllegalArgumentException, uno::RuntimeException) - { - const double* pIn( deviceColor.getConstArray() ); - const sal_Size nLen( deviceColor.getLength() ); - ENSURE_ARG_OR_THROW2(nLen%4==0, - "number of channels no multiple of 4", - static_cast<rendering::XColorSpace*>(this), 0); - - uno::Sequence< rendering::ARGBColor > aRes(nLen/4); - rendering::ARGBColor* pOut( aRes.getArray() ); - for( sal_Size i=0; i<nLen; i+=4 ) - { - *pOut++ = rendering::ARGBColor(pIn[3],pIn[3]*pIn[0],pIn[3]*pIn[1],pIn[3]*pIn[2]); - pIn += 4; - } - return aRes; - } - virtual uno::Sequence< double > SAL_CALL convertFromRGB( const uno::Sequence< rendering::RGBColor >& rgbColor ) throw (lang::IllegalArgumentException, uno::RuntimeException) - { - const rendering::RGBColor* pIn( rgbColor.getConstArray() ); - const sal_Size nLen( rgbColor.getLength() ); - - uno::Sequence< double > aRes(nLen*4); - double* pColors=aRes.getArray(); - for( sal_Size i=0; i<nLen; ++i ) - { - *pColors++ = pIn->Red; - *pColors++ = pIn->Green; - *pColors++ = pIn->Blue; - *pColors++ = 1.0; - ++pIn; - } - return aRes; - } - virtual uno::Sequence< double > SAL_CALL convertFromARGB( const uno::Sequence< rendering::ARGBColor >& rgbColor ) throw (lang::IllegalArgumentException, uno::RuntimeException) - { - const rendering::ARGBColor* pIn( rgbColor.getConstArray() ); - const sal_Size nLen( rgbColor.getLength() ); - - uno::Sequence< double > aRes(nLen*4); - double* pColors=aRes.getArray(); - for( sal_Size i=0; i<nLen; ++i ) - { - *pColors++ = pIn->Red; - *pColors++ = pIn->Green; - *pColors++ = pIn->Blue; - *pColors++ = pIn->Alpha; - ++pIn; - } - return aRes; - } - virtual uno::Sequence< double > SAL_CALL convertFromPARGB( const uno::Sequence< rendering::ARGBColor >& rgbColor ) throw (lang::IllegalArgumentException, uno::RuntimeException) - { - const rendering::ARGBColor* pIn( rgbColor.getConstArray() ); - const sal_Size nLen( rgbColor.getLength() ); - - uno::Sequence< double > aRes(nLen*4); - double* pColors=aRes.getArray(); - for( sal_Size i=0; i<nLen; ++i ) - { - *pColors++ = pIn->Red/pIn->Alpha; - *pColors++ = pIn->Green/pIn->Alpha; - *pColors++ = pIn->Blue/pIn->Alpha; - *pColors++ = pIn->Alpha; - ++pIn; - } - return aRes; - } - - // XIntegerBitmapColorSpace - virtual ::sal_Int32 SAL_CALL getBitsPerPixel( ) throw (uno::RuntimeException) - { - return 32; - } - virtual uno::Sequence< ::sal_Int32 > SAL_CALL getComponentBitCounts( ) throw (uno::RuntimeException) - { - return maBitCounts; - } - virtual ::sal_Int8 SAL_CALL getEndianness( ) throw (uno::RuntimeException) - { - return util::Endianness::LITTLE; - } - virtual uno::Sequence<double> SAL_CALL convertFromIntegerColorSpace( const uno::Sequence< ::sal_Int8 >& deviceColor, - const uno::Reference< rendering::XColorSpace >& targetColorSpace ) throw (lang::IllegalArgumentException, - uno::RuntimeException) - { - if( dynamic_cast<StandardColorSpace*>(targetColorSpace.get()) ) - { - const sal_Int8* pIn( deviceColor.getConstArray() ); - const sal_Size nLen( deviceColor.getLength() ); - ENSURE_ARG_OR_THROW2(nLen%4==0, - "number of channels no multiple of 4", - static_cast<rendering::XColorSpace*>(this), 0); - - uno::Sequence<double> aRes(nLen); - double* pOut( aRes.getArray() ); - for( sal_Size i=0; i<nLen; i+=4 ) - { - *pOut++ = vcl::unotools::toDoubleColor(*pIn++); - *pOut++ = vcl::unotools::toDoubleColor(*pIn++); - *pOut++ = vcl::unotools::toDoubleColor(*pIn++); - *pOut++ = vcl::unotools::toDoubleColor(255-*pIn++); - } - return aRes; - } - else - { - // TODO(P3): if we know anything about target - // colorspace, this can be greatly sped up - uno::Sequence<rendering::ARGBColor> aIntermediate( - convertIntegerToARGB(deviceColor)); - return targetColorSpace->convertFromARGB(aIntermediate); - } - } - virtual uno::Sequence< ::sal_Int8 > SAL_CALL convertToIntegerColorSpace( const uno::Sequence< ::sal_Int8 >& deviceColor, - const uno::Reference< rendering::XIntegerBitmapColorSpace >& targetColorSpace ) throw (lang::IllegalArgumentException, - uno::RuntimeException) - { - if( dynamic_cast<StandardColorSpace*>(targetColorSpace.get()) ) - { - // it's us, so simply pass-through the data - return deviceColor; - } - else - { - // TODO(P3): if we know anything about target - // colorspace, this can be greatly sped up - uno::Sequence<rendering::ARGBColor> aIntermediate( - convertIntegerToARGB(deviceColor)); - return targetColorSpace->convertIntegerFromARGB(aIntermediate); - } - } - virtual uno::Sequence< rendering::RGBColor > SAL_CALL convertIntegerToRGB( const uno::Sequence< ::sal_Int8 >& deviceColor ) throw (lang::IllegalArgumentException, uno::RuntimeException) - { - const sal_Int8* pIn( deviceColor.getConstArray() ); - const sal_Size nLen( deviceColor.getLength() ); - ENSURE_ARG_OR_THROW2(nLen%4==0, - "number of channels no multiple of 4", - static_cast<rendering::XColorSpace*>(this), 0); - - uno::Sequence< rendering::RGBColor > aRes(nLen/4); - rendering::RGBColor* pOut( aRes.getArray() ); - for( sal_Size i=0; i<nLen; i+=4 ) - { - *pOut++ = rendering::RGBColor( - vcl::unotools::toDoubleColor(pIn[0]), - vcl::unotools::toDoubleColor(pIn[1]), - vcl::unotools::toDoubleColor(pIn[2])); - pIn += 4; - } - return aRes; - } - - virtual uno::Sequence< rendering::ARGBColor > SAL_CALL convertIntegerToARGB( const uno::Sequence< ::sal_Int8 >& deviceColor ) throw (lang::IllegalArgumentException, uno::RuntimeException) - { - const sal_Int8* pIn( deviceColor.getConstArray() ); - const sal_Size nLen( deviceColor.getLength() ); - ENSURE_ARG_OR_THROW2(nLen%4==0, - "number of channels no multiple of 4", - static_cast<rendering::XColorSpace*>(this), 0); - - uno::Sequence< rendering::ARGBColor > aRes(nLen/4); - rendering::ARGBColor* pOut( aRes.getArray() ); - for( sal_Size i=0; i<nLen; i+=4 ) - { - *pOut++ = rendering::ARGBColor( - vcl::unotools::toDoubleColor(255-pIn[3]), - vcl::unotools::toDoubleColor(pIn[0]), - vcl::unotools::toDoubleColor(pIn[1]), - vcl::unotools::toDoubleColor(pIn[2])); - pIn += 4; - } - return aRes; - } - - virtual uno::Sequence< rendering::ARGBColor > SAL_CALL convertIntegerToPARGB( const uno::Sequence< ::sal_Int8 >& deviceColor ) throw (lang::IllegalArgumentException, uno::RuntimeException) - { - const sal_Int8* pIn( deviceColor.getConstArray() ); - const sal_Size nLen( deviceColor.getLength() ); - ENSURE_ARG_OR_THROW2(nLen%4==0, - "number of channels no multiple of 4", - static_cast<rendering::XColorSpace*>(this), 0); - - uno::Sequence< rendering::ARGBColor > aRes(nLen/4); - rendering::ARGBColor* pOut( aRes.getArray() ); - for( sal_Size i=0; i<nLen; i+=4 ) - { - const sal_Int8 nAlpha( 255-pIn[3] ); - *pOut++ = rendering::ARGBColor( - vcl::unotools::toDoubleColor(nAlpha), - vcl::unotools::toDoubleColor(nAlpha*pIn[0]), - vcl::unotools::toDoubleColor(nAlpha*pIn[1]), - vcl::unotools::toDoubleColor(nAlpha*pIn[2])); - pIn += 4; - } - return aRes; - } - - virtual uno::Sequence< ::sal_Int8 > SAL_CALL convertIntegerFromRGB( const uno::Sequence< rendering::RGBColor >& rgbColor ) throw (lang::IllegalArgumentException, uno::RuntimeException) - { - const rendering::RGBColor* pIn( rgbColor.getConstArray() ); - const sal_Size nLen( rgbColor.getLength() ); - - uno::Sequence< sal_Int8 > aRes(nLen*4); - sal_Int8* pColors=aRes.getArray(); - for( sal_Size i=0; i<nLen; ++i ) - { - *pColors++ = vcl::unotools::toByteColor(pIn->Red); - *pColors++ = vcl::unotools::toByteColor(pIn->Green); - *pColors++ = vcl::unotools::toByteColor(pIn->Blue); - *pColors++ = 0; - ++pIn; - } - return aRes; - } - - virtual uno::Sequence< ::sal_Int8 > SAL_CALL convertIntegerFromARGB( const uno::Sequence< rendering::ARGBColor >& rgbColor ) throw (lang::IllegalArgumentException, uno::RuntimeException) - { - const rendering::ARGBColor* pIn( rgbColor.getConstArray() ); - const sal_Size nLen( rgbColor.getLength() ); - - uno::Sequence< sal_Int8 > aRes(nLen*4); - sal_Int8* pColors=aRes.getArray(); - for( sal_Size i=0; i<nLen; ++i ) - { - *pColors++ = vcl::unotools::toByteColor(pIn->Red); - *pColors++ = vcl::unotools::toByteColor(pIn->Green); - *pColors++ = vcl::unotools::toByteColor(pIn->Blue); - *pColors++ = 255-vcl::unotools::toByteColor(pIn->Alpha); - ++pIn; - } - return aRes; - } - - virtual uno::Sequence< ::sal_Int8 > SAL_CALL convertIntegerFromPARGB( const uno::Sequence< rendering::ARGBColor >& rgbColor ) throw (lang::IllegalArgumentException, uno::RuntimeException) - { - const rendering::ARGBColor* pIn( rgbColor.getConstArray() ); - const sal_Size nLen( rgbColor.getLength() ); - - uno::Sequence< sal_Int8 > aRes(nLen*4); - sal_Int8* pColors=aRes.getArray(); - for( sal_Size i=0; i<nLen; ++i ) - { - *pColors++ = vcl::unotools::toByteColor(pIn->Red/pIn->Alpha); - *pColors++ = vcl::unotools::toByteColor(pIn->Green/pIn->Alpha); - *pColors++ = vcl::unotools::toByteColor(pIn->Blue/pIn->Alpha); - *pColors++ = 255-vcl::unotools::toByteColor(pIn->Alpha); - ++pIn; - } - return aRes; - } - - public: - StandardColorSpace() : - maComponentTags(4), - maBitCounts(4) - { - sal_Int8* pTags = maComponentTags.getArray(); - sal_Int32* pBitCounts = maBitCounts.getArray(); - pTags[0] = rendering::ColorComponentTag::RGB_RED; - pTags[1] = rendering::ColorComponentTag::RGB_GREEN; - pTags[2] = rendering::ColorComponentTag::RGB_BLUE; - pTags[3] = rendering::ColorComponentTag::ALPHA; - - pBitCounts[0] = - pBitCounts[1] = - pBitCounts[2] = - pBitCounts[3] = 8; - } - }; - - struct StandardColorSpaceHolder : public rtl::StaticWithInit<uno::Reference<rendering::XIntegerBitmapColorSpace>, - StandardColorSpaceHolder> - { - uno::Reference<rendering::XIntegerBitmapColorSpace> operator()() - { - return new StandardColorSpace(); - } - }; - } - - uno::Reference<rendering::XIntegerBitmapColorSpace> getStdColorSpace() - { - return StandardColorSpaceHolder::get(); - } - - rendering::IntegerBitmapLayout getStdMemoryLayout( const geometry::IntegerSize2D& rBmpSize ) - { - rendering::IntegerBitmapLayout aLayout; - - aLayout.ScanLines = rBmpSize.Height; - aLayout.ScanLineBytes = rBmpSize.Width*4; - aLayout.ScanLineStride = aLayout.ScanLineBytes; - aLayout.PlaneStride = 0; - aLayout.ColorSpace = getStdColorSpace(); - aLayout.Palette.clear(); - aLayout.IsMsbFirst = sal_False; - - return aLayout; - } - - ::Color stdIntSequenceToColor( const uno::Sequence<sal_Int8>& rColor ) - { -#ifdef OSL_BIGENDIAN - const sal_Int8* pCols( rColor.getConstArray() ); - return ::Color( pCols[3], pCols[0], pCols[1], pCols[2] ); -#else - return ::Color( *reinterpret_cast< const ::ColorData* >(rColor.getConstArray()) ); -#endif - } - - uno::Sequence<sal_Int8> colorToStdIntSequence( const ::Color& rColor ) - { - uno::Sequence<sal_Int8> aRet(4); - sal_Int8* pCols( aRet.getArray() ); -#ifdef OSL_BIGENDIAN - pCols[0] = rColor.GetRed(); - pCols[1] = rColor.GetGreen(); - pCols[2] = rColor.GetBlue(); - pCols[3] = 255-rColor.GetTransparency(); -#else - *reinterpret_cast<sal_Int32*>(pCols) = rColor.GetColor(); -#endif - return aRet; - } - - // Create a corrected view transformation out of the give one, - // which ensures that the rectangle given by (0,0) and - // rSpriteSize is mapped with its left,top corner to (0,0) - // again. This is required to properly render sprite - // animations to buffer bitmaps. - ::basegfx::B2DHomMatrix& calcRectToOriginTransform( ::basegfx::B2DHomMatrix& o_transform, - const ::basegfx::B2DRange& i_srcRect, - const ::basegfx::B2DHomMatrix& i_transformation ) - { - if( i_srcRect.isEmpty() ) - return o_transform=i_transformation; - - // transform by given transformation - ::basegfx::B2DRectangle aTransformedRect; - - calcTransformedRectBounds( aTransformedRect, - i_srcRect, - i_transformation ); - - // now move resulting left,top point of bounds to (0,0) - const basegfx::B2DHomMatrix aCorrectedTransform(basegfx::tools::createTranslateB2DHomMatrix( - -aTransformedRect.getMinX(), -aTransformedRect.getMinY())); - - // prepend to original transformation - o_transform = aCorrectedTransform * i_transformation; - - return o_transform; - } - - ::basegfx::B2DRange& calcTransformedRectBounds( ::basegfx::B2DRange& outRect, - const ::basegfx::B2DRange& inRect, - const ::basegfx::B2DHomMatrix& transformation ) - { - outRect.reset(); - - if( inRect.isEmpty() ) - return outRect; - - // transform all four extremal points of the rectangle, - // take bounding rect of those. - - // transform left-top point - outRect.expand( transformation * inRect.getMinimum() ); - - // transform bottom-right point - outRect.expand( transformation * inRect.getMaximum() ); - - ::basegfx::B2DPoint aPoint; - - // transform top-right point - aPoint.setX( inRect.getMaxX() ); - aPoint.setY( inRect.getMinY() ); - - aPoint *= transformation; - outRect.expand( aPoint ); - - // transform bottom-left point - aPoint.setX( inRect.getMinX() ); - aPoint.setY( inRect.getMaxY() ); - - aPoint *= transformation; - outRect.expand( aPoint ); - - // over and out. - return outRect; - } - - ::basegfx::B2DHomMatrix& calcRectToRectTransform( ::basegfx::B2DHomMatrix& o_transform, - const ::basegfx::B2DRange& destRect, - const ::basegfx::B2DRange& srcRect, - const ::basegfx::B2DHomMatrix& transformation ) - { - if( srcRect.isEmpty() || - destRect.isEmpty() ) - { - return o_transform=transformation; - } - - // transform inputRect by transformation - ::basegfx::B2DRectangle aTransformedRect; - calcTransformedRectBounds( aTransformedRect, - srcRect, - transformation ); - - // now move resulting left,top point of bounds to (0,0) - basegfx::B2DHomMatrix aCorrectedTransform(basegfx::tools::createTranslateB2DHomMatrix( - -aTransformedRect.getMinX(), -aTransformedRect.getMinY())); - - // scale to match outRect - const double xDenom( aTransformedRect.getWidth() ); - const double yDenom( aTransformedRect.getHeight() ); - if( xDenom != 0.0 && yDenom != 0.0 ) - aCorrectedTransform.scale( destRect.getWidth() / xDenom, - destRect.getHeight() / yDenom ); - // TODO(E2): error handling - - // translate to final position - aCorrectedTransform.translate( destRect.getMinX(), - destRect.getMinY() ); - - ::basegfx::B2DHomMatrix transform( transformation ); - o_transform = aCorrectedTransform * transform; - - return o_transform; - } - - bool isInside( const ::basegfx::B2DRange& rContainedRect, - const ::basegfx::B2DRange& rTransformRect, - const ::basegfx::B2DHomMatrix& rTransformation ) - { - if( rContainedRect.isEmpty() || rTransformRect.isEmpty() ) - return false; - - ::basegfx::B2DPolygon aPoly( - ::basegfx::tools::createPolygonFromRect( rTransformRect ) ); - aPoly.transform( rTransformation ); - - return ::basegfx::tools::isInside( aPoly, - ::basegfx::tools::createPolygonFromRect( - rContainedRect ), - true ); - } - - namespace - { - bool clipAreaImpl( ::basegfx::B2IRange* o_pDestArea, - ::basegfx::B2IRange& io_rSourceArea, - ::basegfx::B2IPoint& io_rDestPoint, - const ::basegfx::B2IRange& rSourceBounds, - const ::basegfx::B2IRange& rDestBounds ) - { - const ::basegfx::B2IPoint aSourceTopLeft( - io_rSourceArea.getMinimum() ); - - ::basegfx::B2IRange aLocalSourceArea( io_rSourceArea ); - - // clip source area (which must be inside rSourceBounds) - aLocalSourceArea.intersect( rSourceBounds ); - - if( aLocalSourceArea.isEmpty() ) - return false; - - // calc relative new source area points (relative to orig - // source area) - const ::basegfx::B2IVector aUpperLeftOffset( - aLocalSourceArea.getMinimum()-aSourceTopLeft ); - const ::basegfx::B2IVector aLowerRightOffset( - aLocalSourceArea.getMaximum()-aSourceTopLeft ); - - ::basegfx::B2IRange aLocalDestArea( io_rDestPoint + aUpperLeftOffset, - io_rDestPoint + aLowerRightOffset ); - - // clip dest area (which must be inside rDestBounds) - aLocalDestArea.intersect( rDestBounds ); - - if( aLocalDestArea.isEmpty() ) - return false; - - // calc relative new dest area points (relative to orig - // source area) - const ::basegfx::B2IVector aDestUpperLeftOffset( - aLocalDestArea.getMinimum()-io_rDestPoint ); - const ::basegfx::B2IVector aDestLowerRightOffset( - aLocalDestArea.getMaximum()-io_rDestPoint ); - - io_rSourceArea = ::basegfx::B2IRange( aSourceTopLeft + aDestUpperLeftOffset, - aSourceTopLeft + aDestLowerRightOffset ); - io_rDestPoint = aLocalDestArea.getMinimum(); - - if( o_pDestArea ) - *o_pDestArea = aLocalDestArea; - - return true; - } - } - - bool clipScrollArea( ::basegfx::B2IRange& io_rSourceArea, - ::basegfx::B2IPoint& io_rDestPoint, - ::std::vector< ::basegfx::B2IRange >& o_ClippedAreas, - const ::basegfx::B2IRange& rBounds ) - { - ::basegfx::B2IRange aResultingDestArea; - - // compute full destination area (to determine uninitialized - // areas below) - const ::basegfx::B2I64Tuple& rRange( io_rSourceArea.getRange() ); - ::basegfx::B2IRange aInputDestArea( io_rDestPoint.getX(), - io_rDestPoint.getY(), - (io_rDestPoint.getX() - + static_cast<sal_Int32>(rRange.getX())), - (io_rDestPoint.getY() - + static_cast<sal_Int32>(rRange.getY())) ); - // limit to output area (no point updating outside of it) - aInputDestArea.intersect( rBounds ); - - // clip to rBounds - if( !clipAreaImpl( &aResultingDestArea, - io_rSourceArea, - io_rDestPoint, - rBounds, - rBounds ) ) - return false; - - // finally, compute all areas clipped off the total - // destination area. - ::basegfx::computeSetDifference( o_ClippedAreas, - aInputDestArea, - aResultingDestArea ); - - return true; - } - - bool clipBlit( ::basegfx::B2IRange& io_rSourceArea, - ::basegfx::B2IPoint& io_rDestPoint, - const ::basegfx::B2IRange& rSourceBounds, - const ::basegfx::B2IRange& rDestBounds ) - { - return clipAreaImpl( NULL, - io_rSourceArea, - io_rDestPoint, - rSourceBounds, - rDestBounds ); - } - - ::basegfx::B2IRange spritePixelAreaFromB2DRange( const ::basegfx::B2DRange& rRange ) - { - if( rRange.isEmpty() ) - return ::basegfx::B2IRange(); - - const ::basegfx::B2IPoint aTopLeft( ::basegfx::fround( rRange.getMinX() ), - ::basegfx::fround( rRange.getMinY() ) ); - return ::basegfx::B2IRange( aTopLeft, - aTopLeft + ::basegfx::B2IPoint( - ::basegfx::fround( rRange.getWidth() ), - ::basegfx::fround( rRange.getHeight() ) ) ); - } - - uno::Sequence< uno::Any >& getDeviceInfo( const uno::Reference< rendering::XCanvas >& i_rxCanvas, - uno::Sequence< uno::Any >& o_rxParams ) - { - o_rxParams.realloc( 0 ); - - if( i_rxCanvas.is() ) - { - try - { - uno::Reference< rendering::XGraphicDevice > xDevice( i_rxCanvas->getDevice(), - uno::UNO_QUERY_THROW ); - - uno::Reference< lang::XServiceInfo > xServiceInfo( xDevice, - uno::UNO_QUERY_THROW ); - uno::Reference< beans::XPropertySet > xPropSet( xDevice, - uno::UNO_QUERY_THROW ); - - o_rxParams.realloc( 2 ); - - o_rxParams[ 0 ] = uno::makeAny( xServiceInfo->getImplementationName() ); - o_rxParams[ 1 ] = uno::makeAny( xPropSet->getPropertyValue( - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("DeviceHandle") ) ) ); - } - catch( uno::Exception& ) - { - // ignore, but return empty sequence - } - } - - return o_rxParams; - } - - awt::Rectangle getAbsoluteWindowRect( const awt::Rectangle& rRect, - const uno::Reference< awt::XWindow2 >& xWin ) - { - awt::Rectangle aRetVal( rRect ); - - ::Window* pWindow = VCLUnoHelper::GetWindow(xWin); - if( pWindow ) - { - ::Point aPoint( aRetVal.X, - aRetVal.Y ); - - aPoint = pWindow->OutputToScreenPixel( aPoint ); - - aRetVal.X = aPoint.X(); - aRetVal.Y = aPoint.Y(); - } - - return aRetVal; - } - - ::basegfx::B2DPolyPolygon getBoundMarksPolyPolygon( const ::basegfx::B2DRange& rRange ) - { - ::basegfx::B2DPolyPolygon aPolyPoly; - ::basegfx::B2DPolygon aPoly; - - const double nX0( rRange.getMinX() ); - const double nY0( rRange.getMinY() ); - const double nX1( rRange.getMaxX() ); - const double nY1( rRange.getMaxY() ); - - aPoly.append( ::basegfx::B2DPoint( nX0+4, - nY0 ) ); - aPoly.append( ::basegfx::B2DPoint( nX0, - nY0 ) ); - aPoly.append( ::basegfx::B2DPoint( nX0, - nY0+4 ) ); - aPolyPoly.append( aPoly ); aPoly.clear(); - - aPoly.append( ::basegfx::B2DPoint( nX1-4, - nY0 ) ); - aPoly.append( ::basegfx::B2DPoint( nX1, - nY0 ) ); - aPoly.append( ::basegfx::B2DPoint( nX1, - nY0+4 ) ); - aPolyPoly.append( aPoly ); aPoly.clear(); - - aPoly.append( ::basegfx::B2DPoint( nX0+4, - nY1 ) ); - aPoly.append( ::basegfx::B2DPoint( nX0, - nY1 ) ); - aPoly.append( ::basegfx::B2DPoint( nX0, - nY1-4 ) ); - aPolyPoly.append( aPoly ); aPoly.clear(); - - aPoly.append( ::basegfx::B2DPoint( nX1-4, - nY1 ) ); - aPoly.append( ::basegfx::B2DPoint( nX1, - nY1 ) ); - aPoly.append( ::basegfx::B2DPoint( nX1, - nY1-4 ) ); - aPolyPoly.append( aPoly ); - - return aPolyPoly; - } - - int calcGradientStepCount( ::basegfx::B2DHomMatrix& rTotalTransform, - const rendering::ViewState& viewState, - const rendering::RenderState& renderState, - const rendering::Texture& texture, - int nColorSteps ) - { - // calculate overall texture transformation (directly from - // texture to device space). - ::basegfx::B2DHomMatrix aMatrix; - - rTotalTransform.identity(); - ::basegfx::unotools::homMatrixFromAffineMatrix( rTotalTransform, - texture.AffineTransform ); - ::canvas::tools::mergeViewAndRenderTransform(aMatrix, - viewState, - renderState); - rTotalTransform *= aMatrix; // prepend total view/render transformation - - // determine size of gradient in device coordinate system - // (to e.g. determine sensible number of gradient steps) - ::basegfx::B2DPoint aLeftTop( 0.0, 0.0 ); - ::basegfx::B2DPoint aLeftBottom( 0.0, 1.0 ); - ::basegfx::B2DPoint aRightTop( 1.0, 0.0 ); - ::basegfx::B2DPoint aRightBottom( 1.0, 1.0 ); - - aLeftTop *= rTotalTransform; - aLeftBottom *= rTotalTransform; - aRightTop *= rTotalTransform; - aRightBottom*= rTotalTransform; - - // longest line in gradient bound rect - const int nGradientSize( - static_cast<int>( - ::std::max( - ::basegfx::B2DVector(aRightBottom-aLeftTop).getLength(), - ::basegfx::B2DVector(aRightTop-aLeftBottom).getLength() ) + 1.0 ) ); - - // typical number for pixel of the same color (strip size) - const int nStripSize( nGradientSize < 50 ? 2 : 4 ); - - // use at least three steps, and at utmost the number of color - // steps - return ::std::max( 3, - ::std::min( - nGradientSize / nStripSize, - nColorSteps ) ); - } - - } // namespace tools - -} // namespace canvas - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/canvas/source/tools/canvastools.flt b/canvas/source/tools/canvastools.flt deleted file mode 100644 index 67e713474b..0000000000 --- a/canvas/source/tools/canvastools.flt +++ /dev/null @@ -1,3 +0,0 @@ -__CT -__real -internal diff --git a/canvas/source/tools/elapsedtime.cxx b/canvas/source/tools/elapsedtime.cxx deleted file mode 100644 index b39ccb9914..0000000000 --- a/canvas/source/tools/elapsedtime.cxx +++ /dev/null @@ -1,227 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * 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_canvas.hxx" - -#include "osl/time.h" -#include "osl/diagnose.h" -#include "canvas/elapsedtime.hxx" - -#if defined(WNT) - -#if defined _MSC_VER -#pragma warning(push,1) -#endif - -// TEMP!!! -// Awaiting corresponding functionality in OSL -// -#define WIN32_LEAN_AND_MEAN -#include <windows.h> -#include <winbase.h> -#include <mmsystem.h> -#endif - -#if defined _MSC_VER -#pragma warning(pop) -#endif - -#include <algorithm> -#include <limits> - -namespace canvas { -namespace tools { - - -#if defined(WNT) -// TODO(Q2): is 0 okay for the failure case here? -double ElapsedTime::getSystemTime() -{ - // TEMP!!! - // Awaiting corresponding functionality in OSL - // - - // is there a performance counter available? - static bool bTimeSetupDone( false ); - static bool bPerfTimerAvailable( false ); - static LONGLONG nPerfCountFreq; - - // TODO(F1): This _might_ cause problems, as it prevents correct - // time handling for very long lifetimes of this class's - // surrounding component in memory. When the difference between - // current sys time and nInitialCount exceeds IEEE double's - // mantissa, time will start to run jerky. - static LONGLONG nInitialCount; - - if( !bTimeSetupDone ) - { - if( QueryPerformanceFrequency( - reinterpret_cast<LARGE_INTEGER *>(&nPerfCountFreq) ) ) - { - // read initial time: - QueryPerformanceCounter( - reinterpret_cast<LARGE_INTEGER *>(&nInitialCount) ); - bPerfTimerAvailable = true; - } - bTimeSetupDone = true; - } - - if( bPerfTimerAvailable ) - { - LONGLONG nCurrCount; - QueryPerformanceCounter( - reinterpret_cast<LARGE_INTEGER *>(&nCurrCount) ); - nCurrCount -= nInitialCount; - return double(nCurrCount) / nPerfCountFreq; - } - else - { - LONGLONG nCurrTime = timeGetTime(); - return double(nCurrTime) / 1000.0; - } -} - -#else // ! WNT - -// TODO(Q2): is 0 okay for the failure case here? -double ElapsedTime::getSystemTime() -{ - TimeValue aTimeVal; - if( osl_getSystemTime( &aTimeVal ) ) - return ((aTimeVal.Nanosec * 10e-10) + aTimeVal.Seconds); - else - return 0.0; -} - -#endif - -ElapsedTime::ElapsedTime() - : m_pTimeBase(), - m_fLastQueriedTime( 0.0 ), - m_fStartTime( getSystemTime() ), - m_fFrozenTime( 0.0 ), - m_bInPauseMode( false ), - m_bInHoldMode( false ) -{ -} - -ElapsedTime::ElapsedTime( - boost::shared_ptr<ElapsedTime> const & pTimeBase ) - : m_pTimeBase( pTimeBase ), - m_fLastQueriedTime( 0.0 ), - m_fStartTime( getCurrentTime() ), - m_fFrozenTime( 0.0 ), - m_bInPauseMode( false ), - m_bInHoldMode( false ) -{ -} - -boost::shared_ptr<ElapsedTime> const & ElapsedTime::getTimeBase() const -{ - return m_pTimeBase; -} - -void ElapsedTime::reset() -{ - m_fLastQueriedTime = 0.0; - m_fStartTime = getCurrentTime(); - m_fFrozenTime = 0.0; - m_bInPauseMode = false; - m_bInHoldMode = false; -} - -void ElapsedTime::adjustTimer( double fOffset, bool /*bLimitToLastQueriedTime*/ ) -{ - // to make getElapsedTime() become _larger_, have to reduce - // m_fStartTime. - m_fStartTime -= fOffset; - - // also adjust frozen time, this method must _always_ affect the - // value returned by getElapsedTime()! - if (m_bInHoldMode || m_bInPauseMode) - m_fFrozenTime += fOffset; -} - -double ElapsedTime::getCurrentTime() const -{ - return m_pTimeBase.get() == 0 - ? getSystemTime() : m_pTimeBase->getElapsedTimeImpl(); -} - -double ElapsedTime::getElapsedTime() const -{ - m_fLastQueriedTime = getElapsedTimeImpl(); - return m_fLastQueriedTime; -} - -double ElapsedTime::getElapsedTimeImpl() const -{ - if (m_bInHoldMode || m_bInPauseMode) - return m_fFrozenTime; - - return getCurrentTime() - m_fStartTime; -} - -void ElapsedTime::pauseTimer() -{ - m_fFrozenTime = getElapsedTimeImpl(); - m_bInPauseMode = true; -} - -void ElapsedTime::continueTimer() -{ - m_bInPauseMode = false; - - // stop pausing, time runs again. Note that - // getElapsedTimeImpl() honors hold mode, i.e. a - // continueTimer() in hold mode will preserve the latter - const double fPauseDuration( getElapsedTimeImpl() - m_fFrozenTime ); - - // adjust start time, such that subsequent getElapsedTime() calls - // will virtually start from m_fFrozenTime. - m_fStartTime += fPauseDuration; -} - -void ElapsedTime::holdTimer() -{ - // when called during hold mode (e.g. more than once per time - // object), the original hold time will be maintained. - m_fFrozenTime = getElapsedTimeImpl(); - m_bInHoldMode = true; -} - -void ElapsedTime::releaseTimer() -{ - m_bInHoldMode = false; -} - -} // namespace tools -} // namespace canvas - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/canvas/source/tools/imagecachedprimitive.hxx b/canvas/source/tools/imagecachedprimitive.hxx deleted file mode 100644 index 23cab7ce83..0000000000 --- a/canvas/source/tools/imagecachedprimitive.hxx +++ /dev/null @@ -1,60 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * 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. - * - ************************************************************************/ - -#ifndef INCLUDED_CANVAS_IMAGECACHEDPRIMITIVE_HXX -#define INCLUDED_CANVAS_IMAGECACHEDPRIMITIVE_HXX - -#include <canvas/rendering/icachedprimitive.hxx> - -#include <boost/shared_ptr.hpp> - - -namespace canvas -{ - /** Objects with this interface are returned from every Image - render operation. - - These objects can be used to implement the - rendering::XCachedPrimitive interface, which in turn caches - render state and objects to facilitate quick redraws. - - Derived from ICachedPrimitive, to add the setImage() method - (which, strictly speaking, is a technicality, because Image - cannot create objects with a shared_ptr to itself). - */ - struct ImageCachedPrimitive : public ICachedPrimitive - { - virtual void setImage( const ::boost::shared_ptr< class Image >& rTargetImage ) = 0; - }; - - typedef ::boost::shared_ptr< ImageCachedPrimitive > ImageCachedPrimitiveSharedPtr; -} - -#endif /* INCLUDED_CANVAS_IMAGECACHEDPRIMITIVE_HXX */ - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/canvas/source/tools/page.cxx b/canvas/source/tools/page.cxx deleted file mode 100644 index 7d85e41978..0000000000 --- a/canvas/source/tools/page.cxx +++ /dev/null @@ -1,155 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * 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_canvas.hxx" - -#include <boost/bind.hpp> -#include "page.hxx" - -namespace canvas -{ - Page::Page( const IRenderModuleSharedPtr &rRenderModule ) : - mpRenderModule(rRenderModule), - mpSurface(rRenderModule->createSurface(::basegfx::B2ISize())) - { - } - - void Page::validate() - { - if(!(isValid())) - { - ::std::for_each( mpFragments.begin(), - mpFragments.end(), - ::boost::mem_fn(&PageFragment::refresh)); - } - } - - bool Page::isValid() const - { - return mpSurface && mpSurface->isValid(); - } - - FragmentSharedPtr Page::allocateSpace( const ::basegfx::B2ISize& rSize ) - { - SurfaceRect rect(rSize); - if(insert(rect)) - { - FragmentSharedPtr pFragment(new PageFragment(rect,this)); - mpFragments.push_back(pFragment); - return pFragment; - } - - return FragmentSharedPtr(); - } - - bool Page::nakedFragment( const FragmentSharedPtr& pFragment ) - { - SurfaceRect rect(pFragment->getSize()); - if(insert(rect)) - { - pFragment->setPage(this); - mpFragments.push_back(pFragment); - return true; - } - - return false; - } - - void Page::free( const FragmentSharedPtr& pFragment ) - { - // the fragment passes as argument is no longer - // dedicated to this page. either it is about to - // be relocated to some other page or it will - // currently be deleted. in either case, simply - // remove the reference from our internal storage. - FragmentContainer_t::iterator it( - std::remove( - mpFragments.begin(),mpFragments.end(),pFragment)); - mpFragments.erase(it,mpFragments.end()); - } - - bool Page::insert( SurfaceRect& r ) - { - const FragmentContainer_t::const_iterator aEnd(mpFragments.end()); - FragmentContainer_t::const_iterator it(mpFragments.begin()); - while(it != aEnd) - { - const SurfaceRect &rect = (*it)->getRect(); - const sal_Int32 x = rect.maPos.getX(); - const sal_Int32 y = rect.maPos.getY(); - // to avoid interpolation artifacts from other textures, - // one pixel gap between them - const sal_Int32 w = rect.maSize.getX()+1; - const sal_Int32 h = rect.maSize.getY()+1; - - // probe location to the right - r.maPos.setX(x+w); - r.maPos.setY(y); - if(isValidLocation(r)) - return true; - - // probe location at bottom - r.maPos.setX(x); - r.maPos.setY(y+h); - if(isValidLocation(r)) - return true; - - ++it; - } - - r.maPos.setX(0); - r.maPos.setY(0); - - return isValidLocation(r); - } - - bool Page::isValidLocation( const SurfaceRect& r ) const - { - // the rectangle passed as argument has a valid - // location if and only if there's no intersection - // with existing areas. - SurfaceRect aBoundary(mpRenderModule->getPageSize()-basegfx::B2IVector(1,1)); - if( !r.inside(aBoundary) ) - return false; - - const FragmentContainer_t::const_iterator aEnd(mpFragments.end()); - FragmentContainer_t::const_iterator it(mpFragments.begin()); - while(it != aEnd) - { - if(r.intersection((*it)->getRect())) - return false; - - ++it; - } - - return true; - } -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/canvas/source/tools/page.hxx b/canvas/source/tools/page.hxx deleted file mode 100644 index bef9684da5..0000000000 --- a/canvas/source/tools/page.hxx +++ /dev/null @@ -1,160 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * 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. - * - ************************************************************************/ - -#ifndef INCLUDED_CANVAS_PAGE_HXX -#define INCLUDED_CANVAS_PAGE_HXX - -#include <basegfx/vector/b2isize.hxx> -#include <basegfx/range/b2irectangle.hxx> -#include <canvas/rendering/icolorbuffer.hxx> -#include <canvas/rendering/irendermodule.hxx> -#include <canvas/rendering/isurface.hxx> - -#include <list> -#include <vector> -#include <boost/shared_ptr.hpp> -#include "surfacerect.hxx" - -namespace canvas -{ - class PageFragment; - - typedef ::boost::shared_ptr< PageFragment > FragmentSharedPtr; - - /** One page of IRenderModule-provided texture space - */ - class Page - { - public: - Page( const IRenderModuleSharedPtr& rRenderModule ); - - FragmentSharedPtr allocateSpace( const ::basegfx::B2ISize& rSize ); - bool nakedFragment( const FragmentSharedPtr& pFragment ); - void free( const FragmentSharedPtr& pFragment ); - const ISurfaceSharedPtr& getSurface() const { return mpSurface; } - bool isValid() const; - void validate(); - - private: - typedef std::list<FragmentSharedPtr> FragmentContainer_t; - - IRenderModuleSharedPtr mpRenderModule; - ISurfaceSharedPtr mpSurface; - FragmentContainer_t mpFragments; - - bool insert( SurfaceRect& r ); - bool isValidLocation( const SurfaceRect& r ) const; - }; - - typedef ::boost::shared_ptr< Page > PageSharedPtr; - - - /** A part of a page, which gets allocated to a surface - */ - class PageFragment - { - public: - PageFragment( const SurfaceRect& r, - Page* pPage ) : - mpPage(pPage), - maRect(r), - mpBuffer(), - maSourceOffset() - { - } - - /// Creates a 'naked' fragment. - PageFragment( const ::basegfx::B2ISize& rSize ) : - mpPage(NULL), - maRect(rSize), - mpBuffer(), - maSourceOffset() - { - } - - bool isNaked() const { return (mpPage == NULL); } - const SurfaceRect& getRect() const { return maRect; } - const ::basegfx::B2IPoint& getPos() const { return maRect.maPos; } - const ::basegfx::B2ISize& getSize() const { return maRect.maSize; } - void setColorBuffer( const IColorBufferSharedPtr& pColorBuffer ) { mpBuffer=pColorBuffer; } - void setSourceOffset( const ::basegfx::B2IPoint& rOffset ) { maSourceOffset=rOffset; } - void setPage( Page* pPage ) { mpPage=pPage; } - - void free( const FragmentSharedPtr& pFragment ) - { - if(mpPage) - mpPage->free(pFragment); - - mpPage=NULL; - } - - bool select( bool bRefresh ) - { - // request was made to select this fragment, - // but this fragment has not been located on any - // of the available pages, we need to hurry now. - if(!(mpPage)) - return false; - - ISurfaceSharedPtr pSurface(mpPage->getSurface()); - - // select this surface before wiping the contents - // since a specific implementation could trigger - // a rendering operation here... - if(!(pSurface->selectTexture())) - return false; - - // call refresh() if requested, otherwise we're up to date... - return bRefresh ? refresh() : true; - } - - bool refresh() - { - if(!(mpPage)) - return false; - - ISurfaceSharedPtr pSurface(mpPage->getSurface()); - - return pSurface->update( maRect.maPos, - ::basegfx::B2IRectangle( - maSourceOffset, - maSourceOffset + maRect.maSize ), - *mpBuffer ); - } - - private: - Page* mpPage; - SurfaceRect maRect; - IColorBufferSharedPtr mpBuffer; - ::basegfx::B2IPoint maSourceOffset; - }; -} - -#endif - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/canvas/source/tools/pagemanager.cxx b/canvas/source/tools/pagemanager.cxx deleted file mode 100644 index b37c578e19..0000000000 --- a/canvas/source/tools/pagemanager.cxx +++ /dev/null @@ -1,225 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * 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_canvas.hxx" - -#include <boost/bind.hpp> -#include "pagemanager.hxx" - -namespace canvas -{ - - ////////////////////////////////////////////////////////////////////////////////// - // PageManager - ////////////////////////////////////////////////////////////////////////////////// - - ////////////////////////////////////////////////////////////////////////////////// - // PageManager::allocateSpace - ////////////////////////////////////////////////////////////////////////////////// - - FragmentSharedPtr PageManager::allocateSpace( const ::basegfx::B2ISize& rSize ) - { - // we are asked to find a location for the requested size. - // first we try to satisfy the request from the - // remaining space in the existing pages. - const PageContainer_t::iterator aEnd(maPages.end()); - PageContainer_t::iterator it(maPages.begin()); - while(it != aEnd) - { - FragmentSharedPtr pFragment((*it)->allocateSpace(rSize)); - if(pFragment) - { - // the page created a new fragment, since we maybe want - // to consolidate sparse pages we keep a reference to - // the fragment. - maFragments.push_back(pFragment); - return pFragment; - } - - ++it; - } - - // otherwise try to create a new page and allocate space there... - PageSharedPtr pPage(new Page(mpRenderModule)); - if(pPage->isValid()) - { - maPages.push_back(pPage); - FragmentSharedPtr pFragment(pPage->allocateSpace(rSize)); - if (pFragment) - maFragments.push_back(pFragment); - return pFragment; - } - - // the rendermodule failed to create a new page [maybe out - // of videomemory], and all other pages could not take - // the new request. we decide to create a 'naked' fragment - // which will receive its location later. - FragmentSharedPtr pFragment(new PageFragment(rSize)); - maFragments.push_back(pFragment); - return pFragment; - } - - ////////////////////////////////////////////////////////////////////////////////// - // PageManager::free - ////////////////////////////////////////////////////////////////////////////////// - - void PageManager::free( const FragmentSharedPtr& pFragment ) - { - // erase the reference to the given fragment from our - // internal container. - FragmentContainer_t::iterator it( - std::remove( - maFragments.begin(),maFragments.end(),pFragment)); - maFragments.erase(it,maFragments.end()); - - // let the fragment itself know about it... - // we need to pass 'this' as argument since the fragment - // needs to pass this to the page and can't create - // shared_ptr from itself... - pFragment->free(pFragment); - } - - ////////////////////////////////////////////////////////////////////////////////// - // PageManager::nakedFragment - ////////////////////////////////////////////////////////////////////////////////// - - void PageManager::nakedFragment( const FragmentSharedPtr& pFragment ) - { - if(maPages.empty()) - return; - - // okay, one last chance is left, we try all available - // pages again. maybe some other fragment was deleted - // and we can exploit the space. - while(!(relocate(pFragment))) - { - // no way, we need to free up some space... - // TODO(F1): this is a heuristic, could - // be designed as a policy. - const FragmentContainer_t::const_iterator aEnd(maFragments.end()); - FragmentContainer_t::const_iterator candidate(maFragments.begin()); - while(candidate != aEnd) - { - if(*candidate && !((*candidate)->isNaked())) - break; - ++candidate; - } - - if (candidate != aEnd) - { - const ::basegfx::B2ISize& rSize((*candidate)->getSize()); - sal_uInt32 nMaxArea(rSize.getX()*rSize.getY()); - - FragmentContainer_t::const_iterator it(candidate); - while(it != aEnd) - { - if (*it && !((*it)->isNaked())) - { - const ::basegfx::B2ISize& rCandidateSize((*it)->getSize()); - const sal_uInt32 nArea(rCandidateSize.getX()*rCandidateSize.getY()); - if(nArea > nMaxArea) - { - candidate=it; - nMaxArea=nArea; - } - } - - ++it; - } - - // this does not erase the candidate, - // but makes it 'naked'... - (*candidate)->free(*candidate); - } - else - break; - } - } - - ////////////////////////////////////////////////////////////////////////////////// - // PageManager::relocate - ////////////////////////////////////////////////////////////////////////////////// - - bool PageManager::relocate( const FragmentSharedPtr& pFragment ) - { - // the fragment passed as argument is assumed to - // be naked, that is it is not located on any page. - // we try all available pages again, maybe some - // other fragment was deleted and we can exploit the space. - const PageContainer_t::iterator aEnd(maPages.end()); - PageContainer_t::iterator it(maPages.begin()); - while(it != aEnd) - { - // if the page at hand takes the fragment, we immediatelly - // call select() to pull the information from the associated - // image to the hardware surface. - if((*it)->nakedFragment(pFragment)) - { - // dirty, since newly allocated. - pFragment->select(true); - return true; - } - - ++it; - } - - return false; - } - - ////////////////////////////////////////////////////////////////////////////////// - // PageManager::validatePages - ////////////////////////////////////////////////////////////////////////////////// - - void PageManager::validatePages() - { - ::std::for_each( maPages.begin(), - maPages.end(), - ::boost::mem_fn(&Page::validate)); - } - - ////////////////////////////////////////////////////////////////////////////////// - // PageManager::getPageSize - ////////////////////////////////////////////////////////////////////////////////// - - ::basegfx::B2ISize PageManager::getPageSize() const - { - return mpRenderModule->getPageSize(); - } - - ////////////////////////////////////////////////////////////////////////////////// - // PageManager::getRenderModule - ////////////////////////////////////////////////////////////////////////////////// - - canvas::IRenderModuleSharedPtr PageManager::getRenderModule() const - { - return mpRenderModule; - } -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/canvas/source/tools/pagemanager.hxx b/canvas/source/tools/pagemanager.hxx deleted file mode 100644 index f82a8e339a..0000000000 --- a/canvas/source/tools/pagemanager.hxx +++ /dev/null @@ -1,97 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * 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. - * - ************************************************************************/ - -#ifndef INCLUDED_CANVAS_PAGEMANAGER_HXX -#define INCLUDED_CANVAS_PAGEMANAGER_HXX - -#include <basegfx/vector/b2isize.hxx> -#include <canvas/rendering/irendermodule.hxx> -#include <canvas/rendering/isurface.hxx> - -#include "page.hxx" - -namespace canvas -{ - - ////////////////////////////////////////////////////////////////////////////////// - // PageManager - ////////////////////////////////////////////////////////////////////////////////// - - class PageManager - { - public: - PageManager( const canvas::IRenderModuleSharedPtr pRenderModule ) : - mpRenderModule(pRenderModule) - { - } - - // returns the maximum size of a hardware - // accelerated page, e.g. OpenGL texture. - ::basegfx::B2ISize getPageSize() const; - - canvas::IRenderModuleSharedPtr getRenderModule() const; - - FragmentSharedPtr allocateSpace( const ::basegfx::B2ISize& rSize ); - void free( const FragmentSharedPtr& pFragment ); - - void nakedFragment( const FragmentSharedPtr& pFragment ); - - void validatePages(); - - private: - // the pagemanager needs access to the rendermodule - // since we query for system resources from it. - canvas::IRenderModuleSharedPtr mpRenderModule; - - // here we collect all fragments that will be created - // since we need them for relocation purposes. - typedef std::list<FragmentSharedPtr> FragmentContainer_t; - FragmentContainer_t maFragments; - - // this is the container holding all created pages, - // behind the scenes these are real hardware surfaces. - typedef std::list<PageSharedPtr> PageContainer_t; - PageContainer_t maPages; - - bool relocate( const FragmentSharedPtr& pFragment ); - }; - - ////////////////////////////////////////////////////////////////////////////////// - // PageManagerSharedPtr - ////////////////////////////////////////////////////////////////////////////////// - - typedef ::boost::shared_ptr< PageManager > PageManagerSharedPtr; - - ////////////////////////////////////////////////////////////////////////////////// - // End of file - ////////////////////////////////////////////////////////////////////////////////// -} - -#endif - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/canvas/source/tools/parametricpolypolygon.cxx b/canvas/source/tools/parametricpolypolygon.cxx deleted file mode 100644 index 02fa26245d..0000000000 --- a/canvas/source/tools/parametricpolypolygon.cxx +++ /dev/null @@ -1,293 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * 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_canvas.hxx" - -#include <canvas/debug.hxx> -#include <canvas/canvastools.hxx> - -#include <rtl/math.hxx> - -#include <basegfx/matrix/b2dhommatrix.hxx> -#include <basegfx/polygon/b2dpolygontools.hxx> -#include <basegfx/point/b2dpoint.hxx> -#include <basegfx/range/b2drectangle.hxx> -#include <basegfx/tools/canvastools.hxx> -#include <basegfx/numeric/ftools.hxx> -#include <basegfx/tools/tools.hxx> - -#include <limits> - -#include <canvas/parametricpolypolygon.hxx> - - -using namespace ::com::sun::star; - -namespace canvas -{ - uno::Sequence<rtl::OUString> ParametricPolyPolygon::getAvailableServiceNames() - { - uno::Sequence<rtl::OUString> aRet(3); - aRet[0] = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "LinearGradient" )); - aRet[1] = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "EllipticalGradient" )); - aRet[2] = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "RectangularGradient" )); - - return aRet; - } - - ParametricPolyPolygon* ParametricPolyPolygon::create( - const uno::Reference< rendering::XGraphicDevice >& rDevice, - const ::rtl::OUString& rServiceName, - const uno::Sequence< uno::Any >& rArgs ) - { - uno::Sequence< uno::Sequence< double > > colorSequence(2); - uno::Sequence< double > colorStops(2); - double fAspectRatio=1.0; - - // defaults - uno::Sequence< rendering::RGBColor > rgbColors(1); - rgbColors[0] = rendering::RGBColor(0,0,0); - colorSequence[0] = rDevice->getDeviceColorSpace()->convertFromRGB(rgbColors); - rgbColors[0] = rendering::RGBColor(1,1,1); - colorSequence[1] = rDevice->getDeviceColorSpace()->convertFromRGB(rgbColors); - colorStops[0] = 0; - colorStops[1] = 1; - - // extract args - for( sal_Int32 i=0; i<rArgs.getLength(); ++i ) - { - beans::PropertyValue aProp; - if( (rArgs[i] >>= aProp) ) - { - if( aProp.Name.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("Colors")) ) - { - aProp.Value >>= colorSequence; - } - else if( aProp.Name.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("Stops")) ) - { - aProp.Value >>= colorStops; - } - else if( aProp.Name.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("AspectRatio")) ) - { - aProp.Value >>= fAspectRatio; - } - } - } - - if( rServiceName.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("LinearGradient")) ) - { - return createLinearHorizontalGradient(rDevice, colorSequence, colorStops); - } - else if( rServiceName.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("EllipticalGradient")) ) - { - return createEllipticalGradient(rDevice, colorSequence, colorStops, fAspectRatio); - } - else if( rServiceName.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("RectangularGradient")) ) - { - return createRectangularGradient(rDevice, colorSequence, colorStops, fAspectRatio); - } - else if( rServiceName.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("VerticalLineHatch")) ) - { - // TODO: NYI - } - else if( rServiceName.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("OrthogonalLinesHatch")) ) - { - // TODO: NYI - } - else if( rServiceName.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("ThreeCrossingLinesHatch")) ) - { - // TODO: NYI - } - else if( rServiceName.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("FourCrossingLinesHatch")) ) - { - // TODO: NYI - } - - return NULL; - } - - ParametricPolyPolygon* ParametricPolyPolygon::createLinearHorizontalGradient( - const uno::Reference< rendering::XGraphicDevice >& rDevice, - const uno::Sequence< uno::Sequence< double > >& colors, - const uno::Sequence< double >& stops ) - { - // TODO(P2): hold gradient brush statically, and only setup - // the colors - return new ParametricPolyPolygon( rDevice, GRADIENT_LINEAR, colors, stops ); - } - - ParametricPolyPolygon* ParametricPolyPolygon::createEllipticalGradient( - const uno::Reference< rendering::XGraphicDevice >& rDevice, - const uno::Sequence< uno::Sequence< double > >& colors, - const uno::Sequence< double >& stops, - double fAspectRatio ) - { - // TODO(P2): hold gradient polygon statically, and only setup - // the colors - return new ParametricPolyPolygon( - rDevice, - ::basegfx::tools::createPolygonFromCircle( - ::basegfx::B2DPoint(0,0), 1 ), - GRADIENT_ELLIPTICAL, - colors, stops, fAspectRatio ); - } - - ParametricPolyPolygon* ParametricPolyPolygon::createRectangularGradient( const uno::Reference< rendering::XGraphicDevice >& rDevice, - const uno::Sequence< uno::Sequence< double > >& colors, - const uno::Sequence< double >& stops, - double fAspectRatio ) - { - // TODO(P2): hold gradient polygon statically, and only setup - // the colors - return new ParametricPolyPolygon( - rDevice, - ::basegfx::tools::createPolygonFromRect( - ::basegfx::B2DRectangle( -1, -1, 1, 1 ) ), - GRADIENT_RECTANGULAR, - colors, stops, fAspectRatio ); - } - - void SAL_CALL ParametricPolyPolygon::disposing() - { - ::osl::MutexGuard aGuard( m_aMutex ); - - mxDevice.clear(); - } - - uno::Reference< rendering::XPolyPolygon2D > SAL_CALL ParametricPolyPolygon::getOutline( double /*t*/ ) throw (lang::IllegalArgumentException, uno::RuntimeException) - { - ::osl::MutexGuard aGuard( m_aMutex ); - - // TODO(F1): outline NYI - return uno::Reference< rendering::XPolyPolygon2D >(); - } - - uno::Sequence< double > SAL_CALL ParametricPolyPolygon::getColor( double /*t*/ ) throw (lang::IllegalArgumentException, uno::RuntimeException) - { - ::osl::MutexGuard aGuard( m_aMutex ); - - // TODO(F1): color NYI - return uno::Sequence< double >(); - } - - uno::Sequence< double > SAL_CALL ParametricPolyPolygon::getPointColor( const geometry::RealPoint2D& /*point*/ ) throw (lang::IllegalArgumentException, uno::RuntimeException) - { - ::osl::MutexGuard aGuard( m_aMutex ); - - // TODO(F1): point color NYI - return uno::Sequence< double >(); - } - - uno::Reference< rendering::XColorSpace > SAL_CALL ParametricPolyPolygon::getColorSpace() throw (uno::RuntimeException) - { - ::osl::MutexGuard aGuard( m_aMutex ); - - return mxDevice.is() ? mxDevice->getDeviceColorSpace() : uno::Reference< rendering::XColorSpace >(); - } - -#define IMPLEMENTATION_NAME "Canvas::ParametricPolyPolygon" -#define SERVICE_NAME "com.sun.star.rendering.ParametricPolyPolygon" - - ::rtl::OUString SAL_CALL ParametricPolyPolygon::getImplementationName( ) throw (uno::RuntimeException) - { - return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( IMPLEMENTATION_NAME ) ); - } - - sal_Bool SAL_CALL ParametricPolyPolygon::supportsService( const ::rtl::OUString& ServiceName ) throw (uno::RuntimeException) - { - return ServiceName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM ( SERVICE_NAME ) ); - } - - uno::Sequence< ::rtl::OUString > SAL_CALL ParametricPolyPolygon::getSupportedServiceNames( ) throw (uno::RuntimeException) - { - uno::Sequence< ::rtl::OUString > aRet(1); - aRet[0] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM ( SERVICE_NAME ) ); - - return aRet; - } - - ParametricPolyPolygon::~ParametricPolyPolygon() - { - } - - ParametricPolyPolygon::ParametricPolyPolygon( const uno::Reference< rendering::XGraphicDevice >& rDevice, - const ::basegfx::B2DPolygon& rGradientPoly, - GradientType eType, - const uno::Sequence< uno::Sequence< double > >& rColors, - const uno::Sequence< double >& rStops ) : - ParametricPolyPolygon_Base( m_aMutex ), - mxDevice( rDevice ), - maValues( rGradientPoly, - rColors, - rStops, - 1.0, - eType ) - { - } - - ParametricPolyPolygon::ParametricPolyPolygon( const uno::Reference< rendering::XGraphicDevice >& rDevice, - const ::basegfx::B2DPolygon& rGradientPoly, - GradientType eType, - const uno::Sequence< uno::Sequence< double > >& rColors, - const uno::Sequence< double >& rStops, - double nAspectRatio ) : - ParametricPolyPolygon_Base( m_aMutex ), - mxDevice( rDevice ), - maValues( rGradientPoly, - rColors, - rStops, - nAspectRatio, - eType ) - { - } - - ParametricPolyPolygon::ParametricPolyPolygon( const uno::Reference< rendering::XGraphicDevice >& rDevice, - GradientType eType, - const uno::Sequence< uno::Sequence< double > >& rColors, - const uno::Sequence< double >& rStops ) : - ParametricPolyPolygon_Base( m_aMutex ), - mxDevice( rDevice ), - maValues( ::basegfx::B2DPolygon(), - rColors, - rStops, - 1.0, - eType ) - { - } - - ParametricPolyPolygon::Values ParametricPolyPolygon::getValues() const - { - ::osl::MutexGuard aGuard( m_aMutex ); - - return maValues; - } - -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/canvas/source/tools/prioritybooster.cxx b/canvas/source/tools/prioritybooster.cxx deleted file mode 100644 index eab632663a..0000000000 --- a/canvas/source/tools/prioritybooster.cxx +++ /dev/null @@ -1,85 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * 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_canvas.hxx" - - -#ifdef WNT -# if defined _MSC_VER -# pragma warning(push,1) -# endif - -# include <windows.h> - -# if defined _MSC_VER -# pragma warning(pop) -# endif -#endif - -#include "osl/diagnose.h" -#include "canvas/prioritybooster.hxx" - - -namespace canvas -{ - namespace tools - { - struct PriorityBooster_Impl - { - int mnOldPriority; - }; - - PriorityBooster::PriorityBooster( sal_Int32 nDelta ) : - mpImpl( new PriorityBooster_Impl ) - { -#ifdef WNT - HANDLE aCurrThread = GetCurrentThread(); - mpImpl->mnOldPriority = GetThreadPriority( aCurrThread ); - - if ( 0 == SetThreadPriority( aCurrThread, mpImpl->mnOldPriority + nDelta ) ) - { - OSL_FAIL( "PriorityBooster::PriorityBooster(): Was not able to modify thread priority" ); - } -#else - (void)nDelta; -#endif - } - - PriorityBooster::~PriorityBooster() - { -#ifdef WNT - SetThreadPriority( GetCurrentThread(), - mpImpl->mnOldPriority ); -#endif - } - } // namespace tools - -} // namespace canvas - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/canvas/source/tools/propertysethelper.cxx b/canvas/source/tools/propertysethelper.cxx deleted file mode 100644 index cf279deafa..0000000000 --- a/canvas/source/tools/propertysethelper.cxx +++ /dev/null @@ -1,190 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * 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_canvas.hxx" - -#include <canvas/propertysethelper.hxx> - -using namespace ::com::sun::star; - -namespace canvas -{ - namespace - { - void throwUnknown( const ::rtl::OUString& aPropertyName ) - { - throw beans::UnknownPropertyException( - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "PropertySetHelper: property " )) + - aPropertyName + - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( " not found." )), - uno::Reference< uno::XInterface >() - ); - } - - void throwVeto( const ::rtl::OUString& aPropertyName ) - { - throw beans::PropertyVetoException( - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "PropertySetHelper: property " )) + - aPropertyName + - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( " access was vetoed." )), - uno::Reference< uno::XInterface >() ); - } - - struct EntryComparator - { - bool operator()( const PropertySetHelper::MapType::MapEntry& rLHS, - const PropertySetHelper::MapType::MapEntry& rRHS ) - { - return strcmp( rLHS.maKey, - rRHS.maKey ) < 0; - } - }; - } - - PropertySetHelper::PropertySetHelper() : - mpMap(), - maMapEntries() - { - } - - PropertySetHelper::PropertySetHelper( const InputMap& rMap ) : - mpMap(), - maMapEntries() - { - initProperties(rMap); - } - - void PropertySetHelper::initProperties( const InputMap& rMap ) - { - mpMap.reset(); - maMapEntries = rMap; - - std::sort( maMapEntries.begin(), - maMapEntries.end(), - EntryComparator() ); - - if( !maMapEntries.empty() ) - mpMap.reset( new MapType(&maMapEntries[0], - maMapEntries.size(), - true) ); - } - - void PropertySetHelper::addProperties( const InputMap& rMap ) - { - InputMap aMerged( getPropertyMap() ); - aMerged.insert( aMerged.end(), - rMap.begin(), - rMap.end() ); - - initProperties( aMerged ); - } - - bool PropertySetHelper::isPropertyName( const ::rtl::OUString& aPropertyName ) const - { - if( !mpMap.get() ) - return false; - - Callbacks aDummy; - return mpMap->lookup( aPropertyName, - aDummy ); - } - - uno::Reference< beans::XPropertySetInfo > PropertySetHelper::getPropertySetInfo() const - { - // we're a stealth property set - return uno::Reference< beans::XPropertySetInfo >(); - } - - void PropertySetHelper::setPropertyValue( const ::rtl::OUString& aPropertyName, - const uno::Any& aValue ) - { - Callbacks aCallbacks; - if( !mpMap.get() || - !mpMap->lookup( aPropertyName, - aCallbacks ) ) - { - throwUnknown( aPropertyName ); - } - - if( aCallbacks.setter.empty() ) - throwVeto( aPropertyName ); - - aCallbacks.setter(aValue); - } - - uno::Any PropertySetHelper::getPropertyValue( const ::rtl::OUString& aPropertyName ) const - { - Callbacks aCallbacks; - if( !mpMap.get() || - !mpMap->lookup( aPropertyName, - aCallbacks ) ) - { - throwUnknown( aPropertyName ); - } - - if( !aCallbacks.getter.empty() ) - return aCallbacks.getter(); - - // TODO(Q1): subtlety, empty getter method silently returns - // the empty any - return uno::Any(); - } - - void PropertySetHelper::addPropertyChangeListener( const ::rtl::OUString& aPropertyName, - const uno::Reference< beans::XPropertyChangeListener >& /*xListener*/ ) - { - // check validity of property, but otherwise ignore the - // request - if( !isPropertyName( aPropertyName ) ) - throwUnknown( aPropertyName ); - } - - void PropertySetHelper::removePropertyChangeListener( const ::rtl::OUString& /*aPropertyName*/, - const uno::Reference< beans::XPropertyChangeListener >& /*xListener*/ ) - { - // ignore request, no listener added in the first place - } - - void PropertySetHelper::addVetoableChangeListener( const ::rtl::OUString& aPropertyName, - const uno::Reference< beans::XVetoableChangeListener >& /*xListener*/ ) - { - // check validity of property, but otherwise ignore the - // request - if( !isPropertyName( aPropertyName ) ) - throwUnknown( aPropertyName ); - } - - void PropertySetHelper::removeVetoableChangeListener( const ::rtl::OUString& /*aPropertyName*/, - const uno::Reference< beans::XVetoableChangeListener >& /*xListener*/ ) - { - // ignore request, no listener added in the first place - } -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/canvas/source/tools/spriteredrawmanager.cxx b/canvas/source/tools/spriteredrawmanager.cxx deleted file mode 100644 index a23b94745d..0000000000 --- a/canvas/source/tools/spriteredrawmanager.cxx +++ /dev/null @@ -1,523 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * 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_canvas.hxx" - -#include <canvas/debug.hxx> -#include <tools/diagnose_ex.h> -#include <canvas/spriteredrawmanager.hxx> - -#include <basegfx/range/b2drectangle.hxx> -#include <basegfx/tools/canvastools.hxx> -#include <basegfx/vector/b2dsize.hxx> -#include <basegfx/range/rangeexpander.hxx> - -#include <algorithm> -#include <o3tl/compat_functional.hxx> -#include <boost/bind.hpp> - - -namespace canvas -{ - namespace - { - /** Helper class to condense sprite updates into a single action - - This class tracks the sprite changes over the recorded - change list, and generates a single update action from - that (note that per screen update, several moves, - visibility changes and content updates might happen) - */ - class SpriteTracer - { - public: - SpriteTracer( const Sprite::Reference& rAffectedSprite ) : - mpAffectedSprite(rAffectedSprite), - maMoveStartArea(), - maMoveEndArea(), - mbIsMove( false ), - mbIsGenericUpdate( false ) - { - } - - void operator()( const SpriteRedrawManager::SpriteChangeRecord& rSpriteRecord ) - { - // only deal with change events from the currently - // affected sprite - if( rSpriteRecord.mpAffectedSprite == mpAffectedSprite ) - { - switch( rSpriteRecord.meChangeType ) - { - case SpriteRedrawManager::SpriteChangeRecord::move: - if( !mbIsMove ) - { - // no move yet - this must be the first one - maMoveStartArea = ::basegfx::B2DRectangle( - rSpriteRecord.maOldPos, - rSpriteRecord.maOldPos + rSpriteRecord.maUpdateArea.getRange() ); - mbIsMove = true; - } - - maMoveEndArea = rSpriteRecord.maUpdateArea; - break; - - case SpriteRedrawManager::SpriteChangeRecord::update: - // update end update area of the - // sprite. Thus, every update() action - // _after_ the last move will correctly - // update the final repaint area. And this - // does not interfere with subsequent - // moves, because moves always perform a - // hard set of maMoveEndArea to their - // stored value - maMoveEndArea.expand( rSpriteRecord.maUpdateArea ); - mbIsGenericUpdate = true; - break; - - default: - ENSURE_OR_THROW( false, - "Unexpected case in SpriteUpdater::operator()" ); - break; - } - } - } - - void commit( SpriteRedrawManager::SpriteConnectedRanges& rUpdateCollector ) const - { - if( mbIsMove ) - { - if( !maMoveStartArea.isEmpty() || - !maMoveEndArea.isEmpty() ) - { - // if mbIsGenericUpdate is false, this is a - // pure move (i.e. no other update - // operations). Pass that information on to - // the SpriteInfo - const bool bIsPureMove( !mbIsGenericUpdate ); - - // ignore the case that start and end update - // area overlap - the b2dconnectedranges - // handle that, anyway. doing it this way - // ensures that we have both old and new area - // stored - - // round all given range up to enclosing - // integer rectangle - since the whole thing - // here is about - - // first, draw the new sprite position - rUpdateCollector.addRange( - ::basegfx::unotools::b2DSurroundingIntegerRangeFromB2DRange( maMoveEndArea ), - SpriteRedrawManager::SpriteInfo( - mpAffectedSprite, - maMoveEndArea, - true, - bIsPureMove ) ); - - // then, clear the old place (looks smoother - // this way) - rUpdateCollector.addRange( - ::basegfx::unotools::b2DSurroundingIntegerRangeFromB2DRange( maMoveStartArea ), - SpriteRedrawManager::SpriteInfo( - Sprite::Reference(), - maMoveStartArea, - true, - bIsPureMove ) ); - } - } - else if( mbIsGenericUpdate && - !maMoveEndArea.isEmpty() ) - { - rUpdateCollector.addRange( - ::basegfx::unotools::b2DSurroundingIntegerRangeFromB2DRange( maMoveEndArea ), - SpriteRedrawManager::SpriteInfo( - mpAffectedSprite, - maMoveEndArea, - true ) ); - } - } - - private: - Sprite::Reference mpAffectedSprite; - ::basegfx::B2DRectangle maMoveStartArea; - ::basegfx::B2DRectangle maMoveEndArea; - - /// True, if at least one move was encountered - bool mbIsMove; - - /// True, if at least one generic update was encountered - bool mbIsGenericUpdate; - }; - - - /** SpriteChecker functor, which for every sprite checks the - given update vector for necessary screen updates - */ - class SpriteUpdater - { - public: - /** Generate update area list - - @param rUpdater - Reference to an updater object, which will receive the - update areas. - - @param rChangeContainer - Container with all sprite change requests - - */ - SpriteUpdater( SpriteRedrawManager::SpriteConnectedRanges& rUpdater, - const SpriteRedrawManager::VectorOfChangeRecords& rChangeContainer ) : - mrUpdater( rUpdater ), - mrChangeContainer( rChangeContainer ) - { - } - - /** Call this method for every sprite on your screen - - This method scans the change container, collecting all - update info for the given sprite into one or two - update operations, which in turn are inserted into the - connected ranges processor. - - @param rSprite - Current sprite to collect update info for. - */ - void operator()( const Sprite::Reference& rSprite ) - { - const SpriteTracer aSpriteTracer( - ::std::for_each( mrChangeContainer.begin(), - mrChangeContainer.end(), - SpriteTracer( rSprite ) ) ); - - aSpriteTracer.commit( mrUpdater ); - } - - private: - SpriteRedrawManager::SpriteConnectedRanges& mrUpdater; - const SpriteRedrawManager::VectorOfChangeRecords& mrChangeContainer; - }; - } - - void SpriteRedrawManager::setupUpdateAreas( SpriteConnectedRanges& rUpdateAreas ) const - { - // TODO(T3): This is NOT thread safe at all. This only works - // under the assumption that NOBODY changes ANYTHING - // concurrently, while this method is on the stack. We should - // really rework the canvas::Sprite interface, in such a way - // that it dumps ALL its state with a single, atomic - // call. Then, we store that state locally. This prolly goes - // in line with the problem of having sprite state available - // for the frame before the last frame; plus, it avoids - // frequent locks of the object mutices - SpriteComparator aSpriteComparator; - - // put all sprites that have changed content into update areas - ListOfSprites::const_iterator aCurrSprite( maSprites.begin() ); - const ListOfSprites::const_iterator aEndSprite ( maSprites.end() ); - while( aCurrSprite != aEndSprite ) - { - if( (*aCurrSprite)->isContentChanged() ) - const_cast<SpriteRedrawManager*>(this)->updateSprite( *aCurrSprite, - (*aCurrSprite)->getPosPixel(), - (*aCurrSprite)->getUpdateArea() ); - ++aCurrSprite; - } - - // sort sprites after prio - VectorOfSprites aSortedSpriteVector; - ::std::copy( maSprites.begin(), - maSprites.end(), - ::std::back_insert_iterator< VectorOfSprites >(aSortedSpriteVector) ); - ::std::sort( aSortedSpriteVector.begin(), - aSortedSpriteVector.end(), - aSpriteComparator ); - - // extract all referenced sprites from the maChangeRecords - // (copy sprites, make the list unique, regarding the - // sprite pointer). This assumes that, until this scope - // ends, nobody changes the maChangeRecords vector! - VectorOfSprites aUpdatableSprites; - VectorOfChangeRecords::const_iterator aCurrRecord( maChangeRecords.begin() ); - const VectorOfChangeRecords::const_iterator aEndRecords( maChangeRecords.end() ); - while( aCurrRecord != aEndRecords ) - { - const Sprite::Reference& rSprite( aCurrRecord->getSprite() ); - if( rSprite.is() ) - aUpdatableSprites.push_back( rSprite ); - ++aCurrRecord; - } - - VectorOfSprites::iterator aBegin( aUpdatableSprites.begin() ); - VectorOfSprites::iterator aEnd ( aUpdatableSprites.end() ); - ::std::sort( aBegin, - aEnd, - aSpriteComparator ); - - aEnd = ::std::unique( aBegin, aEnd ); - - // for each unique sprite, check the change event vector, - // calculate the update operation from that, and add the - // result to the aUpdateArea. - ::std::for_each( aBegin, - aEnd, - SpriteUpdater( rUpdateAreas, - maChangeRecords) ); - - // TODO(P2): Implement your own output iterator adapter, to - // avoid that totally superfluous temp aUnchangedSprites - // vector. - - // add all sprites to rUpdateAreas, that are _not_ already - // contained in the uniquified vector of changed ones - // (i.e. the difference between aSortedSpriteVector and - // aUpdatableSprites). - VectorOfSprites aUnchangedSprites; - ::std::set_difference( aSortedSpriteVector.begin(), - aSortedSpriteVector.end(), - aBegin, aEnd, - ::std::back_insert_iterator< VectorOfSprites >(aUnchangedSprites) ); - - // add each remaining unchanged sprite to connected ranges, - // marked as "don't need update" - VectorOfSprites::const_iterator aCurr( aUnchangedSprites.begin() ); - const VectorOfSprites::const_iterator aEnd2( aUnchangedSprites.end() ); - while( aCurr != aEnd2 ) - { - const ::basegfx::B2DRange& rUpdateArea( (*aCurr)->getUpdateArea() ); - rUpdateAreas.addRange( - ::basegfx::unotools::b2DSurroundingIntegerRangeFromB2DRange( rUpdateArea ), - SpriteInfo(*aCurr, - rUpdateArea, - false) ); - ++aCurr; - } - } - -#if OSL_DEBUG_LEVEL > 0 - bool impIsEqualB2DRange(const basegfx::B2DRange& rRangeA, const basegfx::B2DRange& rRangeB, double fSmallValue) - { - return fabs(rRangeB.getMinX() - rRangeA.getMinX()) <= fSmallValue - && fabs(rRangeB.getMinY() - rRangeA.getMinY()) <= fSmallValue - && fabs(rRangeB.getMaxX() - rRangeA.getMaxX()) <= fSmallValue - && fabs(rRangeB.getMaxY() - rRangeA.getMaxY()) <= fSmallValue; - } - - bool impIsEqualB2DVector(const basegfx::B2DVector& rVecA, const basegfx::B2DVector& rVecB, double fSmallValue) - { - return fabs(rVecB.getX() - rVecA.getX()) <= fSmallValue - && fabs(rVecB.getY() - rVecA.getY()) <= fSmallValue; - } -#endif - - bool SpriteRedrawManager::isAreaUpdateScroll( ::basegfx::B2DRectangle& o_rMoveStart, - ::basegfx::B2DRectangle& o_rMoveEnd, - const UpdateArea& rUpdateArea, - ::std::size_t nNumSprites ) const - { - // check for a solitary move, which consists of exactly two - // pure-move entries, the first with valid, the second with - // invalid sprite (see SpriteTracer::commit()). Note that we - // cannot simply store some flag in SpriteTracer::commit() - // above and just check that here, since during the connected - // range calculations, other sprites might get merged into the - // same region (thus spoiling the scrolling move - // optimization). - if( nNumSprites != 2 ) - return false; - - const SpriteConnectedRanges::ComponentListType::const_iterator aFirst( - rUpdateArea.maComponentList.begin() ); - SpriteConnectedRanges::ComponentListType::const_iterator aSecond( - aFirst ); ++aSecond; - - if( !aFirst->second.isPureMove() || - !aSecond->second.isPureMove() || - !aFirst->second.getSprite().is() || - // use _true_ update area, not the rounded version - !aFirst->second.getSprite()->isAreaUpdateOpaque( aFirst->second.getUpdateArea() ) || - aSecond->second.getSprite().is() ) - { - // either no move update, or incorrect sprite, or sprite - // content not fully opaque over update region. - return false; - } - - o_rMoveStart = aSecond->second.getUpdateArea(); - o_rMoveEnd = aFirst->second.getUpdateArea(); - -#if OSL_DEBUG_LEVEL > 0 - ::basegfx::B2DRectangle aTotalBounds( o_rMoveStart ); - aTotalBounds.expand( o_rMoveEnd ); - - OSL_POSTCOND(impIsEqualB2DRange(rUpdateArea.maTotalBounds, basegfx::unotools::b2DSurroundingIntegerRangeFromB2DRange(aTotalBounds), 0.5), - "SpriteRedrawManager::isAreaUpdateScroll(): sprite area and total area mismatch"); - OSL_POSTCOND(impIsEqualB2DVector(o_rMoveStart.getRange(), o_rMoveEnd.getRange(), 0.5), - "SpriteRedrawManager::isAreaUpdateScroll(): scroll start and end area have mismatching size"); -#endif - - return true; - } - - bool SpriteRedrawManager::isAreaUpdateNotOpaque( const ::basegfx::B2DRectangle& rUpdateRect, - const AreaComponent& rComponent ) const - { - const Sprite::Reference& pAffectedSprite( rComponent.second.getSprite() ); - - if( !pAffectedSprite.is() ) - return true; // no sprite, no opaque update! - - return !pAffectedSprite->isAreaUpdateOpaque( rUpdateRect ); - } - - bool SpriteRedrawManager::isAreaUpdateOpaque( const UpdateArea& rUpdateArea, - ::std::size_t nNumSprites ) const - { - // check whether the sprites in the update area's list will - // fully cover the given area _and_ do that in an opaque way - // (i.e. no alpha, no non-rectangular sprite content). - - // TODO(P1): Come up with a smarter early-exit criterion here - // (though, I think, the case that _lots_ of sprites _fully_ - // cover a rectangular area _without_ any holes is extremely - // improbable) - - // avoid checking large number of sprites (and probably fail, - // anyway). Note: the case nNumSprites < 1 should normally not - // happen, as handleArea() calls backgroundPaint() then. - if( nNumSprites > 3 || nNumSprites < 1 ) - return false; - - const SpriteConnectedRanges::ComponentListType::const_iterator aBegin( - rUpdateArea.maComponentList.begin() ); - const SpriteConnectedRanges::ComponentListType::const_iterator aEnd( - rUpdateArea.maComponentList.end() ); - - // now, calc the _true_ update area, by merging all sprite's - // true update areas into one rectangle - ::basegfx::B2DRange aTrueArea( aBegin->second.getUpdateArea() ); - ::std::for_each( aBegin, - aEnd, - ::boost::bind( ::basegfx::B2DRangeExpander(aTrueArea), - ::boost::bind( &SpriteInfo::getUpdateArea, - ::boost::bind( ::o3tl::select2nd<AreaComponent>(), - _1 ) ) ) ); - - // and check whether _any_ of the sprites tells that its area - // update will not be opaque. - return (::std::find_if( aBegin, - aEnd, - ::boost::bind( &SpriteRedrawManager::isAreaUpdateNotOpaque, - this, - ::boost::cref(aTrueArea), - _1 ) ) == aEnd ); - } - - bool SpriteRedrawManager::areSpritesChanged( const UpdateArea& rUpdateArea ) const - { - // check whether SpriteInfo::needsUpdate returns false for - // all elements of this area's contained sprites - // - // if not a single changed sprite found - just ignore this - // component (return false) - const SpriteConnectedRanges::ComponentListType::const_iterator aEnd( - rUpdateArea.maComponentList.end() ); - return (::std::find_if( rUpdateArea.maComponentList.begin(), - aEnd, - ::boost::bind( &SpriteInfo::needsUpdate, - ::boost::bind( - ::o3tl::select2nd<SpriteConnectedRanges::ComponentType>(), - _1 ) ) ) != aEnd ); - } - - SpriteRedrawManager::SpriteRedrawManager() : - maSprites(), - maChangeRecords() - { - } - - void SpriteRedrawManager::disposing() - { - // drop all references - maChangeRecords.clear(); - - // dispose all sprites - the spritecanvas, and by delegation, - // this object, is the owner of the sprites. After all, a - // sprite without a canvas to render into makes not terribly - // much sense. - - // TODO(Q3): Once boost 1.33 is in, change back to for_each - // with ::boost::mem_fn. For the time being, explicit loop due - // to cdecl declaration of all UNO methods. - ListOfSprites::reverse_iterator aCurr( maSprites.rbegin() ); - ListOfSprites::reverse_iterator aEnd( maSprites.rend() ); - while( aCurr != aEnd ) - (*aCurr++)->dispose(); - - maSprites.clear(); - } - - void SpriteRedrawManager::clearChangeRecords() - { - maChangeRecords.clear(); - } - - void SpriteRedrawManager::showSprite( const Sprite::Reference& rSprite ) - { - maSprites.push_back( rSprite ); - } - - void SpriteRedrawManager::hideSprite( const Sprite::Reference& rSprite ) - { - maSprites.remove( rSprite ); - } - - void SpriteRedrawManager::moveSprite( const Sprite::Reference& rSprite, - const ::basegfx::B2DPoint& rOldPos, - const ::basegfx::B2DPoint& rNewPos, - const ::basegfx::B2DVector& rSpriteSize ) - { - maChangeRecords.push_back( SpriteChangeRecord( rSprite, - rOldPos, - rNewPos, - rSpriteSize ) ); - } - - void SpriteRedrawManager::updateSprite( const Sprite::Reference& rSprite, - const ::basegfx::B2DPoint& rPos, - const ::basegfx::B2DRange& rUpdateArea ) - { - maChangeRecords.push_back( SpriteChangeRecord( rSprite, - rPos, - rUpdateArea ) ); - } - -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/canvas/source/tools/surface.cxx b/canvas/source/tools/surface.cxx deleted file mode 100644 index 4d23c40f7b..0000000000 --- a/canvas/source/tools/surface.cxx +++ /dev/null @@ -1,498 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * 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_canvas.hxx" - -#include "surface.hxx" -#include <basegfx/polygon/b2dpolygonclipper.hxx> -#include <basegfx/matrix/b2dhommatrixtools.hxx> -#include <comphelper/scopeguard.hxx> -#include <boost/bind.hpp> - -namespace canvas -{ - - ////////////////////////////////////////////////////////////////////////////////// - // Surface::Surface - ////////////////////////////////////////////////////////////////////////////////// - - Surface::Surface( const PageManagerSharedPtr& rPageManager, - const IColorBufferSharedPtr& rColorBuffer, - const ::basegfx::B2IPoint& rPos, - const ::basegfx::B2ISize& rSize ) : - mpColorBuffer(rColorBuffer), - mpPageManager(rPageManager), - mpFragment(), - maSourceOffset(rPos), - maSize(rSize), - mbIsDirty(true) - { - } - - ////////////////////////////////////////////////////////////////////////////////// - // Surface::~Surface - ////////////////////////////////////////////////////////////////////////////////// - - Surface::~Surface() - { - if(mpFragment) - mpPageManager->free(mpFragment); - } - - ////////////////////////////////////////////////////////////////////////////////// - // Surface::getUVCoords - ////////////////////////////////////////////////////////////////////////////////// - - void Surface::setColorBufferDirty() - { - mbIsDirty=true; - } - - ////////////////////////////////////////////////////////////////////////////////// - // Surface::getUVCoords - ////////////////////////////////////////////////////////////////////////////////// - - basegfx::B2DRectangle Surface::getUVCoords() const - { - ::basegfx::B2ISize aPageSize(mpPageManager->getPageSize()); - ::basegfx::B2IPoint aDestOffset; - if( mpFragment ) - aDestOffset = mpFragment->getPos(); - - const double pw( aPageSize.getX() ); - const double ph( aPageSize.getY() ); - const double ox( aDestOffset.getX() ); - const double oy( aDestOffset.getY() ); - const double sx( maSize.getX() ); - const double sy( maSize.getY() ); - - return ::basegfx::B2DRectangle( ox/pw, - oy/ph, - (ox+sx)/pw, - (oy+sy)/ph ); - } - - ////////////////////////////////////////////////////////////////////////////////// - // Surface::getUVCoords - ////////////////////////////////////////////////////////////////////////////////// - - basegfx::B2DRectangle Surface::getUVCoords( const ::basegfx::B2IPoint& rPos, - const ::basegfx::B2ISize& rSize ) const - { - ::basegfx::B2ISize aPageSize(mpPageManager->getPageSize()); - - const double pw( aPageSize.getX() ); - const double ph( aPageSize.getY() ); - const double ox( rPos.getX() ); - const double oy( rPos.getY() ); - const double sx( rSize.getX() ); - const double sy( rSize.getY() ); - - return ::basegfx::B2DRectangle( ox/pw, - oy/ph, - (ox+sx)/pw, - (oy+sy)/ph ); - } - - ////////////////////////////////////////////////////////////////////////////////// - // Surface::draw - ////////////////////////////////////////////////////////////////////////////////// - - bool Surface::draw( double fAlpha, - const ::basegfx::B2DPoint& rPos, - const ::basegfx::B2DHomMatrix& rTransform ) - { - IRenderModuleSharedPtr pRenderModule(mpPageManager->getRenderModule()); - - RenderModuleGuard aGuard( pRenderModule ); - - prepareRendering(); - - // convert size to normalized device coordinates - const ::basegfx::B2DRectangle& rUV( getUVCoords() ); - - const double u1(rUV.getMinX()); - const double v1(rUV.getMinY()); - const double u2(rUV.getMaxX()); - const double v2(rUV.getMaxY()); - - // concat transforms - // 1) offset of surface subarea - // 2) surface transform - // 3) translation to output position [rPos] - // 4) scale to normalized device coordinates - // 5) flip y-axis - // 6) translate to account for viewport transform - basegfx::B2DHomMatrix aTransform(basegfx::tools::createTranslateB2DHomMatrix( - maSourceOffset.getX(), maSourceOffset.getY())); - aTransform = aTransform * rTransform; - aTransform.translate(::basegfx::fround(rPos.getX()), - ::basegfx::fround(rPos.getY())); - - /* - ###################################### - ###################################### - ###################################### - - Y - ^+1 - | - 2 | 3 - x------------x - | | | - | | | - ------|-----O------|------>X - -1 | | | +1 - | | | - x------------x - 1 | 0 - | - |-1 - - ###################################### - ###################################### - ###################################### - */ - - const ::basegfx::B2DPoint& p0(aTransform * ::basegfx::B2DPoint(maSize.getX(),maSize.getY())); - const ::basegfx::B2DPoint& p1(aTransform * ::basegfx::B2DPoint(0.0,maSize.getY())); - const ::basegfx::B2DPoint& p2(aTransform * ::basegfx::B2DPoint(0.0,0.0)); - const ::basegfx::B2DPoint& p3(aTransform * ::basegfx::B2DPoint(maSize.getX(),0.0)); - - canvas::Vertex vertex; - vertex.r = 1.0f; - vertex.g = 1.0f; - vertex.b = 1.0f; - vertex.a = static_cast<float>(fAlpha); - vertex.z = 0.0f; - - { - pRenderModule->beginPrimitive( canvas::IRenderModule::PRIMITIVE_TYPE_QUAD ); - - // issue an endPrimitive() when leaving the scope - const ::comphelper::ScopeGuard aScopeGuard( - boost::bind( &::canvas::IRenderModule::endPrimitive, - ::boost::ref(pRenderModule) ) ); - - vertex.u=static_cast<float>(u2); vertex.v=static_cast<float>(v2); - vertex.x=static_cast<float>(p0.getX()); vertex.y=static_cast<float>(p0.getY()); - pRenderModule->pushVertex(vertex); - - vertex.u=static_cast<float>(u1); vertex.v=static_cast<float>(v2); - vertex.x=static_cast<float>(p1.getX()); vertex.y=static_cast<float>(p1.getY()); - pRenderModule->pushVertex(vertex); - - vertex.u=static_cast<float>(u1); vertex.v=static_cast<float>(v1); - vertex.x=static_cast<float>(p2.getX()); vertex.y=static_cast<float>(p2.getY()); - pRenderModule->pushVertex(vertex); - - vertex.u=static_cast<float>(u2); vertex.v=static_cast<float>(v1); - vertex.x=static_cast<float>(p3.getX()); vertex.y=static_cast<float>(p3.getY()); - pRenderModule->pushVertex(vertex); - } - - return !(pRenderModule->isError()); - } - - ////////////////////////////////////////////////////////////////////////////////// - // Surface::drawRectangularArea - ////////////////////////////////////////////////////////////////////////////////// - - bool Surface::drawRectangularArea( - double fAlpha, - const ::basegfx::B2DPoint& rPos, - const ::basegfx::B2DRectangle& rArea, - const ::basegfx::B2DHomMatrix& rTransform ) - { - if( rArea.isEmpty() ) - return true; // immediate exit for empty area - - IRenderModuleSharedPtr pRenderModule(mpPageManager->getRenderModule()); - - RenderModuleGuard aGuard( pRenderModule ); - - prepareRendering(); - - // these positions are relative to the texture - ::basegfx::B2IPoint aPos1( - ::basegfx::fround(rArea.getMinimum().getX()), - ::basegfx::fround(rArea.getMinimum().getY())); - ::basegfx::B2IPoint aPos2( - ::basegfx::fround(rArea.getMaximum().getX()), - ::basegfx::fround(rArea.getMaximum().getY()) ); - - // clip the positions to the area this surface covers - aPos1.setX(::std::max(aPos1.getX(),maSourceOffset.getX())); - aPos1.setY(::std::max(aPos1.getY(),maSourceOffset.getY())); - aPos2.setX(::std::min(aPos2.getX(),maSourceOffset.getX()+maSize.getX())); - aPos2.setY(::std::min(aPos2.getY(),maSourceOffset.getY()+maSize.getY())); - - // if the resulting area is empty, return immediately - ::basegfx::B2IVector aSize(aPos2 - aPos1); - if(aSize.getX() <= 0 || aSize.getY() <= 0) - return true; - - ::basegfx::B2IPoint aDestOffset; - if( mpFragment ) - aDestOffset = mpFragment->getPos(); - - // convert size to normalized device coordinates - const ::basegfx::B2DRectangle& rUV( - getUVCoords(aPos1 - maSourceOffset + aDestOffset, - aSize) ); - const double u1(rUV.getMinX()); - const double v1(rUV.getMinY()); - const double u2(rUV.getMaxX()); - const double v2(rUV.getMaxY()); - - // concatenate transforms - // 1) offset of surface subarea - // 2) surface transform - // 3) translation to output position [rPos] - basegfx::B2DHomMatrix aTransform(basegfx::tools::createTranslateB2DHomMatrix(aPos1.getX(), aPos1.getY())); - aTransform = aTransform * rTransform; - aTransform.translate(::basegfx::fround(rPos.getX()), - ::basegfx::fround(rPos.getY())); - - - /* - ###################################### - ###################################### - ###################################### - - Y - ^+1 - | - 2 | 3 - x------------x - | | | - | | | - ------|-----O------|------>X - -1 | | | +1 - | | | - x------------x - 1 | 0 - | - |-1 - - ###################################### - ###################################### - ###################################### - */ - - const ::basegfx::B2DPoint& p0(aTransform * ::basegfx::B2DPoint(aSize.getX(),aSize.getY())); - const ::basegfx::B2DPoint& p1(aTransform * ::basegfx::B2DPoint(0.0, aSize.getY())); - const ::basegfx::B2DPoint& p2(aTransform * ::basegfx::B2DPoint(0.0, 0.0)); - const ::basegfx::B2DPoint& p3(aTransform * ::basegfx::B2DPoint(aSize.getX(),0.0)); - - canvas::Vertex vertex; - vertex.r = 1.0f; - vertex.g = 1.0f; - vertex.b = 1.0f; - vertex.a = static_cast<float>(fAlpha); - vertex.z = 0.0f; - - { - pRenderModule->beginPrimitive( canvas::IRenderModule::PRIMITIVE_TYPE_QUAD ); - - // issue an endPrimitive() when leaving the scope - const ::comphelper::ScopeGuard aScopeGuard( - boost::bind( &::canvas::IRenderModule::endPrimitive, - ::boost::ref(pRenderModule) ) ); - - vertex.u=static_cast<float>(u2); vertex.v=static_cast<float>(v2); - vertex.x=static_cast<float>(p0.getX()); vertex.y=static_cast<float>(p0.getY()); - pRenderModule->pushVertex(vertex); - - vertex.u=static_cast<float>(u1); vertex.v=static_cast<float>(v2); - vertex.x=static_cast<float>(p1.getX()); vertex.y=static_cast<float>(p1.getY()); - pRenderModule->pushVertex(vertex); - - vertex.u=static_cast<float>(u1); vertex.v=static_cast<float>(v1); - vertex.x=static_cast<float>(p2.getX()); vertex.y=static_cast<float>(p2.getY()); - pRenderModule->pushVertex(vertex); - - vertex.u=static_cast<float>(u2); vertex.v=static_cast<float>(v1); - vertex.x=static_cast<float>(p3.getX()); vertex.y=static_cast<float>(p3.getY()); - pRenderModule->pushVertex(vertex); - } - - return !(pRenderModule->isError()); - } - - ////////////////////////////////////////////////////////////////////////////////// - // Surface::drawWithClip - ////////////////////////////////////////////////////////////////////////////////// - - bool Surface::drawWithClip( double fAlpha, - const ::basegfx::B2DPoint& rPos, - const ::basegfx::B2DPolygon& rClipPoly, - const ::basegfx::B2DHomMatrix& rTransform ) - { - IRenderModuleSharedPtr pRenderModule(mpPageManager->getRenderModule()); - - RenderModuleGuard aGuard( pRenderModule ); - - prepareRendering(); - - // untransformed surface rectangle, relative to the whole - // image (note: this surface might actually only be a tile of - // the whole image, with non-zero maSourceOffset) - const double x1(maSourceOffset.getX()); - const double y1(maSourceOffset.getY()); - const double w(maSize.getX()); - const double h(maSize.getY()); - const double x2(x1+w); - const double y2(y1+h); - const ::basegfx::B2DRectangle aSurfaceClipRect(x1,y1,x2,y2); - - // concatenate transforms - // we use 'fround' here to avoid rounding errors. the vertices will - // be transformed by the overall transform and uv coordinates will - // be calculated from the result, and this is why we need to use - // integer coordinates here... - basegfx::B2DHomMatrix aTransform; - aTransform = aTransform * rTransform; - aTransform.translate(::basegfx::fround(rPos.getX()), - ::basegfx::fround(rPos.getY())); - - /* - ###################################### - ###################################### - ###################################### - - Y - ^+1 - | - 2 | 3 - x------------x - | | | - | | | - ------|-----O------|------>X - -1 | | | +1 - | | | - x------------x - 1 | 0 - | - |-1 - - ###################################### - ###################################### - ###################################### - */ - - // uv coordinates that map the surface rectangle - // to the destination rectangle. - const ::basegfx::B2DRectangle& rUV( getUVCoords() ); - - basegfx::B2DPolygon rTriangleList(basegfx::tools::clipTriangleListOnRange(rClipPoly, - aSurfaceClipRect)); - - // Push vertices to backend renderer - if(const sal_uInt32 nVertexCount = rTriangleList.count()) - { - canvas::Vertex vertex; - vertex.r = 1.0f; - vertex.g = 1.0f; - vertex.b = 1.0f; - vertex.a = static_cast<float>(fAlpha); - vertex.z = 0.0f; - -#if defined(TRIANGLE_LOG) && defined(DBG_UTIL) - OSL_TRACE( "Surface::draw(): numvertices %d numtriangles %d\n", - nVertexCount, - nVertexCount/3 ); -#endif - - pRenderModule->beginPrimitive( canvas::IRenderModule::PRIMITIVE_TYPE_TRIANGLE ); - - // issue an endPrimitive() when leaving the scope - const ::comphelper::ScopeGuard aScopeGuard( - boost::bind( &::canvas::IRenderModule::endPrimitive, - ::boost::ref(pRenderModule) ) ); - - for(sal_uInt32 nIndex=0; nIndex<nVertexCount; ++nIndex) - { - const basegfx::B2DPoint &aPoint = rTriangleList.getB2DPoint(nIndex); - basegfx::B2DPoint aTransformedPoint(aTransform * aPoint); - const double tu(((aPoint.getX()-aSurfaceClipRect.getMinX())*rUV.getWidth()/w)+rUV.getMinX()); - const double tv(((aPoint.getY()-aSurfaceClipRect.getMinY())*rUV.getHeight()/h)+rUV.getMinY()); - vertex.u=static_cast<float>(tu); - vertex.v=static_cast<float>(tv); - vertex.x=static_cast<float>(aTransformedPoint.getX()); - vertex.y=static_cast<float>(aTransformedPoint.getY()); - pRenderModule->pushVertex(vertex); - } - } - - return !(pRenderModule->isError()); - } - - ////////////////////////////////////////////////////////////////////////////////// - // Surface::prepareRendering - ////////////////////////////////////////////////////////////////////////////////// - - void Surface::prepareRendering() - { - mpPageManager->validatePages(); - - // clients requested to draw from this surface, therefore one - // of the above implemented concrete rendering operations - // was triggered. we therefore need to ask the pagemanager - // to allocate some space for the fragment we're dedicated to. - if(!(mpFragment)) - { - mpFragment = mpPageManager->allocateSpace(maSize); - if( mpFragment ) - { - mpFragment->setColorBuffer(mpColorBuffer); - mpFragment->setSourceOffset(maSourceOffset); - } - } - - if( mpFragment ) - { - // now we need to 'select' the fragment, which will in turn - // pull informations from the image on demand. - // in case this fragment is still not located on any of the - // available pages ['naked'], we force the page manager to - // do it now, no way to defer this any longer... - if(!(mpFragment->select(mbIsDirty))) - mpPageManager->nakedFragment(mpFragment); - - } - mbIsDirty=false; - } - - ////////////////////////////////////////////////////////////////////////////////// - // End of file - ////////////////////////////////////////////////////////////////////////////////// -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/canvas/source/tools/surface.hxx b/canvas/source/tools/surface.hxx deleted file mode 100644 index 1238a97943..0000000000 --- a/canvas/source/tools/surface.hxx +++ /dev/null @@ -1,165 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * 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. - * - ************************************************************************/ - -#ifndef INCLUDED_CANVAS_SURFACE_HXX -#define INCLUDED_CANVAS_SURFACE_HXX - -#include <basegfx/point/b2ipoint.hxx> -#include <basegfx/point/b2dpoint.hxx> -#include <basegfx/polygon/b2dpolygon.hxx> -#include <basegfx/range/b2drectangle.hxx> -#include <basegfx/vector/b2isize.hxx> -#include <basegfx/matrix/b2dhommatrix.hxx> -#include <canvas/rendering/irendermodule.hxx> -#include <canvas/rendering/icolorbuffer.hxx> -#include <canvas/rendering/isurface.hxx> - -#include "surfacerect.hxx" -#include "pagemanager.hxx" - -namespace canvas -{ - ////////////////////////////////////////////////////////////////////////////////// - // Surface - ////////////////////////////////////////////////////////////////////////////////// - - /** surfaces denote occupied areas withing pages. - - pages encapsulate the hardware buffers that - contain image data which can be used for texturing. - surfaces are areas within those pages. - */ - class Surface - { - public: - - Surface( const PageManagerSharedPtr& rPageManager, - const IColorBufferSharedPtr& rColorBuffer, - const ::basegfx::B2IPoint& rPos, - const ::basegfx::B2ISize& rSize ); - ~Surface(); - - void setColorBufferDirty(); - - /** Render the surface content to screen. - - @param fAlpha - Overall alpha for content - - @param rPos - Output position - - @param rTransform - Output transformation (does not affect output position) - */ - bool draw( double fAlpha, - const ::basegfx::B2DPoint& rPos, - const ::basegfx::B2DHomMatrix& rTransform ); - - /** Render the surface content to screen. - - @param fAlpha - Overall alpha for content - - @param rPos - Output position - - @param rArea - Subset of the surface to render. Coordinate system are - surface area pixel, given area will be clipped to the - surface bounds. - - @param rTransform - Output transformation (does not affect output position) - */ - bool drawRectangularArea( - double fAlpha, - const ::basegfx::B2DPoint& rPos, - const ::basegfx::B2DRange& rArea, - const ::basegfx::B2DHomMatrix& rTransform ); - - /** Render the surface content to screen. - - @param fAlpha - Overall alpha for content - - @param rPos - Output position - - @param rClipPoly - Clip polygon for the surface. The clip polygon is also - subject to the output transformation. - - @param rTransform - Output transformation (does not affect output position) - */ - bool drawWithClip( double fAlpha, - const ::basegfx::B2DPoint& rPos, - const ::basegfx::B2DPolygon& rClipPoly, - const ::basegfx::B2DHomMatrix& rTransform ); - - // private attributes - private: - IColorBufferSharedPtr mpColorBuffer; - - // invoking any of the above defined 'draw' methods - // will forward primitive commands to the rendermodule. - PageManagerSharedPtr mpPageManager; - - FragmentSharedPtr mpFragment; - - // the offset of this surface with regard to the source - // image. if the source image had to be tiled into multiple - // surfaces, this offset denotes the relative pixel distance - // from the source image's upper, left corner - ::basegfx::B2IPoint maSourceOffset; - - // the size in pixels of this surface. please note that - // this size is likely to be smaller than the size of - // the colorbuffer we're associated with since we - // maybe represent only a part of it. - ::basegfx::B2ISize maSize; - - bool mbIsDirty; - - // private methods - private: - bool refresh( canvas::IColorBuffer& rBuffer ) const; - void prepareRendering(); - - basegfx::B2DRectangle getUVCoords() const; - basegfx::B2DRectangle getUVCoords( const ::basegfx::B2IPoint& rPos, - const ::basegfx::B2ISize& rSize ) const; - }; - - typedef ::boost::shared_ptr< Surface > SurfaceSharedPtr; -} - -#endif - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/canvas/source/tools/surfaceproxy.cxx b/canvas/source/tools/surfaceproxy.cxx deleted file mode 100644 index 48d233bc33..0000000000 --- a/canvas/source/tools/surfaceproxy.cxx +++ /dev/null @@ -1,185 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * 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_canvas.hxx" - -#include <boost/bind.hpp> -#include <basegfx/polygon/b2dpolygoncutandtouch.hxx> -#include <basegfx/polygon/b2dpolygontriangulator.hxx> -#include <basegfx/polygon/b2dpolypolygontools.hxx> -#include "surfaceproxy.hxx" - -namespace canvas -{ - ////////////////////////////////////////////////////////////////////////////////// - // SurfaceProxy::SurfaceProxy - ////////////////////////////////////////////////////////////////////////////////// - - SurfaceProxy::SurfaceProxy( const canvas::IColorBufferSharedPtr& pBuffer, - const PageManagerSharedPtr& pPageManager ) : - mpPageManager( pPageManager ), - maSurfaceList(), - mpBuffer( pBuffer ) - { - const ::basegfx::B2ISize aImageSize(mpBuffer->getWidth(),mpBuffer->getHeight()); - const ::basegfx::B2ISize aPageSize(mpPageManager->getPageSize()); - const sal_Int32 aPageSizeX(aPageSize.getX()); - const sal_Int32 aPageSizeY(aPageSize.getY()); - const sal_Int32 aImageSizeX(aImageSize.getX()); - const sal_Int32 aImageSizeY(aImageSize.getY()); - - // see if the size of the colorbuffer is larger than the size - // of a single page. if this is the case we divide the - // colorbuffer into as many surfaces as we need to get the - // whole area distributed. otherwise (the colorbuffer is - // smaller than the size of a single page) we search for free - // pages or create a new one. - // the incoming image is too large to fit into a single - // page. strategy: we split the image into rectangular - // areas that are as large as the maximum page size - // dictates and follow the strategy for fitting images. - size_t dwNumSurfaces(0); - for(sal_Int32 y=0; y<aImageSizeY; y+=aPageSizeY) - for(sal_Int32 x=0; x<aImageSizeX; x+=aPageSizeX) - ++dwNumSurfaces; - maSurfaceList.reserve(dwNumSurfaces); - - for(sal_Int32 y=0; y<aImageSizeY; y+=aPageSizeY) - { - for(sal_Int32 x=0; x<aImageSizeX; x+=aPageSizeX) - { - // the current surface is located at the position [x,y] - // and has the size [min(restx,pagesizex),min(resty,pagesizey) - ::basegfx::B2IPoint aOffset(x,y); - ::basegfx::B2ISize aSize( ::std::min( aImageSize.getX()-x, - aPageSize.getX() ), - ::std::min( aImageSize.getY()-y, - aPageSize.getY() ) ); - - maSurfaceList.push_back( - SurfaceSharedPtr( - new Surface( - mpPageManager, - mpBuffer, - aOffset, - aSize))); - } - } - } - - ////////////////////////////////////////////////////////////////////////////////// - // SurfaceProxy::setColorBufferDirty - ////////////////////////////////////////////////////////////////////////////////// - - void SurfaceProxy::setColorBufferDirty() - { - ::std::for_each( maSurfaceList.begin(), - maSurfaceList.end(), - ::boost::mem_fn(&Surface::setColorBufferDirty)); - } - - ////////////////////////////////////////////////////////////////////////////////// - // SurfaceProxy::draw - ////////////////////////////////////////////////////////////////////////////////// - - bool SurfaceProxy::draw( double fAlpha, - const ::basegfx::B2DPoint& rPos, - const ::basegfx::B2DHomMatrix& rTransform ) - { - ::std::for_each( maSurfaceList.begin(), - maSurfaceList.end(), - ::boost::bind( &Surface::draw, - _1, - fAlpha, - ::boost::cref(rPos), - ::boost::cref(rTransform))); - - return true; - } - - ////////////////////////////////////////////////////////////////////////////////// - // SurfaceProxy::draw - ////////////////////////////////////////////////////////////////////////////////// - - bool SurfaceProxy::draw( double fAlpha, - const ::basegfx::B2DPoint& rPos, - const ::basegfx::B2DRange& rArea, - const ::basegfx::B2DHomMatrix& rTransform ) - { - ::std::for_each( maSurfaceList.begin(), - maSurfaceList.end(), - ::boost::bind(&Surface::drawRectangularArea, - _1, - fAlpha, - ::boost::cref(rPos), - ::boost::cref(rArea), - ::boost::cref(rTransform))); - - return true; - } - - ////////////////////////////////////////////////////////////////////////////////// - // SurfaceProxy::draw - ////////////////////////////////////////////////////////////////////////////////// - - bool SurfaceProxy::draw( double fAlpha, - const ::basegfx::B2DPoint& rPos, - const ::basegfx::B2DPolyPolygon& rClipPoly, - const ::basegfx::B2DHomMatrix& rTransform ) - { - const ::basegfx::B2DPolygon& rTriangulatedPolygon( - ::basegfx::triangulator::triangulate(rClipPoly)); - -#if OSL_DEBUG_LEVEL > 2 - // dump polygons - OSL_TRACE( "Original clip polygon: %s\n" - "Triangulated polygon: %s\n", - rtl::OUStringToOString( - basegfx::tools::exportToSvgD( rClipPoly ), - RTL_TEXTENCODING_ASCII_US).getStr(), - rtl::OUStringToOString( - basegfx::tools::exportToSvgD( - basegfx::B2DPolyPolygon(rTriangulatedPolygon) ), - RTL_TEXTENCODING_ASCII_US).getStr() ); -#endif - - ::std::for_each( maSurfaceList.begin(), - maSurfaceList.end(), - ::boost::bind(&Surface::drawWithClip, - _1, - fAlpha, - ::boost::cref(rPos), - ::boost::cref(rTriangulatedPolygon), - ::boost::cref(rTransform))); - - return true; - } -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/canvas/source/tools/surfaceproxy.hxx b/canvas/source/tools/surfaceproxy.hxx deleted file mode 100644 index a68a1ce46b..0000000000 --- a/canvas/source/tools/surfaceproxy.hxx +++ /dev/null @@ -1,137 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * 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. - * - ************************************************************************/ - -#ifndef INCLUDED_CANVAS_SURFACEPROXY_HXX -#define INCLUDED_CANVAS_SURFACEPROXY_HXX - -#include <canvas/rendering/isurfaceproxy.hxx> -#include <canvas/rendering/icolorbuffer.hxx> - -#include "pagemanager.hxx" -#include "surface.hxx" - -namespace canvas -{ - - ////////////////////////////////////////////////////////////////////////////////// - // SurfaceProxy - ////////////////////////////////////////////////////////////////////////////////// - - /** Definition of the surface proxy class. - - Surface proxies are the connection between *one* source image - and *one or more* hardware surfaces (or textures). in a - logical structure surface proxies represent soley this - dependeny plus some simple cache management. - */ - class SurfaceProxy : public ISurfaceProxy - { - public: - - SurfaceProxy( const canvas::IColorBufferSharedPtr& pBuffer, - const PageManagerSharedPtr &pPageManager ); - - // ISurfaceProxy interface - virtual void setColorBufferDirty(); - - /** Render the surface content to screen. - - @param fAlpha - Overall alpha for content - - @param rPos - Output position - - @param rTransform - Output transformation (does not affect output position) - */ - virtual bool draw( double fAlpha, - const ::basegfx::B2DPoint& rPos, - const ::basegfx::B2DHomMatrix& rTransform ); - - /** Render the surface content to screen. - - @param fAlpha - Overall alpha for content - - @param rPos - Output position - - @param rArea - Subset of the surface to render. Coordinate system are - surface area pixel, given area will be clipped to the - surface bounds. - - @param rTransform - Output transformation (does not affect output position) - */ - virtual bool draw( double fAlpha, - const ::basegfx::B2DPoint& rPos, - const ::basegfx::B2DRange& rArea, - const ::basegfx::B2DHomMatrix& rTransform ); - - /** Render the surface content to screen. - - @param fAlpha - Overall alpha for content - - @param rPos - Output position - - @param rClipPoly - Clip polygon for the surface. The clip polygon is also - subject to the output transformation. - - @param rTransform - Output transformation (does not affect output position) - */ - virtual bool draw( double fAlpha, - const ::basegfx::B2DPoint& rPos, - const ::basegfx::B2DPolyPolygon& rClipPoly, - const ::basegfx::B2DHomMatrix& rTransform ); - - private: - PageManagerSharedPtr mpPageManager; - - // the pagemanager will distribute the image - // to one or more surfaces, this is why we - // need a list here. - std::vector<SurfaceSharedPtr> maSurfaceList; - - // pointer to the source of image data - // which always is stored in system memory, - // 32bit rgba and can have any size. - canvas::IColorBufferSharedPtr mpBuffer; - }; - - typedef ::boost::shared_ptr< SurfaceProxy > SurfaceProxySharedPtr; -} - -#endif - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/canvas/source/tools/surfaceproxymanager.cxx b/canvas/source/tools/surfaceproxymanager.cxx deleted file mode 100644 index 1b6e8fba85..0000000000 --- a/canvas/source/tools/surfaceproxymanager.cxx +++ /dev/null @@ -1,89 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * 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_canvas.hxx" - -#include <canvas/rendering/isurfaceproxymanager.hxx> -#include <canvas/rendering/isurfaceproxy.hxx> -#include "surfaceproxy.hxx" - -namespace canvas -{ - - ////////////////////////////////////////////////////////////////////////////////// - // SurfaceProxyManager - ////////////////////////////////////////////////////////////////////////////////// - - class SurfaceProxyManager : public ISurfaceProxyManager - { - public: - - SurfaceProxyManager( const IRenderModuleSharedPtr pRenderModule ) : - mpPageManager( new PageManager(pRenderModule) ) - { - } - - /** the whole idea is build around the concept that you create - some arbitrary buffer which contains the image data and - tell the texture manager about it. from there on you can - draw this image using any kind of graphics api you want. - in the technical sense we allocate some space in local - videomemory or AGP memory which will be filled on demand, - which means if there exists any rendering operation that - needs to read from this memory location. this method - creates a logical hardware surface object which uses the - given color buffer as the image source. internally this - texture may be distributed to several real hardware - surfaces. - */ - virtual ISurfaceProxySharedPtr createSurfaceProxy( const IColorBufferSharedPtr& pBuffer ) const - { - // not much to do for now, simply allocate a new surface - // proxy from our internal pool and initialize this thing - // properly. we *don't* create a hardware surface for now. - return SurfaceProxySharedPtr(new SurfaceProxy(pBuffer,mpPageManager)); - } - - private: - PageManagerSharedPtr mpPageManager; - }; - - ////////////////////////////////////////////////////////////////////////////////// - // createSurfaceProxyManager - ////////////////////////////////////////////////////////////////////////////////// - - ISurfaceProxyManagerSharedPtr createSurfaceProxyManager( const IRenderModuleSharedPtr& rRenderModule ) - { - return ISurfaceProxyManagerSharedPtr( - new SurfaceProxyManager( - rRenderModule)); - } -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/canvas/source/tools/surfacerect.hxx b/canvas/source/tools/surfacerect.hxx deleted file mode 100644 index 67b5ea464f..0000000000 --- a/canvas/source/tools/surfacerect.hxx +++ /dev/null @@ -1,138 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * 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. - * - ************************************************************************/ - -#ifndef INCLUDED_CANVAS_SURFACERECT_HXX -#define INCLUDED_CANVAS_SURFACERECT_HXX - -#include <basegfx/point/b2ipoint.hxx> -#include <basegfx/vector/b2isize.hxx> - -namespace canvas -{ - ////////////////////////////////////////////////////////////////////////////////// - // SurfaceRect - ////////////////////////////////////////////////////////////////////////////////// - - struct SurfaceRect - { - ::basegfx::B2IPoint maPos; - ::basegfx::B2ISize maSize; - ::basegfx::B2IPoint maBackup; - bool bEnabled; - - explicit SurfaceRect( const ::basegfx::B2ISize &rSize ) : - maPos(), - maSize(rSize), - maBackup(), - bEnabled(true) - { - } - - // coordinates contained in this rectangle are - // constrained to the following rules: - // 1) p.x >= pos.x - // 2) p.x <= pos.x+size.x - // 3) p.y >= pos.y - // 4) p.y <= pos.y+size.y - // in other words, 'size' means the number of pixels - // this rectangle encloses plus one. for example with pos[0,0] - // and size[512,512], p[512,512] would return inside. - // a size of [0,0] therefore denotes a one-by-one rectangle. - bool pointInside( sal_Int32 px, sal_Int32 py ) const - { - const sal_Int32 x1(maPos.getX()); - const sal_Int32 y1(maPos.getY()); - const sal_Int32 x2(maPos.getX()+maSize.getX()); - const sal_Int32 y2(maPos.getY()+maSize.getY()); - if(px < x1) return false; - if(px >= x2) return false; - if(py < y1) return false; - if(py >= y2) return false; - return true; - } - - // returns true if the horizontal line intersects the rect. - bool hLineIntersect( sal_Int32 lx1, sal_Int32 lx2, sal_Int32 ly ) const - { - const sal_Int32 x1(maPos.getX()); - const sal_Int32 y1(maPos.getY()); - const sal_Int32 x2(maPos.getX()+maSize.getX()); - const sal_Int32 y2(maPos.getY()+maSize.getY()); - if(ly < y1) return false; - if(ly >= y2) return false; - if((lx1 < x1) && (lx2 < x1)) return false; - if((lx1 >= x2) && (lx2 >= x2)) return false; - return true; - } - - //! Returns true if the vertical line intersects the rect. - bool vLineIntersect( sal_Int32 lx, sal_Int32 ly1, sal_Int32 ly2 ) const - { - const sal_Int32 x1(maPos.getX()); - const sal_Int32 y1(maPos.getY()); - const sal_Int32 x2(maPos.getX()+maSize.getX()); - const sal_Int32 y2(maPos.getY()+maSize.getY()); - if(lx < x1) return false; - if(lx >= x2) return false; - if((ly1 < y1) && (ly2 < y1)) return false; - if((ly1 >= y2) && (ly2 >= y2)) return false; - return true; - } - - // returns true if the passed rect intersects this one. - bool intersection( const SurfaceRect& r ) const - { - const sal_Int32 x1(maPos.getX()); - const sal_Int32 y1(maPos.getY()); - const sal_Int32 x2(maPos.getX()+maSize.getX()); - const sal_Int32 y2(maPos.getY()+maSize.getY()); - if(r.hLineIntersect(x1,x2,y1)) return true; - if(r.hLineIntersect(x1,x2,y2)) return true; - if(r.vLineIntersect(x1,y1,y2)) return true; - if(r.vLineIntersect(x2,y1,y2)) return true; - return false; - } - - bool inside( const SurfaceRect& r ) const - { - const sal_Int32 x1(maPos.getX()); - const sal_Int32 y1(maPos.getY()); - const sal_Int32 x2(maPos.getX()+maSize.getX()); - const sal_Int32 y2(maPos.getY()+maSize.getY()); - if(!(r.pointInside(x1,y1))) return false; - if(!(r.pointInside(x2,y1))) return false; - if(!(r.pointInside(x2,y2))) return false; - if(!(r.pointInside(x1,y2))) return false; - return true; - } - }; -} - -#endif - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/canvas/source/tools/verifyinput.cxx b/canvas/source/tools/verifyinput.cxx deleted file mode 100644 index 8da43f0165..0000000000 --- a/canvas/source/tools/verifyinput.cxx +++ /dev/null @@ -1,929 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * 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_canvas.hxx" - -#include <com/sun/star/geometry/AffineMatrix2D.hpp> -#include <com/sun/star/geometry/Matrix2D.hpp> -#include <com/sun/star/geometry/RealPoint2D.hpp> -#include <com/sun/star/geometry/RealSize2D.hpp> -#include <com/sun/star/geometry/IntegerPoint2D.hpp> -#include <com/sun/star/geometry/IntegerSize2D.hpp> -#include <com/sun/star/geometry/RealRectangle2D.hpp> -#include <com/sun/star/geometry/RealBezierSegment2D.hpp> -#include <com/sun/star/rendering/RenderState.hpp> -#include <com/sun/star/rendering/ViewState.hpp> -#include <com/sun/star/rendering/XCanvas.hpp> -#include <com/sun/star/rendering/CompositeOperation.hpp> -#include <com/sun/star/rendering/TexturingMode.hpp> -#include <com/sun/star/util/Endianness.hpp> -#include <com/sun/star/rendering/PathCapType.hpp> -#include <com/sun/star/rendering/PathJoinType.hpp> -#include <com/sun/star/rendering/IntegerBitmapLayout.hpp> -#include <com/sun/star/rendering/FloatingPointBitmapFormat.hpp> -#include <com/sun/star/rendering/FloatingPointBitmapLayout.hpp> -#include <com/sun/star/beans/XPropertySet.hpp> -#include <com/sun/star/lang/XServiceInfo.hpp> - -#include <basegfx/matrix/b2dhommatrix.hxx> -#include <basegfx/range/b2drange.hxx> -#include <basegfx/range/b2irange.hxx> -#include <basegfx/range/b2drectangle.hxx> -#include <basegfx/point/b2dpoint.hxx> -#include <basegfx/tools/canvastools.hxx> -#include <basegfx/polygon/b2dpolygon.hxx> - -#include <canvas/verifyinput.hxx> -#include <canvas/canvastools.hxx> - - -using namespace ::com::sun::star; - -namespace canvas -{ - namespace tools - { - void verifyInput( const geometry::RealPoint2D& rPoint, - const char* pStr, - const uno::Reference< uno::XInterface >& xIf, - ::sal_Int16 nArgPos ) - { - (void)pStr; (void)xIf; (void)nArgPos; - -#if OSL_DEBUG_LEVEL > 0 - if( !::rtl::math::isFinite( rPoint.X ) ) - { - throw lang::IllegalArgumentException( - ::rtl::OUString::createFromAscii(pStr) + - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ": verifyInput(): point X value contains infinite or NAN" )), - xIf, - nArgPos ); - } - - if( !::rtl::math::isFinite( rPoint.Y ) ) - { - throw lang::IllegalArgumentException( - ::rtl::OUString::createFromAscii(pStr) + - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ": verifyInput(): point X value contains infinite or NAN" )), - xIf, - nArgPos ); - } -#else - if( !::rtl::math::isFinite( rPoint.X ) || - !::rtl::math::isFinite( rPoint.Y ) ) - { - throw lang::IllegalArgumentException(); - } -#endif - } - - void verifyInput( const geometry::RealSize2D& rSize, - const char* pStr, - const uno::Reference< uno::XInterface >& xIf, - ::sal_Int16 nArgPos ) - { - (void)pStr; (void)xIf; (void)nArgPos; - -#if OSL_DEBUG_LEVEL > 0 - if( !::rtl::math::isFinite( rSize.Width ) ) - { - throw lang::IllegalArgumentException( - ::rtl::OUString::createFromAscii(pStr) + - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ": verifyInput(): size.Width value contains infinite or NAN" )), - xIf, - nArgPos ); - } - - if( !::rtl::math::isFinite( rSize.Height ) ) - { - throw lang::IllegalArgumentException( - ::rtl::OUString::createFromAscii(pStr) + - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ": verifyInput(): size.Height value contains infinite or NAN" )), - xIf, - nArgPos ); - } -#else - if( !::rtl::math::isFinite( rSize.Width ) || - !::rtl::math::isFinite( rSize.Height ) ) - { - throw lang::IllegalArgumentException(); - } -#endif - } - - void verifyInput( const geometry::RealBezierSegment2D& rSegment, - const char* pStr, - const uno::Reference< uno::XInterface >& xIf, - ::sal_Int16 nArgPos ) - { - (void)pStr; (void)xIf; (void)nArgPos; - -#if OSL_DEBUG_LEVEL > 0 - if( !::rtl::math::isFinite( rSegment.Px ) ) - { - throw lang::IllegalArgumentException( - ::rtl::OUString::createFromAscii(pStr) + - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ": verifyInput(): bezier segment's Px value contains infinite or NAN" )), - xIf, - nArgPos ); - } - - if( !::rtl::math::isFinite( rSegment.Py ) ) - { - throw lang::IllegalArgumentException( - ::rtl::OUString::createFromAscii(pStr) + - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ": verifyInput(): bezier segment's Py value contains infinite or NAN" )), - xIf, - nArgPos ); - } - - if( !::rtl::math::isFinite( rSegment.C1x ) ) - { - throw lang::IllegalArgumentException( - ::rtl::OUString::createFromAscii(pStr) + - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ": verifyInput(): bezier segment's C1x value contains infinite or NAN" )), - xIf, - nArgPos ); - } - - if( !::rtl::math::isFinite( rSegment.C1y ) ) - { - throw lang::IllegalArgumentException( - ::rtl::OUString::createFromAscii(pStr) + - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ": verifyInput(): bezier segment's C1y value contains infinite or NAN" )), - xIf, - nArgPos ); - } - - if( !::rtl::math::isFinite( rSegment.C2x ) ) - { - throw lang::IllegalArgumentException( - ::rtl::OUString::createFromAscii(pStr) + - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ": verifyInput(): bezier segment's C2x value contains infinite or NAN" )), - xIf, - nArgPos ); - } - - if( !::rtl::math::isFinite( rSegment.C2y ) ) - { - throw lang::IllegalArgumentException( - ::rtl::OUString::createFromAscii(pStr) + - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ": verifyInput(): bezier segment's C2y value contains infinite or NAN" )), - xIf, - nArgPos ); - } -#else - if( !::rtl::math::isFinite( rSegment.Px ) || - !::rtl::math::isFinite( rSegment.Py ) || - !::rtl::math::isFinite( rSegment.C1x ) || - !::rtl::math::isFinite( rSegment.C1y ) || - !::rtl::math::isFinite( rSegment.C2x ) || - !::rtl::math::isFinite( rSegment.C2y ) ) - { - throw lang::IllegalArgumentException(); - } -#endif - } - - void verifyInput( const geometry::RealRectangle2D& rRect, - const char* pStr, - const uno::Reference< uno::XInterface >& xIf, - ::sal_Int16 nArgPos ) - { - (void)pStr; (void)xIf; (void)nArgPos; - -#if OSL_DEBUG_LEVEL > 0 - if( !::rtl::math::isFinite( rRect.X1 ) ) - { - throw lang::IllegalArgumentException( - ::rtl::OUString::createFromAscii(pStr) + - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ": verifyInput(): rectangle point X1 contains infinite or NAN" )), - xIf, - nArgPos ); - } - - if( !::rtl::math::isFinite( rRect.Y1 ) ) - { - throw lang::IllegalArgumentException( - ::rtl::OUString::createFromAscii(pStr) + - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ": verifyInput(): rectangle point Y1 contains infinite or NAN" )), - xIf, - nArgPos ); - } - - if( !::rtl::math::isFinite( rRect.X2 ) ) - { - throw lang::IllegalArgumentException( - ::rtl::OUString::createFromAscii(pStr) + - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ": verifyInput(): rectangle point X2 contains infinite or NAN" )), - xIf, - nArgPos ); - } - - if( !::rtl::math::isFinite( rRect.Y2 ) ) - { - throw lang::IllegalArgumentException( - ::rtl::OUString::createFromAscii(pStr) + - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ": verifyInput(): rectangle point Y2 contains infinite or NAN" )), - xIf, - nArgPos ); - } -#else - if( !::rtl::math::isFinite( rRect.X1 ) || - !::rtl::math::isFinite( rRect.Y1 ) || - !::rtl::math::isFinite( rRect.X2 ) || - !::rtl::math::isFinite( rRect.Y2 ) ) - { - throw lang::IllegalArgumentException(); - } -#endif - } - - void verifyInput( const geometry::AffineMatrix2D& matrix, - const char* pStr, - const uno::Reference< uno::XInterface >& xIf, - ::sal_Int16 nArgPos ) - { - (void)pStr; (void)xIf; (void)nArgPos; - -#if OSL_DEBUG_LEVEL > 0 - const sal_Int32 nBinaryState( - 100000 * !::rtl::math::isFinite( matrix.m00 ) + - 10000 * !::rtl::math::isFinite( matrix.m01 ) + - 1000 * !::rtl::math::isFinite( matrix.m02 ) + - 100 * !::rtl::math::isFinite( matrix.m10 ) + - 10 * !::rtl::math::isFinite( matrix.m11 ) + - 1 * !::rtl::math::isFinite( matrix.m12 ) ); - - if( nBinaryState ) - { - throw lang::IllegalArgumentException( - ::rtl::OUString::createFromAscii(pStr) + - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ": verifyInput(): AffineMatrix2D contains infinite or NAN value(s) at the following positions (m00-m12): " )) + - ::rtl::OUString::valueOf(nBinaryState), - xIf, - nArgPos ); - } -#else - if( !::rtl::math::isFinite( matrix.m00 ) || - !::rtl::math::isFinite( matrix.m01 ) || - !::rtl::math::isFinite( matrix.m02 ) || - !::rtl::math::isFinite( matrix.m10 ) || - !::rtl::math::isFinite( matrix.m11 ) || - !::rtl::math::isFinite( matrix.m12 ) ) - { - throw lang::IllegalArgumentException(); - } -#endif - } - - void verifyInput( const geometry::Matrix2D& matrix, - const char* pStr, - const uno::Reference< uno::XInterface >& xIf, - ::sal_Int16 nArgPos ) - { - (void)pStr; (void)xIf; (void)nArgPos; - -#if OSL_DEBUG_LEVEL > 0 - const sal_Int32 nBinaryState( - 1000 * !::rtl::math::isFinite( matrix.m00 ) + - 100 * !::rtl::math::isFinite( matrix.m01 ) + - 10 * !::rtl::math::isFinite( matrix.m10 ) + - 1 * !::rtl::math::isFinite( matrix.m11 ) ); - - if( nBinaryState ) - { - throw lang::IllegalArgumentException( - ::rtl::OUString::createFromAscii(pStr) + - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ": verifyInput(): Matrix2D contains infinite or NAN value(s) at the following positions (m00-m11): " )) + - ::rtl::OUString::valueOf(nBinaryState), - xIf, - nArgPos ); - } -#else - if( !::rtl::math::isFinite( matrix.m00 ) || - !::rtl::math::isFinite( matrix.m01 ) || - !::rtl::math::isFinite( matrix.m10 ) || - !::rtl::math::isFinite( matrix.m11 ) ) - { - throw lang::IllegalArgumentException(); - } -#endif - } - - void verifyInput( const rendering::ViewState& viewState, - const char* pStr, - const uno::Reference< uno::XInterface >& xIf, - ::sal_Int16 nArgPos ) - { - verifyInput( viewState.AffineTransform, - pStr, xIf, nArgPos ); - } - - void verifyInput( const rendering::RenderState& renderState, - const char* pStr, - const uno::Reference< uno::XInterface >& xIf, - ::sal_Int16 nArgPos, - sal_Int32 nMinColorComponents ) - { - verifyInput( renderState.AffineTransform, - pStr, xIf, nArgPos ); - - if( renderState.DeviceColor.getLength() < nMinColorComponents ) - { -#if OSL_DEBUG_LEVEL > 0 - throw lang::IllegalArgumentException( - ::rtl::OUString::createFromAscii(pStr) + - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ": verifyInput(): render state's device color has too few components (" )) + - ::rtl::OUString::valueOf(nMinColorComponents) + - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( " expected, " )) + - ::rtl::OUString::valueOf(renderState.DeviceColor.getLength()) + - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( " provided)" )), - xIf, - nArgPos ); -#else - throw lang::IllegalArgumentException(); -#endif - } - - if( renderState.CompositeOperation < rendering::CompositeOperation::CLEAR || - renderState.CompositeOperation > rendering::CompositeOperation::SATURATE ) - { -#if OSL_DEBUG_LEVEL > 0 - throw lang::IllegalArgumentException( - ::rtl::OUString::createFromAscii(pStr) + - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ": verifyInput(): render state's CompositeOperation value out of range (" )) + - ::rtl::OUString::valueOf(sal::static_int_cast<sal_Int32>(renderState.CompositeOperation)) + - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( " not known)" )), - xIf, - nArgPos ); -#else - throw lang::IllegalArgumentException(); -#endif - } - } - - void verifyInput( const rendering::Texture& texture, - const char* pStr, - const uno::Reference< uno::XInterface >& xIf, - ::sal_Int16 nArgPos ) - { - verifyInput( texture.AffineTransform, - pStr, xIf, nArgPos ); - - if( !::rtl::math::isFinite( texture.Alpha ) || - texture.Alpha < 0.0 || - texture.Alpha > 1.0 ) - { -#if OSL_DEBUG_LEVEL > 0 - throw lang::IllegalArgumentException( - ::rtl::OUString::createFromAscii(pStr) + - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ": verifyInput(): textures' alpha value out of range (is " )) + - ::rtl::OUString::valueOf(texture.Alpha) + - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ")" )), - xIf, - nArgPos ); -#else - throw lang::IllegalArgumentException(); -#endif - } - - if( texture.NumberOfHatchPolygons < 0 ) - { -#if OSL_DEBUG_LEVEL > 0 - throw lang::IllegalArgumentException( - ::rtl::OUString::createFromAscii(pStr) + - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ": verifyInput(): textures' NumberOfHatchPolygons is negative" )), - xIf, - nArgPos ); -#else - throw lang::IllegalArgumentException(); -#endif - } - - if( texture.RepeatModeX < rendering::TexturingMode::NONE || - texture.RepeatModeX > rendering::TexturingMode::REPEAT ) - { -#if OSL_DEBUG_LEVEL > 0 - throw lang::IllegalArgumentException( - ::rtl::OUString::createFromAscii(pStr) + - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ": verifyInput(): textures' RepeatModeX value is out of range (" )) + - ::rtl::OUString::valueOf(sal::static_int_cast<sal_Int32>(texture.RepeatModeX)) + - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( " not known)" )), - xIf, - nArgPos ); -#else - throw lang::IllegalArgumentException(); -#endif - } - - if( texture.RepeatModeY < rendering::TexturingMode::NONE || - texture.RepeatModeY > rendering::TexturingMode::REPEAT ) - { -#if OSL_DEBUG_LEVEL > 0 - throw lang::IllegalArgumentException( - ::rtl::OUString::createFromAscii(pStr) + - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ": verifyInput(): textures' RepeatModeY value is out of range (" )) + - ::rtl::OUString::valueOf(sal::static_int_cast<sal_Int32>(texture.RepeatModeY)) + - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( " not known)" )), - xIf, - nArgPos ); -#else - throw lang::IllegalArgumentException(); -#endif - } - } - - namespace - { - struct VerifyDashValue - { - VerifyDashValue( const char* pStr, - const uno::Reference< uno::XInterface >& xIf, - ::sal_Int16 nArgPos ) : - mpStr( pStr ), - mrIf( xIf ), - mnArgPos( nArgPos ) - { - } - - void operator()( const double& rVal ) - { - if( !::rtl::math::isFinite( rVal ) || rVal < 0.0 ) - { -#if OSL_DEBUG_LEVEL > 0 - throw lang::IllegalArgumentException( - ::rtl::OUString::createFromAscii(mpStr) + - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ": verifyInput(): one of stroke attributes' DashArray value out of range (is " )) + - ::rtl::OUString::valueOf(rVal) + - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ")" )), - mrIf, - mnArgPos ); -#else - throw lang::IllegalArgumentException(); -#endif - } - } - - const char* mpStr; - const uno::Reference< uno::XInterface >& mrIf; - sal_Int16 mnArgPos; - }; - } - - void verifyInput( const rendering::StrokeAttributes& strokeAttributes, - const char* pStr, - const uno::Reference< uno::XInterface >& xIf, - ::sal_Int16 nArgPos ) - { - if( !::rtl::math::isFinite( strokeAttributes.StrokeWidth ) || - strokeAttributes.StrokeWidth < 0.0 ) - { -#if OSL_DEBUG_LEVEL > 0 - throw lang::IllegalArgumentException( - ::rtl::OUString::createFromAscii(pStr) + - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ": verifyInput(): stroke attributes' StrokeWidth value out of range (is " )) + - ::rtl::OUString::valueOf(strokeAttributes.StrokeWidth) + - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ")" )), - xIf, - nArgPos ); -#else - throw lang::IllegalArgumentException(); -#endif - } - - if( !::rtl::math::isFinite( strokeAttributes.MiterLimit ) || - strokeAttributes.MiterLimit < 0.0 ) - { -#if OSL_DEBUG_LEVEL > 0 - throw lang::IllegalArgumentException( - ::rtl::OUString::createFromAscii(pStr) + - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ": verifyInput(): stroke attributes' MiterLimit value out of range (is " )) + - ::rtl::OUString::valueOf(strokeAttributes.MiterLimit) + - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ")" )), - xIf, - nArgPos ); -#else - throw lang::IllegalArgumentException(); -#endif - } - - ::std::for_each( strokeAttributes.DashArray.getConstArray(), - strokeAttributes.DashArray.getConstArray() + strokeAttributes.DashArray.getLength(), - VerifyDashValue( pStr, xIf, nArgPos ) ); - - ::std::for_each( strokeAttributes.LineArray.getConstArray(), - strokeAttributes.LineArray.getConstArray() + strokeAttributes.LineArray.getLength(), - VerifyDashValue( pStr, xIf, nArgPos ) ); - - if( strokeAttributes.StartCapType < rendering::PathCapType::BUTT || - strokeAttributes.StartCapType > rendering::PathCapType::SQUARE ) - { -#if OSL_DEBUG_LEVEL > 0 - throw lang::IllegalArgumentException( - ::rtl::OUString::createFromAscii(pStr) + - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ": verifyInput(): stroke attributes' StartCapType value is out of range (" )) + - ::rtl::OUString::valueOf(sal::static_int_cast<sal_Int32>(strokeAttributes.StartCapType)) + - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( " not known)" )), - xIf, - nArgPos ); -#else - throw lang::IllegalArgumentException(); -#endif - } - - if( strokeAttributes.EndCapType < rendering::PathCapType::BUTT || - strokeAttributes.EndCapType > rendering::PathCapType::SQUARE ) - { -#if OSL_DEBUG_LEVEL > 0 - throw lang::IllegalArgumentException( - ::rtl::OUString::createFromAscii(pStr) + - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ": verifyInput(): stroke attributes' StartCapType value is out of range (" )) + - ::rtl::OUString::valueOf(sal::static_int_cast<sal_Int32>(strokeAttributes.EndCapType)) + - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( " not known)" )), - xIf, - nArgPos ); -#else - throw lang::IllegalArgumentException(); -#endif - } - - if( strokeAttributes.JoinType < rendering::PathJoinType::NONE || - strokeAttributes.JoinType > rendering::PathJoinType::BEVEL ) - { -#if OSL_DEBUG_LEVEL > 0 - throw lang::IllegalArgumentException( - ::rtl::OUString::createFromAscii(pStr) + - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ": verifyInput(): stroke attributes' JoinType value is out of range (" )) + - ::rtl::OUString::valueOf(sal::static_int_cast<sal_Int32>(strokeAttributes.JoinType)) + - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( " not known)" )), - xIf, - nArgPos ); -#else - throw lang::IllegalArgumentException(); -#endif - } - } - - void verifyInput( const rendering::IntegerBitmapLayout& bitmapLayout, - const char* pStr, - const uno::Reference< uno::XInterface >& xIf, - ::sal_Int16 nArgPos ) - { - (void)pStr; (void)xIf; (void)nArgPos; - - if( bitmapLayout.ScanLines < 0 ) - { -#if OSL_DEBUG_LEVEL > 0 - throw lang::IllegalArgumentException( - ::rtl::OUString::createFromAscii(pStr) + - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ": verifyInput(): bitmap layout's ScanLines is negative" )), - xIf, - nArgPos ); -#else - throw lang::IllegalArgumentException(); -#endif - } - - if( bitmapLayout.ScanLineBytes < 0 ) - { -#if OSL_DEBUG_LEVEL > 0 - throw lang::IllegalArgumentException( - ::rtl::OUString::createFromAscii(pStr) + - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ": verifyInput(): bitmap layout's ScanLineBytes is negative" )), - xIf, - nArgPos ); -#else - throw lang::IllegalArgumentException(); -#endif - } - - if( !bitmapLayout.ColorSpace.is() ) - { -#if OSL_DEBUG_LEVEL > 0 - throw lang::IllegalArgumentException( - ::rtl::OUString::createFromAscii(pStr) + - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ": verifyInput(): bitmap layout's ColorSpace is invalid" )), - xIf, - nArgPos ); -#else - throw lang::IllegalArgumentException(); -#endif - } - else - { - if( bitmapLayout.ColorSpace->getBitsPerPixel() < 0 ) - { -#if OSL_DEBUG_LEVEL > 0 - throw lang::IllegalArgumentException( - ::rtl::OUString::createFromAscii(pStr) + - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ": verifyInput(): bitmap layout's ColorSpace getBitsPerPixel() is negative" )), - xIf, - nArgPos ); -#else - throw lang::IllegalArgumentException(); -#endif - } - - if( bitmapLayout.ColorSpace->getEndianness() < util::Endianness::LITTLE || - bitmapLayout.ColorSpace->getEndianness() > util::Endianness::BIG ) - { -#if OSL_DEBUG_LEVEL > 0 - throw lang::IllegalArgumentException( - ::rtl::OUString::createFromAscii(pStr) + - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ": verifyInput(): bitmap layout's ColorSpace getEndianness() value is out of range (" )) + - ::rtl::OUString::valueOf(sal::static_int_cast<sal_Int32>(bitmapLayout.ColorSpace->getEndianness())) + - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( " not known)" )), - xIf, - nArgPos ); -#else - throw lang::IllegalArgumentException(); -#endif - } - } - } - - void verifyInput( const rendering::FloatingPointBitmapLayout& bitmapLayout, - const char* pStr, - const uno::Reference< uno::XInterface >& xIf, - ::sal_Int16 nArgPos ) - { - (void)pStr; (void)xIf; (void)nArgPos; - - if( bitmapLayout.ScanLines < 0 ) - { -#if OSL_DEBUG_LEVEL > 0 - throw lang::IllegalArgumentException( - ::rtl::OUString::createFromAscii(pStr) + - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ": verifyInput(): bitmap layout's ScanLines is negative" )), - xIf, - nArgPos ); -#else - throw lang::IllegalArgumentException(); -#endif - } - - if( bitmapLayout.ScanLineBytes < 0 ) - { -#if OSL_DEBUG_LEVEL > 0 - throw lang::IllegalArgumentException( - ::rtl::OUString::createFromAscii(pStr) + - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ": verifyInput(): bitmap layout's ScanLineBytes is negative" )), - xIf, - nArgPos ); -#else - throw lang::IllegalArgumentException(); -#endif - } - - if( !bitmapLayout.ColorSpace.is() ) - { -#if OSL_DEBUG_LEVEL > 0 - throw lang::IllegalArgumentException( - ::rtl::OUString::createFromAscii(pStr) + - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ": verifyInput(): bitmap layout's ColorSpace is invalid" )), - xIf, - nArgPos ); -#else - throw lang::IllegalArgumentException(); -#endif - } - - if( bitmapLayout.NumComponents < 0 ) - { -#if OSL_DEBUG_LEVEL > 0 - throw lang::IllegalArgumentException( - ::rtl::OUString::createFromAscii(pStr) + - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ": verifyInput(): bitmap layout's NumComponents is negative" )), - xIf, - nArgPos ); -#else - throw lang::IllegalArgumentException(); -#endif - } - - if( bitmapLayout.Endianness < util::Endianness::LITTLE || - bitmapLayout.Endianness > util::Endianness::BIG ) - { -#if OSL_DEBUG_LEVEL > 0 - throw lang::IllegalArgumentException( - ::rtl::OUString::createFromAscii(pStr) + - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ": verifyInput(): bitmap layout's Endianness value is out of range (" )) + - ::rtl::OUString::valueOf(sal::static_int_cast<sal_Int32>(bitmapLayout.Endianness)) + - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( " not known)" )), - xIf, - nArgPos ); -#else - throw lang::IllegalArgumentException(); -#endif - } - - if( bitmapLayout.Format < rendering::FloatingPointBitmapFormat::HALFFLOAT || - bitmapLayout.Format > rendering::FloatingPointBitmapFormat::DOUBLE ) - { -#if OSL_DEBUG_LEVEL > 0 - throw lang::IllegalArgumentException( - ::rtl::OUString::createFromAscii(pStr) + - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ": verifyInput(): bitmap layout's Format value is out of range (" )) + - ::rtl::OUString::valueOf(sal::static_int_cast<sal_Int32>(bitmapLayout.Format)) + - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( " not known)" )), - xIf, - nArgPos ); -#else - throw lang::IllegalArgumentException(); -#endif - } - } - - void verifyInput( const rendering::FontInfo& /*fontInfo*/, - const char* /*pStr*/, - const uno::Reference< uno::XInterface >& /*xIf*/, - ::sal_Int16 /*nArgPos*/ ) - { - // TODO(E3): Implement FontDescription checks, once the - // Panose stuff is ready. - } - - void verifyInput( const rendering::FontRequest& fontRequest, - const char* pStr, - const uno::Reference< uno::XInterface >& xIf, - ::sal_Int16 nArgPos ) - { - verifyInput( fontRequest.FontDescription, - pStr, xIf, nArgPos ); - - if( !::rtl::math::isFinite( fontRequest.CellSize ) ) - { -#if OSL_DEBUG_LEVEL > 0 - throw lang::IllegalArgumentException( - ::rtl::OUString::createFromAscii(pStr) + - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ": verifyInput(): font request's CellSize value contains infinite or NAN" )), - xIf, - nArgPos ); -#else - throw lang::IllegalArgumentException(); -#endif - } - - if( !::rtl::math::isFinite( fontRequest.ReferenceAdvancement ) ) - { -#if OSL_DEBUG_LEVEL > 0 - throw lang::IllegalArgumentException( - ::rtl::OUString::createFromAscii(pStr) + - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ": verifyInput(): font request's ReferenceAdvancement value contains infinite or NAN" )), - xIf, - nArgPos ); -#else - throw lang::IllegalArgumentException(); -#endif - } - - if( fontRequest.CellSize != 0.0 && - fontRequest.ReferenceAdvancement != 0.0 ) - { -#if OSL_DEBUG_LEVEL > 0 - throw lang::IllegalArgumentException( - ::rtl::OUString::createFromAscii(pStr) + - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ": verifyInput(): font request's CellSize and ReferenceAdvancement are mutually exclusive, one of them must be 0.0" )), - xIf, - nArgPos ); -#else - throw lang::IllegalArgumentException(); -#endif - } - } - - void verifyIndexRange( const geometry::IntegerRectangle2D& rect, - const geometry::IntegerSize2D& size ) - { - const ::basegfx::B2IRange aRect( - ::basegfx::unotools::b2IRectangleFromIntegerRectangle2D( - rect ) ); - - if( aRect.getMinX() < 0 || - aRect.getMaxX() > size.Width || - aRect.getMinY() < 0 || - aRect.getMaxY() > size.Height ) - { - throw ::com::sun::star::lang::IndexOutOfBoundsException(); - } - } - - void verifyIndexRange( const geometry::IntegerPoint2D& pos, - const geometry::IntegerSize2D& size ) - { - if( pos.X < 0 || - pos.X > size.Width || - pos.Y < 0 || - pos.Y > size.Height ) - { - throw ::com::sun::star::lang::IndexOutOfBoundsException(); - } - } - - void verifyBitmapSize( const geometry::IntegerSize2D& size, - const char* pStr, - const uno::Reference< uno::XInterface >& xIf ) - { - (void)pStr; (void)xIf; - - if( size.Width <= 0 ) - { -#if OSL_DEBUG_LEVEL > 0 - throw lang::IllegalArgumentException( - ::rtl::OUString::createFromAscii(pStr) + - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ": verifyBitmapSize(): size has 0 or negative width (value: " )) + - ::rtl::OUString::valueOf(size.Width) + - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ")" )), - xIf, - 0 ); -#else - throw lang::IllegalArgumentException(); -#endif - } - - if( size.Height <= 0 ) - { -#if OSL_DEBUG_LEVEL > 0 - throw lang::IllegalArgumentException( - ::rtl::OUString::createFromAscii(pStr) + - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ": verifyBitmapSize(): size has 0 or negative height (value: " )) + - ::rtl::OUString::valueOf(size.Height) + - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ")" )), - xIf, - 0 ); -#else - throw lang::IllegalArgumentException(); -#endif - } - } - - void verifySpriteSize( const geometry::RealSize2D& size, - const char* pStr, - const uno::Reference< uno::XInterface >& xIf ) - { - (void)pStr; (void)xIf; - - if( size.Width <= 0.0 ) - { -#if OSL_DEBUG_LEVEL > 0 - throw lang::IllegalArgumentException( - ::rtl::OUString::createFromAscii(pStr) + - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ": verifySpriteSize(): size has 0 or negative width (value: " )) + - ::rtl::OUString::valueOf(size.Width) + - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ")" )), - xIf, - 0 ); -#else - throw lang::IllegalArgumentException(); -#endif - } - - if( size.Height <= 0.0 ) - { -#if OSL_DEBUG_LEVEL > 0 - throw lang::IllegalArgumentException( - ::rtl::OUString::createFromAscii(pStr) + - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ": verifySpriteSize(): size has 0 or negative height (value: " )) + - ::rtl::OUString::valueOf(size.Height) + - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ")" )), - xIf, - 0 ); -#else - throw lang::IllegalArgumentException(); -#endif - } - } - - - } // namespace tools - -} // namespace canvas - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |