1 : /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2 : *
3 : * ***** BEGIN LICENSE BLOCK *****
4 : * Version: MPL 1.1/GPL 2.0/LGPL 2.1
5 : *
6 : * The contents of this file are subject to the Mozilla Public License Version
7 : * 1.1 (the "License"); you may not use this file except in compliance with
8 : * the License. You may obtain a copy of the License at
9 : * http://www.mozilla.org/MPL/
10 : *
11 : * Software distributed under the License is distributed on an "AS IS" basis,
12 : * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
13 : * for the specific language governing rights and limitations under the
14 : * License.
15 : *
16 : * The Original Code is mozilla.org code.
17 : *
18 : * The Initial Developer of the Original Code is
19 : * Netscape Communications Corporation.
20 : * Portions created by the Initial Developer are Copyright (C) 2001
21 : * the Initial Developer. All Rights Reserved.
22 : *
23 : * Contributor(s):
24 : * Chris Saari <saari@netscape.com>
25 : * Bobby Holley <bobbyholley@gmail.com>
26 : *
27 : * Alternatively, the contents of this file may be used under the terms of
28 : * either the GNU General Public License Version 2 or later (the "GPL"), or
29 : * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
30 : * in which case the provisions of the GPL or the LGPL are applicable instead
31 : * of those above. If you wish to allow use of your version of this file only
32 : * under the terms of either the GPL or the LGPL, and not to allow others to
33 : * use your version of this file under the terms of the MPL, indicate your
34 : * decision by deleting the provisions above and replace them with the notice
35 : * and other provisions required by the GPL or the LGPL. If you do not delete
36 : * the provisions above, a recipient may use your version of this file under
37 : * the terms of any one of the MPL, the GPL or the LGPL.
38 : *
39 : * ***** END LICENSE BLOCK ***** */
40 :
41 : #ifndef _nsGIFDecoder2_h
42 : #define _nsGIFDecoder2_h
43 :
44 : #include "nsCOMPtr.h"
45 : #include "Decoder.h"
46 : #include "imgIDecoderObserver.h"
47 :
48 : #include "GIF2.h"
49 :
50 : namespace mozilla {
51 : namespace image {
52 : class RasterImage;
53 :
54 : //////////////////////////////////////////////////////////////////////
55 : // nsGIFDecoder2 Definition
56 :
57 : class nsGIFDecoder2 : public Decoder
58 : {
59 : public:
60 :
61 : nsGIFDecoder2(RasterImage &aImage, imgIDecoderObserver* aObserver);
62 : ~nsGIFDecoder2();
63 :
64 : virtual void WriteInternal(const char* aBuffer, PRUint32 aCount);
65 : virtual void FinishInternal();
66 : virtual Telemetry::ID SpeedHistogram();
67 :
68 : private:
69 : /* These functions will be called when the decoder has a decoded row,
70 : * frame size information, etc. */
71 :
72 : void BeginGIF();
73 : nsresult BeginImageFrame(PRUint16 aDepth);
74 : void EndImageFrame();
75 : void FlushImageData();
76 : void FlushImageData(PRUint32 fromRow, PRUint32 rows);
77 :
78 : nsresult GifWrite(const PRUint8 * buf, PRUint32 numbytes);
79 : PRUint32 OutputRow();
80 : bool DoLzw(const PRUint8 *q);
81 :
82 11 : inline int ClearCode() const { return 1 << mGIFStruct.datasize; }
83 :
84 : PRInt32 mCurrentRow;
85 : PRInt32 mLastFlushedRow;
86 :
87 : PRUint8 *mImageData; // Pointer to image data in either Cairo or 8bit format
88 : PRUint32 *mColormap; // Current colormap to be used in Cairo format
89 : PRUint32 mColormapSize;
90 : PRUint32 mOldColor; // The old value of the transparent pixel
91 :
92 : // The frame number of the currently-decoding frame when we're in the middle
93 : // of decoding it, and -1 otherwise.
94 : PRInt32 mCurrentFrame;
95 :
96 : PRUint8 mCurrentPass;
97 : PRUint8 mLastFlushedPass;
98 : PRUint8 mColorMask; // Apply this to the pixel to keep within colormap
99 : bool mGIFOpen;
100 : bool mSawTransparency;
101 :
102 : gif_struct mGIFStruct;
103 : };
104 :
105 : } // namespace image
106 : } // namespace mozilla
107 :
108 : #endif
|