Модераторы: Poseidon

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C&DOS] Просмотрщик файлов формата ГИФ 
:(
    Опции темы
Гениальный123Робот
Дата 7.3.2007, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 2.1.2006

Репутация: нет
Всего: нет



Добрый день! Для хорошо знающих СИ
Задача такая: выделить здесь основные функции и пояснить их (то есть ключевые функции выделить). 
Ну то есть объяснить мне, из чего задача и как работает. 
Заранее спасибо!


Код

#include <graphics.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <dos.h>
#define MAX_CODES 4095

FILE *gif;
int str,bad_code_count,nImages;
long beforeLcPal, beforeGlPal, curPtr;
short curr_size; 
short clear; 
short ending; 
short newcodes; 
short top_slot;
short slot; 

struct image {
 
 int Width, Height; 
 int BPP; 
 int Transparent; 
 
 int xPos, yPos; 
 int Delay; 
 int Transparency; 
};

struct image * GIFImage;



short navail_bytes = 0;
short nbits_left = 0; 
unsigned char b1;
unsigned char byte_buff[257]; 
unsigned char *pbytes;


long code_mask[13] =
{
 0,
 0x0001,0x0003,
 0x0007, 0x000F,
 0x001F, 0x003F,
 0x007F, 0x00FF,
 0x01FF, 0x03FF,
 0x07FF, 0x0FFF
};

unsigned char stack[MAX_CODES + 1]; 
unsigned char suffix[MAX_CODES + 1]; 
unsigned short prefix[MAX_CODES + 1];

short decoder(int linewidth);
int out_line(unsigned int pixels[],int linelen);
int LoadGIF (char * szFileName,struct image * NextImage);
void GrafInit();
void CreatePalette(struct image *,int,int);
void Init (struct image * img, int iWidth, int iHeight, int iBPP);
int huge detectSVGA(void);
short get_next_code();
short init_exp(int size);
void ClearScr(struct image *);

void main(int argc,char* argv[])
{
 char path[32];
 int temp;
 do
 {
  if (argv[1])
  {
   strcpy(path,argv[1]);
   argv[1]=0;
  } else
  {
   str=0;
   clrscr();
   puts("Type 'exit' to terminate the program");
   printf("Enter the path to GIF File: ");
   scanf("%s",path);
  }
  if (stricmp(path,"exit"))
  {
   GIFImage=(struct image *)malloc(sizeof(struct image));
   GrafInit();
   if (!strstr(path,".gif"))
    strcat(path,".gif");
   temp=LoadGIF(path,GIFImage);
   if (!temp)
   {
    free(GIFImage);
    closegraph();
    //GraphClose();
    continue;
   }
   getch();
   free(GIFImage);
   closegraph();
   //GraphClose();
  } else return;
 } while (1);

};

void GrafInit()
{
 int gdriver, gmode, errorcode;
 installuserdriver("SVGA256",detectSVGA);

 gdriver=DETECT;

 initgraph(&gdriver, &gmode, "");

 errorcode = graphresult();

 if (errorcode != grOk)  
 {
  printf("Graphics error: %s\n", grapherrormsg(errorcode));
  printf("Press any key to halt:");
  getch();
  exit(1);
 }
};

int huge detectSVGA(void)
{
 return 2;
};

void CreatePalette(struct image * img,int Lc,int Gl)
{
 unsigned char r,g,b;

 if (Lc)
  fseek(gif,beforeLcPal,0);
 else if (Gl)
  fseek(gif,beforeGlPal,0);
 else return;

 for (int i=0;i<1<<img->BPP;i++)
 {
  r=fgetc(gif);
  g=fgetc(gif);
  b=fgetc(gif);
  asm mov ax,0x1010;
  asm mov bx,i;
  asm mov dh,r;
  asm mov ch,g;
  asm mov cl,b;
  asm int 0x10;
 }
 fseek(gif,curPtr,0);
};

void ClearScr(struct image * img)
{
 setcolor(0);
 rectangle(0,0,img->Width,img->Height);
}

void Init (struct image * img, int iWidth, int iHeight, int iBPP)
{
 img->Transparent=-1;
 img->Width = iWidth; img->Height=iHeight; img->BPP=iBPP;
 img->xPos=img->yPos=img->Delay=0;
};

int LoadGIF (char * szFileName,struct image * NextImage)
{
 int n;
 // Global GIF variables:
 int GlobalBPP; // Bits per Pixel.

 struct GIFGCEtag { 
  unsigned char BlockSize; 
  unsigned char PackedFields; 
         
          
  unsigned short Delay;
  unsigned char Transparent; 
 } gifgce;

 int GraphicExtensionFound = 0;

 
 if (!(gif=fopen(szFileName,"rb")))
 {
  puts("File not found!");
  getch();
  return 0;
 }
 
 char szSignature[6]; 
 fread(szSignature,1,6,gif);
 if (memcmp(szSignature,"GIF",2) != 0)
 {
  puts("Not a GIF File!");
  getch();
  return 0;
 }

 
 struct GIFLSDtag {
  unsigned short ScreenWidth; 
  unsigned short ScreenHeight;
  unsigned char PackedFields;
         
  unsigned char Background;
  unsigned char PixelAspectRatio;
 } giflsd;

 fread((char*)&giflsd,sizeof(giflsd),1,gif);

 GlobalBPP = (giflsd.PackedFields & 0x07) + 1;

 beforeGlPal=ftell(gif);
 if (giflsd.PackedFields & 0x80) 
  fseek(gif,3*(1<<GlobalBPP),1);
 fseek(gif,1,1);
 
 do
 {
  fseek(gif,-1,1);
  int charGot=fgetc(gif);

  if (charGot == 0x21) 
  {
   switch (fgetc(gif))
   {

   case 0xF9: 

    fread((char*)&gifgce,sizeof(gifgce),1,gif);
    GraphicExtensionFound++;
    fseek(gif,1,1);
       // Block Terminator (always 0)
    break;

   case 0xFE: 
   case 0x01: 
   case 0xFF:
   default: 
    // read (and ignore) data sub-blocks
    int nBlockLength;
    while (nBlockLength=fgetc(gif))
    {
     for (int n=0; n<nBlockLength; n++)
     fseek(gif,1,1);
    }
    break;
   }
  }


  else if (charGot == 0x2c) { 

  
   struct GIFIDtag {
    unsigned short xPos; 
    unsigned short yPos; 
    unsigned short Width; 
    unsigned short Height; 
    unsigned char PackedFields; 
         
   } gifid;

   fread((char*)&gifid,sizeof(gifid),1,gif);

   int LocalColorMap = (gifid.PackedFields & 0x80)? 1 : 0;

   Init (NextImage, gifid.Width, gifid.Height,
    LocalColorMap ? (gifid.PackedFields&7)+1 : GlobalBPP);

  
   NextImage->xPos = gifid.xPos;
   NextImage->yPos = gifid.yPos;
   if (GraphicExtensionFound)
   {
    NextImage->Transparent=
     (gifgce.PackedFields&0x01) ? gifgce.Transparent : -1;
    NextImage->Transparency=
     (gifgce.PackedFields&0x1c)>1 ? 1 : 0;
    NextImage->Delay = gifgce.Delay*10;
   }
   beforeLcPal=ftell(gif);
   if (LocalColorMap) 
    fseek(gif,3*(1<<NextImage->BPP),1);
   //delay(NextImage->Delay);
   curPtr=ftell(gif);
   /*if (nImages)          
    ClearScr(NextImage);
   nImages++;*/
   CreatePalette(NextImage,LocalColorMap,giflsd.PackedFields&0x80);
   n=decoder(NextImage->Width);
  }


  else if (charGot == 0x3b) { 
   break; 
  }

 } while (fgetc(gif));

 nImages=0;
 fclose(gif);

 if (n<0)
 {
  puts("Error!");
      getch();
  return 0;
 }
 return 1;
};


int out_line(unsigned char pixels[],int linelen)
{
 int i;
 if (str>(getmaxy()+1))
  return 1;
 for (i=0; i<linelen; i++)
 {
  if (i>(getmaxx()+1))
   return 1;
  putpixel(i,str,pixels[i]);
 }
 str++;
 return 1;
};

short get_next_code()
{
 short i, x;
 unsigned long ret;
  if (nbits_left == 0)
  {
    if (navail_bytes <= 0)
    {
  
    pbytes = byte_buff;
    if ((navail_bytes = fgetc(gif)) < 0)
    return(navail_bytes);
    else if (navail_bytes)
    {
      for (i = 0; i < navail_bytes; ++i)
      {
        if ((x = fgetc(gif)) < 0)
       return(x);
        byte_buff[i] = x;
      }
    }
    }
    b1 = *pbytes++;
    nbits_left = 8;
    --navail_bytes;
  }
    ret = b1 >> (8 - nbits_left); 
 while (curr_size > nbits_left)
 { 
  if (navail_bytes <= 0)
  {
   
   pbytes = byte_buff;
   if ((navail_bytes = fgetc(gif)) < 0)
    return(navail_bytes);
   else if (navail_bytes)
   {
    for (i = 0; i < navail_bytes; ++i)
    {
        if ((x = fgetc(gif)) < 0)
       return(x);
                    byte_buff[i] = x;
    }
   }
  }
  b1 = *pbytes++;
  ret |= b1 << nbits_left;
  nbits_left += 8;
  --navail_bytes;
  }
  nbits_left -= curr_size;
  ret &= code_mask[curr_size];
  return((unsigned short)(ret));
};


short init_exp(int size)
{
  curr_size = size + 1;
  top_slot = 1 << curr_size;
  clear = 1 << size;
  ending = clear + 1;
    slot = newcodes = ending + 1;
    navail_bytes = nbits_left = 0;
    return(0);
};


short decoder(int linewidth)
{
 register unsigned char *sp, *bufptr;
 unsigned char *buf;
 register short code, fc, oc, bufcnt;
 short c, size, ret;

 if ((size = fgetc(gif)) < 0)
  return(size);
 if (size < 2 || 9 < size)
  return(-20);
 init_exp(size);

 oc = fc = 0;

 if ((buf = (unsigned char *)malloc(linewidth + 1)) == NULL)
  return(-10);

 sp = stack;
 bufptr = buf;
 bufcnt = linewidth;

 while ((c = get_next_code()) != ending)
 {

  if (c < 0)
  {
   free(buf);
   return(0);
  }

  if (c == clear)
  {
   curr_size = size + 1;
   slot = newcodes;
   top_slot = 1 << curr_size;

   while ((c = get_next_code()) == clear){}
   if (c == ending)
    break;
   if (c >= slot)
    c = 0;
   oc = fc = c;
   *bufptr++ = c;
   if (--bufcnt == 0)
   {
    if ((ret = out_line(buf, linewidth)) < 0)
    {
     free(buf);
     return(ret);
    }
    bufptr = buf;
    bufcnt = linewidth;
   }
  } else
  {
   code = c;
   if (code >= slot)
   {
    if (code > slot)
     ++bad_code_count;
    code = oc;
    *sp++ = fc;
   }
   while (code >= newcodes)
   {
    *sp++ = suffix;
    code = prefix;
   }
   *sp++ = code;
   if (slot < top_slot)
   {
    suffix[slot] = fc = code;
    prefix[slot++] = oc;
    oc = c;
   }
   if (slot >= top_slot)
    if (curr_size < 12)
    {
     top_slot <<= 1;
     ++curr_size;
    }
   while (sp > stack)
   {
    *bufptr++ = *(--sp);
    if (--bufcnt == 0)
    {
     if ((ret = out_line(buf, linewidth)) < 0)
     {
      free(buf);
      return(ret);
     }
     bufptr = buf;
     bufcnt = linewidth;
    }
   }
  }
 }

 ret = 0;
 if (bufcnt != linewidth)
  ret = out_line(buf, (linewidth - bufcnt));
 free(buf);
 return ret;

}



Это сообщение отредактировал(а) Alexeis - 8.3.2007, 13:54
PM MAIL   Вверх
En_t_end
Дата 12.3.2007, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2074
Регистрация: 4.12.2004

Репутация: 2
Всего: 20



Гениальный123Робот
Тебе что, спецификацию gif рассказать ? Дык в инете поищи.
PM MAIL ICQ Skype GTalk Jabber   Вверх
Гениальный123Робот
Дата 13.3.2007, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 2.1.2006

Репутация: нет
Всего: нет



Цитата(En_t_end @ 12.3.2007,  18:12)
Гениальный123Робот
Тебе что, спецификацию gif рассказать ? Дык в инете поищи.

поподробнее можно? 
PM MAIL   Вверх
Гениальный123Робот
Дата 14.3.2007, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 2.1.2006

Репутация: нет
Всего: нет



У кого-нибудь компилируется? Попробуйте, пожалуйста! Должно компилироваться, но у меня ошибок 6 линковщика...
А у Вас? user posted image

Это сообщение отредактировал(а) Гениальный123Робот - 14.3.2007, 16:10
PM MAIL   Вверх
Kuvaldis
Дата 15.3.2007, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


Профиль
Группа: Участник Клуба
Сообщений: 1189
Регистрация: 16.6.2006
Где: Минск

Репутация: 32
Всего: 61



Если компилировать в Borland 3.1 *(у тебя используется графика), то в
Код

   while (code >= newcodes)    
   {    
    *sp++ = suffix;    (1)
    code = prefix;    
   }

Выдаются 2 идентичные ошибки:
can't conver unsigned char* to unsigned char

Это ошибки НЕ линкера, они на этапе компиляции


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
zkv
Дата 15.3.2007, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 21
Всего: 92



Цитата(Kuvaldis @  15.3.2007,  11:58 Найти цитируемый пост)
Выдаются 2 идентичные ошибки:
can't conver unsigned char* to unsigned char

тоже самое, что там подразумевалось разобраться с ходу не получилось, попробовал пару вариантов наугад smile - прога запускается, спрашивает имя файла, а потом исчезает вместе с компилятором.
PM MAIL   Вверх
Kuvaldis
Дата 15.3.2007, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


Профиль
Группа: Участник Клуба
Сообщений: 1189
Регистрация: 16.6.2006
Где: Минск

Репутация: 32
Всего: 61



Гениальный123Робот
Вишь, что 
zkv написал
Цитата

тоже самое, что там подразумевалось разобраться с ходу не получилось, попробовал пару вариантов наугад

У меня то же самое. Вывод: всегда пиши комментарии ;)

