gifcodec.h
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:9k
源码类别:

Symbian

开发平台:

C/C++

  1. /* ***** BEGIN LICENSE BLOCK ***** 
  2.  * Version: RCSL 1.0/RPSL 1.0 
  3.  *  
  4.  * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. 
  5.  *      
  6.  * The contents of this file, and the files included with this file, are 
  7.  * subject to the current version of the RealNetworks Public Source License 
  8.  * Version 1.0 (the "RPSL") available at 
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed 
  10.  * the file under the RealNetworks Community Source License Version 1.0 
  11.  * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, 
  12.  * in which case the RCSL will apply. You may also obtain the license terms 
  13.  * directly from RealNetworks.  You may not use this file except in 
  14.  * compliance with the RPSL or, if you have a valid RCSL with RealNetworks 
  15.  * applicable to this file, the RCSL.  Please see the applicable RPSL or 
  16.  * RCSL for the rights, obligations and limitations governing use of the 
  17.  * contents of the file.  
  18.  *  
  19.  * This file is part of the Helix DNA Technology. RealNetworks is the 
  20.  * developer of the Original Code and owns the copyrights in the portions 
  21.  * it created. 
  22.  *  
  23.  * This file, and the files included with this file, is distributed and made 
  24.  * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  25.  * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  26.  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS 
  27.  * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
  28.  * 
  29.  * Technology Compatibility Kit Test Suite(s) Location: 
  30.  *    http://www.helixcommunity.org/content/tck 
  31.  * 
  32.  * Contributor(s): 
  33.  *  
  34.  * ***** END LICENSE BLOCK ***** */ 
  35. #ifndef _CGIFCODEC_H
  36. #define _CGIFCODEC_H
  37. class CGIFCodec : public CHXBaseCountingObject,
  38.                   public CUnknownIMP
  39. {
  40.     DECLARE_UNKNOWN(CGIFCodec)
  41. public:
  42.     enum
  43.     {
  44.         kImageDescriptor                   = 0x2C,
  45.         kTrailer                           = 0x3B,
  46.         kExtension                         = 0x21,
  47.         kGraphicControlExtension           = 0xF9,
  48.         kApplicationExtension              = 0xFF,
  49.         kCommentExtension                  = 0xFE,
  50.         kPlainTextExtension                = 0x01
  51.     };
  52.     struct LogicalScreenDescriptor
  53.     {
  54.         UINT32 m_ulLogicalScreenWidth;
  55.         UINT32 m_ulLogicalScreenHeight;
  56.         BOOL   m_bGlobalColorTablePresent;
  57.         UINT32 m_ulOriginalColorBits;
  58.         BOOL   m_bColorsSorted;
  59.         UINT32 m_ulColorTableBits;
  60.         UINT32 m_ulColorTableNumEntries;
  61.         UINT32 m_ulBackgroundColorIndex;
  62.         UINT32 m_ulPixelAspectRatio;
  63.         float  m_fPixelAspectRatio;
  64.     };
  65.     CGIFCodec();
  66.     virtual ~CGIFCodec();
  67.     static UINT32 GetMaxNumPackets(BYTE* pBuf, UINT32 ulLen);
  68.     HX_RESULT    InitParseWireFormat(BYTE *pBuffer, UINT32 ulLen);
  69.     UINT32       GetDelayTime(UINT32 i);
  70.     UINT32       GetImageDataSize(UINT32 i);
  71.     HX_RESULT    GetPacketBufferLength(UINT32 &rulLen);
  72.     HX_RESULT    GetPacketBuffer(BYTE *pBuffer, UINT32 ulLen, BOOL &rbFirstInImage);
  73.     void         TermParse();
  74.     HX_RESULT    InitDecompress(BYTE *pBuffer, UINT32 ulLen);
  75.     HX_RESULT    Decompress(BYTE *pBuffer, UINT32 ulLen, BOOL bNewImage);
  76.     HX_RESULT    GetIndexImage(INT32 lCurIndex, UINT32 ulImgIndex, BYTE *pBuffer, UINT32 ulWidth, UINT32 ulHeight,
  77.                                UINT32 ulPadWidth, BOOL bRowsInverted);
  78.     HX_RESULT    GetRGBImage(INT32 lCurIndex, UINT32 ulImgIndex, BYTE *pBuffer, UINT32 ulWidth, UINT32 ulHeight, UINT32 ulPadWidth,
  79.                              UINT32 ulBytesPerPixel, BOOL bRowsInverted, BOOL bRGBOrdering, BYTE ucBackRed, BYTE ucBackGreen, BYTE ucBackBlue,
  80.                              BYTE ucBackAlpha = 0);
  81.     HX_RESULT    GetRGBImageEx(INT32 lCurIndex, UINT32 ulImgIndex, BYTE *pBuffer, UINT32 ulWidth, UINT32 ulHeight,
  82.                                UINT32 ulPadWidth, UINT32 ulBytesPerPixel, BOOL bRowsInverted, BOOL bRGBOrdering,
  83.                                UINT32 ulBgColor, BOOL bMediaOpacity, UINT32 ulMediaOpacity,
  84.                                BOOL bChromaKey, UINT32 ulChromaKey, UINT32 ulChromaKeyTol, UINT32 ulChromaKeyOpacity);
  85.     HX_RESULT    GetRGB32(UINT32 ulImageNum, BYTE *pBuffer, UINT32 ulRowStride, BOOL bRowsInverted);
  86.     void         PacketLost();
  87.     void         TermDecompress();
  88.     BOOL         LocalColorMapsPresent();
  89.     BOOL         IsGIF89a()                              { return m_bIsGIF89a; }
  90.     UINT32       GetNumImages()                          { return m_ulNumImages; }
  91.     CGIFImage   *GetImage(UINT32 i)                      { return (i < m_ulNumImages ? &m_pImage[i] : NULL); }
  92.     UINT32       GetLogicalScreenWidth()                 { return m_cLSD.m_ulLogicalScreenWidth; }
  93.     UINT32       GetLogicalScreenHeight()                { return m_cLSD.m_ulLogicalScreenHeight; }
  94.     UINT32       GetDelayTimeSum()                       { return m_ulDelayTimeSum; }
  95.     UINT32       GetLoopCount()                          { return m_ulLoopCount; }
  96.     BOOL         DecompressFinished()                    { return (m_ulState == kStateDecoFinished ? TRUE : FALSE);  }
  97.     BOOL         ParseFinished()                         { return (m_ulParseState == kStateParseFinished ? TRUE : FALSE);  }
  98.     BOOL         GetValid()                              { return m_bValid; }
  99.     void         SetValid(BOOL bValid)                   { m_bValid = bValid; }
  100.     BOOL         GetNeedPacket()                         { return m_bNeedPacket; }
  101.     void         SetNeedPacket(BOOL bNeed)               { m_bNeedPacket = bNeed; }
  102.     static void  ParseLogicalScreenDescriptor(BYTE *pBuffer, LogicalScreenDescriptor &cLSD);
  103.     // Methods common to both parsing and decompression
  104.     static void  SkipBlocks(BYTE * &pBuffer, BYTE* pBufLimit = NULL);
  105. protected:
  106.     enum
  107.     {
  108.         kStateConstructed      = 0,
  109.         kStateDecoInitialized  = 1,
  110.         kStateDecoInProgress   = 2,
  111.         kStateDecoFinished     = 3,
  112.         kStateParseInitialized = 1,
  113.         kStateParseInProgress  = 2,
  114.         kStateParseFinished    = 3,
  115.         kIdealPacketSize       = 480,
  116.         kMinimumPacketSize     = 320
  117.     };
  118.     struct ParseSegment
  119.     {
  120.         BYTE  *pMark;
  121.         UINT32 ulSize;
  122.     };
  123.     // Members common to both parsing and decompression
  124.     UINT32                  m_ulNumImages;
  125.     UINT32                  m_ulLoopCount;
  126.     // Member variables for wire format parsing
  127.     UINT32                  m_ulParseState;
  128.     BYTE                   *m_pParseBuffer;
  129.     UINT32                  m_ulParseBufferLength;
  130.     ParseSegment           *m_pSegment;
  131.     UINT32                  m_ulDelayTimeSum;
  132.     UINT32                  m_ulNumSegmentsAllocated;
  133.     UINT32                  m_ulNumSegments;
  134.     UINT32                  m_ulCurSegIndex;
  135.     UINT32                  m_ulCurSegOffset;
  136.     // Members for decompression
  137.     LogicalScreenDescriptor m_cLSD;
  138.     BOOL                    m_bIsGIF89a;
  139.     BYTE                   *m_pucGlobalColorMap;
  140.     UINT32                 *m_pImageHeaderSize;
  141.     UINT32                 *m_pCompressedBufferSize;
  142.     CGIFImage              *m_pImage;
  143.     UINT32                  m_ulCurrentImageIndex;
  144.     BOOL                    m_bNeedPacket;
  145.     UINT32                  m_ulState;
  146.     BOOL                    m_bValid;
  147.     // Common member methods
  148.     void ParseApplicationExtension(BYTE * &pBuf);
  149.     // Member functions for parsing
  150.     void          ResetParse();
  151.     UINT32        ComputeLZWDataSize(BYTE *pLZW);
  152.     inline void Pack32(UINT32 ulValue, UINT8 *pData)
  153.     {
  154.         pData[0] = (UINT8) ((ulValue >> 24) & 0x000000FF);
  155.         pData[1] = (UINT8) ((ulValue >> 16) & 0x000000FF);
  156.         pData[2] = (UINT8) ((ulValue >>  8) & 0x000000FF);
  157.         pData[3] = (UINT8) ( ulValue        & 0x000000FF);
  158.     };
  159.     inline void Pack16(UINT16 usValue, UINT8 *pData)
  160.     {
  161.         pData[0] = (UINT8) ((usValue >> 8) & 0x00FF);
  162.         pData[1] = (UINT8) ( usValue       & 0x00FF);
  163.     };
  164.     // Member functions for decompressing
  165.     void          ResetDecompress();
  166.     HX_RESULT     ParseContainerHeader(BYTE * &pBuffer);
  167.     INT32         ComputeStartingImageIndex(INT32 lCurIndex, INT32 lDesiredIndex);
  168.     inline UINT32 UnPack32(BYTE *pBuf)
  169.     {
  170.         return (pBuf[0] << 24) | (pBuf[1] << 16) | (pBuf[2] << 8) | pBuf[3];
  171.     };
  172.     inline UINT16 UnPack16(BYTE *pBuf)
  173.     {
  174.         return (UINT16) ((pBuf[0] << 8) | pBuf[1]);
  175.     };
  176. };
  177. #define GIF_RENDERER_FLAG_PARSEFAILED  1
  178. #endif