nedoPC.org

Electronics hobbyists community established in 2002
Atom Feed | View unanswered posts | View active topics It is currently 19 Apr 2024 07:26



Reply to topic  [ 2 posts ] 
MYG - MY Graphics format from 1995 
Author Message
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22543
Location: Silicon Valley
Reply with quote
Когда я учился в институте и писал лабы по курсу "Динамические Системы Хаоса и Порядка" в 1995 году мне понадобился свой собственный формат представления графики и мультиков - в результате я родил формат MYG и написал на C++ его поддержку - первая версия была 16-цветной (с поддержкой стандартных EGA цветов), а вторая версия - 256-цветной (с несколькими специальным образом подобранными палитрами). Сжатие достигалось с помощью RLE алгоритма (замена последовательности пикселов с одним и тем же цветом на команду в которой указан цвет и количество повторений) и формат во многих случаях уделывал PCX и иногда (очень редко) был даже лучше, чем GIF (возможно потому что использовалось несколько предопределённых палитр и само содержимое палитры в файл не записывалось - это уже экономия 48 байт для 16-цветных картинок и 768 байт для 256-цветных). Под спойлером исходник, который может использоваться для записи и проигрывания обоих форматов:

 MYG.H
Code:
// MY Graphics format. Shabarshin A.A.   13.01.1995
const char copyright[]=
"\r\n  -=MY Graphics format=-  1995, UPI-Ekaterinburg, Shabarshin A.\r\n\r\n";
#ifndef __STDIO_H
#include <stdio.h>
#endif
#ifndef __STDLIB_H
#include <stdlib.h>
#endif
#ifndef __STRING_H
#include <string.h>
#endif
#ifndef __DOS_H
#include <dos.h>
#endif
#ifndef __GRAPHICS_H
#include <graphics.h>
#endif
#ifndef __SVGA_H
#include "svga.h"
#endif
#ifndef __MYG_H
#define __MYG_H

int _EGA=0;

#define MYG_EGA  1
#define MYG_VGA  2
#define MYG_SVGA 3

#define MYG_PATH 64

class MYG
{int x0,y0,
     col,row,
     xc,yc,
     koef,
     xt,yt,
     kadr,
     ver,
     disk,
     mkol,
     page_sw,
     page_a,
     page_v,
     spal;
 float k;
 FILE *f0;
 long tek,tend;
 char **im;
 void LineGor(int x1,int x2,int y);
 void LineVer(int y1,int y2,int x);
 void Point(int x,int y){PutP(x,y,GetP(x0+xc-(xc-x)/k,y0+yc-(yc-y)/k));};
 void SetBegin(){xt=x0;yt=y0;};
 int GetColor(){int c=GetP(xt,yt);
                if(++xt==x0+col)
                {  xt=x0;
                   int ytt=y0+row;
                   if(yt==ytt) {c=-999;yt--;}
                   if(++yt==ytt) xt=x0+col-1;
                }
                return c;
                };
 int PutColor(int c){int cc=0;
                PutP(xt,yt,c);
                if(++xt==x0+col)
                {  xt=x0;
                   int ytt=y0+row;
                   if(yt==ytt) {cc=-999;yt--;}
                   if(++yt==ytt) xt=x0+col-1;
                }
                return cc;
                };
 void PutLine(int,int);
 void PutP(int,int,int);
 int GetP(int x,int y){ if(koef){x*=koef;y*=koef;}
                        return getpixel(x,y);};
 void Seq(int x,int y,int n);
 void Arc(int x,int y,long n);
 int Mgetc(void){return disk?getc(f0):GetM(tek++);};
 void SetM(long l,char c){im[l>>15][l&0x7FFF]=c;};
 int  GetM(long l){return im[l>>15][l&0x7FFF];};
 void AskVer(int v){ver=v;if(v>2)Error(0);}
 public:
 char ct,ctt;
 Palette256 *dac256;
 MYG(int,int,int,int,int);
 MYG(int x,int y,char f[MYG_PATH],int k0,int pgp);
 MYG(char f[MYG_PATH]);
 ~MYG();
 void Error(int);
 int ComeOn(int,int,double);
 void SetKoef(int k0){koef=k0==1?0:k0;};
 int Save(char f[MYG_PATH]);
 int Append(char f[MYG_PATH]);
 int Show(int,int,int);
 int GetShot(void) {return kadr;};
 int GetCol(void) {return col;};
 int GetRow(void) {return row;};
 void Shot(void);
 void PageSwitch(int s){page_sw=s;};
 void InitG(void);
 int GetVer(void){return ver;}
 void SetStandardPalette(int);
 int GetStandardPalette(void){return dac256->GetStandardPalette();};
};

