Bitmap image editor for Saloks

Delphi & Pascal (česká wiki)
Přejít na: navigace, hledání
Category: KMP (Club of young programmers)

Program: Bitmapy.pas
File exe: Bitmapy.exe
need: Prechod.mf

Bitmap image editor for Saloks.
{ BITMAPY.PAS                                                       }
{ Editor bitmapovych obrazkov pre programy Saloky.                  }
{                                                                   }
{ Author: Ľuboš Saloky                                              }
{ Datum: 01.01.1996                           http://www.trsek.com  }
 
{$G+}
program Editor_bitmapovych_obrazkov;
uses MukoGr,MukoUtil,Myska,Crt,Dos;
{$DEFINE _______MAPEDIT}
const PrikX=205;PrikY=10;
      MiniX=205;MiniY=140;   {160,0}
      Font='prechod.mf';
      RozPaleta=4;
      RozBitmapa=4;
      PocetOP=10;
      Aktiv:array[1..PocetOP,1..4] of word=(
        (0,0,0,0),                                         {bitmapa - spracovane zvlast}
        (PrikX,PrikY,PrikX+16,PrikY+16),                   {<}
        (PrikX+20,PrikY,PrikX+36,PrikY+16),                {>}
        (PrikX+40,PrikY,PrikX+80,PrikY+16),                {novy}
        (PrikX,PrikY+20,PrikX+40,PrikY+36),                {zmaz}
        (PrikX+45,PrikY+20,PrikX+109,PrikY+36),            {odstran}
        (PrikX,PrikY+40,PrikX+56,PrikY+56),                {koniec}
        (PrikX,PrikY+60,PrikX+16*RozPaleta,PrikY+60+16*RozPaleta),
        (PrikX+16*RozPaleta+2,PrikY+60,PrikX+22+RozPaleta*16,PrikY+60+16*RozPaleta),
        (PrikX+64,PrikY+40,PrikX+48+64,PrikY+56));          {subor}
      OLH:array[0..PocetOP]of string[40]=(
        '','Kliknutim poloz bod.','Predosla bitmapa.','Dalsia bitmapa.',
        'Pridaj novu bitmapu.','Zmazanie bitmapy.','Odstranenie bitmapy.',
        'Koniec programu.','Vyber si farbu.','Aktualna farba.','Subor s bitmapami');
      Texty:array[2..10] of string[7]=('<','>','NOVA','ZMAZ','ODSTRAN','KONIEC','','','SUBOR');
 
var Udalost,UStara:integer;
    x,y,z,PomX,PomY,Kolko,Err:word; {kolko bajtov bolo nacitanych pri odstranovani}
    RozX,RozY,Color:byte;           {rozmery aktualnej bitmapy a aktualna farba}
    AktBMP,Tlacidla:byte;           {pocet a aktualna bitmapa}
    BMP:array[0..3601] of byte;     {bitmapy max. 40*40}
    ASubor:SearchRec;
{$IFDEF MAPEDIT}
    VsetkyBMP:array[0..28*24*24] of byte;{vsetky bitmapy}
{$ENDIF}
    s,Subor:string;
    f:file;
    Odstr:longint;                  {pozicia 1. odstranovaneho bajtu}
{$IFDEF MAPEDIT}
 
procedure ZobrazSusedneBitmapy;
const PosAktX=40;PosAktY=150;
begin
  Nastav(PosAktX-16,PosAktY-16,0);
  VyplnPlochu(56,56);
  PrilepPriehladnuBitmapu(24,24,Ofs(VsetkyBMP)+((AktBMP+19) mod 24)*576);
  Nastav(PosAktX,PosAktY-16,0);
  PrilepPriehladnuBitmapu(24,24,Ofs(VsetkyBMP)+((AktBMP+20) mod 24)*576);
  Nastav(PosAktX+16,PosAktY-16,0);
  PrilepPriehladnuBitmapu(24,24,Ofs(VsetkyBMP)+((AktBMP+21) mod 24)*576);
  Nastav(PosAktX-16,PosAktY,0);
  PrilepPriehladnuBitmapu(24,24,Ofs(VsetkyBMP)+((AktBMP+22) mod 24)*576);
  Nastav(PosAktX,PosAktY,0);
  PrilepPriehladnuBitmapu(24,24,Ofs(VsetkyBMP)+((AktBMP+23) mod 24)*576);
  Nastav(PosAktX+16,PosAktY,0);
  PrilepPriehladnuBitmapu(24,24,Ofs(VsetkyBMP)+((AktBMP+24) mod 24)*576);
  Nastav(PosAktX-16,PosAktY+16,0);
  PrilepPriehladnuBitmapu(24,24,Ofs(VsetkyBMP)+((AktBMP+25) mod 24)*576);
  Nastav(PosAktX,PosAktY+16,0);
  PrilepPriehladnuBitmapu(24,24,Ofs(VsetkyBMP)+((AktBMP+26) mod 24)*576);
  Nastav(PosAktX+16,PosAktY+16,0);
  PrilepPriehladnuBitmapu(24,24,Ofs(VsetkyBMP)+((AktBMP+27) mod 24)*576);
end;
{$ENDIF}
 
procedure NacitajBitmapu;
begin
  BlockRead(f,RozX,1);
  BlockRead(f,RozY,1);
  BlockRead(f,BMP,RozX*RozY);
end;
 
procedure ZobrazBitmapu;
var px,py:word;
begin
  Nastav(0,0,0);
  VyplnPlochu(202,200);
  Nastav(MiniX-1,MiniY-1,0);
  VyplnPlochu(42,42);
  Nastav(MiniX-1,MiniY-1,15);
  Ramcek(RozX+2,RozY+2,0);
  for px:=0 to RozX-1 do
    for py:=0 to RozY-1 do begin
      Nastav(RozBitmapa*px,RozBitmapa*py,BMP[py*RozX+px]);
      VyplnPlochu(RozBitmapa,RozBitmapa);
      PolozBod(MiniX+px,MiniY+py,BMP[px+RozX*py]);
    end;
  for px:=0 to RozX do PolozBod(RozBitmapa*px,RozBitmapa*RozY+1,15);
  for py:=0 to RozY do PolozBod(RozBitmapa*RozX+1,RozBitmapa*py,15);
  Nastav(0,RozY*RozBitmapa,15);
  if RozY<>40 then CiaraVodorovna(RozX*RozBitmapa+1);
  Nastav(RozX*RozBitmapa,0,15);
  CiaraZvisla(RozY*RozBitmapa+1);
end;
 
procedure NovaBitmapa;
begin
  VypniKurzorMysi;
  if Subor='' then begin
    Nastav(0,0,0);
    VyplnPlochu(201,200);
    VypisPriehladne('Nebol zvoleny subor.'#13'Bude vytvoreny novy.'#13#13'Meno suboru:',Hneda);
    Nastav(0,32,0);
    Citaj(12,Hneda);
    Subor:=Ret;
    Assign(f,Subor);
    ReWrite(f,1);
    BlockWrite(f,paleta,768);
    AktBMP:=0;RozX:=0;RozY:=0;
    BlockWrite(f,AktBMP,1);
    ZapniKurzorMysi;
  end;
  Seek(f,FilePos(f)-RozY*RozX);
  BlockWrite(f,BMP,RozY*RozX);
  Seek(f,768);
  BlockRead(f,AktBMP,1);
  Seek(f,768);
  Inc(AktBMP);
  BlockWrite(f,AktBMP,1);
  Seek(f,FileSize(f));
  Nastav(0,0,0);          {vyber rozmerov bitmapy}
  VyplnPlochu(201,200);
  VypisPriehladne('Zvol si velkost bitmapy.',SvetloModra);
  Nastav(0,16,0);
  VypisPriehladne('X-ova:',Hneda);
  Nastav(48,16,0);
  Citaj(3,Bordova);
  Val(Ret,RozX,Err);
  Nastav(0,24,0);
  VypisPriehladne('Y-ova:',Hneda);
  Nastav(48,24,0);
  Citaj(3,Bordova);
  Val(Ret,RozY,Err);
  BlockWrite(f,RozX,1);
  BlockWrite(f,RozY,1);
  for PomX:=0 to 3599 do BMP[PomX]:=0;
  BlockWrite(f,BMP,RozX*RozY);
  ZobrazBitmapu;
  ZapniKurzorMysi;
end;
 
procedure InicializujSubor;
begin
  if Subor<>'' then begin
    Assign(f,Subor);              {inicializacia suboru}
    {$I-}
    Reset(f,1);
    {$I+}
    if IOResult<>0 then begin
      ReWrite(f,1);
      BlockWrite(f,paleta,768);
      AktBMP:=0;RozX:=0;RozY:=0;
      BlockWrite(f,AktBMP,1);
      ZapniKurzorMysi;
      NovaBitmapa;
    end;
{$IFDEF MAPEDIT}
    Seek(f,771);
    for x:=0 to 24 do begin
      BlockRead(f,VsetkyBMP[x*576],24*24);
      Seek(f,Filepos(f)+2);
    end;
    ZobrazSusedneBitmapy;
{$ENDIF}
    Seek(f,769);
    NacitajBitmapu;
    ZobrazBitmapu;
  end;
end;
 
procedure InicializujPracovnuPlochu;
begin
  VypniKurzorMysi;
  ZmazObrazovku;
  Nastav(Aktiv[8,1]-1,Aktiv[8,2]-1,15);{kreslenie obvodovych ciar okolo palety}
  Ramcek(16*RozPaleta+23,16*RozPaleta+2,0);
  Nastav(Aktiv[8,3],Aktiv[8,2],15);
  CiaraZvisla(16*RozPaleta+1);
  for x:=0 to 15 do                    {vykreslenie palety}
    for y:=0 to 15 do begin
      Nastav(PrikX+x*RozPaleta,PrikY+60+y*RozPaleta,x+16*y);
      VyplnPlochu(RozPaleta,RozPaleta);
    end;
  for x:=2 to 7 do begin                {vykreslenie tlacidiel}
    Nastav(Aktiv[x,1],Aktiv[x,2],14);
    Ramcek(Aktiv[x,3]-Aktiv[x,1],Aktiv[x,4]-Aktiv[x,2],0);
    Nastav(Aktiv[x,1]+4,Aktiv[x,2]+4,0);
    VypisPriehladne(Texty[x],SvetloModra);
  end;
  Nastav(Aktiv[10,1],Aktiv[10,2],14);
  Ramcek(Aktiv[10,3]-Aktiv[10,1],Aktiv[10,4]-Aktiv[10,2],0);
  Nastav(Aktiv[10,1]+4,Aktiv[10,2]+4,0);
  VypisPriehladne(Texty[10],SvetloModra);
  AktBMP:=1;Color:=25;
  Nastav(Aktiv[8,3]+1,Aktiv[8,2],Color);
  VyplnPlochu(20,16*RozPaleta);
  ZapniKurzorMysi;
end;
 
BEGIN
{ ----- inicializacia ----- }
  Subor:='';
  InicializujGrafiku;
  NacitajFontAPaletu(Font);
  InicializujPracovnuPlochu;
  InicializujSubor;
  ZapniKurzorMysi;
{ ----- cakanie na udalost ----- }
  UStara:=0;
  repeat
    repeat
      ZistiPoziciu(x,y,Tlacidla);
      x:=x div 2;
      Udalost:=0;
      for z:=1 to PocetOP do
        if (x>=Aktiv[z,1]) and (x<=Aktiv[z,3]) and (y>=Aktiv[z,2]) and (y<=Aktiv[z,4]) then Udalost:=z;
      if (x<RozBitmapa*RozX) and (y<RozBitmapa*RozY) then Udalost:=1;
      if (Udalost<>UStara) and (RozY<38) then begin
        VypniKurzorMysi;
        Nastav(0,192,0);
        VyplnPlochu(201,8);
        VypisPriehladne(OLH[Udalost],SvetloModra);
        UStara:=Udalost;
        ZapniKurzorMysi;
      end;
    until Tlacidla>0;
    if (Udalost<>8) and (Udalost<>1) then
      repeat ZistiPoziciu(PomX,PomY,Tlacidla); until Tlacidla=0;
{ ----- spracovanie udalosti ----- }
    case Udalost of
      1:begin{kreslenie bitmapy}
        PomX:=x div RozBitmapa;
        PomY:=y div RozBitmapa;
        if BMP[PomX+PomY*RozX]<>Color then begin
          VypniKurzorMysi;
          Nastav(PomX*RozBitmapa,PomY*RozBitmapa,Color);
          VyplnPlochu(RozBitmapa,RozBitmapa);
          BMP[PomX+PomY*RozX]:=Color;
          PolozBod(MiniX+PomX,MiniY+PomY,Color);
{$IFDEF MAPEDIT}
          VsetkyBMP[AktBMP*576+PomY*24+PomX]:=Color;
          PolozBod(40+PomX,150+PomY,Color);
{$ENDIF}
          ZapniKurzorMysi;
        end;
      end;
      2:begin{predosla bitmapa}
        Seek(f,FilePos(f)-RozY*RozX);
        BlockWrite(f,BMP,RozY*RozX);
        if AktBMP>1 then begin
          Seek(f,769);
          for PomX:=1 to AktBMP-1 do NacitajBitmapu;
          Dec(AktBMP);
          ZobrazBitmapu;
          UStara:=0;
        end;
      end;
      3:begin{dalsia bitmapa}
        Seek(f,FilePos(f)-RozY*RozX);
        BlockWrite(f,BMP,RozY*RozX);
        if not EOF(f) then begin
          NacitajBitmapu;
          ZobrazBitmapu;
          UStara:=0;
          Inc(AktBMP);
        end;
      end;
      4:NovaBitmapa;{nova bitmapa}
      5:begin{zmazanie bitmapy}
        for PomX:=0 to 3599 do BMP[PomX]:=Color;
        ZobrazBitmapu;
      end;
      6:begin{odstranenie bitmapy}
        Odstr:=FilePos(f)-RozX*RozY-2;
        Seek(f,Odstr);
        while not EOF(f) do begin
          Seek(f,Odstr+RozX*RozY+2);
          BlockRead(f,BMP,RozX*RozY+2,Kolko);
          Seek(f,Odstr);
          BlockWrite(f,BMP,Kolko);
          Odstr:=Odstr+RozX*RozY+2;
        end;
        Seek(f,FileSize(f)-RozX*RozY-2);
        Truncate(f);
        Seek(f,768);
        BlockRead(f,AktBMP,1);
        Dec(AktBMP);
        Seek(f,768);
        BlockWrite(f,AktBMP,1);
        AktBMP:=1;
        NacitajBitmapu;
        ZobrazBitmapu;
      end;
      8:begin{vyber farby}
        PomX:=(x-Aktiv[8,1]) div RozPaleta;
        PomY:=(y-Aktiv[8,2]) div RozPaleta;
        if 16*PomY+PomX<>Color then begin
          Color:=16*PomY+PomX;
          VypniKurzorMysi;
          Nastav(Aktiv[8,3]+1,Aktiv[8,2],Color);
          VyplnPlochu(20,16*RozPaleta);
          ZapniKurzorMysi;
        end;
      end;
      10:begin
        SuboroveOkno(80,20,'Subory:','mb',ASubor);
        CakajNaPustenie;
        Subor:=ASubor.Name;
        VypniKurzorMysi;
        InicializujPracovnuPlochu;
        if Subor<>'' then begin
          InicializujSubor;
        end else if RozX>0 then ZobrazBitmapu;
        ZapniKurzorMysi;
      end;
    end;
{$IFDEF MAPEDIT}
    if (Udalost<>8) and (Udalost<>1) then ZobrazSusedneBitmapy;
{$ENDIF}
  until Udalost=7;
{ ----- ukoncenie programu ----- }
  if Subor<>'' then begin
    Seek(f,FilePos(f)-RozY*RozX);
    BlockWrite(f,BMP,RozY*RozX);
    Close(f);
  end;
  VypniKurzorMysi;
END.