GIFDECOD.H
上传用户:wep9318
上传日期:2007-01-07
资源大小:893k
文件大小:3k
源码类别:

图片显示

开发平台:

Visual C++

  1. /* DECODE.C - An LZW decoder for GIF
  2.  * Copyright (C) 1987, by Steven A. Bennett
  3.  * Copyright (C) 1994, C++ version by Alejandro Aguilar Sierra
  4. *
  5.  * Permission is given by the author to freely redistribute and include
  6.  * this code in any program as long as this credit is given where due.
  7.  *
  8.  * In accordance with the above, I want to credit Steve Wilhite who wrote
  9.  * the code which this is heavily inspired by...
  10.  *
  11.  * GIF and 'Graphics Interchange Format' are trademarks (tm) of
  12.  * Compuserve, Incorporated, an H&R Block Company.
  13.  *
  14.  * Release Notes: This file contains a decoder routine for GIF images
  15.  * which is similar, structurally, to the original routine by Steve Wilhite.
  16.  * It is, however, somewhat noticably faster in most cases.
  17.  *
  18.  */
  19. #define LOCAL static
  20. #define FAST register
  21. typedef short SHORT;       // 16 bits integer
  22. typedef unsigned short USHORT; // 16 bits unsigned integer
  23. typedef unsigned char byte;             // 8 bits unsigned integer
  24. typedef unsigned long ULONG;            // 32 bits unsigned integer
  25. typedef int INT;                        // 16 bits integer
  26. #ifndef LONG
  27. typedef long LONG;                      // 32 bits integer
  28. #endif
  29. /* Various error codes used by decoder
  30.  */
  31. #define OUT_OF_MEMORY -10
  32. #define BAD_CODE_SIZE -20
  33. #define READ_ERROR -1
  34. #define WRITE_ERROR -2
  35. #define OPEN_ERROR -3
  36. #define CREATE_ERROR -4
  37. #define NULL   0L
  38. #define MAX_CODES   4095
  39. class GIFDecoder
  40. {
  41. protected:
  42.   SHORT init_exp(SHORT size);
  43.   SHORT get_next_code();
  44. public:
  45.   SHORT decoder(SHORT linewidth, INT&  bad_code_count);
  46. /* bad_code_count is incremented each time an out of range code is read.
  47.  * When this value is non-zero after a decode, your GIF file is probably
  48.  * corrupt in some way...
  49.  */
  50.   friend int get_byte(void);
  51. //   - This external (machine specific) function is expected to return
  52. // either the next byte from the GIF file, or a negative error number.
  53. friend int out_line(unsigned char *pixels, int linelen);
  54. /*   - This function takes a full line of pixels (one byte per pixel) and
  55.  * displays them (or does whatever your program wants with them...).  It
  56.  * should return zero, or negative if an error or some other event occurs
  57.  * which would require aborting the decode process...  Note that the length
  58.  * passed will almost always be equal to the line length passed to the
  59.  * decoder function, with the sole exception occurring when an ending code
  60.  * occurs in an odd place in the GIF file...  In any case, linelen will be
  61.  * equal to the number of pixels passed...
  62. */
  63. protected:
  64. /* Static variables */
  65. SHORT curr_size;                     /* The current code size */
  66. SHORT clear;                         /* Value for a clear code */
  67. SHORT ending;                        /* Value for a ending code */
  68. SHORT newcodes;                      /* First available code */
  69. SHORT top_slot;                      /* Highest code for current size */
  70. SHORT slot;                          /* Last read code */
  71. /* The following static variables are used
  72.  * for seperating out codes
  73.  */
  74. SHORT navail_bytes;              /* # bytes left in block */
  75. SHORT nbits_left;                /* # bits left in current byte */
  76. byte b1;                           /* Current byte */
  77. byte byte_buff[257];               /* Current block */
  78. byte *pbytes;                      /* Pointer to next byte in block */
  79. };