void MYG::LineGor(int x1,int x2,int y)
{for(int xx=x1;xx<=x2;xx++) Point(xx,y);}

void MYG::LineVer(int y1,int y2,int x)
{for(int yy=y1;yy<=y2;yy++) Point(x,yy);}

void MYG::Error(int e)
{  closegraph();
   printf("ОШИБКА : ");
   switch(e)
   {case 0:printf("Некоppектная веpсия пакета MYG !");break;
    case 1:printf("Некоppектно составленный MYG-файл !");break;
    case 2:printf("Неизвестная команда в MYG-файле !");break;
    case 3:printf("Не может откpыть MYG-файл !");break;
    case 4:printf("Несоответствие кадpа MYG-файлy !");break;
    case 5:printf("Ошибка MYG-системы !!!");break;

   }
   sound(1000);
   delay(250);
   nosound();
   exit(1);
}


MYG::MYG(int x,int y,int dx,int dy,int v=1)
{ x0=x;y0=y;disk=1;
  spal=1;
  AskVer(v);
  page_sw=0;
  col=dx;row=dy;
  koef=0;kadr=0;
  ct=ctt=0;mkol=0;
  InitG();
}


MYG::MYG(char f[MYG_PATH])
{ disk=0;
  page_sw=0;
  koef=0;kadr=0;
  spal=1;
  ct=ctt=0;tek=0L;
  char f00[MYG_PATH];
  strcpy(f00,f);
  strcat(f00,".myg");
  f0=fopen(f00,"rb");
  if(f0==NULL) Error(3);
  fseek(f0,0L,SEEK_END);
  tend=ftell(f0);
  fseek(f0,0L,SEEK_SET);
  AskVer(getc(f0));
  unsigned int i32=32768;
  mkol=(tend+1)/i32+1;
  im=new char*[mkol];
  long ss=tend+1;
  int iii=0;
  while(ss>=i32)
  {  im[iii++]=new char[i32];
     ss-=i32;
  }
  im[iii++]=new char[ss+1];
  while(iii<mkol) im[iii++]=NULL;
  fseek(f0,0L,SEEK_SET);
  for(int i=0;i<mkol;i++) fread(im[i],1,i32,f0);
  fclose(f0);
  InitG();
}


MYG::MYG(int x,int y,char f[MYG_PATH],int k0=0,int pgp=0)
{ disk=1;mkol=0;
  ct=ctt=0;kadr=0;
  spal=1;
  char f00[MYG_PATH];
  strcpy(f00,f);
  strcat(f00,".myg");
  f0=fopen(f00,"rb");
  if(f0==NULL) Error(3);
  AskVer(fgetc(f0));
  page_sw=(ver==1)?pgp:0;
  fseek(f0,0L,SEEK_SET);
  InitG();
  Show(x,y,k0);
  fclose(f0);
}


void MYG::InitG(void)
{ dac256=NULL;
  switch(ver)
  {  case 1: if(!_EGA)
             {_EGA=1;
             #ifndef GRAPH_BGI
             registerbgidriver(EGAVGA_driver);
             #endif
             int gd=EGA,gm=EGAHI;
             initgraph(&gd,&gm,"");
             }
             break;
     case 2: dac256=new Palette256(1);
             break;
  }
}