Это сообщение отредактировал(а) Kuvaldis - 15.3.2007, 16:17


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
Гениальный123Робот
Дата 15.3.2007, 18:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 2.1.2006

Репутация: нет
Всего: нет



Спасибо, что отозвались! Большое спасибо!  
Окей, вот с комментами. 

Код

// Kursach.cpp : Defines the entry point for the console application.
//

#include <graphics.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <dos.h>
#define MAX_CODES 4095

FILE *gif;
int str,bad_code_count,nImages;
long beforeLcPal, beforeGlPal, curPtr;
short curr_size; /* The current code size */
short clear; /* Value for a clear code */
short ending; /* Value for a ending code */
short newcodes; /* First available code */
short top_slot; /* Highest code for current size */
short slot; /* Last read code */

struct image {
 // standard members:
 int Width, Height; // Dimensions in pixels
 int BPP; // Bits Per Pixel
 int Transparent; // Index of Transparent color (-1 for none)
 // Extra members for animations:
 int xPos, yPos; // Relative Position
 int Delay; // Delay after image in 1/1000 seconds.
 int Transparency; // Animation Transparency.
};

struct image * GIFImage;

/* The following static variables are used* for seperating out codes*/

short navail_bytes = 0; /* # bytes left in block */
short nbits_left = 0; /* # bits left in current byte */
unsigned char b1; /* Current byte */
unsigned char byte_buff[257]; /* Current block */
unsigned char *pbytes; /* Pointer to next byte in block */


