williamr@2: // Copyright (c) 2001-2009 Nokia Corporation and/or its subsidiary(-ies). williamr@2: // All rights reserved. williamr@2: // This component and the accompanying materials are made available williamr@4: // under the terms of "Eclipse Public License v1.0" williamr@2: // which accompanies this distribution, and is available williamr@4: // at the URL "http://www.eclipse.org/legal/epl-v10.html". williamr@2: // williamr@2: // Initial Contributors: williamr@2: // Nokia Corporation - initial contribution. williamr@2: // williamr@2: // Contributors: williamr@2: // williamr@2: // Description: williamr@2: // This is the public client API for the Image Conversion Library williamr@2: // williamr@2: // williamr@2: williamr@2: #ifndef IMAGECONVERSION_H williamr@2: #define IMAGECONVERSION_H williamr@2: williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: williamr@4: #ifndef SYMBIAN_ENABLE_SPLIT_HEADERS williamr@4: #include williamr@4: #endif williamr@4: williamr@2: class MImageDecoderRelay; williamr@2: class MImageEncoderRelay; williamr@2: class CImageDecoderPlugin; williamr@2: class CImageEncoderPlugin; williamr@2: class CImageDecodeConstruct; williamr@2: class CImageEncodeConstruct; williamr@2: williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@2: williamr@2: Container type to manage lists of UIDs. williamr@2: */ williamr@2: typedef RArray RUidDataArray; williamr@2: williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@2: williamr@2: Class used to manage the mapping between an image's type, sub-type and description. williamr@2: */ williamr@2: class CImageTypeDescription : public CBase williamr@2: { williamr@2: public: williamr@2: /** williamr@2: @internalComponent williamr@2: */ williamr@2: static CImageTypeDescription* NewL(const TDesC& aDescription, const TUid aImageType, const TUid aSubType); williamr@2: /** williamr@2: @internalComponent williamr@2: */ williamr@2: static CImageTypeDescription* NewLC(const TDesC& aDescription, const TUid aImageType, const TUid aSubType); williamr@4: williamr@2: IMPORT_C ~CImageTypeDescription(); williamr@2: IMPORT_C const TDesC& Description() const; williamr@2: IMPORT_C TUid ImageType() const; williamr@2: IMPORT_C TUid SubType() const; williamr@2: private: williamr@2: CImageTypeDescription(const TUid aImageType, const TUid aSubType); williamr@2: void ConstructL(const TDesC& aDescription); williamr@2: private: williamr@2: HBufC* iDescription; williamr@2: const TUid iImageType; williamr@2: const TUid iSubType; williamr@2: }; williamr@2: williamr@2: /** williamr@2: Container type to manage lists of pointers to CImageTypeDescription objects. williamr@2: williamr@2: @publishedAll williamr@2: @released williamr@2: */ williamr@2: typedef RPointerArray RImageTypeDescriptionArray; williamr@2: williamr@2: /** williamr@2: Class used to manage the mapping between an image's MIME type & file extension. williamr@2: williamr@2: @publishedAll williamr@2: @released williamr@2: */ williamr@2: class CFileExtensionMIMEType : public CBase williamr@2: { williamr@2: public: williamr@2: /** williamr@2: @internalComponent williamr@2: */ williamr@2: static CFileExtensionMIMEType* NewL(const TDesC8& aExtn, const TDesC8& aMIMEType, const TDesC& aDisplayName, TUid aImageType, TUid aImageSubType, TUid aImplementationUid); williamr@2: IMPORT_C static CFileExtensionMIMEType* NewLC(const TDesC8& aExtn, const TDesC8& aMIMEType, const TDesC& aDisplayName, TUid aImageType, TUid aImageSubType, TUid aImplementationUid); williamr@2: IMPORT_C ~CFileExtensionMIMEType(); williamr@2: williamr@2: IMPORT_C const TDesC& FileExtension() const; williamr@2: IMPORT_C const TDesC8& MIMEType() const; williamr@2: IMPORT_C const TDesC& DisplayName() const; williamr@2: IMPORT_C TUid ImageType() const; williamr@2: IMPORT_C TUid ImageSubType() const; williamr@2: IMPORT_C TUid ImplementationUid() const; williamr@2: private: williamr@2: CFileExtensionMIMEType(); williamr@2: void ConstructL(const TDesC8& aExtn, const TDesC8& aMIMEType, const TDesC& aDisplayName, TUid aImageType, TUid aImageSubType, TUid aImplementationUid); williamr@2: private: williamr@2: HBufC* iFileExtension; williamr@2: HBufC8* iMIMEType; williamr@2: HBufC* iDisplayName; williamr@2: TUid iImageTypeUid; williamr@2: TUid iImageSubTypeUid; williamr@2: TUid iImplementationUid; williamr@2: }; williamr@2: williamr@2: /** williamr@2: Container type to manage lists of pointers to CFileExtensionMIMEType objects. williamr@2: williamr@2: @publishedAll williamr@2: @released williamr@2: */ williamr@2: typedef RPointerArray RFileExtensionMIMETypeArray; williamr@2: williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@2: williamr@2: Class used to manage various information about an implementation williamr@2: which is stored in resource files. williamr@2: williamr@2: @see CImplementationInformation williamr@2: */ williamr@2: class CImplementationInformationType : public CBase williamr@2: { williamr@2: public: williamr@2: /** williamr@2: @internalComponent williamr@2: */ williamr@2: static CImplementationInformationType* NewL(); williamr@2: /** williamr@2: @internalComponent williamr@2: */ williamr@2: static CImplementationInformationType* NewLC(); williamr@4: williamr@2: IMPORT_C ~CImplementationInformationType(); williamr@4: williamr@2: /** williamr@2: @internalComponent williamr@2: */ williamr@2: void SetDataL(TUid aImplementationUid, TInt aVersion, const TDesC& aDisplayName, const TDesC8& aDataType, const TDesC8& aOpaqueData, TDriveUnit aDrive); williamr@2: williamr@2: IMPORT_C TUid ImplementationUid() const; williamr@2: IMPORT_C TInt Version() const; williamr@2: IMPORT_C const TDesC& DisplayName() const; williamr@2: IMPORT_C const TDesC8& DataType() const; williamr@2: IMPORT_C const TDesC8& OpaqueData() const; williamr@2: williamr@2: IMPORT_C TDriveUnit Drive(); williamr@2: williamr@2: private: williamr@2: CImplementationInformationType(); williamr@2: williamr@2: private: williamr@2: TUid iImplementationUid; williamr@2: TInt iVersion; williamr@2: HBufC* iDisplayName; williamr@2: HBufC8* iDataType; williamr@2: HBufC8* iOpaqueData; williamr@2: TDriveUnit iDrive; williamr@2: }; williamr@2: williamr@2: //The public API for clients to call the Image Conversion Library decoders williamr@2: williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@2: williamr@2: Provides access to the Image Conversion Library decoders. williamr@2: williamr@2: This class provides functions to decode images held in files or descriptors. To decode buffered williamr@2: images use the buffered version of this class CBufferedImageDecoder. williamr@2: williamr@2: Regarding DRM: Note that intent is evaluated when a CImageDecoder instance is being constructed by one of the FileNewL() methods. williamr@2: It is executed after at least one frame of the image has been successfully decoded. Subsequent converts using the same CImageDecoder instance will not execute intent. williamr@2: */ williamr@2: class CImageDecoder : public CBase williamr@2: { williamr@2: public: williamr@2: williamr@2: /** williamr@2: Flags to control how the image is decoded. williamr@2: These can be combined using an OR operation. williamr@2: */ williamr@2: enum TOptions williamr@2: { williamr@2: /** No flag set williamr@2: */ williamr@2: EOptionNone = 0x00, williamr@2: williamr@2: /** Do not dither the decoded image williamr@2: */ williamr@2: EOptionNoDither = 0x01, williamr@2: williamr@2: /** Perform the decoding in a separate thread williamr@2: */ williamr@2: EOptionAlwaysThread = 0x02, williamr@2: williamr@2: /** williamr@2: Allow Opens to complete with no error if there is less williamr@2: than one frame available. This should be set for streaming. williamr@2: */ williamr@2: EOptionAllowZeroFrameOpen = 0x04, williamr@2: williamr@2: /** williamr@2: Setting this flag requests that the plugin generate a mask during decoding. williamr@2: williamr@2: Note: williamr@2: williamr@2: This option is only relevant to image formats williamr@2: that do not already contain mask information. williamr@2: williamr@2: The client must check that TFrameInfo::ETransparencyPossible is set williamr@2: before attempting to obtain the mask, because not all plugins support mask generation. williamr@2: */ williamr@2: EAllowGeneratedMask = 0x08, williamr@2: williamr@2: /** williamr@2: Use the highest possible image decoding speed; this may result in lower image quality. williamr@2: This flag is more applicable to formats which use "lossy" compression algorithms, such as JPEG. williamr@2: Decoders that do not support fast decoding will ignore it. williamr@2: */ williamr@2: EPreferFastDecode = 0x10, williamr@2: williamr@2: /** williamr@2: @publishedPartner williamr@2: @released williamr@2: williamr@2: Prevent MNG ImageDecoder from unwinding all the loops williamr@2: */ williamr@2: EOptionMngSubframesNoLoops = 0x20, williamr@2: williamr@2: /** williamr@2: @publishedPartner williamr@2: @released williamr@2: williamr@2: Setting this flag requests that the plugin use the frame size rather than the williamr@2: overall size when calculating its reduction factor williamr@2: */ williamr@2: EOptionUseFrameSizeInPixels = 0x40, williamr@2: williamr@2: /** williamr@2: When specified, this flag indicates that the decoder must ignore the EXIF meta-data, if present. williamr@2: In this case, the ExifMetaData() should return NULL. williamr@2: This option value is also used to indicate the requirement to ignore the EXIF meta-data when doing the williamr@2: image transformation. williamr@2: */ williamr@2: EOptionIgnoreExifMetaData = 0x80, williamr@2: williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@4: williamr@2: Codec must support crop. williamr@2: */ williamr@2: EOptionExtCrop = 0x0100, williamr@2: williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@4: williamr@2: Codec must support block streaming extension. williamr@2: */ williamr@2: EOptionExtStream = 0x0200, williamr@2: williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@4: williamr@2: Codec must support rotation through the operation extension. williamr@2: */ williamr@2: EOptionExtRotation = 0x0400, williamr@2: williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@4: williamr@2: Codec must support horizontal mirror through the operation extension. williamr@2: */ williamr@2: EOptionExtMirrorHorizontalAxis = 0x0800, williamr@2: williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@4: williamr@2: Codec must support vertical mirror through the operation extension. williamr@2: */ williamr@2: EOptionExtMirrorVerticalAxis = 0x1000, williamr@2: williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@4: williamr@2: Codec must support the scaling extension. williamr@2: */ williamr@2: EOptionExtScaling = 0x2000, williamr@2: williamr@2: /** Reserved. williamr@2: */ williamr@2: EOptionExtReserved7 = 0x4000, williamr@2: williamr@2: /** Reserved. williamr@2: */ williamr@2: EOptionExtReserved8 = 0x8000, williamr@2: /** williamr@2: @internalTechnology williamr@2: Requests that decode always fails for Png images without an iEND chunk. williamr@2: */ williamr@2: EOptionPngMissingiENDFail = 0x010000, williamr@2: williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@2: williamr@2: Allows WMF codec to ignore any SETVIEWPORTORG, SETVIEWPORTEXT, SCALEVIEWPORTEXT williamr@2: or OFFSETVIEWPORTORG commands in the metafile and allows scaling to destination bitmap. williamr@2: */ williamr@4: EOptionWmfIgnoreViewportMetaData = 0x020000, williamr@4: williamr@4: /** williamr@4: @publishedPartner williamr@4: @prototype williamr@4: williamr@4: Requests that codec applies the auto rotation when decoding according to the orientation tag in the image Exif header. williamr@4: */ williamr@4: EOptionAutoRotate = 0x040000 williamr@2: }; williamr@2: williamr@2: /** williamr@2: Flags to control which image is decoded. williamr@2: This can be used when the source file or descriptor williamr@2: contains multiple distinct image sources. williamr@2: */ williamr@2: enum TImageType williamr@2: { williamr@2: /** Use the thumbnail as source image williamr@2: */ williamr@2: EImageTypeThumbnail = 0x01, williamr@2: /** Use the main image williamr@2: */ williamr@2: EImageTypeMain = 0x02 williamr@2: }; williamr@2: williamr@2: public: williamr@2: IMPORT_C static void GetImageTypesL(RImageTypeDescriptionArray& aImageTypeArray); williamr@2: IMPORT_C static void GetImageSubTypesL(const TUid aImageType, RImageTypeDescriptionArray& aSubTypeArray); williamr@2: IMPORT_C static void GetFileTypesL(RFileExtensionMIMETypeArray& aFileExtensionArray); williamr@2: IMPORT_C static void GetMimeTypeFileL(RFs& aFs, const TDesC& aFileName, TDes8& aMimeType); williamr@2: IMPORT_C static void GetMimeTypeDataL(const TDesC8& aImageData, TDes8& aMimeType); williamr@2: williamr@2: IMPORT_C static CImplementationInformationType* GetImplementationInformationL(TUid aImplementationUid); williamr@2: williamr@2: IMPORT_C static CImageDecoder* FileNewL(RFs& aFs, const TDesC& aSourceFilename, const TDesC8& aMIMEType, const TOptions aOptions = EOptionNone); williamr@2: IMPORT_C static CImageDecoder* FileNewL(RFs& aFs, const TDesC& aSourceFilename, const TOptions aOptions = EOptionNone, const TUid aImageType = KNullUid, const TUid aImageSubType = KNullUid, const TUid aDecoderUid = KNullUid); williamr@2: williamr@2: IMPORT_C static CImageDecoder* FileNewL(RFs& aFs, const TDesC& aSourceFilename, const TDesC8& aMIMEType, ContentAccess::TIntent aIntent, const TOptions aOptions = EOptionNone); williamr@2: IMPORT_C static CImageDecoder* FileNewL(RFs& aFs, const TDesC& aSourceFilename, ContentAccess::TIntent aIntent, const TOptions aOptions = EOptionNone, const TUid aImageType = KNullUid, const TUid aImageSubType = KNullUid, const TUid aDecoderUid = KNullUid); williamr@2: IMPORT_C static CImageDecoder* FileNewL(RFile& aFile, const TDesC8& aMIMEType, ContentAccess::TIntent aIntent, const TOptions aOptions = EOptionNone); williamr@2: IMPORT_C static CImageDecoder* FileNewL(RFile& aFile, ContentAccess::TIntent aIntent, const TOptions aOptions = EOptionNone, const TUid aImageType = KNullUid, const TUid aImageSubType = KNullUid, const TUid aDecoderUid = KNullUid); williamr@2: williamr@2: IMPORT_C static CImageDecoder* FileNewL(RFs& aFs, const TMMSource& aFileSource, const TDesC8& aMIMEType, const TOptions aOptions = EOptionNone); williamr@2: IMPORT_C static CImageDecoder* FileNewL(RFs& aFs, const TMMSource& aFileSource, const TOptions aOptions = EOptionNone, const TUid aImageType = KNullUid, const TUid aImageSubType = KNullUid, const TUid aDecoderUid = KNullUid); williamr@2: williamr@2: IMPORT_C static CImageDecoder* DataNewL(RFs& aFs, const TDesC8& aSourceData, const TDesC8& aMIMEType, const TOptions aOptions = EOptionNone); williamr@2: IMPORT_C static CImageDecoder* DataNewL(RFs& aFs, const TDesC8& aSourceData, const TOptions aOptions = EOptionNone, const TUid aImageType = KNullUid, const TUid aImageSubType = KNullUid, const TUid aDecoderUid = KNullUid); williamr@2: IMPORT_C virtual ~CImageDecoder(); williamr@2: williamr@2: IMPORT_C virtual void Convert(TRequestStatus* aRequestStatus, CFbsBitmap& aDestination, TInt aFrameNumber = 0); williamr@2: IMPORT_C virtual void Convert(TRequestStatus* aRequestStatus, CFbsBitmap& aDestination, CFbsBitmap& aDestinationMask, TInt aFrameNumber = 0); williamr@2: IMPORT_C virtual void ContinueConvert(TRequestStatus* aRequestStatus); williamr@2: IMPORT_C void Cancel(); williamr@2: williamr@2: IMPORT_C TInt FrameCount() const; williamr@2: IMPORT_C TBool IsImageHeaderProcessingComplete() const; williamr@2: IMPORT_C void ContinueProcessingHeaderL(); williamr@2: williamr@2: IMPORT_C const TFrameInfo& FrameInfo(TInt aFrameNumber = 0) const; williamr@2: IMPORT_C const CFrameImageData& FrameData(TInt aFrameNumber = 0) const; williamr@2: williamr@2: IMPORT_C TInt NumberOfImageComments() const; williamr@2: IMPORT_C HBufC* ImageCommentL(TInt aCommentNumber) const; williamr@2: IMPORT_C TInt NumberOfFrameComments(TInt aFrameNumber) const; williamr@2: IMPORT_C HBufC* FrameCommentL(TInt aFrameNumber, TInt aCommentNumber) const; williamr@2: williamr@2: IMPORT_C CFrameInfoStrings* FrameInfoStringsLC(TInt aFrameNumber = 0); williamr@2: IMPORT_C CFrameInfoStrings* FrameInfoStringsL(TInt aFrameNumber = 0); williamr@2: IMPORT_C TUid ImplementationUid() const; williamr@2: williamr@2: IMPORT_C void ImageType(TInt aFrameNumber, TUid& aImageType, TUid& aImageSubType) const; williamr@2: williamr@2: IMPORT_C TInt SetAgentProperty(ContentAccess::TAgentProperty aProperty, TInt aValue); williamr@2: IMPORT_C void SetImageTypeL(TInt aImageType); williamr@2: williamr@2: IMPORT_C TInt ReductionFactor(const TSize& aOriginalSize, const TSize& aReducedSize) const; williamr@2: IMPORT_C TInt ReducedSize(const TSize& aOriginalSize, TInt aReductionFactor, TSize& aReducedSize) const; williamr@2: IMPORT_C TInt SetDecoderThreadPriority(TThreadPriority aPriority); williamr@2: williamr@2: IMPORT_C static void GetPluginPropertiesL(const TUid aImplementationUid, RUidDataArray& aPropertiesArray); williamr@2: IMPORT_C static void GetInterfaceImplementationsL(const RUidDataArray& aRequiredUids, RUidDataArray& aImplArray); williamr@2: IMPORT_C static void GetInterfaceImplementationsL(const TUid* aRequiredUids, const TInt aLength, RUidDataArray& aImplArray); williamr@2: williamr@2: IMPORT_C TImageConvOperation* OperationL(); williamr@2: IMPORT_C TImageConvScaler* ScalerL(); williamr@2: IMPORT_C TImageConvStreamedDecode* BlockStreamerL(); williamr@2: williamr@2: IMPORT_C void SetClippingRectL(const TRect* aClipRect); williamr@2: IMPORT_C TInt GetDestinationSize(TSize& aSize, TInt aFrameNumber = 0); williamr@2: williamr@2: IMPORT_C void Prepare(TRequestStatus* aRequestStatus); williamr@2: williamr@2: protected: williamr@2: IMPORT_C CImageDecoder(); williamr@2: williamr@2: // custom commands - for extended decoders williamr@2: IMPORT_C void CustomSyncL(TInt aParam); williamr@2: IMPORT_C void CustomAsync(TRequestStatus* aRequestStatus, TInt aParam); williamr@2: IMPORT_C CImageDecoderPlugin* Plugin() const; williamr@2: williamr@2: private: williamr@2: static void MimeTypeGetDecoderListL(RImplInfoPtrArray& aDecoderList, const TDesC8& aMIMEType, const TOptions aOptions = EOptionNone); williamr@2: static void ImageTypeGetDecoderListL(RImplInfoPtrArray& aDecoderList, const TDesC8& aImageHeader, const TUid aImageType, const TUid aImageSubType, const TUid aDecoderUid, const TOptions aOptions = EOptionNone); williamr@2: static void SuffixTypeGetDecoderListL(RImplInfoPtrArray& aDecoderList, const TDesC& aFileName, const TOptions aOptions = EOptionNone); williamr@2: williamr@2: static CImageDecoder* FileFindDecoderNewL(const RImplInfoPtrArray& aDecoderList, RFs& aFs, const TDesC& aSourceFilename, const TOptions aOptions, const TDesC& aUniqueId); williamr@2: static CImageDecoder* FileDecoderNewL(const CImplementationInformation& aDecoderInfo, RFs& aFs, const TDesC& aSourceFilename, const TOptions aOptions, const TDesC& aUniqueId); williamr@2: williamr@2: static CImageDecoder* DataFindDecoderNewL(const RImplInfoPtrArray& aDecoderList, RFs& aFs, const TDesC8& aSourceData, const TOptions aOptions); williamr@2: static CImageDecoder* DataDecoderNewL(const CImplementationInformation& aDecoderInfo, RFs& aFs, const TDesC8& aSourceData, const TOptions aOptions); williamr@2: williamr@2: static CImageDecodeConstruct* NewDecodeConstructL(const CImplementationInformation& aDecoderInfo, const TOptions aOptions = EOptionNone); williamr@2: williamr@2: static void DoGetMimeTypeL(const TDesC& aFileName, const TDesC8& aMatchString, TDes8& aMimeType); williamr@2: williamr@2: static CImageDecoder* NewL(CImageDecodeConstruct* aConstruct, TOptions aOptions); williamr@2: static CImageDecoder* NewL(); williamr@2: williamr@2: static CImageDecoder* FileNewImplL(RFs& aFs, const TDesC& aSourceFilename, const TDesC8& aMIMEType, const TDesC& aUniqueId, const ContentAccess::TIntent aIntent, const TOptions aOptions = EOptionNone); williamr@2: static CImageDecoder* FileNewImplL(RFs& aFs, const TDesC& aSourceFilename, const TDesC& aUniqueId, const ContentAccess::TIntent aIntent, const TOptions aOptions = EOptionNone, const TUid aImageType = KNullUid, const TUid aImageSubType = KNullUid, const TUid aDecoderUid = KNullUid); williamr@2: static CImageDecoder* FileFindDecoderNewL(const RImplInfoPtrArray& aDecoderList, RFile& aFile, const TOptions aOptions, const TDesC& aUniqueId); williamr@2: static CImageDecoder* FileDecoderNewL(const CImplementationInformation& aDecoderInfo, RFile& aFile, const TOptions aOptions, const TDesC& aUniqueId); williamr@2: static CImageDecoder* FileNewImplL(RFile& aFile, const TDesC8& aMIMEType, const TDesC& aUniqueId, const ContentAccess::TIntent aIntent, const TOptions aOptions = EOptionNone); williamr@2: static CImageDecoder* FileNewImplL(RFile& aFile, const TDesC& aUniqueId, const ContentAccess::TIntent aIntent, const TOptions aOptions = EOptionNone, const TUid aImageType = KNullUid, const TUid aImageSubType = KNullUid, const TUid aDecoderUid = KNullUid); williamr@2: static ContentAccess::CContent* GetContentLC(const TDesC& aSourceFilename); williamr@2: williamr@2: inline TBool ValidProperties() const; williamr@2: williamr@2: // Future proofing williamr@2: IMPORT_C virtual void ReservedVirtual1(); williamr@2: IMPORT_C virtual void ReservedVirtual2(); williamr@2: IMPORT_C virtual void ReservedVirtual3(); williamr@2: IMPORT_C virtual void ReservedVirtual4(); williamr@2: williamr@2: private: williamr@2: MImageDecoderRelay* iRelay; williamr@2: williamr@2: friend class CImageDecodeConstruct; williamr@2: }; williamr@2: williamr@2: williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@2: williamr@2: Buffered image conversion library. williamr@2: williamr@2: Provides a wrapper arround CImageDecoder that enables you to decode multiple images without williamr@2: having to recreate the CBufferedImageDecoder object each time. One of the key features of this williamr@2: class is the ability to append image data to the decoder object as it becomes available; this williamr@2: is done using AppendDataL(). williamr@2: */ williamr@2: williamr@2: //The public API for clients to call the Buffered Image Conversion Library decoders williamr@2: class CBufferedImageDecoder : public CBase williamr@2: { williamr@2: private: williamr@2: enum TState williamr@2: { williamr@2: EStateCreated, williamr@2: EStateOpening, williamr@2: EStateOpen, williamr@2: EStateConverting williamr@2: }; williamr@2: williamr@2: public: williamr@2: IMPORT_C static CBufferedImageDecoder* NewL(RFs& aFs); williamr@2: IMPORT_C virtual ~CBufferedImageDecoder(); williamr@2: williamr@2: IMPORT_C void OpenL(const TDesC8& aSourceData, const TDesC8& aMIMEType, const CImageDecoder::TOptions aOptions = CImageDecoder::EOptionNone); williamr@2: IMPORT_C void OpenL(const TDesC8& aSourceData, const CImageDecoder::TOptions aOptions = CImageDecoder::EOptionNone, const TUid aImageType = KNullUid, const TUid aImageSubType = KNullUid, const TUid aDecoderUid = KNullUid); williamr@2: IMPORT_C void ContinueOpenL(); williamr@2: IMPORT_C void ContinueProcessingHeaderL(); williamr@2: IMPORT_C TBool IsImageHeaderProcessingComplete() const; williamr@2: williamr@2: IMPORT_C void Convert(TRequestStatus* aRequestStatus, CFbsBitmap& aDestination, TInt aFrameNumber = 0); williamr@2: IMPORT_C void Convert(TRequestStatus* aRequestStatus, CFbsBitmap& aDestination, CFbsBitmap& aDestinationMask, TInt aFrameNumber = 0); williamr@2: IMPORT_C void ContinueConvert(TRequestStatus* aRequestStatus); williamr@2: williamr@2: IMPORT_C void Cancel(); williamr@2: IMPORT_C void Reset(); williamr@2: williamr@2: IMPORT_C void AppendDataL(const TDesC8& aData); williamr@2: williamr@2: IMPORT_C TInt FrameCount() const; williamr@2: IMPORT_C const TFrameInfo& FrameInfo(TInt aFrameNumber = 0) const; williamr@2: IMPORT_C const CFrameImageData& FrameData(TInt aFrameNumber = 0) const; williamr@2: williamr@2: IMPORT_C TInt NumberOfImageComments() const; williamr@2: IMPORT_C HBufC* ImageCommentL(TInt aCommentNumber) const; williamr@2: IMPORT_C TInt NumberOfFrameComments(TInt aFrameNumber) const; williamr@2: IMPORT_C HBufC* FrameCommentL(TInt aFrameNumber, TInt aCommentNumber) const; williamr@2: williamr@2: IMPORT_C CFrameInfoStrings* FrameInfoStringsLC(TInt aFrameNumber = 0); williamr@2: IMPORT_C CFrameInfoStrings* FrameInfoStringsL(TInt aFrameNumber = 0); williamr@2: IMPORT_C TUid ImplementationUid() const; williamr@2: williamr@2: IMPORT_C TBool ValidDecoder () const; williamr@2: williamr@2: private: williamr@2: CBufferedImageDecoder(RFs& aFs); williamr@2: williamr@2: private: williamr@2: RFs iFileSession; williamr@2: CImageDecoder::TOptions iOptions; williamr@2: TUid iImageType; williamr@2: TUid iImageSubType; williamr@2: TUid iDecoderUid; williamr@2: TPtr8 iBuffer; williamr@2: TPtr8 iMimeType; williamr@2: williamr@2: CImageDecoder* iDecoder; williamr@2: williamr@2: TBool iImageTypeOpen; // Object was opened using image type williamr@2: TState iState; williamr@2: williamr@2: friend class RBufferedDecoderTest; williamr@2: }; williamr@2: williamr@2: williamr@2: // The public API for clients to call the Image Conversion Library encoders williamr@2: williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@2: williamr@2: Provides access to the ICL (image conversion library) encoders. williamr@2: williamr@2: This class provides functions that convert image data held in CFbsBitmap objects williamr@2: into well know formats and store the results in either files of descriptors. williamr@2: */ williamr@2: class CImageEncoder : public CBase williamr@2: { williamr@2: public: williamr@2: williamr@2: /** williamr@2: Flags to control how the image is encoded. williamr@2: These can be combined using an OR operation. williamr@2: */ williamr@2: enum TOptions williamr@2: { williamr@2: /** No flag set williamr@2: */ williamr@2: EOptionNone = 0x00, williamr@2: williamr@2: /** Perform the encoding in a separate thread williamr@2: */ williamr@2: EOptionAlwaysThread = 0x01, williamr@2: williamr@2: /** If the codec supports it, generate a palette based on the colors present in the image data, rather than using the default palette williamr@2: */ williamr@2: EOptionGenerateAdaptivePalette = 0x02, williamr@2: williamr@2: /** williamr@4: Use the highest possible image encoding speed; this may result in lower image quality. williamr@4: This flag is more applicable to formats which use "lossy" compression algorithms, such as JPEG. williamr@4: Decoders that do not support fast encoding will ignore it. williamr@4: */ williamr@4: EPreferFastEncode = 0x04, williamr@4: williamr@4: /** williamr@2: @publishedAll williamr@2: @released williamr@4: williamr@2: Codec must support block streaming extension. williamr@2: */ williamr@2: EOptionExtStream = 0x0100, williamr@2: williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@4: williamr@2: Codec must support rotation through the operation extension. williamr@2: */ williamr@2: EOptionExtRotation = 0x0200, williamr@2: williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@4: williamr@2: Codec must support horizontal mirror through the operation extension. williamr@2: */ williamr@2: EOptionExtMirrorHorizontalAxis = 0x0400, williamr@2: williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@4: williamr@2: Codec must support vertical mirror through the operation extension. williamr@2: */ williamr@2: EOptionExtMirrorVerticalAxis = 0x0800, williamr@2: williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@4: williamr@2: Codec must support setting thumbnail when using the other extensions (e.g. thumbnail rotation) williamr@2: */ williamr@2: EOptionExtUseWithSetThumbnail = 0x1000, williamr@2: williamr@2: /** Reserved. williamr@2: */ williamr@2: EOptionExtReserved1 = 0x2000, williamr@2: williamr@2: /** Reserved. williamr@2: */ williamr@2: EOptionExtReserved2 = 0x4000, williamr@2: williamr@2: /** Reserved. williamr@2: */ williamr@2: EOptionExtReserved3 = 0x8000 williamr@2: }; williamr@2: williamr@2: public: williamr@2: IMPORT_C static void GetImageTypesL(RImageTypeDescriptionArray& aImageTypeArray); williamr@2: IMPORT_C static void GetImageSubTypesL(const TUid aImageType, RImageTypeDescriptionArray& aSubTypeArray); williamr@2: IMPORT_C static void GetFileTypesL(RFileExtensionMIMETypeArray& aFileExtensionArray); williamr@2: IMPORT_C static CImageEncoder* FileNewL(RFs& aFs, const TDesC& aDestinationFilename, const TDesC8& aMIMEType, const TOptions aOptions = EOptionNone); williamr@2: IMPORT_C static CImageEncoder* FileNewL(RFs& aFs, const TDesC& aDestinationFilename, const TOptions aOptions = EOptionNone, const TUid aImageType = KNullUid, const TUid aImageSubType = KNullUid, const TUid aEncoderUid = KNullUid); williamr@2: williamr@2: IMPORT_C static CImageEncoder* FileNewL(RFile& aFile, const TDesC8& aMIMEType, const TOptions aOptions = EOptionNone); williamr@2: IMPORT_C static CImageEncoder* FileNewL(RFile& aFile, const TOptions aOptions = EOptionNone, const TUid aImageType = KNullUid, const TUid aImageSubType = KNullUid, const TUid aEncoderUid = KNullUid); williamr@2: williamr@2: IMPORT_C static CImageEncoder* DataNewL(HBufC8*& aDestinationData, const TDesC8& aMIMEType, const TOptions aOptions = EOptionNone); williamr@2: IMPORT_C static CImageEncoder* DataNewL(HBufC8*& aDestinationData, const TOptions aOptions = EOptionNone, const TUid aImageType = KNullUid, const TUid aImageSubType = KNullUid, const TUid aEncoderUid = KNullUid); williamr@2: williamr@2: IMPORT_C void Convert(TRequestStatus* aRequestStatus, const CFbsBitmap& aSource, const CFrameImageData* aFrameImageData = NULL); williamr@2: williamr@2: IMPORT_C virtual ~CImageEncoder(); williamr@2: IMPORT_C void Cancel(); williamr@2: williamr@2: IMPORT_C TUid ImplementationUid() const; williamr@2: williamr@2: IMPORT_C void SetThumbnail(TBool aDoGenerateThumbnail); williamr@2: IMPORT_C TInt SetEncoderThreadPriority(TThreadPriority aPriority); williamr@2: williamr@2: IMPORT_C static void GetPluginPropertiesL(const TUid aImplementationUid, RUidDataArray& aPropertiesArray); williamr@2: IMPORT_C static void GetInterfaceImplementationsL(const RUidDataArray& aRequiredUids, RUidDataArray& aImplArray); williamr@2: IMPORT_C static void GetInterfaceImplementationsL(const TUid* aRequiredUids, const TInt aLength, RUidDataArray& aImplArray); williamr@2: williamr@2: IMPORT_C TImageConvOperation* OperationL(); williamr@2: IMPORT_C TImageConvStreamedEncode* BlockStreamerL(); williamr@2: williamr@2: IMPORT_C void Prepare(TRequestStatus* aRequestStatus); williamr@2: williamr@2: protected: williamr@2: IMPORT_C CImageEncoder(); williamr@2: williamr@2: // custom commands - for extended encoders williamr@2: IMPORT_C void CustomSyncL(TInt aParam); williamr@2: IMPORT_C void CustomAsync(TRequestStatus* aRequestStatus, TInt aParam); williamr@2: IMPORT_C CImageEncoderPlugin* Plugin() const; williamr@2: williamr@2: private: williamr@2: static void MimeTypeGetEncoderListL(RImplInfoPtrArray& aEncoderList, const TDesC8& aMIMEType, const TOptions aOptions = EOptionNone); williamr@2: static void ImageTypeGetEncoderListL(RImplInfoPtrArray& aEncoderList, const TUid aImageType, const TUid aImageSubType, const TUid aEncoderUid, const TOptions aOptions = EOptionNone); williamr@2: williamr@2: static CImageEncodeConstruct* NewEncodeConstructL(const CImplementationInformation& aEncoderInfo, const TOptions aOptions = EOptionNone); williamr@2: williamr@2: static CImageEncoder* NewL(CImageEncodeConstruct* aConstruct, TOptions aOptions); williamr@2: static CImageEncoder* NewL(); williamr@2: williamr@2: inline TBool ValidProperties() const; williamr@2: williamr@2: // Future proofing williamr@2: IMPORT_C virtual void ReservedVirtual1(); williamr@2: IMPORT_C virtual void ReservedVirtual2(); williamr@2: IMPORT_C virtual void ReservedVirtual3(); williamr@2: IMPORT_C virtual void ReservedVirtual4(); williamr@2: williamr@2: private: williamr@2: MImageEncoderRelay* iRelay; williamr@2: williamr@2: friend class CImageEncodeConstruct; williamr@2: }; williamr@2: williamr@4: #endif // IMAGECONVERSION_H williamr@2: