/**************************************************************
 * 
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 * 
 *************************************************************/



#ifndef _GIFREAD_HXX
#define _GIFREAD_HXX

#ifndef _GRAPH_HXX
#include <vcl/graph.hxx>
#endif
#ifndef _BMPACC_HXX
#include <vcl/bmpacc.hxx>
#endif

#ifdef _GIFPRIVATE

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

enum GIFAction
{
	GLOBAL_HEADER_READING,
	MARKER_READING,
	EXTENSION_READING,
	LOCAL_HEADER_READING,
	FIRST_BLOCK_READING,
	NEXT_BLOCK_READING,
	ABORT_READING,
	END_READING
};

// ------------------------------------------------------------------------

enum ReadState
{
	GIFREAD_OK,
	GIFREAD_ERROR,
	GIFREAD_NEED_MORE
};

// -------------
// - GIFReader -
// -------------

class GIFLZWDecompressor;

class SvStream;

class GIFReader : public GraphicReader
{
	Graphic				aImGraphic;
	Animation			aAnimation;
	Bitmap				aBmp8;
	Bitmap				aBmp1;
	BitmapPalette		aGPalette;
	BitmapPalette		aLPalette;
	SvStream&			rIStm;
	void*				pCallerData;
	HPBYTE				pSrcBuf;
	GIFLZWDecompressor*	pDecomp;
	BitmapWriteAccess*	pAcc8;
	BitmapWriteAccess*	pAcc1;
	long				nYAcc;
	long				nLastPos;
	sal_uInt32			nLogWidth100;
	sal_uInt32			nLogHeight100;
	sal_uInt16				nTimer;
	sal_uInt16				nGlobalWidth;			// maximale Bildbreite aus Header
	sal_uInt16				nGlobalHeight;			// maximale Bildhoehe aus Header
	sal_uInt16				nImageWidth;			// maximale Bildbreite aus Header
	sal_uInt16				nImageHeight;			// maximale Bildhoehe aus Header
	sal_uInt16				nImagePosX;
	sal_uInt16				nImagePosY;
	sal_uInt16				nImageX;				// maximale Bildbreite aus Header
	sal_uInt16				nImageY;				// maximale Bildhoehe aus Header
	sal_uInt16				nLastImageY;
	sal_uInt16				nLastInterCount;
	sal_uInt16				nLoops;
	GIFAction			eActAction;
	sal_Bool				bStatus;
	sal_Bool				bGCTransparent;			// Ob das Bild Transparent ist, wenn ja:
	sal_Bool				bInterlaced;
	sal_Bool				bOverreadBlock;
	sal_Bool				bImGraphicReady;
	sal_Bool				bGlobalPalette;
	sal_uInt8				nBackgroundColor;		// Hintergrundfarbe
	sal_uInt8				nGCTransparentIndex;	// Pixel von diesem Index sind durchsichtig
	sal_uInt8				nGCDisposalMethod;		// 'Disposal Method' (siehe GIF-Doku)
	sal_uInt8				cTransIndex1;
	sal_uInt8				cNonTransIndex1;

	void				ReadPaletteEntries( BitmapPalette* pPal, sal_uLong nCount );
	void				ClearImageExtensions();
	sal_Bool				CreateBitmaps( long nWidth, long nHeight, BitmapPalette* pPal, sal_Bool bWatchForBackgroundColor );
	sal_Bool				ReadGlobalHeader();
	sal_Bool				ReadExtension();
	sal_Bool				ReadLocalHeader();
	sal_uLong				ReadNextBlock();
	void				FillImages( HPBYTE pBytes, sal_uLong nCount );
	void				CreateNewBitmaps();
	sal_Bool				ProcessGIF();

public:

	ReadState			ReadGIF( Graphic& rGraphic );
	const Graphic&		GetIntermediateGraphic();

						GIFReader( SvStream& rStm );
	virtual				~GIFReader();
};

#endif // _GIFPRIVATE

// -------------
// - ImportGIF -
// -------------

 sal_Bool ImportGIF( SvStream& rStream, Graphic& rGraphic );

#endif // _GIFREAD_HXX
