/*************************************************************************
 *
 *  $RCSfile: animate.hxx,v $
 *
 *  $Revision: 1.2 $
 *
 *  last change: $Author: hr $ $Date: 2000/12/07 13:37:15 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/

#ifndef _SV_ANIMATE_HXX
#define _SV_ANIMATE_HXX

#ifndef _SV_TIMER_HXX
#include <vcl/timer.hxx>
#endif
#ifndef _SV_BITMAPEX_HXX
#include <vcl/bitmapex.hxx>
#endif

// -----------
// - Defines -
// -----------

#define ANIMATION_TIMEOUT_ON_CLICK 2147483647L

// ---------
// - Enums -
// ---------

enum Disposal
{
	DISPOSE_NOT,
	DISPOSE_BACK,
	DISPOSE_FULL,
	DISPOSE_PREVIOUS 
};

enum CycleMode
{
	CYCLE_NOT,
	CYCLE_NORMAL,
	CYCLE_FALLBACK,
	CYCLE_REVERS,
	CYCLE_REVERS_FALLBACK
};

// -------------------
// - AnimationBitmap -
// -------------------

struct AnimationBitmap
{
	BitmapEx	aBmpEx;
	Point		aPosPix;
	Size		aSizePix;
	long		nWait;
	Disposal	eDisposal;
	BOOL		bUserInput;

				AnimationBitmap() {}
				AnimationBitmap( const BitmapEx& rBmpEx, const Point& rPosPix,
								 const Size& rSizePix, long _nWait = 0L,
								 Disposal _eDisposal = DISPOSE_NOT ) :
							aBmpEx		( rBmpEx ),
							aPosPix		( rPosPix ),
							aSizePix	( rSizePix ),
							nWait		( _nWait ),
							eDisposal	( _eDisposal ),
							bUserInput	( FALSE ) {}

	BOOL		operator==( const AnimationBitmap& rAnimBmp ) const
				{
					return( rAnimBmp.aBmpEx == aBmpEx &&
							rAnimBmp.aPosPix == aPosPix &&
							rAnimBmp.aSizePix == aSizePix &&
							rAnimBmp.nWait == nWait &&
							rAnimBmp.eDisposal == eDisposal &&
							rAnimBmp.bUserInput == bUserInput );
				}

	BOOL		operator!=( const AnimationBitmap& rAnimBmp ) const { return !( *this == rAnimBmp ); }

	BOOL		IsEqual( const AnimationBitmap& rAnimBmp ) const
				{
					return( rAnimBmp.aPosPix == aPosPix &&
							rAnimBmp.aSizePix == aSizePix &&
							rAnimBmp.nWait == nWait &&
							rAnimBmp.eDisposal == eDisposal &&
							rAnimBmp.bUserInput == bUserInput &&
							rAnimBmp.aBmpEx.IsEqual( aBmpEx ) );
				}

	ULONG		GetChecksum() const;
};

// -------------------
// - AnimationBitmap -
// -------------------

struct AInfo
{
	Bitmap			aLastSaveBitmap;
	Bitmap			aBackBitmap;
	Rectangle		aClipRect;
	Size			aLastSaveSize;
	Point			aLastSavePoint;
	Point			aStartOrg;
	Size			aStartSize;
	OutputDevice*	pOutDev;
	void*			pViewData;
	long			nExtraData;
	BOOL			bWithSize;
	BOOL			bPause;

					AInfo() : pOutDev( NULL ), 
							  pViewData( NULL ), 
							  nExtraData( 0L ),
							  bWithSize( FALSE ),
							  bPause( FALSE ) {}
};

// -------------------
// - AnimationBitmap -
// -------------------

class Animation
{
	static ULONG			mnAnimCount;
	List					maList;
	List					maAInfoList;
	Link					maNotifyLink;
	BitmapEx				maBitmapEx;
	Timer					maTimer;
	Size					maGlobalSize;
	List*					mpViewList;
	void*					mpExtraData;
	long					mnLoopCount;
	long					mnLoops;
	long					mnPos;
	Disposal				meLastDisposal;
	CycleMode				meCycleMode;
	BOOL					mbFirst;
	BOOL					mbIsInAnimation;
	BOOL					mbWithSize;
	BOOL					mbLoopTerminated;
	BOOL					mbIsWaiting;

#if 0 // _SOLAR__PRIVATE				

	void					ImplRestartTimer( ULONG nTimeout );
							DECL_LINK( ImplTimeoutHdl, Timer* );

public:

	static void				ImplIncAnimCount() { mnAnimCount++; }
	static void 			ImplDecAnimCount() { mnAnimCount--; }
	ULONG					ImplGetCurPos() const { return mnPos; }

#endif						

public:						
							Animation();
							Animation( const Animation& rAnimation );
							~Animation();

	Animation&				operator=( const Animation& rAnimation );
	BOOL					operator==( const Animation& rAnimation ) const;
	BOOL					operator!=( const Animation& rAnimation ) const { return !(*this==rAnimation); }

	BOOL					IsEqual( const Animation& rAnimation ) const;

	BOOL					IsEmpty() const;
	void					SetEmpty();

	void					Clear();

	BOOL					Start( OutputDevice* pOutDev, const Point& rDestPt, long nExtraData = 0, 
								   OutputDevice* pFirstFrameOutDev = NULL );
	BOOL					Start( OutputDevice* pOutDev, const Point& rDestPt, const Size& rDestSz, long nExtraData = 0,
								   OutputDevice* pFirstFrameOutDev = NULL );
	void					Stop( OutputDevice* pOutDev = NULL, long nExtraData = 0 );

	void					Draw( OutputDevice* pOutDev, const Point& rDestPt ) const;
	void					Draw( OutputDevice* pOutDev, const Point& rDestPt, const Size& rDestSz ) const;

	BOOL					IsInAnimation() const { return mbIsInAnimation; }
	BOOL					IsTransparent() const;
	BOOL					IsTerminated() const { return mbLoopTerminated; }

	const Size&				GetDisplaySizePixel() const { return maGlobalSize; }
	void					SetDisplaySizePixel( const Size& rSize ) { maGlobalSize = rSize; }

	const BitmapEx&			GetBitmapEx() const { return maBitmapEx; }
	void					SetBitmapEx( const BitmapEx& rBmpEx ) { maBitmapEx = rBmpEx; }

	ULONG					GetLoopCount() const { return mnLoopCount; }
	void					SetLoopCount( const ULONG nLoopCount );
	void					ResetLoopCount();

	void					SetCycleMode( CycleMode eMode );
	CycleMode				GetCycleMode() const { return meCycleMode; }

	void					SetNotifyHdl( const Link& rLink ) { maNotifyLink = rLink; }
	const Link&				GetNotifyHdl() const { return maNotifyLink; }

	USHORT					Count() const { return (USHORT) maList.Count(); }
	BOOL					Insert( const AnimationBitmap& rAnimationBitmap );
	const AnimationBitmap&	Get( USHORT nAnimation ) const;
	void					Replace( const AnimationBitmap& rNewAnimationBmp, USHORT nAnimation );

	List*					GetAInfoList() { return &maAInfoList; }
	ULONG					GetSizeBytes() const;
	ULONG					GetChecksum() const;

public:

    BOOL					Convert( BmpConversion eConversion );
	BOOL					ReduceColors( USHORT nNewColorCount, 
										  BmpReduce eReduce = BMP_REDUCE_SIMPLE );
    BOOL					Invert();
    BOOL					Mirror( ULONG nMirrorFlags );
	BOOL					Dither( ULONG nDitherFlags = BMP_DITHER_MATRIX, const BitmapPalette* pDitherPal = NULL );
	BOOL					Adjust( short nLuminancePercent = 0,
									short nContrastPercent = 0,
									short nChannelRPercent = 0, 
									short nChannelGPercent = 0, 
									short nChannelBPercent = 0,
									double fGamma = 1.0,
									BOOL bInvert = FALSE );
	BOOL					Filter( BmpFilter eFilter, 
									const BmpFilterParam* pFilterParam = NULL,
									const Link* pProgress = NULL );

    friend SvStream&		operator>>( SvStream& rIStream, Animation& rAnimation );
    friend SvStream&		operator<<( SvStream& rOStream, const Animation& rAnimation );
};

#endif // _SV_ANIMATE_HXX