int MYG::Show(int x,int y,int k0=0)
{ char c1,c2,com;
  kadr=0;
  page_a=0;
  page_v=0;
  x0=x;y0=y;koef=k0;
  tek=0;
  int kol,ii,xi,yi;
  long siz;
  Mgetc();
  col=Mgetc()+256*Mgetc();
  row=Mgetc()+256*Mgetc();
  com=Mgetc();
  while(com!=0xFF)
  { switch(com)
    { case 0x00:// Заполнение стpоки по точкам
      case 0x01:
      case 0x02:// Наpисовать стpоку текущим цветом
      case 0x03:break;
      case 0x04:// Кадp в сжатом фоpмате
         siz=row;siz*=col;
         Arc(x0,y0,siz);
         //if(Mgetc()!=0xFC) Error(1);
         break;
      case 0x05:// Копиpование стpоки из пpедыдущей
      case 0x06:
      case 0x07:// Установка стандартной палитры из SVGA.H
         if(ver==1) Error(1);
         spal=Mgetc();
         dac256->SetStandardPalette(spal);
         break;
      case 0x0F:// Пустая команда
         break;
      // Стpока в сжатом фоpмате
      case 0x30: xi=Mgetc();yi=Mgetc();
                 Arc(xi,yi,Mgetc()+256*Mgetc());break;
      case 0x31: xi=Mgetc();yi=Mgetc()+256;
                 Arc(xi,yi,Mgetc()+256*Mgetc());break;
      case 0x32: xi=Mgetc()+256;yi=Mgetc();
                 Arc(xi,yi,Mgetc()+256*Mgetc());break;
      case 0x33: xi=Mgetc()+256;yi=Mgetc()+256;
                 Arc(xi,yi,Mgetc()+256*Mgetc());break;
      case 0x34: xi=Mgetc()+512;yi=Mgetc();
                 Arc(xi,yi,Mgetc()+256*Mgetc());break;
      case 0x35: xi=Mgetc()+512;yi=Mgetc()+256;
                 Arc(xi,yi,Mgetc()+256*Mgetc());break;
      // Установка текущего цвета
      case 0xC0: ct=0;ctt=0;break;
      case 0xC1: ct=1;ctt=0x11;break;
      case 0xC2: ct=2;ctt=0x22;break;
      case 0xC3: ct=3;ctt=0x33;break;
      case 0xC4: ct=4;ctt=0x44;break;
      case 0xC5: ct=5;ctt=0x55;break;
      case 0xC6: ct=6;ctt=0x66;break;
      case 0xC7: ct=7;ctt=0x77;break;
      case 0xC8: ct=8;ctt=0x88;break;
      case 0xC9: ct=9;ctt=0x99;break;
      case 0xCA: ct=10;ctt=0xAA;break;
      case 0xCB: ct=11;ctt=0xBB;break;
      case 0xCC: ct=12;ctt=0xCC;break;
      case 0xCD: ct=13;ctt=0xDD;break;
      case 0xCE: ct=14;ctt=0xEE;break;
      case 0xCF: ct=15;ctt=0xFF;break;

      case 0xFC:// Маpкеp кадpа
         kadr++;
         #ifdef SHOT
            Shot();
         #endif
         if(page_sw)
         {  if(page_a)
            {  page_a=0;page_v=1;}
            else
            {  page_a=1;page_v=0;}
            setactivepage(page_a);
            setvisualpage(page_v);
         }
         break;
      // Задеpжки
      case 0xFD: delay(1000);break;
      case 0xFE: delay(Mgetc()+256*Mgetc());break;
      default:Error(2);
    }
    com=Mgetc();
  }
  return 1;
}


void MYG::Arc(int x,int y,long n)
{        char c,c1,c2;
         if(ver==2)ctt=1;
         int kol;
         long ss=0;
         xt=x;yt=y;
         while(ss<n)
         {  c=Mgetc();
            if(c==ctt)
            {  switch(ver)
               { case 1:
                   c1=Mgetc();
                   c2=Mgetc();
                   c=(c1&0xF0)>>4;
                   kol=(c1&0x0F)<<8|c2;
                   break;
                 case 2:
                   c=Mgetc();
                   kol=Mgetc();
                   break;
               }
               ss+=kol;
               PutLine(kol,c);
            }
            else
            {  switch(ver)
               { case 1:
                   ss++;ss++;
                   PutColor(c/16);
                   if(ss<=n) PutColor(c%16);
                   break;
                 case 2:
                   ss++;
                   PutColor(c);
                   break;
               }
            }
         }
}


MYG::~MYG()
{
if(!mkol) {for(int i=0;i<mkol;i++) delete im[i];};
if(!disk) delete im;
if(ver==2) delete dac256;
}


int MYG::ComeOn(int x,int y,double k0)
{ k=k0;xc=x+x0;yc=y+y0;// Вблизи точки пpиближения возникают искажения !
  ct=ctt=0;
  float xb,yb,xl,yl;
  float sxl,sxr,syu,syd;
  xb=x0;yb=y0;
  xl=x0+col-1;
  yl=y0+row-1;
  int x1,y1,x2,y2;
  float g=640;
  x1=xc-xb;if(x1<g) g=x1;
  y1=yc-yb;if(y1<g) g=y1;
  x2=xl-xc;if(x2<g) g=x2;
  y2=yl-yc;if(y2<g) g=y2;
  sxl=x1/g;syu=y1/g;
  sxr=x2/g;syd=y2/g;
  int x00;
  for(int g0=0;g0<g;g0++)
  {   x00=xb;xb+=sxl;
      while(x00<xb) LineVer(yb,yl,x00++);
      x00=xl;xl-=sxr;
      while(x00>xl) LineVer(yb,yl,x00--);
      x00=yb;yb+=syu;
      while(x00<yb) LineGor(xb,xl,x00++);
      x00=yl;yl-=syd;
      while(x00>yl) LineGor(xb,xl,x00--);
  }
  return 1;
}



int MYG::Save(char f[MYG_PATH])
{
char f00[MYG_PATH];
strcpy(f00,f);
strcat(f00,".myg");
f0=fopen(f00,"wb");
if(f0==NULL) Error(3);
fputc(ver,f0);
fputc(col%256,f0);
fputc(col/256,f0);
fputc(row%256,f0);
fputc(row/256,f0);
SetBegin();
int kol,i;
int c0,c1,c,cc1,cc2,cc3,co;
int cm[16];
c0=0;
switch(ver)
{case 1:
  for(i=0;i<16;i++) cm[i]=0;
  while((c=GetColor())!=-999)
  { if(c0!=c){ c0=c;
               if(kol>1&&kol<6) cm[c]++;
               kol=0;
             }
    else {if(kol++>=4096)
          {kol=0;
           c0=-1;
          }
         }
  }
  kol=cm[0];c0=0;
  for(i=0;i<16;i++){if(cm[i]<kol) {kol=cm[i];c0=i;}}
  ct=c0;ctt=ct+ct*16;c0=0xC0|ct;
  fputc(c0,f0);
  break;
 case 2:
  ctt=0x01;
  fputc(7,f0);
  fputc(spal,f0);
  break;
}
fputc(4,f0);
SetBegin();
c1=GetColor();c0=GetColor();
switch(ver)
{ case 1:
while(c1!=-999&&c0!=-999)
{  if(c0!=c1){c=c1*16+c0;
              fputc(c,f0);
              c1=GetColor();
              c0=GetColor();
             }
   else{      cc1=c1*16+c0;c=c0;
              c1=GetColor();c0=GetColor();
              cc2=c1*16+c0;
              if(c1==c&&c0==c)
              {  c1=GetColor();c0=GetColor();
                 cc3=c1*16+c0;
                 if(c1==c&&c0==c)
                 {  kol=5;while(c1==c&&c1!=-999)
                          {  c1=GetColor();
                             kol++;
                          }
                    while(kol>=4096)
                    {  fputc(ctt,f0);
                       co=c*16+15;
                       fputc(co,f0);
                       fputc(0xFF,f0);
                       kol-=4095;
                    }
                    fputc(ctt,f0);
                    co=c*16+kol/256;
                    fputc(co,f0);
                    fputc(kol%256,f0);
                    c0=GetColor();
                 }
                 else
                 {if(cc1==ctt&&cc2==ctt)
                    {fputc(ctt,f0);fputc(ct*16,f0);fputc(4,f0);}
                  else
                    {
                    if(cc1!=ctt) fputc(cc1,f0);
                    else{fputc(ctt,f0);fputc(ct*16,f0);fputc(2,f0);}
                    if(cc2!=ctt) fputc(cc2,f0);
                    else{fputc(ctt,f0);fputc(ct*16,f0);fputc(2,f0);}
                    }
                    if(cc3!=ctt) fputc(cc3,f0);
                    else{fputc(ctt,f0);fputc(ct*16,f0);fputc(2,f0);}
                    c1=GetColor();c0=GetColor();
                 }
              }
              else
              {  if(cc1!=ctt) fputc(cc1,f0);
                 else{fputc(ctt,f0);fputc(ct*16,f0);fputc(2,f0);}
                 if(cc2!=ctt) fputc(cc2,f0);
                 else{fputc(ctt,f0);fputc(ct*16,f0);fputc(2,f0);}
                 c1=GetColor();c0=GetColor();
              }
       }
}
if(c1!=-999) fputc(c1<<4,f0);
break;
case 2:if(c1==1)c1=2;if(c0==1)c0=2;
       while(c1!=-999&&c0!=-999)
       {if(c1!=c0){fputc(c1,f0);
                   c1=c0;
                   c0=GetColor();
                   if(c0==1)c0=2;
                  }
        else{      cc1=c1;c=c1;
                   c1=c0;
                   cc2=c0;
                   c0=GetColor();
                   if(c0==1)c0=2;
                   if(c0==c)
                   {  kol=2;while(c1==c&&c1!=-999)
                            {  c1=GetColor();
                               if(c1==1)c1=2;
                               kol++;
                            }
                      while(kol>=256)
                      {     fputc(ctt,f0);
                            fputc(c,f0);
                            fputc(0xFF,f0);
                            kol-=255;
                      }
                      fputc(ctt,f0);
                      fputc(c,f0);
                      fputc(kol,f0);
                      c0=GetColor();
                      if(c0==1)c0=2;
                   }
                   else
                   {  fputc(cc1,f0);
                      fputc(cc2,f0);
                      c1=c0;
                      c0=GetColor();
                      if(c0==1)c0=2;
                   }
            }
       }
}
fputc(0xFC,f0);
fputc(0xFF,f0);
fclose(f0);
return 1;
}



void MYG::PutP(int x,int y,int c){if(!koef) putpixel(x,y,c);
                              else{x*=koef;y*=koef;
                                   if(koef==2)
                                   {  putpixel(x,y,c);
                                      putpixel(x+1,y,c);
                                      putpixel(x+1,y+1,c);
                                      putpixel(x,y+1,c);
                                   }
                                   else
                                   {  putpixel(x,y,c);
                                      putpixel(x+1,y,c);
                                      putpixel(x+2,y,c);
                                      putpixel(x+2,y+1,c);
                                      putpixel(x+2,y+2,c);
                                      putpixel(x+1,y+2,c);
                                      putpixel(x,y+2,c);
                                      putpixel(x,y+1,c);
                                      putpixel(x+1,y+1,c);
                                   }
                              }};


