MYG - MY Graphics format from 1995

Использование и разработка софта (преимущественно на ПЦ)

Moderator: Shaos

User avatar
Shaos
Admin
Posts: 24014
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

MYG - MY Graphics format from 1995

Post by Shaos »

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

 MYG.H

Code: Select all

// 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: Select all

// 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х я нагенерил кучу графики в этом формате - в основном множество Мандельброта:
Screenshot from 2021-04-26 03-03-16.png
Также в 1995 году с самодельной "лунной" палитрой был создан вот такой программный продукт, сданный в качестве курсача от нескольких человек из трёх разных групп с одного потока ( но писал всё я за исключением класса для показа кнопочек, который написал мой общажный друган, который тоже в списке авторов и картинки генерил тоже я, используя общажную машину 386DX40 с мат.сопроцессором, которая формально принадлежала ешё одному чуваку из списка, плюс ещё в списке была подружка другана и чувак из третьей группы, который просто нам пива занёс ; ) - тут в формате MYG были представлены и статические изображения, и мультики:


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

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

Вобщем к чему это всё? Думаю я реанимировать этот формат представления графики и применить его для Спринтера...
You do not have the required permissions to view the files attached to this post.
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24014
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: MYG - MY Graphics format from 1995

Post by Shaos »

Вот пример проигрывателя, использующего этот класс:

Code: Select all

// Демонст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 объявлялся пользователем, если он хотел что-то делать между кадрами анимации (в данном случае после каждого кадра проверялось нажатие на любую клавишу и если клавиша нажата происходил выход из программы).
Я тут за главного - если что шлите мыло на me собака shaos точка net