Cod sursa(job #147739)

Utilizator stanflorinStan Florin stanflorin Data 3 martie 2008 14:16:46
Problema Bool Scor 0
Compilator fpc Status done
Runda Arhiva de probleme Marime 12.33 kb
 unit iViewBMP;

 interface

 uses dos,crt,graph,iVGA,ifBMP;

 procedure LoadPackBMPFile(x,y:LongInt;NameCode:PathStr);
 procedure SavePackBMPFile(x1,y1,x2,y2:LongInt;NameCode:PathStr);
 procedure LoadUnPackBMPFile(x,y:LongInt;NameCode:PathStr);
 procedure _LoadUnPackBMPFile(x,y:LongInt;NameCode:PathStr);
 procedure SaveUnPackBMPFile(x1,y1,x2,y2:LongInt;NameCode:PathStr);

 implementation

 var
      testH:BitMapFileHeader;
      testI:BitMapInfo;
      cRed,cGreen,cBlue:byte;
      cRGB:RGBQuad;
      cReg:byte;
      fBMP:file;
      iBMP,jBMP:LongInt;
      memBMP:byte;
      readByte:byte;
      LineBuff:array[0..639] of byte;

procedure LoadPackBMPFile(x,y:LongInt;NameCode:PathStr);
 begin
    Assign(fBMP,NameCode);
    Reset(fBMP,1);
    BlockRead(fBMP,testH.Types[1],1);
    BlockRead(fBMP,testH.Types[2],1);
    BlockRead(fBMP,testH.Size,4);
    BlockRead(fBMP,testH.Reserved1,2);
    BlockRead(fBMP,testH.Reserved2,2);
    BlockRead(fBMP,testH.OffBits,4);
    BlockRead(fBMP,testI.H.Size,4);
    BlockRead(fBMP,testI.H.Width,4);
    BlockRead(fBMP,testI.H.Height,4);
    BlockRead(fBMP,testI.H.Planes,2);
    BlockRead(fBMP,testI.H.BitCount,2);
    if testI.H.BitCount < 4 then
       begin
          SetVideoMode(3);
          writeln;
          writeln('Mod video neidentificat');
          Halt(1);
       end;
    BlockRead(fBMP,testI.H.Compression,4);
    BlockRead(fBMP,testI.H.SizeImage,4);
    BlockRead(fBMP,testI.H.XPelsPerMeter,4);
    BlockRead(fBMP,testI.H.YPelsPerMeter,4);
    BlockRead(fBMP,testI.H.ClrUsed,4);
    BlockRead(fBMP,testI.H.ClrImportant,4);
    if (testI.H.BitCount = 4) and (testI.H.ClrImportant >= 0) then
       begin
          for iBMP:=0 to 15 do
              begin
                 BlockRead(fBMP,testI.C[iBMP].Blue,1);
                 testI.C[iBMP].Blue:=testI.C[iBMP].Blue div 4;
                 BlockRead(fBMP,testI.C[iBMP].Green,1);
                 testI.C[iBMP].Green:=testI.C[iBMP].Green div 4;
                 BlockRead(fBMP,testI.C[iBMP].Red,1);
                 testI.C[iBMP].Red:=testI.C[iBMP].Red div 4;
                 BlockRead(fBMP,testI.C[iBMP].Reserved,1);
              end;
       end;
    for iBMP:=0 to 5 do
        SetColorRegister(iBMP,testI.C[iBMP].Red,testI.C[iBMP].Green,testI.C[iBMP].Blue);
    SetColorRegister(20,testI.C[6].Red,testI.C[6].Green,testI.C[6].Blue);
    SetColorRegister(7,testI.C[7].Red,testI.C[7].Green,testI.C[7].Blue);
    for iBMP:=56 to 63 do
        SetColorRegister(iBMP,testI.C[iBMP-48].Red,testI.C[iBMP-48].Green,testI.C[iBMP-48].Blue);
    for iBMP:=0 to testI.H.Height-1 do
        begin
           jBMP:=0;
           repeat
              BlockRead(fBMP,readByte,1);
              memBMP:=readByte;
              readByte:=memBMP shr 4;
              PutPixel(x+jBMP,y+testI.H.Height-iBMP-1,readByte);
              Inc(jBMP);
              asm
                  and memBMP,15
              end;
              PutPixel(x+jBMP,y+testI.H.Height-iBMP-1,memBMP);
              Inc(jBMP);
           until jBMP = testI.H.Width;
        end;
    Close(fBMP);
 end;

procedure SavePackBMPFile(x1,y1,x2,y2:LongInt;NameCode:PathStr);
 begin
    Assign(fBMP,NameCode);
    Rewrite(fBMP,1);
    testH.Types[1]:='B';
    testH.Types[2]:='M';
    testH.Size:=Round((x2-x1+1)*(y2-y1+1)/2)+118;
    testH.Reserved1:=0;
    testH.Reserved2:=0;
    testH.OffBits:=118;
    testI.H.Size:=40;
    testI.H.Width:=x2-x1+1;
    testI.H.Height:=y2-y1+1;
    testI.H.Planes:=1;
    testI.H.BitCount:=4;
    testI.H.Compression:=0;
    testI.H.SizeImage:=0;
    testI.H.XPelsPerMeter:=0;
    testI.H.YPelsPerMeter:=0;
    testI.H.ClrUsed:=0;
    testI.H.ClrImportant:=0;
    BlockWrite(fBMP,testH.Types[1],1);
    BlockWrite(fBMP,testH.Types[2],1);
    BlockWrite(fBMP,testH.Size,4);
    BlockWrite(fBMP,testH.Reserved1,2);
    BlockWrite(fBMP,testH.Reserved2,2);
    BlockWrite(fBMP,testH.OffBits,4);
    BlockWrite(fBMP,testI.H.Size,4);
    BlockWrite(fBMP,testI.H.Width,4);
    BlockWrite(fBMP,testI.H.Height,4);
    BlockWrite(fBMP,testI.H.Planes,2);
    BlockWrite(fBMP,testI.H.BitCount,2);
    BlockWrite(fBMP,testI.H.Compression,4);
    BlockWrite(fBMP,testI.H.SizeImage,4);
    BlockWrite(fBMP,testI.H.XPelsPerMeter,4);
    BlockWrite(fBMP,testI.H.YPelsPerMeter,4);
    BlockWrite(fBMP,testI.H.ClrUsed,4);
    BlockWrite(fBMP,testI.H.ClrImportant,4);
    for iBMP:=0 to 5 do
        begin
           ReadColorRegister(iBMP,cRed,cGreen,cBlue);
           testI.C[iBMP].Blue:=cBlue*4;
           testI.C[iBMP].Green:=cGreen*4;
           testI.C[iBMP].Red:=cRed*4;
           testI.C[iBMP].Reserved:=0;
           BlockWrite(fBMP,testI.C[iBMP].Blue,1);
           BlockWrite(fBMP,testI.C[iBMP].Green,1);
           BlockWrite(fBMP,testI.C[iBMP].Red,1);
           BlockWrite(fBMP,testI.C[iBMP].Reserved,1);
        end;
    ReadColorRegister(20,cRed,cGreen,cBlue);
    testI.C[6].Blue:=cBlue*4;
    testI.C[6].Green:=cGreen*4;
    testI.C[6].Red:=cRed*4;
    testI.C[6].Reserved:=0;
    BlockWrite(fBMP,testI.C[6].Blue,1);
    BlockWrite(fBMP,testI.C[6].Green,1);
    BlockWrite(fBMP,testI.C[6].Red,1);
    BlockWrite(fBMP,testI.C[6].Reserved,1);
    ReadColorRegister(7,cRed,cGreen,cBlue);
    testI.C[7].Blue:=cBlue*4;
    testI.C[7].Green:=cGreen*4;
    testI.C[7].Red:=cRed*4;
    testI.C[7].Reserved:=0;
    BlockWrite(fBMP,testI.C[7].Blue,1);
    BlockWrite(fBMP,testI.C[7].Green,1);
    BlockWrite(fBMP,testI.C[7].Red,1);
    BlockWrite(fBMP,testI.C[7].Reserved,1);
    for iBMP:=56 to 63 do
        begin
           ReadColorRegister(iBMP,cRed,cGreen,cBlue);
           testI.C[iBMP-48].Blue:=cBlue*4;
           testI.C[iBMP-48].Green:=cGreen*4;
           testI.C[iBMP-48].Red:=cRed*4;
           testI.C[iBMP-48].Reserved:=0;
           BlockWrite(fBMP,testI.C[iBMP-48].Blue,1);
           BlockWrite(fBMP,testI.C[iBMP-48].Green,1);
           BlockWrite(fBMP,testI.C[iBMP-48].Red,1);
           BlockWrite(fBMP,testI.C[iBMP-48].Reserved,1);
        end;
   jBMP:=y2;
   repeat
   iBMP:=x1;
   repeat
      readByte:=GetPixel(iBMP,jBMP) shl 4;
      Inc(iBMP);
      readByte:=readByte+GetPixel(iBMP,jBMP);
      BlockWrite(fBMP,readByte,1);
      Inc(iBMP);
   until iBMP > x2;
   jBMP:=jBMP-1;
   until jBMP < y1;
   Close(fBMP);
 end;

procedure LoadUnPackBMPFile(x,y:LongInt;NameCode:PathStr);
 begin
    Assign(fBMP,NameCode);
    Reset(fBMP,1);
    BlockRead(fBMP,testH.Types[1],1);
    BlockRead(fBMP,testH.Types[2],1);
    BlockRead(fBMP,testH.Size,4);
    BlockRead(fBMP,testH.Reserved1,2);
    BlockRead(fBMP,testH.Reserved2,2);
    BlockRead(fBMP,testH.OffBits,4);
    BlockRead(fBMP,testI.H.Size,4);
    BlockRead(fBMP,testI.H.Width,4);
    BlockRead(fBMP,testI.H.Height,4);
    BlockRead(fBMP,testI.H.Planes,2);
    BlockRead(fBMP,testI.H.BitCount,2);
    if testI.H.BitCount < 4 then
       begin
          SetVideoMode(3);
          writeln;
          writeln('Mod video neidentificat');
          Halt(1);
       end;
    BlockRead(fBMP,testI.H.Compression,4);
    BlockRead(fBMP,testI.H.SizeImage,4);
    BlockRead(fBMP,testI.H.XPelsPerMeter,4);
    BlockRead(fBMP,testI.H.YPelsPerMeter,4);
    BlockRead(fBMP,testI.H.ClrUsed,4);
    BlockRead(fBMP,testI.H.ClrImportant,4);
    if (testI.H.BitCount = 8) and (testI.H.ClrImportant >= 0) then
       begin
          for iBMP:=0 to 255 do
              begin
                 BlockRead(fBMP,testI.C[iBMP].Blue,1);
                 testI.C[iBMP].Blue:=testI.C[iBMP].Blue div 4;
                 BlockRead(fBMP,testI.C[iBMP].Green,1);
                 testI.C[iBMP].Green:=testI.C[iBMP].Green div 4;
                 BlockRead(fBMP,testI.C[iBMP].Red,1);
                 testI.C[iBMP].Red:=testI.C[iBMP].Red div 4;
                 BlockRead(fBMP,testI.C[iBMP].Reserved,1);
              end;
       end;
    for iBMP:=0 to 255 do
        SetColorRegister(iBMP,testI.C[iBMP].Red,testI.C[iBMP].Green,testI.C[iBMP].Blue);
    for iBMP:=0 to testI.H.Height-1 do
        begin
           BlockRead(fBMP,LineBuff,testI.H.Width);
           for jBMP:=0 to testI.H.Width-1 do
               Mem[$A000:jBMP+x+320*y+320*(testI.H.Height-iBMP-1)]:=LineBuff[jBMP];
        end;
    Close(fBMP);
 end;

procedure SaveUnPackBMPFile(x1,y1,x2,y2:LongInt;NameCode:PathStr);
 begin
    Assign(fBMP,NameCode);
    Rewrite(fBMP,1);
    testH.Types[1]:='B';
    testH.Types[2]:='M';
    testH.Size:=(x2-x1+1)*(y2-y1+1)+1078;
    testH.Reserved1:=0;
    testH.Reserved2:=0;
    testH.OffBits:=1078;
    testI.H.Size:=40;
    testI.H.Width:=x2-x1+1;
    testI.H.Height:=y2-y1+1;
    testI.H.Planes:=1;
    testI.H.BitCount:=8;
    testI.H.Compression:=0;
    testI.H.SizeImage:=0;
    testI.H.XPelsPerMeter:=0;
    testI.H.YPelsPerMeter:=0;
    testI.H.ClrUsed:=256;
    testI.H.ClrImportant:=256;
    BlockWrite(fBMP,testH.Types[1],1);
    BlockWrite(fBMP,testH.Types[2],1);
    BlockWrite(fBMP,testH.Size,4);
    BlockWrite(fBMP,testH.Reserved1,2);
    BlockWrite(fBMP,testH.Reserved2,2);
    BlockWrite(fBMP,testH.OffBits,4);
    BlockWrite(fBMP,testI.H.Size,4);
    BlockWrite(fBMP,testI.H.Width,4);
    BlockWrite(fBMP,testI.H.Height,4);
    BlockWrite(fBMP,testI.H.Planes,2);
    BlockWrite(fBMP,testI.H.BitCount,2);
    BlockWrite(fBMP,testI.H.Compression,4);
    BlockWrite(fBMP,testI.H.SizeImage,4);
    BlockWrite(fBMP,testI.H.XPelsPerMeter,4);
    BlockWrite(fBMP,testI.H.YPelsPerMeter,4);
    BlockWrite(fBMP,testI.H.ClrUsed,4);
    BlockWrite(fBMP,testI.H.ClrImportant,4);
    for iBMP:=0 to 255 do
        begin
           ReadColorRegister(iBMP,cRed,cGreen,cBlue);
           testI.C[iBMP].Blue:=cBlue*4;
           testI.C[iBMP].Green:=cGreen*4;
           testI.C[iBMP].Red:=cRed*4;
           testI.C[iBMP].Reserved:=0;
           BlockWrite(fBMP,testI.C[iBMP].Blue,1);
           BlockWrite(fBMP,testI.C[iBMP].Green,1);
           BlockWrite(fBMP,testI.C[iBMP].Red,1);
           BlockWrite(fBMP,testI.C[iBMP].Reserved,1);
        end;
   for iBMP:=0 to testI.H.Height-1 do
        begin
           for jBMP:=0 to testI.H.Width-1 do
               LineBuff[jBMP]:=Mem[$A000:jBMP+x1+320*y1+320*(testI.H.Height-iBMP-1)];
           BlockWrite(fBMP,LineBuff,testI.H.Width);
        end;
   Close(fBMP);
 end;

procedure _LoadUnPackBMPFile(x,y:LongInt;NameCode:PathStr);
 begin
    Assign(fBMP,NameCode);
    Reset(fBMP,1);
    BlockRead(fBMP,testH.Types[1],1);
    BlockRead(fBMP,testH.Types[2],1);
    BlockRead(fBMP,testH.Size,4);
    BlockRead(fBMP,testH.Reserved1,2);
    BlockRead(fBMP,testH.Reserved2,2);
    BlockRead(fBMP,testH.OffBits,4);
    BlockRead(fBMP,testI.H.Size,4);
    BlockRead(fBMP,testI.H.Width,4);
    BlockRead(fBMP,testI.H.Height,4);
    BlockRead(fBMP,testI.H.Planes,2);
    BlockRead(fBMP,testI.H.BitCount,2);
    if testI.H.BitCount < 4 then
       begin
          SetVideoMode(3);
          writeln;
          writeln('Mod video neidentificat');
          Halt(1);
       end;
    BlockRead(fBMP,testI.H.Compression,4);
    BlockRead(fBMP,testI.H.SizeImage,4);
    BlockRead(fBMP,testI.H.XPelsPerMeter,4);
    BlockRead(fBMP,testI.H.YPelsPerMeter,4);
    BlockRead(fBMP,testI.H.ClrUsed,4);
    BlockRead(fBMP,testI.H.ClrImportant,4);
    if (testI.H.BitCount = 8) and (testI.H.ClrImportant >= 0) then
       begin
          for iBMP:=0 to 255 do
              begin
                 BlockRead(fBMP,testI.C[iBMP].Blue,1);
                 testI.C[iBMP].Blue:=testI.C[iBMP].Blue div 4;
                 BlockRead(fBMP,testI.C[iBMP].Green,1);
                 testI.C[iBMP].Green:=testI.C[iBMP].Green div 4;
                 BlockRead(fBMP,testI.C[iBMP].Red,1);
                 testI.C[iBMP].Red:=testI.C[iBMP].Red div 4;
                 BlockRead(fBMP,testI.C[iBMP].Reserved,1);
              end;
       end;
    for iBMP:=0 to 255 do
        SetColorRegister(iBMP,testI.C[iBMP].Red,testI.C[iBMP].Green,testI.C[iBMP].Blue);
{    testI.H.Height:=400; { ! }
    for iBMP:=0 to testI.H.Height-1 do
        begin
           BlockRead(fBMP,LineBuff,testI.H.Width);
           for jBMP:=0 to testI.H.Width-1 do begin
            if odd(jBMP) then
               Mem[$A000:(jBMP div 2)+x+320*y+
                          320*(testI.H.Height-(round(iBMP /2.4))-1)]:=
                          LineBuff[jBMP];
            end
        end;
    Close(fBMP);
 end;



Begin
End.