void MYG::PutLine(int k,int c)
{ int d=x0+col-xt,p=1;
  setlinestyle(0,1,1);
  setcolor(c);
  while(p)
  { if(k<d)
    { if(!koef) line(xt,yt,xt+k-1,yt);
      else {int x00=xt*koef,y00=yt*koef,x01=x00+koef*k-1;
            if(koef==2) {
                         line(x00,y00,x01,y00);
                         line(x00,y00+1,x01,y00+1);
                        }
            else {       line(x00,y00,x01,y00);
                         line(x00,y00+1,x01,y00+1);
                         line(x00,y00+2,x01,y00+2);
                 }
           }
      xt+=k;
      p=0;
    }
    else
    { if(!koef) line(xt,yt,x0+col-1,yt);
      else {int x00=xt*koef,y00=yt*koef,x01=(x0+col)*koef-1;
            if(koef==2) {
                         line(x00,y00,x01,y00);
                         line(x00,y00+1,x01,y00+1);
                        }
            else {       line(x00,y00,x01,y00);
                         line(x00,y00+1,x01,y00+1);
                         line(x00,y00+2,x01,y00+2);
                 }
           }
      k-=d;yt++;xt=x0;d=col;
    }
  }
}



int MYG::Append(char f[MYG_PATH])
{
char f00[MYG_PATH];
strcpy(f00,f);
strcat(f00,".myg");
f0=fopen(f00,"r+b");
if(f0==NULL) Error(3);
if(ver<getc(f0)) Error(0);
if(col!=getc(f0)+256*getc(f0)) Error(4);
if(row!=getc(f0)+256*getc(f0)) Error(4);
fseek(f0,-1L,SEEK_END);
fputc(0x0F,f0);
fclose(f0);
char fff[16]="__myg__";
char *fn;
strcpy(fn,fff);
Save(fn);
FILE *f1;
strcat(fff,".myg");
f1=fopen(fff,"rb");
if(f1==NULL) Error(3);
f0=fopen(f00,"ab");
if(f0==NULL) Error(3);
fseek(f1,0L,SEEK_END);
long l=ftell(f1),li;
fseek(f1,5L,SEEK_SET);
for(li=6;li<=l;li++) fputc(getc(f1),f0);
fclose(f0);
fclose(f1);
return 1;
}

void MYG::SetStandardPalette(int p)
{ if(ver==1) Error(1);
  else
  {  spal=p;
     dac256->SetStandardPalette(p);
  }
}

#endif

В дополнение к нему ещё шёл класс для работы с SVGA графикой (в случае использования версии 2 формата MYG) - там наиболее интересны стандартные палитры - я в основном использовал палитру 1 (PAL_MAND) и палитру 2 (PAL_RGBW), но под палитру 3 (PAL_RGST) тоже сделал несколько мультиков (это красно-зелёная палитра для стерео-очков) :

 SVGA.H
Code:
// SVGA - 256 colors.  29.04.1995
// +SavePalette()    - 27.02.1997
// +LoadPalette()    - 27.02.1997

#ifndef __STDIO_H
#include <stdio.h>
#endif
#ifndef __STDLIB_H
#include <stdlib.h>
#endif
#ifndef __STRING_H
#include <string.h>
#endif
#ifndef __GRAPHICS_H
#include <graphics.h>
#endif
#ifndef __DOS_H
#include <dos.h>
#endif
#ifndef __SVGA_H
#define __SVGA_H

typedef unsigned char DacPalette256[256][3];
extern int far _Cdecl Svga256_fdriver[];

#define SVGA256_320x200  0
#define SVGA256_640x400  1
#define SVGA256_640x480  2
#define SVGA256_800x600  3
#define SVGA256_1024x768 4