long code_mask[13] =
{
 0,
 0x0001,0x0003,
 0x0007, 0x000F,
 0x001F, 0x003F,
 0x007F, 0x00FF,
 0x01FF, 0x03FF,
 0x07FF, 0x0FFF
};

unsigned char stack[MAX_CODES + 1]; /* Stack for storing pixels */
unsigned char suffix[MAX_CODES + 1]; /* Suffix table */
unsigned short prefix[MAX_CODES + 1]; /* Prefix linked list */

short decoder(int linewidth);
int out_line(unsigned int pixels[],int linelen);
int LoadGIF (char * szFileName,struct image * NextImage);
void GrafInit();
void CreatePalette(struct image *,int,int);
void Init (struct image * img, int iWidth, int iHeight, int iBPP);
int huge detectSVGA(void);
short get_next_code();
short init_exp(int size);
void ClearScr(struct image *);

void main(int argc,char* argv[])
{
 char path[32];
 int temp;
 do
 {
  if (argv[1])
  {
   strcpy(path,argv[1]);
   argv[1]=0;
  } else
  {
   str=0;
   clrscr();
   puts("Type 'exit' to terminate the program");
   printf("Enter the path to GIF File: ");
   scanf("%s",path);
  }
  if (stricmp(path,"exit"))
  {
   GIFImage=(struct image *)malloc(sizeof(struct image));
   GrafInit();
   if (!strstr(path,".gif"))
    strcat(path,".gif");
   temp=LoadGIF(path,GIFImage);
   if (!temp)
   {
    free(GIFImage);
    closegraph();
    //GraphClose();
    continue;
   }
   getch();
   free(GIFImage);
   closegraph();
   //GraphClose();
  } else return;
 } while (1);

};

