--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/imagingmodules/jp2kcodec/Inc/JP2KImageWriter.h Thu Dec 17 09:22:31 2009 +0200
@@ -0,0 +1,515 @@
+/*
+* Copyright (c) 2003, 2004 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: CJ2kImageWriter class used to perform inverse transformation and
+* writing decoded image data to bitmap.
+*
+*/
+
+
+#ifndef __JP2KIMAGEWRITER_H__
+#define __JP2KIMAGEWRITER_H__
+
+// INCLUDES
+#include <icl/imageprocessor.h>
+
+// CONSTANTS
+const TUint8 KByteBits = 8; // Number of bits in byte
+const TUint8 KFractionBits = 12;
+const TUint16 KOffset = (1 << ( KFractionBits - 1 ) );
+
+// Inverse color transform shifted(by 12 bits) coefficients
+const TInt32 KIctCoefficient11 = 5743;
+const TInt32 KIctCoefficient21 = -1409;
+const TInt32 KIctCoefficient22 = -2925;
+const TInt32 KIctCoefficient31 = 7258;
+
+// The ICC profile Tag definitions
+const TUint8 KICCSkipBytes = 128; // Bytes to skip before reading the ICC profile
+const TUint32 KRedMatrixTag = 0x7258595A; // Tag indicating the place (in ICC profile) of conversion matrix coefficients for red
+const TUint32 KGreenMatrixTag = 0x6758595A; // Tag indicating the place of conversion matrix coefficients for green
+const TUint32 KBlueMatrixTag = 0x6258595A; // Tag indicating the place of conversion matrix coefficients for blue
+const TUint32 KRedTrcTag = 0x72545243; // Tag indicating the place of Tone Reproduction Curve value for red
+const TUint32 KGreenTrcTag = 0x67545243; // Tag indicating the place of Tone Reproduction Curve value for green
+const TUint32 KBlueTrcTag = 0x62545243; // Tag indicating the place of Tone Reproduction Curve value for blue
+const TUint32 KGrayTrcTag = 0x6B545243; // Tag indicating the place of Tone Reproduction Curve value for gray
+const TUint32 KPixelsBlock = 256; // The max number of pixel in a block
+
+// Define the XYZ to linear sRGB matrix coefficients
+const TReal KSRGB00 = 3.1337;
+const TReal KSRGB01 = -1.6173;
+const TReal KSRGB02 = -0.4907;
+const TReal KSRGB10 = -0.9785;
+const TReal KSRGB11 = 1.9162;
+const TReal KSRGB12 = 0.0334;
+const TReal KSRGB20 = 0.0720;
+const TReal KSRGB21 = -0.2290;
+const TReal KSRGB22 = 1.4056;
+const TReal KSRGBMax = (TReal)4095;
+const TInt32 KSRGBMaxInt = (TInt32)4095;
+const TInt32 KSRGBShift = 4; // The shift for the sRGB maximum value
+const TInt32 KSRGBMaxIntShifted = (TInt32)( ( 1 << KSRGBShift ) * (TReal)4095 );// The sRGB maximum value shifted by 4
+const TInt32 KTRCShift = 12; // The shift used for TRC LUT values for integer computation
+const TInt32 KTRCShiftMultiplier = (TInt32)( 1 << KTRCShift ); // The shift used for TRC LUT values for integer computation
+const TUint32 KICCDownshift = KTRCShift + KSRGBShift; // The total shift used for computing the ICC conversion with integers (12 for TRC LUT and 4 for the matrix coefficients)
+
+const TReal KDivisor = (TReal)65536;
+const TReal KGamma = (TReal)256;
+
+// Define values for performing the linear RGB -> sRGB (non linear) conversion
+const TReal KSRGB_CUTOFF = 0.0031308;
+const TReal KSRGB_SLOPE = 12.92;
+const TReal KSRGB_EXPONENT = 0.4166666; // ( 1.0 / 2.4 );
+const TReal KSRGB_MULTIPLIER = 1.055;
+const TReal KSRGB_SUBTRACT = 0.055;
+
+// DATA TYPES
+
+// FUNCTION PROTOTYPES
+
+// FORWARD DECLARATIONS
+class CJ2kImageWriter;
+class CJ2kImageInfo;
+class CJ2kTileInfo;
+class TJ2kInfo;
+
+// CLASS DECLARATION
+
+/**
+ * CJ2kWriterComponentInfo class is used to store
+ * information about tiles' coordinates for outputting
+ * samples and also to store the output data.
+ *
+ * JP2KCodec.dll
+ * @since 2.6
+ */
+class CJ2kWriterComponentInfo : public CBase
+ {
+ public: // Constructors and destructor
+
+ /**
+ * Destructor.
+ */
+ virtual ~CJ2kWriterComponentInfo();
+
+ public: // New functions
+
+ /**
+ * Allocate the 2-D data array with a size
+ * @since 2.6
+ * @param aSize: the size to allocate.
+ */
+ void AllocDataL( const TSize& aSize );
+
+ /**
+ * Free the 2-D data array
+ * @since 2.6
+ */
+ void FreeData();
+
+ /**
+ * Get the 2-D data arry
+ * @since 2.6
+ * @return TPrecInt**: the pointer to pointer.
+ */
+ TPrecInt** Data();
+
+ /**
+ * Get the starting point of a tile
+ * @since 2.6
+ * @param aTileIndex: the tile index.
+ * @return TPoint&: a reference to the start point of the tile.
+ */
+ TPoint& TileStartAt( TUint16 aTileIndex );
+
+ /**
+ * Update the starting point of next tile
+ * @since 2.6
+ * @param aTileIndex: the tile index.
+ * @param aSize: the size of the tile.
+ * @param aImageInfo: a reference to CJ2kImageInfo object.
+ */
+ void UpdateNextTileStartAt(TUint16 aTileIndex, const TSize& aSize, CJ2kImageInfo& aImageInfo );
+
+ public: // Functions from base classes
+
+ protected: // New functions
+
+ protected: // Functions from base classes
+
+ private:
+
+ public: // Data
+
+ protected: // Data
+
+ private: // Data
+
+ // Internal 2-D data array
+ TPrecInt **iData;
+
+ // Start position of each tile
+ RArray<TPoint> iTileStartList;
+
+ public: // Friend classes
+ friend class CJ2kImageWriter;
+
+ protected: // Friend classes
+
+ private: // Friend classes
+ };
+
+/**
+ * CJ2kImageWriter class has methods to perform
+ * color, bitdepth and ICC profile conversions to
+ * produce 8-bit output data.
+ *
+ * JP2KCodec.dll
+ * @since 2.6
+ */
+class CJ2kImageWriter : public CBase
+ {
+ public: // Constructors and destructor
+
+ /**
+ * Two-phased constructor.
+ */
+ static CJ2kImageWriter* NewL( CImageProcessor* aImageProcessor, CJ2kImageInfo& aImageInfo,
+ TJ2kInfo& aJ2kInfo );
+
+ /**
+ * Destructor.
+ */
+ virtual ~CJ2kImageWriter();
+
+ public: // New functions
+
+ /**
+ * Get the component of the image writer
+ * @since 2.6
+ * @param aIndex: the component index.
+ * @return CJ2kWriterComponentInfo&: a reference to CJ2kWriterComponentInfo.
+ */
+ const CJ2kWriterComponentInfo& WriterComponentAt( TUint16 aIndex ) const;
+
+ /**
+ * Output the image related to the component of the tile
+ * @since 2.6
+ * @param aTile: a reference to CJ2kTileInfo object.
+ * @param aComponentIndex: the component index.
+ */
+ void OutputImageL( CJ2kTileInfo& aTile, TUint16 aComponentIndex );
+
+ /**
+ * Output the image related to the component of the tile
+ * @since 2.6
+ * @param aTile: a reference to CJ2kTileInfo object.
+ * @param aComponentIndex: the component index.
+ * @param aSize: the size to output.
+ */
+ void OutputImageL( CJ2kTileInfo& aTile, TUint16 aComponentIndex,
+ const TSize& aSize );
+ /**
+ * Output the image related to the component of the tile
+ * @param aTile: a reference to CJ2kTileInfo object.
+ * @param aComponentIndex: the component index.
+ * @param aBlockXCoord: the block X coordinate.
+ * @param aBlockYCoord: the block Y coordinate.
+ * @param aFirstCompSize: the size of first component.
+ * @param aThisCompSize: the size of this component.
+ */
+ void OutputBlockL( CJ2kTileInfo& aTile, TUint16 aComponentIndex,
+ TInt32 aBlockXCoord, TInt32 aBlockYCoord,
+ TSize aFirstCompSize, TSize aThisCompSize );
+ /**
+ * Set the image processor of the image write
+ * @since 2.6
+ * @param aImageProcessor: a pointer to CImageProcessor object.
+ */
+ void SetNewImageProcessor( CImageProcessor* aImageProcessor );
+
+ /**
+ * Get the single output file
+ * @since 2.6
+ * @return TUint8: true if single file output.
+ */
+ TUint8 SingleFileOutput() const;
+
+ /**
+ * Get the EnumCS
+ * @since 2.6
+ * @return TUint8: the CS code.
+ */
+ TUint8 CSCode() const;
+
+ public: // Functions from base classes
+
+ protected: // New functions
+
+ protected: // Functions from base classes
+
+ private:
+
+ /**
+ * C++ default constructor.
+ */
+ CJ2kImageWriter( CImageProcessor* aImageProcessor, CJ2kImageInfo& aImageInfo, TJ2kInfo& aJ2kInfo );
+
+ /**
+ * By default Symbian 2nd phase constructor is private.
+ */
+ void ConstructL();
+
+ /**
+ * Perform the inverse reversible color transformation
+ * @since 2.6
+ * @param aSize: the size.
+ */
+ void PerformInverseRCT( const TSize& aSize );
+
+ /**
+ * Perform the inverse irreversible color transformation
+ * @since 2.6
+ * @param aSize: the size.
+ */
+ void PerformInverseICT( const TSize& aSize );
+
+ /**
+ * Inverse irreversible color transformation
+ * @since 2.6
+ * @param aY: the Y value.
+ * @param aU: the U value.
+ * @param aV: the V value.
+ * @param aR: a reference to red value.
+ * @param aG: a reference to green value.
+ * @param aB: a reference to blue value.
+ */
+ void InverseICTTransform( TPrecInt aY, TPrecInt aU, TPrecInt aV,
+ TPrecInt& aR, TPrecInt& aG, TPrecInt& aB );
+
+ /**
+ * Inverse irreversible color transformation
+ * @since 2.6
+ * @param aY1: the Y value of the even sample.
+ * @param aY2: the Y value of the odd sample.
+ * @param aU: the U value.
+ * @param aV: the V value.
+ * @param aR1: a reference to even red value.
+ * @param aG1: a reference to even green value.
+ * @param aB1: a reference to even blue value.
+ * @param aR2: a reference to odd red value.
+ * @param aG2: a reference to odd green value.
+ * @param aB2: a reference to odd blue value.
+ */
+ void InverseICTTransform( TPrecInt aY1, TPrecInt aY2, TPrecInt aU, TPrecInt aV,
+ TPrecInt& aR1, TPrecInt& aG1, TPrecInt& aB1,
+ TPrecInt& aR2, TPrecInt& aG2, TPrecInt& aB2 );
+
+ /**
+ * Inverse irreversible color transformation
+ * @since 2.6
+ * @param aY1: the Y value of the even sample on even row.
+ * @param aY2: the Y value of the odd sample on even row.
+ * @param aY3: the Y value of the even sample on odd row.
+ * @param aY4: the Y value of the odd sample on odd row.
+ * @param aU: the U value.
+ * @param aV: the V value.
+ * @param aR1: a reference to even red value on even row.
+ * @param aG1: a reference to even green value on even row.
+ * @param aB1: a reference to even blue value on even row.
+ * @param aR2: a reference to odd red value on even row.
+ * @param aG2: a reference to odd green value on even row.
+ * @param aB2: a reference to odd blue value on even row.
+ * @param aR3: a reference to even red value on odd row.
+ * @param aG3: a reference to even green value on odd row.
+ * @param aB3: a reference to even blue value on odd row.
+ * @param aR4: a reference to odd red value on odd row.
+ * @param aG4: a reference to odd green value on odd row.
+ * @param aB4: a reference to odd blue value on odd row.
+ */
+ void InverseICTTransform( TPrecInt aY1, TPrecInt aY2, TPrecInt aY3, TPrecInt aY4,
+ TPrecInt aU, TPrecInt aV,
+ TPrecInt& aR1, TPrecInt& aG1, TPrecInt& aB1,
+ TPrecInt& aR2, TPrecInt& aG2, TPrecInt& aB2,
+ TPrecInt& aR3, TPrecInt& aG3, TPrecInt& aB3,
+ TPrecInt& aR4, TPrecInt& aG4, TPrecInt& aB4 );
+
+ /**
+ * Initialize the ICC profile from JP2 file format (iJ2kInfo)
+ * @since 2.6
+ */
+ void InitializeICCProfileL();
+
+ /**
+ * Initialize the output parameters
+ * @since 2.6
+ */
+ void InitializeOutputParametersL();
+
+ /**
+ * Perform the XYZ to sRGB conversion using ICC profile.
+ * @since 2.6
+ * @param aX: sample x to be converted.
+ * @param aY: sample y to be converted.
+ * @param aZ: sample z to be converted.
+ * @param aR: a reference to red value.
+ * @param aG: a reference to green value.
+ * @param aB: a reference to blue value.
+ */
+ void DoICCConversion( TInt32 aX, TInt32 aY, TInt32 aZ,
+ TPrecInt& aR, TPrecInt& aG, TPrecInt& aB );
+ /**
+ * Map data less than 8 bits to 8 bits data
+ * @since 2.6
+ * @param aComponent: a reference to CJ2kWriterComponentInfo object.
+ * @param aSize: the size of component.
+ * @param aBitDepth: the bit depth.
+ */
+ void MapToEightBits( CJ2kWriterComponentInfo& aComponent,
+ const TSize& aSize, TUint16 aBitDepth );
+
+ /**
+ * Map data using the component mapping box from JP2 file format
+ * @since 2.6
+ * @param aNumCSComp: number of CS component.
+ * @param aReducedLevels: the reduced resolution level.
+ * @param aSize: the size to output.
+ * @param aTile: a reference to CJ2kTileInfo object.
+ */
+ void MapComponentsL( TUint16 aNumCSComp,TUint16 aReducedLevels,
+ const TSize& aSize, CJ2kTileInfo& aTile );
+
+ /**
+ * Write the component to the single output file
+ * @since 2.6
+ * @param aTile: a reference to CJ2kTileInfo object.
+ * @param aCompIndex: the component index.
+ * @param aSize: the size of component.
+ * @param aBitDepth: the bit depth.
+ */
+ void WriteOutputFile( CJ2kTileInfo& aTile, TUint16 aCompIndex, const TSize& aSize,
+ TUint16 aBitDepth );
+
+ /**
+ * Write all components of the tile to the single output file
+ * @since 2.6
+ * @param aTile: a reference to CJ2kTileInfo object.
+ * @param aSize: the size to output.
+ */
+ void CombineOutputFile( CJ2kTileInfo& aTile, const TSize& aSize );
+
+ /**
+ * Write out a color pixel
+ * @since 2.6
+ * @param aR: the red value.
+ * @param aG: the green value.
+ * @param aB: the blue value.
+ */
+ void WritePixel( TUint8 aR, TUint8 aG, TUint8 aB );
+
+ /**
+ * Write out a grayscale pixel
+ * @since 2.6
+ * @param aGray256: the gray scale value.
+ */
+ void WritePixel( TUint8 aGray256 );
+
+ /**
+ * Set the position of the pixel
+ * @since 2.6
+ * @param aPosition: the position of next pixel.
+ */
+ void SetPixelPos( const TPoint& aPosition );
+
+ /**
+ * Set the position of the pixel
+ * @since 2.6
+ * @param aX: the X position of next pixel.
+ * @param aY: the Y position of next pixel.
+ */
+ void SetPixelPos( const TInt aX, const TInt aY );
+
+ public: // Data
+
+ protected: // Data
+
+ private: // Data
+
+ // File type
+ enum TFileType
+ {
+ KOurRGB, //lint !e769 keep here for later use
+ KRGB,
+ KYUV422,
+ KYUV420
+ };
+
+ // Number of components
+ TUint16 iNumComponents;
+
+ // File type
+ TFileType iFileType;
+
+ // Is single file output?
+ TUint8 iSingleFileOutput;
+
+ // Is ICC Profile used?
+ TUint8 iICCProfile;
+
+ // An array of component infos
+ RPointerArray<CJ2kWriterComponentInfo> iComponents;
+
+ // Reference to the image processor
+ CImageProcessor* iImageProcessor;
+
+ // Reference to the image info
+ CJ2kImageInfo& iImageInfo;
+
+ // Reference to the file format into
+ TJ2kInfo& iJ2kInfo;
+
+ // ** For ICC Profile **
+
+ // Conversion matrix to perform the RGBin->XYZ->sRGB conversion
+ TInt32 iMatrix[9];
+
+ // Linear sRGB lookup table for sRGB(lin)->sRGB(non-lin) conversion
+ HBufC8 *iLinearsRGBLut;
+
+ // Tone reproduction curve LUT for linearizing Gray input sample
+ TInt32 *iGrayTRCLut;
+
+ // Tone reproduction curve LUT for linearizing Red input sample
+ TInt32 *iRedTRCLut;
+
+ // Tone reproduction curve LUT for linearizing Green input sample
+ TInt32 *iGreenTRCLut;
+
+ // Tone reproduction curve LUT for linearizing Blue input sample
+ TInt32 *iBlueTRCLut;
+
+ // Block containing grayscale pixels
+ TUint32 *iMonoPixelBlock;
+
+ // Block containing color pixels
+ TRgb *iColorPixelBlock;
+
+ public: // Friend classes
+
+ protected: // Friend classes
+
+ private: // Friend classes
+
+ };
+
+#endif // __JP2KIMAGEWRITER_H__