#define PAL_GRAY 0
#define PAL_MAND 1
#define PAL_RGBW 2
#define PAL_RGST 3

int VIDEO=0;
int SVGA256=0;

int huge DetectVGA256()
{   int Vid=VIDEO;
    return Vid;
}

#ifndef _RGB_STRUCT
#define _RGB_STRUCT
struct RGB
{  unsigned char r,g,b;
   RGB(int r1,int g1,int b1){r=r1;g=g1;b=b1;};
   RGB(){r=63;g=63;b=63;};
};
#endif

struct Palette256
{    int stnd;
     char *VideoMem;
     DacPalette256 d;
     Palette256(){InitG();};
     Palette256(int m){InitG();SetStandardPalette(m);};
     void SetStandardPalette(int);
     int  GetStandardPalette(void){return stnd;};
     int LoadPalette(char* s);
     int SavePalette(char* s);
     void InitG(void){
        VideoMem=(char*)0xA0000000;
        if(!SVGA256)
        {SVGA256=1;
        installuserdriver("Svga256",DetectVGA256);
        #ifndef GRAPH_BGI
        registerfarbgidriver(Svga256_fdriver);
        #endif
        int gd=DETECT,gm;
        initgraph(&gd,&gm,"");
        }
     };
     ~Palette256(){
     //closegraph();SVGA256=0;
     };
     void SetPalette(int i,RGB col)
     {  d[i][0]=col.r;
        d[i][1]=col.g;
        d[i][2]=col.b;
     };
     void SetAllPalette(void) //{setvgapalette256(&d);};
     {  struct REGPACK reg;
        reg.r_ax = 0x1012;
        reg.r_bx = 0;
        reg.r_cx = 256;
        reg.r_es = FP_SEG(d);
        reg.r_dx = FP_OFF(d);
        intr(0x10,&reg);
     };
     RGB GetPalette(int i)
     {  RGB col;
        col.r=d[i][0];
        col.g=d[i][1];
        col.b=d[i][2];
        return col;
     };
     void GetAllPalette(void)  //{getvgapalette256(&d);};
     {  struct REGPACK reg;
        reg.r_ax = 0x1017;
        reg.r_bx = 0;
        reg.r_cx = 256;
        reg.r_es = FP_SEG(d);
        reg.r_dx = FP_OFF(d);
        intr(0x10,&reg);
     };
};

void Palette256::SetStandardPalette(int p)
{  stnd=p;
   int i,j,ii,jj,oo;
   unsigned char r,g,b;
   switch(p)
   {case PAL_GRAY:
         for(j=0;j<256;j++) SetPalette(j,RGB(j/4,j/4,j/4));
         SetAllPalette();
         break;
    case PAL_MAND:
         for(ii=0;ii<256;ii++)
         {   i=ii/64;oo=ii%64;
             switch(i)
             { case 0:r=oo;g=0;b=0;break;
               case 1:r=63-oo;g=oo;b=0;break;
               case 2:r=0;g=63-oo;b=oo;break;
               case 3:r=oo;g=oo;b=63;
             }
             SetPalette(ii,RGB(r,g,b));
         }
         SetAllPalette();
         break;
    case PAL_RGBW:
         for(ii=0;ii<256;ii++)
         {   i=ii/64;oo=ii%64;
             switch(i)
             { case 0:SetPalette(ii,RGB(oo,0,0));break;
               case 1:SetPalette(ii,RGB(0,oo,0));break;
               case 2:SetPalette(ii,RGB(0,0,oo));break;
               case 3:SetPalette(ii,RGB(oo,oo,oo));break;
             }
         }
         SetAllPalette();
         break;
    case PAL_RGST:
         for(i=0;i<16;i++){ ii=i<<2;oo=i<<4;
         for(j=0;j<16;j++){ jj=j<<2;
             SetPalette((oo|j),RGB(ii,jj,0));
         }}
         SetAllPalette();
         break;
   }
}

