--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/imaging/imagingfws/src/ImageConversionPriv.h Wed Aug 25 12:29:52 2010 +0300
@@ -0,0 +1,434 @@
+// Copyright (c) 2001-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// Not for public use
+// These are structures for the Image Conversion Library
+// to maintain future binary compatibility
+//
+//
+
+#ifndef IMAGECONVERSIONPRIV_H
+#define IMAGECONVERSIONPRIV_H
+
+#include "icl/ImageCodec.h"
+#include "icl/ImageData.h"
+#include "ImageConversion.h"
+#include "ImagePrivSupport.h"
+#include "icl/imageconversionextension.h"
+#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS
+#include <icl/imagecodecdef.h>
+#endif
+
+#if defined(SYMBIAN_ENABLE_ENCODER_ASYNC_WRITES)
+#include "asyncfilewriter.h"
+#endif
+
+#include <caf/caf.h>
+#include <caf/content.h>
+#include <caf/data.h>
+
+using namespace ContentAccess;
+
+// incomplete forward declarations
+class CImageDecoderPlugin;
+class CImageEncoderPlugin;
+
+class RCImageDecoderPrivContinueProcessingHeaderLTest;
+
+class CImageDataArray; // declared here
+NONSHARABLE_CLASS( CImageDataArray ): public CBase
+ {
+public:
+ ~CImageDataArray();
+
+ // Access fns.
+ // Append/insert/delete
+ TInt InsertImageData(const TImageDataBlock* aEntry, TInt aPos);
+ TInt AppendImageData(const TImageDataBlock* aEntry);
+ void RemoveImageData(TInt aIndex);
+
+ // Get image data/local image data.
+ const TImageDataBlock* GetImageData(TInt aIndex) const;
+ TImageDataBlock* GetImageData(TInt aIndex);
+
+ // Get num entries.
+ TInt ImageDataCount() const;
+
+ // Append image buffers.
+ TInt AppendImageBuffer(const HBufC8* aImageBuffer);
+
+private:
+ // Image data for the frame. (Single frame formats)
+ // Image data that is the same for all frames. (Multi frame formats)
+ RPointerArray<TImageDataBlock> iImageData;
+
+ // List of HBufC8 (Comments) owned by us.
+ // Deleted when we are.
+ RPointerArray<HBufC8> iImageBuffers;
+
+friend class CFrameImageData;
+ };
+
+/*
+Interface to allow proxy (from straight), or stub (from threaded) to set the
+framework's TRequestStatus.
+*/
+class MFrameworkExtAsyncInterface
+ {
+public:
+ /*
+ Used only in conjunction with asynchronous framework extension methods.
+ It registers the calling thread's TRequestStatus with the framework, which is
+ signalled when RequestComplete() is called, indicating an error code (including
+ KErrNone) to the client.
+ @param aRequestThread The calling thread.
+ @param aRequestStatus The calling thread's TRequestStatus.
+ */
+ virtual void RegisterClientRequestStatus(RThread& aRequestThread, TRequestStatus* aRequestStatus) = 0;
+
+ /*
+ Used only in conjunction with asynchronous framework extension methods.
+ Starts the framework AO, and thus the processing loop.
+ */
+ virtual void StartActivity() = 0;
+ };
+
+// Properties for CImageDecoder
+class CImageDecoderPriv; // declared here
+NONSHARABLE_CLASS( CImageDecoderPriv ): public CActive,
+ public MFrameworkExtAsyncInterface
+ {
+public:
+ static CImageDecoderPriv* NewL(CImageDecodeConstruct *aConstruct, MImageDecoderPrivSupport* aSupport);
+ virtual ~CImageDecoderPriv();
+
+ void SetFileL(RFs& aFs, const TDesC& aSourceFilename, const CImageDecoder::TOptions aOptions = CImageDecoder::EOptionNone);
+ void SetFileL(RFile& aFile, const CImageDecoder::TOptions aOptions = CImageDecoder::EOptionNone);
+ void SetDataL(RFs& aFs, const TDesC8& aSourceData, const CImageDecoder::TOptions aOptions = CImageDecoder::EOptionNone);
+
+ void CreatePluginL();
+ CImageDecoderPlugin* Plugin() const;
+
+ void HandleNewlyOpenedImageL();
+
+ void InitConvertL();
+ void RequestInitL(TInt aFrameNumber);
+ void Convert(RThread& aRequestThread, TRequestStatus* aRequestStatus, CFbsBitmap& aDestination, TInt aFrameNumber);
+ void Convert(RThread& aRequestThread, TRequestStatus* aRequestStatus, CFbsBitmap& aDestination, CFbsBitmap& aDestinationMask, TInt aFrameNumber = 0);
+ void ContinueConvert(RThread& aRequestThread, TRequestStatus* aRequestStatus);
+
+ void DoConvert();
+ void PrepareForProcessFrameL();
+ void HandleProcessFrameResult(TInt aErrCode, TFrameState aCodecState);
+ TBufPtr8& SourceData();
+
+ void ContinueProcessingHeaderL();
+
+ void ReadDataL(TInt aPosition, TPtrC8& aReadBuffer, TInt aLength);
+
+ void CreateFrameInfoL();
+ void DeleteFrameInfoL();
+ void ReadFrameHeadersL();
+
+ const TFrameInfo& FrameInfo(TInt aFrameNumber) const;
+ CFrameInfoStrings* FrameInfoStringsLC(TInt aFrameNumber);
+
+ void Cleanup();
+ void RequestComplete(TInt aReason);
+ void SelfComplete(TInt aReason);
+ void SetSelfPending();
+
+ TUid ImplementationUid() const;
+
+ void SetImageTypeL(TInt aImageType);
+
+ // custom command support
+ void CustomSyncL(TInt aParam);
+ void BodyHandleCustomSyncL(TInt aParam);
+ void CustomAsync(RThread& aRequestThread, TRequestStatus* aRequestStatus, TInt aParam);
+ void BodyInitCustomAsyncL(TInt aParam);
+ void BodyNotifyComplete();
+
+ // thread support to plugin
+ TBool AmInThread() const;
+ TBool ShouldAbort() const;
+
+ // straight access functions decoder
+ TInt FrameCount() const;
+ TBool IsImageHeaderProcessingComplete() const;
+ const CFrameImageData& FrameData(TInt aFrameNumber) const;
+
+ // straight access functions from plugin
+ CImageReadCodec* ImageReadCodec() const;
+ void SetImageReadCodec(CImageReadCodec* aImageReadCodec);
+ TInt DataLength() const;
+ void SetDataLength(TInt aDataLength);
+ TInt StartPosition() const;
+ void SetStartPosition(TInt aStartPosition);
+ const TImageDataBlock* ImageData(TInt aIndex) const;
+ TInt InsertImageData(const TImageDataBlock* aEntry, TInt aPos);
+ void RemoveImageData(TInt aPos);
+ TInt AppendImageData(const TImageDataBlock* aEntry);
+ TInt ImageDataCount() const;
+ TInt AppendImageDataBuffer(const HBufC8* aImageBuffer);
+ TInt NumberOfFrames() const;
+ TInt Position() const;
+ void SetPosition(const TInt aPosition);
+ const TFrameInfo& ImageInfo() const;
+ void SetImageInfo(const TFrameInfo& aImageInfo);
+ const CFbsBitmap& Destination() const;
+ TBool ValidDestination() const;
+ const CFbsBitmap& DestinationMask() const;
+ TBool ValidDestinationMask() const;
+ TInt SourceLength() const;
+
+ void SetIntent(TIntent aIntent);
+
+ void SetUniqueIdL(const TDesC& aUniqueId);
+ TInt SetAgentProperty(TAgentProperty aProperty, TInt aValue);
+
+ void SetThumbnailData(HBufC8* aThumbnailData);
+
+ TInt ReductionFactor(const TSize& aOriginalSize, const TSize& aReducedSize) const;
+ TInt ReducedSize(const TSize& aOriginalSize, TInt aReductionFactor, TSize& aReducedSize) const;
+
+ inline CImageDecoder::TOptions DecoderOptions() const;
+
+ // Framework extension
+ void GetExtensionL(TUid aExtUid, MImageConvExtension*& aExtPtr);
+ void SetClippingRectL(const TRect* aClipRect);
+ TInt GetDestinationSize(TSize& aSize, TInt aFrameNumber = 0);
+
+ // From MFrameworkExtAsyncInterface
+ void RegisterClientRequestStatus(RThread& aRequestThread, TRequestStatus* aRequestStatus);
+ void StartActivity();
+
+protected:
+ TBool MustUseBufferWithDescriptor() const;
+ void CopyBufferToDescriptor(TDes8& aBuffer, const TDesC8& aSource, TInt aPosition, TInt aSize);
+
+private:
+
+ CImageDecoderPriv(CImageDecodeConstruct* aConstruct, MImageDecoderPrivSupport* aSupport);
+
+ void RunL(); // From CActive
+ void DoCancel();
+
+ void OpenExtraResourceFileLC(RFs& aFs, const TUid aUid, RResourceFile& aResourceFile) const;
+ TInt DataSizeL();
+ void SeekReadL(TInt aPosition, TDes8& aDest, TInt aSize);
+
+
+private:
+ // Frame info and frame data arrays. (Local frame settings)
+ RPointerArray<TFrameInfo> iFrameInfo;
+ RPointerArray<CFrameImageData> iFrameData;
+
+ TFrameInfo iImageInfo;
+ CImageDataArray iImageData;
+
+ // Global frame settings
+ CFbsBitmap* iDestination; // not owned
+ CFbsBitmap* iDestinationMask; // not owned
+
+ TInt iDataLength;
+ TInt iStartPosition;
+ TInt iPosition;
+ TInt iSrcLength;
+ TBufPtr8 iSrcDes;
+
+ CImageReadCodec* iImageReadCodec;
+ TBool iHaveCompleteImageHeaders;
+
+ TInt iImageType;
+ HBufC8* iThumbnailData;
+
+private:
+ RFs* iFs;
+ CContent* iContent;
+ CData* iData;
+ TIntent iIntent;
+ HBufC* iUniqueId;
+ TImageParameterData iImageParameterData;
+ TFileName iFileName;
+ TInt iDestinationHandle;
+ TInt iDestinationMaskHandle;
+
+ HBufC8* iReadBuffer;
+
+ TInt iNextFrameOffset;
+ TBool iProcessingFrameInfo;
+
+ TInt iBlockLength;
+ TInt iCurrentBlockLength;
+ TSize iDestinationSize; // used to check we don't continue with different bitmap
+ TInt iOldSrcDesLength;
+
+ CImageDecoder::TOptions iOptions;
+
+ RThread* iRequestThread; // not owned
+ TRequestStatus* iConvStatus; // not owned
+ TInt iCurrentFrame;
+ TBool iCurrentlyProcessingData;
+
+ CImageDecodeConstruct* iConstruct; // not owned
+ MImageDecoderPrivSupport* iSupport; // not owned
+ CImageDecoderPlugin* iPlugin;
+ TBool iIntentHasBeenExecuted;
+ /** Size of data source in bytes. Only valid if data source is read-only. */
+ TInt iCachedDataSize;
+ /** Start byte of last read from data file. */
+ TInt iLastPos;
+ /** Byte after last data block which was read from data source. */
+ TInt iLastExtent;
+ /** Flag to indicate if file input is read only or will grow **/
+ TBool iReadOnly;
+ /** Flag to Check whether to Use Image buffer read optimization **/
+ TBool iUseBufferReadOptimization;
+
+// allow direct access to unit tests.
+friend class RCImageDecoderPrivTestBase;
+friend class RCImageDecoderPrivContinueProcessingHeaderLTest;
+ };
+
+// forward declaration - gives access to internal destination buffer
+class CImageEncoderPrivTestAccess;
+
+// Properties for CImageEncoder
+class CImageEncoderPriv; // declared here
+NONSHARABLE_CLASS( CImageEncoderPriv ): public CActive,
+ public MFrameworkExtAsyncInterface
+#if defined(SYMBIAN_ENABLE_ENCODER_ASYNC_WRITES)
+ ,protected MBufferWrittenObserver
+#endif
+ {
+public:
+ static CImageEncoderPriv* NewL(CImageEncodeConstruct* aConstruct, MImageEncoderPrivSupport* aSupport);
+ virtual ~CImageEncoderPriv();
+
+ void SetFileL(RFs& aFs, const TDesC& aDestinationFilename, const CImageEncoder::TOptions aOptions = CImageEncoder::EOptionNone);
+ void SetFileL(RFile& aFile, const CImageEncoder::TOptions aOptions = CImageEncoder::EOptionNone);
+ void SetDataL(HBufC8*& aDestinationData, const CImageEncoder::TOptions aOptions = CImageEncoder::EOptionNone);
+
+ void CreatePluginL();
+ CImageEncoderPlugin* Plugin() const;
+
+ TInt CurrentImageSizeL() const;
+ void Cleanup();
+ void InitConvertL();
+ void RequestInitL();
+ void Convert(RThread& aRequestThread, TRequestStatus* aRequestStatus, const CFbsBitmap& aSource, const CFrameImageData* aFrameImageData);
+ void WriteDataL(TInt aPosition,const TDesC8& aDes);
+ void WriteDataPositionIncL(TInt aPosition,const TDesC8& aDes);
+ void DoConvert();
+ void HandleProcessFrameResult(TInt aErrCode, TFrameState aCodecState);
+ TBufPtr8& DestinationData();
+ void DoCancel();
+ void FinishConvertL();
+
+ TUid ImplementationUid() const;
+
+ // custom command support
+ void CustomSyncL(TInt aParam);
+ void BodyHandleCustomSyncL(TInt aParam);
+ void CustomAsync(RThread& aRequestThread, TRequestStatus* aRequestStatus, TInt aParam);
+ void BodyInitCustomAsyncL(TInt aParam);
+ void BodyNotifyComplete();
+
+ void RequestComplete(TInt aReason);
+ void SelfComplete(TInt aReason);
+ void SetSelfPending();
+
+ // thread support to plugin
+ TBool AmInThread() const;
+ TBool ShouldAbort() const;
+
+ // Data access from CImageEncoderPlugin
+ CImageWriteCodec* ImageWriteCodec() const;
+ void SetImageWriteCodec(CImageWriteCodec* aImageWriteCodec);
+ const CFbsBitmap& Source() const;
+ TBool ValidSource() const;
+ TInt& StartPosition();
+ TInt& Position();
+ const TSize& FrameInfoOverallSizeInPixels() const;
+
+ void SetThumbnail(TBool aDoGenerateThumbnail);
+
+ inline CImageEncoder::TOptions EncoderOptions() const;
+
+ // Framework extension
+ void GetExtensionL(TUid aExtUid, MImageConvExtension*& aExtPtr);
+
+ // From MFrameworkExtAsyncInterface
+ void RegisterClientRequestStatus(RThread& aRequestThread, TRequestStatus* aRequestStatus);
+ void StartActivity();
+
+#if defined(SYMBIAN_ENABLE_ENCODER_ASYNC_WRITES)
+protected:
+ void DoHandleProcessFrameResultL(TFrameState aCodecState);
+
+ // from the MBufferWrittenObserver
+ virtual void BufferWritten(const TPtrC8& aWritten, TInt aErrorCode);
+#endif // defined(SYMBIAN_ENABLE_ENCODER_ASYNC_WRITES)
+
+private:
+ CImageEncoderPriv(CImageEncodeConstruct* aConstruct, MImageEncoderPrivSupport* aSupport);
+
+ void RunL();
+
+private:
+ RThread* iRequestThread; // not owned
+ TRequestStatus* iConvStatus; // not owned
+ TFrameInfo iFrameInfo;
+ CImageWriteCodec* iImageWriteCodec;
+ TBufPtr8 iDstDes;
+ HBufC8* iDstBuffer;
+ HBufC8* iFinalDstBuffer;
+ HBufC8** iDestination;
+ TInt iStartPosition;
+ TInt iPosition;
+
+ TBool iHeaderWritten; // describes if the header has been written or not
+
+ CImageEncoder::TOptions iOptions;
+
+ RFs* iFs;
+ RFile iFile;
+ TFileName iFileName;
+
+ const CFbsBitmap* iSource;
+ TImageParameterData iImageParameterData;
+ TBool iConvertStarted;
+
+private:
+ CImageEncodeConstruct* iConstruct; // not owned
+ MImageEncoderPrivSupport* iSupport;
+ CImageEncoderPlugin* iPlugin;
+
+#if defined(SYMBIAN_ENABLE_ENCODER_ASYNC_WRITES)
+ CAsyncFileWriter* iAsyncFileWriter;
+ TInt iWriterError;
+
+#else
+ TBool iLastBuffer;
+#endif // defined(SYMBIAN_ENABLE_ENCODER_ASYNC_WRITES)
+
+// allow this class access to internal buffers
+friend class CImageEncoderPrivTestAccess;
+ };
+
+#include "ImageConversionPriv.inl"
+
+
+#endif // IMAGECONVERSIONPRIV_H
+