void GrafInit()
{
 int gdriver, gmode, errorcode;
 installuserdriver("SVGA256",detectSVGA);

 gdriver=DETECT;

 initgraph(&gdriver, &gmode, "");

 errorcode = graphresult();

 if (errorcode != grOk)  /* an error occurred */
 {
  printf("Graphics error: %s\n", grapherrormsg(errorcode));
  printf("Press any key to halt:");
  getch();
  exit(1);
 }
};

int huge detectSVGA(void)
{
 return 2;
};

void CreatePalette(struct image * img,int Lc,int Gl)
{
 unsigned char r,g,b;

 if (Lc)
  fseek(gif,beforeLcPal,0);
 else if (Gl)
  fseek(gif,beforeGlPal,0);
 else return;

 for (int i=0;i<1<<img->BPP;i++)
 {
  r=fgetc(gif);
  g=fgetc(gif);
  b=fgetc(gif);
  asm mov ax,0x1010;
  asm mov bx,i;
  asm mov dh,r;
  asm mov ch,g;
  asm mov cl,b;
  asm int 0x10;
 }
 fseek(gif,curPtr,0);
};

void ClearScr(struct image * img)
{
 setcolor(0);
 rectangle(0,0,img->Width,img->Height);
}

void Init (struct image * img, int iWidth, int iHeight, int iBPP)
{
 img->Transparent=-1;
 img->Width = iWidth; img->Height=iHeight; img->BPP=iBPP;
 img->xPos=img->yPos=img->Delay=0;
};

