program bmpbild256;
uses crt, graph, dos, maus, textobjz;

{$i d:\tp\arbeit\svga256.inc}

type array640 = array[1..640] of byte;
type koord_bmp = array[1..1286] of byte;
     string50 = string[50];

var xsize, ysize, j: integer;
    i, fsize : longint;
    zanfang: array[1..1078] of byte;
    zfeld : array640;
    f2: file;
    xmaus, ymaus, tasten, xk, xkalt : word;
    xz, yz                          : integer;
    objchar, zeichen, zeichen2 : char;

{---Maus---}

procedure bereich(bool : boolean; xv, yv: integer;
                  var xmaus, ymaus: word; var xz, yz: integer);

  begin
    if bool then
      begin
        xz:=xz+xv;
        yz:=yz+yv;
        set_maus(xmaus-xv, ymaus-yv);
        xmaus:=xmaus-xv;
        ymaus:=ymaus-yv;
      end;
  end;

procedure mauscursorpkt(bool: boolean; xyz, xv1, xv2: integer;
                        var xy : integer);

  begin
    if bool then xy:=xyz+xv1
            else xy:=xv2;
  end;

procedure koordinaten(xmz, ymz, xk: integer; objchar: char);

  var xstr, ystr : string[3];

  begin
    if xk<>320 then {=320 dann keine Darstellung}
      begin
        str(getpixel(xmz, ymz), xstr); str(ymz, ystr);
        setcolor(0);
        setfillstyle(1, 0);
        bar(xk, 0, xk+79, 15);
        setcolor(52);
        outtextxy(xk+2, 0, xstr);  {+0, +15 sonst falscher Ausgabeort}
      end;{of while}
  end;{of procedure}

procedure rand(bool: boolean; xz, yz, xmax, ymax: integer;
               var xmaus, ymaus: word);

  begin
    if bool then
      begin
        xmaus:=xmax-xz;
        ymaus:=ymax-yz;
        set_maus(xmax-xz, ymax-yz);
      end;
  end;

procedure mauszeichnen(x1, y1, x2, y2, xl, yl: integer);

  var mausflaeche : array[1..182] of char;

  begin
    getimage(x1, y1, x2, y2, mausflaeche);
    setcolor(helldunkel(x1+5, y1+5));
    line(x1, yl, x2, yl);
    line(xl, y1, xl, y2);
    delay(20);
    putimage(x1, y1, mausflaeche, 0);
  end;

procedure koord_aendern(var xk: word; var koord_bereich: koord_bmp);

  begin             {=320 dann keine Darstellung}
    if xk<>320 then putimage(xk, 0, koord_bereich, 0);
    if xk=0 then xk:=320
            else begin
                   if xk=560 then xk:=0
                             else xk:=560;
                 end;
    if xk<>320 then getimage(xk, 0, xk+79, 15, koord_bereich);
  end;

procedure maus_darstellung(var xz, yz: integer; var xk, xmaus, ymaus, tasten: word; objchar: char);

  var x1, y1, x2, y2: integer;

  begin
    maus_status(xmaus, ymaus, tasten);
    bereich(ymaus<  30,    0, -100, xmaus, ymaus, xz, yz);
    bereich(ymaus> 170,    0,  100, xmaus, ymaus, xz, yz);
    bereich(xmaus< 200, -300,    0, xmaus, ymaus, xz, yz);
    bereich(xmaus> 400,  301,    0, xmaus, ymaus, xz, yz);
    koordinaten(xmaus+xz, ymaus+yz, xk, objchar);
    rand(ymaus+yz> 479,  0, yz, xmaus,   479, xmaus, ymaus);
    rand(ymaus+yz<   0,  0, yz, xmaus,     0, xmaus, ymaus);
    rand(xmaus+xz> 639, xz,  0,   639, ymaus, xmaus, ymaus);
    rand(xmaus+xz<   0, xz,  0,     0, ymaus, xmaus, ymaus);
    mauscursorpkt(xmaus+xz> 5,   xmaus+xz, -5, 0,   x1);
    mauscursorpkt(xmaus+xz< 634, xmaus+xz,  5, 639, x2);
    mauscursorpkt(ymaus+yz> 5,   ymaus+yz, -5, 0,   y1);
    mauscursorpkt(ymaus+yz< 474, ymaus+yz,  5, 479, y2);
    mauszeichnen(x1, y1, x2, y2, xmaus+xz, ymaus+yz);
    xmaus:=xmaus+xz; ymaus:=ymaus+yz;
  end;
{---Maus Ende---}

{$F+}
function DetectVGA256 : Integer;
  begin
    DetectVGA256 := 2;
  end;
{$F-}

procedure initfont(fontdatei: string50);

var fontf : file;
    fontp : pointer;

  begin
    assign(fontf, 'd:\tp\bgi\'+fontdatei);
    reset(fontf, 1);
    getmem(fontp, filesize(fontf));
    blockread(fontf, fontp^, filesize(fontf));
    if registerbgifont(fontp)<0 then writeln('Fehler');
  end;

procedure Start {Graphik und Maus starten};

  var gdinit, gd, gm : integer;
      inst, grafik   : boolean;
      tasten         : word;
      ch             : char;

  begin
    gdinit:= Installuserdriver('SVGA256', @DetectVGA256);       {Graphik}
    gd:=detect;
    initfont('sans.chr');
    initfont('litt.chr');
    initgraph(gd, gm, 'd:\tp\tppas1\bgi');
  end;

begin
  assign(f2, 'd:\tp\arbeit\256farb.bmp');
  reset(f2, 1);
  blockread(f2, zanfang, sizeof(zanfang));
  fsize:=round(zanfang[5])*256*256+round(zanfang[4])*256+round(zanfang[3]);
  xsize:=zanfang[20]*256+zanfang[19];
  ysize:=zanfang[24]*256+zanfang[23];
  for i:=0 to 1078 do
    begin
      if i=55 then writeln;
      write(zanfang[i]:4);
      if (i-54) mod 256 = 0 then begin
                                   readln;
                                   clrscr;
                                 end;
    end;
  readln;
  start;
  for i:=1 to 239 do
    begin
      setrgbpalette(i, zanfang[54+i*4+3] div 4, zanfang[54+i*4+2] div 4,
                    zanfang[54+i*4+1] div 4);
    end;
  for i:=240 to 255 do
    begin
      setrgbpalette(i, zanfang[54+i*4+3] div 4, zanfang[54+i*4+2] div 4,
                    zanfang[54+i*4+1] div 4);
    end;
  i:=1078;
  setfillstyle(1, 2); bar(0, 0, 639, 479);
  repeat
    dec(ysize);
    blockread(f2, zfeld, sizeof(zfeld));
    for j:=1 to xsize do
        putpixel(j-1, ysize, zfeld[j]);
    i:=i+sizeof(zfeld);
  until i>=fsize;
  close(f2);
  setcolor(32);
  i:=getpixel(370, 350);
  while keypressed do zeichen:=readkey;
  zeichen:=chr(0); zeichen2:=chr(0);
  settextstyle(2, 0, 5);
  xk:=560; xz:=0; yz:=150;
  repeat                               {auf Eingaben warten}
    delay(2);
    maus_darstellung(xz, yz, xk, xmaus, ymaus, tasten, objchar);
    if keypressed then zeichen:=readkey;
    if keypressed and (zeichen=chr(0)) then zeichen2:=readkey;
  until (tasten=1) or (zeichen>chr(0)) or (zeichen2>chr(0));
  closegraph;
  writeln(fsize);
  readln;
end.