| OLD | NEW |
| 1 /* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ | 1 /* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ |
| 2 /* ***** BEGIN LICENSE BLOCK ***** | 2 /* ***** BEGIN LICENSE BLOCK ***** |
| 3 * Version: MPL 1.1/GPL 2.0/LGPL 2.1 | 3 * Version: MPL 1.1/GPL 2.0/LGPL 2.1 |
| 4 * | 4 * |
| 5 * The contents of this file are subject to the Mozilla Public License Version | 5 * The contents of this file are subject to the Mozilla Public License Version |
| 6 * 1.1 (the "License"); you may not use this file except in compliance with | 6 * 1.1 (the "License"); you may not use this file except in compliance with |
| 7 * the License. You may obtain a copy of the License at | 7 * the License. You may obtain a copy of the License at |
| 8 * http://www.mozilla.org/MPL/ | 8 * http://www.mozilla.org/MPL/ |
| 9 * | 9 * |
| 10 * Software distributed under the License is distributed on an "AS IS" basis, | 10 * Software distributed under the License is distributed on an "AS IS" basis, |
| (...skipping 28 matching lines...) Expand all Loading... |
| 39 #define GIFImageReader_h | 39 #define GIFImageReader_h |
| 40 | 40 |
| 41 // Define ourselves as the clientPtr. Mozilla just hacked their C++ callback cl
ass into this old C decoder, | 41 // Define ourselves as the clientPtr. Mozilla just hacked their C++ callback cl
ass into this old C decoder, |
| 42 // so we will too. | 42 // so we will too. |
| 43 #include "platform/SharedBuffer.h" | 43 #include "platform/SharedBuffer.h" |
| 44 #include "core/platform/image-decoders/gif/GIFImageDecoder.h" | 44 #include "core/platform/image-decoders/gif/GIFImageDecoder.h" |
| 45 #include "wtf/OwnPtr.h" | 45 #include "wtf/OwnPtr.h" |
| 46 #include "wtf/PassOwnPtr.h" | 46 #include "wtf/PassOwnPtr.h" |
| 47 #include "wtf/Vector.h" | 47 #include "wtf/Vector.h" |
| 48 | 48 |
| 49 #define MAX_LZW_BITS 12 | 49 #define MAX_DICTIONARY_ENTRY_BITS 12 |
| 50 #define MAX_BYTES 4097 /* 2^MAX_LZW_BITS+1 */ | 50 #define MAX_DICTIONARY_ENTRIES 4096 // 2^MAX_DICTIONARY_ENTRY_BITS |
| 51 #define MAX_COLORS 256 | 51 #define MAX_COLORS 256 |
| 52 #define GIF_COLORS 3 | 52 #define BYTES_PER_COLORMAP_ENTRY 3 |
| 53 | 53 |
| 54 const int cLoopCountNotSeen = -2; | 54 const int cLoopCountNotSeen = -2; |
| 55 | 55 |
| 56 // List of possible parsing states. | 56 // List of possible parsing states. |
| 57 enum GIFState { | 57 enum GIFState { |
| 58 GIFType, | 58 GIFType, |
| 59 GIFGlobalHeader, | 59 GIFGlobalHeader, |
| 60 GIFGlobalColormap, | 60 GIFGlobalColormap, |
| 61 GIFImageStart, | 61 GIFImageStart, |
| 62 GIFImageHeader, | 62 GIFImageHeader, |
| (...skipping 25 matching lines...) Expand all Loading... |
| 88 , codemask(0) | 88 , codemask(0) |
| 89 , clearCode(0) | 89 , clearCode(0) |
| 90 , avail(0) | 90 , avail(0) |
| 91 , oldcode(0) | 91 , oldcode(0) |
| 92 , firstchar(0) | 92 , firstchar(0) |
| 93 , bits(0) | 93 , bits(0) |
| 94 , datum(0) | 94 , datum(0) |
| 95 , ipass(0) | 95 , ipass(0) |
| 96 , irow(0) | 96 , irow(0) |
| 97 , rowsRemaining(0) | 97 , rowsRemaining(0) |
| 98 , stackp(0) | |
| 99 , rowIter(0) | 98 , rowIter(0) |
| 100 , m_client(client) | 99 , m_client(client) |
| 101 , m_frameContext(frameContext) | 100 , m_frameContext(frameContext) |
| 102 { } | 101 { } |
| 103 | 102 |
| 104 bool prepareToDecode(); | 103 bool prepareToDecode(); |
| 105 bool outputRow(); | 104 bool outputRow(GIFRow::const_iterator rowBegin); |
| 106 bool doLZW(const unsigned char* block, size_t bytesInBlock); | 105 bool doLZW(const unsigned char* block, size_t bytesInBlock); |
| 107 bool hasRemainingRows() { return rowsRemaining; } | 106 bool hasRemainingRows() { return rowsRemaining; } |
| 108 | 107 |
| 109 private: | 108 private: |
| 110 // LZW decoding states and output states. | 109 // LZW decoding states and output states. |
| 111 int codesize; | 110 int codesize; |
| 112 int codemask; | 111 int codemask; |
| 113 int clearCode; // Codeword used to trigger dictionary reset. | 112 int clearCode; // Codeword used to trigger dictionary reset. |
| 114 int avail; // Index of next available slot in dictionary. | 113 int avail; // Index of next available slot in dictionary. |
| 115 int oldcode; | 114 int oldcode; |
| 116 unsigned char firstchar; | 115 unsigned char firstchar; |
| 117 int bits; // Number of unread bits in "datum". | 116 int bits; // Number of unread bits in "datum". |
| 118 int datum; // 32-bit input buffer. | 117 int datum; // 32-bit input buffer. |
| 119 int ipass; // Interlace pass; Ranges 1-4 if interlaced. | 118 int ipass; // Interlace pass; Ranges 1-4 if interlaced. |
| 120 size_t irow; // Current output row, starting at zero. | 119 size_t irow; // Current output row, starting at zero. |
| 121 size_t rowsRemaining; // Rows remaining to be output. | 120 size_t rowsRemaining; // Rows remaining to be output. |
| 122 | 121 |
| 123 unsigned short prefix[MAX_BYTES]; | 122 unsigned short prefix[MAX_DICTIONARY_ENTRIES]; |
| 124 unsigned char suffix[MAX_BYTES]; | 123 unsigned char suffix[MAX_DICTIONARY_ENTRIES]; |
| 125 unsigned char stack[MAX_BYTES]; | 124 unsigned short suffixLength[MAX_DICTIONARY_ENTRIES]; |
| 126 Vector<unsigned char> rowBuffer; // Single scanline temporary buffer. | 125 GIFRow rowBuffer; // Single scanline temporary buffer. |
| 127 | 126 GIFRow::iterator rowIter; |
| 128 size_t stackp; // Current stack pointer. | |
| 129 Vector<unsigned char>::iterator rowIter; | |
| 130 | 127 |
| 131 // Initialized during construction and read-only. | 128 // Initialized during construction and read-only. |
| 132 WebCore::GIFImageDecoder* m_client; | 129 WebCore::GIFImageDecoder* m_client; |
| 133 const GIFFrameContext* m_frameContext; | 130 const GIFFrameContext* m_frameContext; |
| 134 }; | 131 }; |
| 135 | 132 |
| 136 // Data structure for one LZW block. | 133 // Data structure for one LZW block. |
| 137 struct GIFLZWBlock { | 134 struct GIFLZWBlock { |
| 138 WTF_MAKE_FAST_ALLOCATED; | 135 WTF_MAKE_FAST_ALLOCATED; |
| 139 public: | 136 public: |
| (...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 358 GIFColorMap m_globalColorMap; | 355 GIFColorMap m_globalColorMap; |
| 359 int m_loopCount; // Netscape specific extension block to control the number
of animation loops a GIF renders. | 356 int m_loopCount; // Netscape specific extension block to control the number
of animation loops a GIF renders. |
| 360 | 357 |
| 361 Vector<OwnPtr<GIFFrameContext> > m_frames; | 358 Vector<OwnPtr<GIFFrameContext> > m_frames; |
| 362 | 359 |
| 363 RefPtr<WebCore::SharedBuffer> m_data; | 360 RefPtr<WebCore::SharedBuffer> m_data; |
| 364 bool m_parseCompleted; | 361 bool m_parseCompleted; |
| 365 }; | 362 }; |
| 366 | 363 |
| 367 #endif | 364 #endif |
| OLD | NEW |