int Palette256::LoadPalette(char* s)
{  int b,g,r,i;
   char ss[100];
   strcpy(ss,s);
   strcat(ss,".pal");
   FILE *f=fopen(ss,"rb");
   for(i=0;i<256;i++)
   {
       r=fgetc(f);
       g=fgetc(f);
       b=fgetc(f);
       SetPalette(i,RGB(r,g,b));
   }
   SetAllPalette();
   fclose(f);
   return 1;
}

int Palette256::SavePalette(char* s)
{  int i;
   RGB p;
   char ss[100];
   strcpy(ss,s);
   strcat(ss,".pal");
   FILE *f=fopen(ss,"wb");
   GetAllPalette();
   for(i=0;i<256;i++)
   {
       p=GetPalette(i);
       fputc(p.r,f);
       fputc(p.g,f);
       fputc(p.b,f);
   }
   fclose(f);
   return 1;
}

Palette256 *dac256;
int OpenGraph256(int k)
{ int o=0;
  if(!SVGA256)
  {  dac256=new Palette256(k);
     o=1;
  }
  return o;
}


#endif

Во второй половине 90х я нагенерил кучу графики в этом формате - в основном множество Мандельброта:

Attachment:
Screenshot from 2021-04-26 03-03-16.png
Screenshot from 2021-04-26 03-03-16.png [ 71.37 KiB | Viewed 1929 times ]

Также в 1995 году с самодельной "лунной" палитрой был создан вот такой программный продукт, сданный в качестве курсача от нескольких человек из трёх разных групп с одного потока ( но писал всё я за исключением класса для показа кнопочек, который написал мой общажный друган, который тоже в списке авторов и картинки генерил тоже я, используя общажную машину 386DX40 с мат.сопроцессором, которая формально принадлежала ешё одному чуваку из списка, плюс ещё в списке была подружка другана и чувак из третьей группы, который просто нам пива занёс ; ) - тут в формате MYG были представлены и статические изображения, и мультики:


https://youtu.be/1-XwFXB843A (озвучка была добавлена из аудиобиблиотеки ютюба при выкладывании видео)

Я это видео в 2015 году уже тут на форуме выкладывал:
http://www.nedopc.org/forum/viewtopic.php?p=118811#p118811
А щас вот смотрю ютюб ухудшил качество видео и замазал фамилии студентов :o

Вобщем к чему это всё? Думаю я реанимировать этот формат представления графики и применить его для Спринтера...

_________________
:dj: https://mastodon.social/@Shaos


26 Apr 2021 03:11
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22543
Location: Silicon Valley
Reply with quote
Вот пример проигрывателя, использующего этот класс:
Code:
// Демонстpатоp MYG-файлов.  31.01.1995, 26.05.1995  Шабаpшин А.

#define  SHOT
#include "myg.h"
#include <conio.h>

void MYG::Shot(void)
{if(kbhit())
 {getch();exit(1);}
}

int main(int argc,char **argv)
{
if(argc!=2)
{ printf("\n Пpимеp вызова    MYG_VIEW  FILE.MYG\n");
  exit(1);
}
char str[MYG_PATH];
strcpy(str,argv[1]);
char *po=strchr(str,'.');
if(po!=NULL) po[0]=0;
MYG m(0,0,str,0,1);
//sound(1000);
//delay(5);
//nosound();
getch();
closegraph();
return 1;
}

Опциональный метод Shot объявлялся пользователем, если он хотел что-то делать между кадрами анимации (в данном случае после каждого кадра проверялось нажатие на любую клавишу и если клавиша нажата происходил выход из программы).

_________________
:dj: https://mastodon.social/@Shaos


26 Apr 2021 03:38
Profile WWW
Display posts from previous:  Sort by  
Reply to topic   [ 2 posts ] 

Who is online

Users browsing this forum: No registered users and 24 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.