int LoadGIF (char * szFileName,struct image * NextImage)
{
 int n;
 // Global GIF variables:
 int GlobalBPP; // Bits per Pixel.

 struct GIFGCEtag { // GRAPHIC CONTROL EXTENSION
  unsigned char BlockSize; // Block Size: 4 bytes
  unsigned char PackedFields; // Packed Fields. Bits detail:
          //    0: Transparent Color Flag
          //    1: User Input Flag
          //  2-4: Disposal Method
  unsigned short Delay; // Delay Time (1/100 seconds)
  unsigned char Transparent; // Transparent Color Index
 } gifgce;

 int GraphicExtensionFound = 0;

 // OPEN FILE
 if (!(gif=fopen(szFileName,"rb")))
 {
  puts("File not found!");
  getch();
  return 0;
 }
 // *1* READ HEADER (SIGNATURE + VERSION)
 char szSignature[6]; // First 6 bytes (GIF87a or GIF89a)
 fread(szSignature,1,6,gif);
 if (memcmp(szSignature,"GIF",2) != 0)
 {
  puts("Not a GIF File!");
  getch();
  return 0;
 }

 // *2* READ LOGICAL SCREEN DESCRIPTOR
 struct GIFLSDtag {
  unsigned short ScreenWidth; // Logical Screen Width
  unsigned short ScreenHeight; // Logical Screen Height
  unsigned char PackedFields; // Packed Fields. Bits detail:
          //  0-2: Size of Global Color Table
          //    3: Sort Flag
          //  4-6: Color Resolution
          //    7: Global Color Table Flag
  unsigned char Background; // Background Color Index
  unsigned char PixelAspectRatio;
 } giflsd;

 fread((char*)&giflsd,sizeof(giflsd),1,gif);

 GlobalBPP = (giflsd.PackedFields & 0x07) + 1;

 beforeGlPal=ftell(gif);
 if (giflsd.PackedFields & 0x80) // File has global color map?
  fseek(gif,3*(1<<GlobalBPP),1);
 fseek(gif,1,1);
 // *4* NOW WE HAVE 3 POSSIBILITIES:
 //  4a) Get and Extension Block (Blocks with additional information)
 //  4b) Get an Image Separator (Introductor to an image)
 //  4c) Get the trailer Char (End of GIF File)
 do
 {
  fseek(gif,-1,1);
  int charGot=fgetc(gif);

  if (charGot == 0x21) // *A* EXTENSION BLOCK
  {
   switch (fgetc(gif))
   {

   case 0xF9: // Graphic Control Extension

    fread((char*)&gifgce,sizeof(gifgce),1,gif);
    GraphicExtensionFound++;
    fseek(gif,1,1);
       // Block Terminator (always 0)
    break;

   case 0xFE: // Comment Extension: Ignored
   case 0x01: // PlainText Extension: Ignored
   case 0xFF: // Application Extension: Ignored
   default: // Unknown Extension: Ignored
    // read (and ignore) data sub-blocks
    int nBlockLength;
    while (nBlockLength=fgetc(gif))
    {
     for (int n=0; n<nBlockLength; n++)
     fseek(gif,1,1);
    }
    break;
   }
  }


  else if (charGot == 0x2c) { // *B* IMAGE (0x2c Image Separator)

   // Read Image Descriptor
   struct GIFIDtag {
    unsigned short xPos; // Image Left Position
    unsigned short yPos; // Image Top Position
    unsigned short Width; // Image Width
    unsigned short Height; // Image Height
    unsigned char PackedFields; // Packed Fields. Bits detail:
           //  0-2: Size of Local Color Table
           //  3-4: (Reserved)
           //    5: Sort Flag
           //    6: Interlace Flag
           //    7: Local Color Table Flag
   } gifid;

   fread((char*)&gifid,sizeof(gifid),1,gif);

   int LocalColorMap = (gifid.PackedFields & 0x80)? 1 : 0;

   Init (NextImage, gifid.Width, gifid.Height,
    LocalColorMap ? (gifid.PackedFields&7)+1 : GlobalBPP);

   // Fill NextImage Data
   NextImage->xPos = gifid.xPos;
   NextImage->yPos = gifid.yPos;
   if (GraphicExtensionFound)
   {
    NextImage->Transparent=
     (gifgce.PackedFields&0x01) ? gifgce.Transparent : -1;
    NextImage->Transparency=
     (gifgce.PackedFields&0x1c)>1 ? 1 : 0;
    NextImage->Delay = gifgce.Delay*10;
   }
   beforeLcPal=ftell(gif);
   if (LocalColorMap) // Read Color Map (if descriptor says so)
    fseek(gif,3*(1<<NextImage->BPP),1);
   //delay(NextImage->Delay);
   curPtr=ftell(gif);
   /*if (nImages)          //for animation, che t ne katit 
    ClearScr(NextImage);
   nImages++;*/
   CreatePalette(NextImage,LocalColorMap,giflsd.PackedFields&0x80);
   n=decoder(NextImage->Width);
  }


  else if (charGot == 0x3b) { // *C* TRAILER: End of GIF Info
   break; // Ok. Standard End.
  }

 } while (fgetc(gif));

 nImages=0;
 fclose(gif);

 if (n<0)
 {
  puts("Error!");
      getch();
  return 0;
 }
 return 1;
};


int out_line(unsigned char pixels[],int linelen)
{
 int i;
 if (str>(getmaxy()+1))
  return 1;
 for (i=0; i<linelen; i++)
 {
  if (i>(getmaxx()+1))
   return 1;
  putpixel(i,str,pixels[i]);
 }
 str++;
 return 1;
};

short get_next_code()
{
 short i, x;
 unsigned long ret;
  if (nbits_left == 0)
  {
    if (navail_bytes <= 0)
    {
   /* Out of bytes in current block, so read next block*/
    pbytes = byte_buff;
    if ((navail_bytes = fgetc(gif)) < 0)
    return(navail_bytes);
    else if (navail_bytes)
    {
      for (i = 0; i < navail_bytes; ++i)
      {
        if ((x = fgetc(gif)) < 0)
       return(x);
        byte_buff[i] = x;
      }
    }
    }
    b1 = *pbytes++;
    nbits_left = 8;
    --navail_bytes;
  }
    ret = b1 >> (8 - nbits_left); 
 while (curr_size > nbits_left)
 { 
  if (navail_bytes <= 0)
  {
   /* Out of bytes in current block, so read next block*/  
   pbytes = byte_buff;
   if ((navail_bytes = fgetc(gif)) < 0)
    return(navail_bytes);
   else if (navail_bytes)
   {
    for (i = 0; i < navail_bytes; ++i)
    {
        if ((x = fgetc(gif)) < 0)
       return(x);
                    byte_buff[i] = x;
    }
   }
  }
  b1 = *pbytes++;
  ret |= b1 << nbits_left;
  nbits_left += 8;
  --navail_bytes;
  }
  nbits_left -= curr_size;
  ret &= code_mask[curr_size];
  return((unsigned short)(ret));
};


short init_exp(int size)
{
  curr_size = size + 1;
  top_slot = 1 << curr_size;
  clear = 1 << size;
  ending = clear + 1;
    slot = newcodes = ending + 1;
    navail_bytes = nbits_left = 0;
    return(0);
};


short decoder(int linewidth)
{
 register unsigned char *sp, *bufptr;
 unsigned char *buf;
 register short code, fc, oc, bufcnt;
 short c, size, ret;
/* Initialize for decoding a new image...*/
 if ((size = fgetc(gif)) < 0)
  return(size);
 if (size < 2 || 9 < size)
  return(-20);
 init_exp(size);
/* Initialize in case they forgot to put in a clear code.* (This shouldn't happen, but we'll try and decode it anyway...)*/
 oc = fc = 0;
/* Allocate space for the decode buffer*/
 if ((buf = (unsigned char *)malloc(linewidth + 1)) == NULL)
  return(-10);
/* Set up the stack pointer and decode buffer pointer*/
 sp = stack;
 bufptr = buf;
 bufcnt = linewidth;

 while ((c = get_next_code()) != ending)
 {
/* If we had a file error, return without completing the decode*/
  if (c < 0)
  {
   free(buf);
   return(0);
  }
/* If the code is a clear code, reinitialize all necessary items.*/
  if (c == clear)
  {
   curr_size = size + 1;
   slot = newcodes;
   top_slot = 1 << curr_size;
/* Continue reading codes until we get a non-clear code* (Another unlikely, but possible case...)*/
   while ((c = get_next_code()) == clear){}
   if (c == ending)
    break;
   if (c >= slot)
    c = 0;
   oc = fc = c;
   *bufptr++ = c;
   if (--bufcnt == 0)
   {
    if ((ret = out_line(buf, linewidth)) < 0)
    { 
     free(buf);
     return(ret);
    }
    bufptr = buf;
    bufcnt = linewidth;
   }
  } else
  {
   code = c;
   if (code >= slot)
   {
    if (code > slot)
     ++bad_code_count;
    code = oc;
    *sp++ = fc;
   }
   while (code >= newcodes)
   {
    *sp++ = suffix[coУБРАТЬ_ЭТОТ_ТЕКСТde];
    code = prefix [coУБРАТЬ_ЭТОТ_ТЕКСТde];
   }
   *sp++ = code;
   if (slot < top_slot)
   {
    suffix[slot] = fc = code;
    prefix[slot++] = oc;
    oc = c;
   }
   if (slot >= top_slot)
    if (curr_size < 12)
    {
     top_slot <<= 1;
     ++curr_size;
    }
   while (sp > stack)
   {
    *bufptr++ = *(--sp);
    if (--bufcnt == 0)
    {
     if ((ret = out_line(buf, linewidth)) < 0)
     {
      free(buf);
      return(ret);
     }
     bufptr = buf;
     bufcnt = linewidth;
    }
   }
  }
 }

 ret = 0;
 if (bufcnt != linewidth)
  ret = out_line(buf, (linewidth - bufcnt));
 free(buf);
 return ret;

}



Может кто ход событий (функций) расскажет, кто посильнее меня в СИ? Какие конкретно надо выполнить функции, чтобы решить задачу просмотра картинок расширения ГИФ? 

P.S. В строках 483 и 484 -  убрать русский текст, а то он мешает тэгу "code"

Это сообщение отредактировал(а) Alexeis - 26.4.2007, 13:24
PM MAIL   Вверх
zkv
Дата 15.3.2007, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 21
Всего: 92



Цитата(Гениальный123Робот @  15.3.2007,  18:18 Найти цитируемый пост)

    *sp++ = suffix[code];
    code = prefix [code];

такой вариант я пробовал. Не помогает. 
Гениальный123Робот, ты чего добиться хочешь? Ну разберешься если даже ты с этой прогой, а дальше что делать с просмотрщиком  гифов из консоли? Я не могу представить себе сферы его применения.  Лучше сразу брал бы какой нить компилятор посовременней, и писал бы в нем.

А сам то ты пробовал запускать эту прогу? Посидел бы сам с отладчиком, поискал бы ошибку, но, повторюсь, зачем изучать специфику работы с графикой уже мертвого компилятора?

И тебе именно самому велосипед хочется изобрести? Вообще то существует довольно много способов просмотреть гиф-картинку, не вникая в устройство формата.
PM MAIL   Вверх
Rockie
Дата 15.3.2007, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 13
Всего: 31



Гениальный123Робот, судя по первым строчкам кода, компилируешь в VC. 
BGI(Borland Graphic Interface) не поддерживается компиляторами платформы windows. Вернее, при особо сильном желании прикрутить можно но, как уже сказали, овчинка выделки не стоит

Добавлено @ 20:00 
BGI for Windows


--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
likehood
Дата 15.3.2007, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


666
**


Профиль
Группа: Участник
Сообщений: 536
Регистрация: 21.12.2005

Репутация: 12
Всего: 24



Цитата(Rockie @  15.3.2007,  20:59 Найти цитируемый пост)
 судя по первым строчкам кода, компилируешь в VC. 

Интересно, как ты определил, чем он компилирует код. Кстати, из названия темы видно, что пишет он под ДОС.

Непонятно только в чем проблема, у меня например в BC 3.1 картинку показало.
PM MAIL   Вверх
Гениальный123Робот
Дата 15.3.2007, 21:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 2.1.2006

Репутация: нет
Всего: нет



Это мой курсовой проект. Мне надо разобраться в готовой задаче. И все. Поэтому я к вам. Ясно, что области применения тут нет, а требуется просто сделать и сдать ;)  
Поэтому и спрашиваю, какие функции в этой программе, как они работают и т.п. 
А у меня ошибки выдаются вон какие (Я выше скинул картинку). Как их исправить? 
У меня Borland C++ 3.1
PM MAIL   Вверх
likehood
Дата 15.3.2007, 21:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


666
**


Профиль
Группа: Участник
Сообщений: 536
Регистрация: 21.12.2005

Репутация: 12
Всего: 24



Гениальный123Робот, а такая галочка установлена Options->Linker->Libraries->Graphic Library?

PM MAIL   Вверх
Гениальный123Робот
Дата 15.3.2007, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 2.1.2006

Репутация: нет
Всего: нет



Цитата(likehood @ 15.3.2007,  21:17)
Гениальный123Робот, а такая галочка установлена Options->Linker->Libraries->Graphic Library?

Сразу как ты сказал - поставил, но теперь уже все компилируется, а после этого запускается прога и написано:
Device driver file not found <SVGA256.BGI>
Балин, что за ошибка... 

Слу, и не проверишь (что я ниже написал) и пояснишь функции основные? Что они делают? 
Вот они:

short decoder(int linewidth);
int out_line(unsigned int pixels[],int linelen);
int LoadGIF (char * szFileName,struct image * NextImage); // загружает gif
void GrafInit();
void CreatePalette(struct image *,int,int);
void Init (struct image * img, int iWidth, int iHeight, int iBPP);
int huge detectSVGA(void);
short get_next_code();
short init_exp(int size);
void ClearScr(struct image *); // очищает экран
PM MAIL   Вверх
likehood
Дата 15.3.2007, 21:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


666
**


Профиль
Группа: Участник
Сообщений: 536
Регистрация: 21.12.2005

Репутация: 12
Всего: 24



Цитата(Гениальный123Робот @  15.3.2007,  22:30 Найти цитируемый пост)
Device driver file not found <SVGA256.BGI>

Файл svga256.bgi (видеодрайвер) должен лежать в одной папке с твоей программой.
PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.1313 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.