Color Images in Pascal - Programmers Heaven

Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!

Categories

Color Images in Pascal

NinthAngleNinthAngle Posts: 98Member
Hi,
Im trying to modify a program I wrote in pascal that displays images using Graphix($13). At the moment all the pictures it shows are black and white. Can I change the program to display COLOR bmp images?

regards,
NA
«1

Comments

  • Phat NatPhat Nat Posts: 757Member
    [b][red]This message was edited by Phat Nat at 2006-6-19 17:39:45[/red][/b][hr]
    : Hi,
    : Im trying to modify a program I wrote in pascal that displays images using Graphix($13). At the moment all the pictures it shows are black and white. Can I change the program to display COLOR bmp images?
    :
    : regards,
    : NA
    :

    What unit are you using for displaying the BMPs? It sounds like you are using my unit.
    If you are using the ones that I wrote (SHOW_BMP.PAS & GRAPHICS.PAS), then if you are using 24-bit BMPs they will show as B&W if GRAYSCALE is set to true. Depending on the version you are using, it may not support color. I have an updated one that will display 24-bit BMPs in 256 color mode properly.

    If you are using SHOW_BMP.PAS, then to see if it will do color BMPs, check below the Mode listing at the top. Right below [b]Mode1280x1024x24 = $11B;[/b] should be a line that says [b]Grayscale : Boolean = False;[/b] right above [b]MaxPal = 215;[/b]
    If not, you have an old version. Post back and I will post the new version.

    Phat Nat
  • Phat NatPhat Nat Posts: 757Member
    [b][red]This message was edited by Phat Nat at 2006-6-27 17:54:16[/red][/b][hr]
    Looking through I see that you were using my unit many posts ago, so I will assume you still are. Here is the newest version:

    http://www.programmersheaven.com/search/download.asp?FileID=47108

    Phat Nat







  • Phat NatPhat Nat Posts: 757Member
    [b][red]This message was edited by Phat Nat at 2006-6-27 17:55:0[/red][/b][hr]
    The link to the full file is now:

    http://www.programmersheaven.com/search/download.asp?FileID=47108

    Phat Nat

  • zibadianzibadian Posts: 6,349Member
    : Looking through I see that you were using my unit many posts ago, so I will assume you still are. Here is the newest version:
    : It is too long of a post, so I will post this half, then the second half.
    : [code]
    : (***************************************************************************)
    : (* SHOW_BMP Version 0.8 *)
    : (* Developed by Phat Nat ([email protected]) *)
    : (* Latest Changes Include: *)
    : (* + Added Color Support for 24-bit images in 8-bit mode *)
    : (* + Improved display of 8-bit images in 24/32-bit modes *)
    : (* + Added VESA modes listing for use with the Graphix() procedure *)
    : (* + Added version listing *)
    : (***************************************************************************)
    : UNIT Show_Bmp;
    :
    : INTERFACE
    :
    : USES Crt;
    :
    : CONST
    : VGA = $A000; { Used for direct screen display of images }
    : { List of basic available VESA modes }
    : Mode320x200x8 = $13;
    : Mode320x200x15 = $10D;
    : Mode320x200x16 = $10E;
    : Mode320x200x24 = $10F;
    :
    : Mode640x400x8 = $100;
    :
    : Mode640x480x1 = $11;
    : Mode640x480x4 = $12;
    : Mode640x480x8 = $101;
    : Mode640x480x15 = $110;
    : Mode640x480x16 = $111;
    : Mode640x480x24 = $112;
    :
    : Mode800x600x4 = $102;
    : Mode800x600x8 = $103;
    : Mode800x600x15 = $113;
    : Mode800x600x16 = $114;
    : Mode800x600x24 = $115;
    :
    : Mode1024x768x4 = $104;
    : Mode1024x768x8 = $105;
    : Mode1024x768x15 = $116;
    : Mode1024x768x16 = $117;
    : Mode1024x768x24 = $118;
    :
    : Mode1280x1024x4 = $106;
    : Mode1280x1024x8 = $107;
    : Mode1280x1024x15 = $119;
    : Mode1280x1024x16 = $11A;
    : Mode1280x1024x24 = $11B;
    :
    : { Set to TRUE to display 8-bit Images in B&W in 24/32-Bit modes }
    : GrayScale : Boolean = False;
    :
    :
    : MaxPal = 215;
    : DefaultPal : Array[0..MaxPal,0..2] Of Byte =
    : (($00,$00,$00),($33,$00,$00),($66,$00,$00),($99,$00,$00),($CC,$00,$00),($FF,$00,$00),
    : ($00,$00,$33),($33,$00,$33),($66,$00,$33),($99,$00,$33),($CC,$00,$33),($FF,$00,$33),
    : ($00,$00,$66),($33,$00,$66),($66,$00,$66),($99,$00,$66),($CC,$00,$66),($FF,$00,$66),
    : ($00,$00,$99),($33,$00,$99),($66,$00,$99),($99,$00,$99),($CC,$00,$99),($FF,$00,$99),
    : ($00,$00,$CC),($33,$00,$CC),($66,$00,$CC),($99,$00,$CC),($CC,$00,$CC),($FF,$00,$CC),
    : ($00,$00,$FF),($33,$00,$FF),($66,$00,$FF),($99,$00,$FF),($CC,$00,$FF),($FF,$00,$FF),
    : ($00,$33,$00),($33,$33,$00),($66,$33,$00),($99,$33,$00),($CC,$33,$00),($FF,$33,$00),
    : ($00,$33,$33),($33,$33,$33),($66,$33,$33),($99,$33,$33),($CC,$33,$33),($FF,$33,$33),
    : ($00,$33,$66),($33,$33,$66),($66,$33,$66),($99,$33,$66),($CC,$33,$66),($FF,$33,$66),
    : ($00,$33,$99),($33,$33,$99),($66,$33,$99),($99,$33,$99),($CC,$33,$99),($FF,$33,$99),
    : ($00,$33,$CC),($33,$33,$CC),($66,$33,$CC),($99,$33,$CC),($CC,$33,$CC),($FF,$33,$CC),
    : ($00,$33,$FF),($33,$33,$FF),($66,$33,$FF),($99,$33,$FF),($CC,$33,$FF),($FF,$33,$FF),
    : ($00,$66,$00),($33,$66,$00),($66,$66,$00),($99,$66,$00),($CC,$66,$00),($FF,$66,$00),
    : ($00,$66,$33),($33,$66,$33),($66,$66,$33),($99,$66,$33),($CC,$66,$33),($FF,$66,$33),
    : ($00,$66,$66),($33,$66,$66),($66,$66,$66),($99,$66,$66),($CC,$66,$66),($FF,$66,$66),
    : ($00,$66,$99),($33,$66,$99),($66,$66,$99),($99,$66,$99),($CC,$66,$99),($FF,$66,$99),
    : ($00,$66,$CC),($33,$66,$CC),($66,$66,$CC),($99,$66,$CC),($CC,$66,$CC),($FF,$66,$CC),
    : ($00,$66,$FF),($33,$66,$FF),($66,$66,$FF),($99,$66,$FF),($CC,$66,$FF),($FF,$66,$FF),
    : ($00,$99,$00),($33,$99,$00),($66,$99,$00),($99,$99,$00),($CC,$99,$00),($FF,$99,$00),
    : ($00,$99,$33),($33,$99,$33),($66,$99,$33),($99,$99,$33),($CC,$99,$33),($FF,$99,$33),
    : ($00,$99,$66),($33,$99,$66),($66,$99,$66),($99,$99,$66),($CC,$99,$66),($FF,$99,$66),
    : ($00,$99,$99),($33,$99,$99),($66,$99,$99),($99,$99,$99),($CC,$99,$99),($FF,$99,$99),
    : ($00,$99,$CC),($33,$99,$CC),($66,$99,$CC),($99,$99,$CC),($CC,$99,$CC),($FF,$99,$CC),
    : ($00,$99,$FF),($33,$99,$FF),($66,$99,$FF),($99,$99,$FF),($CC,$99,$FF),($FF,$99,$FF),
    : ($00,$CC,$00),($33,$CC,$00),($66,$CC,$00),($99,$CC,$00),($CC,$CC,$00),($FF,$CC,$00),
    : ($00,$CC,$33),($33,$CC,$33),($66,$CC,$33),($99,$CC,$33),($CC,$CC,$33),($FF,$CC,$33),
    : ($00,$CC,$66),($33,$CC,$66),($66,$CC,$66),($99,$CC,$66),($CC,$CC,$66),($FF,$CC,$66),
    : ($00,$CC,$99),($33,$CC,$99),($66,$CC,$99),($99,$CC,$99),($CC,$CC,$99),($FF,$CC,$99),
    : ($00,$CC,$CC),($33,$CC,$CC),($66,$CC,$CC),($99,$CC,$CC),($CC,$CC,$CC),($FF,$CC,$CC),
    : ($00,$CC,$FF),($33,$CC,$FF),($66,$CC,$FF),($99,$CC,$FF),($CC,$CC,$FF),($FF,$CC,$FF),
    : ($00,$FF,$00),($33,$FF,$00),($66,$FF,$00),($99,$FF,$00),($CC,$FF,$00),($FF,$FF,$00),
    : ($00,$FF,$33),($33,$FF,$33),($66,$FF,$33),($99,$FF,$33),($CC,$FF,$33),($FF,$FF,$33),
    : ($00,$FF,$66),($33,$FF,$66),($66,$FF,$66),($99,$FF,$66),($CC,$FF,$66),($FF,$FF,$66),
    : ($00,$FF,$99),($33,$FF,$99),($66,$FF,$99),($99,$FF,$99),($CC,$FF,$99),($FF,$FF,$99),
    : ($00,$FF,$CC),($33,$FF,$CC),($66,$FF,$CC),($99,$FF,$CC),($CC,$FF,$CC),($FF,$FF,$CC),
    : ($00,$FF,$FF),($33,$FF,$FF),($66,$FF,$FF),($99,$FF,$FF),($CC,$FF,$FF),($FF,$FF,$FF));
    :
    : TYPE
    : BMPHeaderRec = record
    : Identifier : Array[0..1] Of Char;
    : Size : LongInt;
    : Reserved : LongInt;
    : BitMapOffset : LongInt;
    : CheckType : LongInt;
    : Width : LongInt;
    : Height : LongInt;
    : Planes : Word;
    : Bits : Word;
    : Compression : LongInt;
    : ImageSize : LongInt;
    : XPels : LongInt;
    : YPels : LongInt;
    : ColorUsed : LongInt;
    : ColorImportant : LongInt;
    : End;
    :
    : InfoBlock = record
    : Valid : Boolean;
    : Cmp : ShortInt;
    : BMPHeader : BMPHeaderRec;
    : END;
    :
    : ColorType = record
    : Blue : Byte;
    : Green : Byte;
    : Red : Byte;
    : Index : Integer;
    : END;
    :
    : HiColorType = record
    : Blue : Byte;
    : Green : Byte;
    : Red : Byte;
    : END;
    :
    : VAR
    : ScreenH : Integer;
    : ScreenW : Integer;
    : BPP : Byte;
    :
    : PROCEDURE Graphix(Mode : Word);
    : PROCEDURE SetTextMode;
    : PROCEDURE SetPal(Num : Byte;Red, Green, Blue : Byte);
    : PROCEDURE GetPal(Num : Byte;VAR Red, Green, Blue : Byte);
    : PROCEDURE GetPixel(X,Y : Integer;VAR Color : ColorType);
    : PROCEDURE PutPixel(X,Y : Integer;Color, ClearColor : ColorType; Where : Word);
    : FUNCTION GetBMPInfo(Name : String; VAR Info : InfoBlock) : Boolean;
    : PROCEDURE ShowBMPInfo(Info : InfoBlock);
    : FUNCTION ShowBMP(StartX, StartY : Integer; Name : String; DoColors : Boolean; Clear : ColorType; Where : Word) : Boolean;
    :
    : IMPLEMENTATION
    :
    : CONST
    : Header : array[1..2] Of Char = 'BM';
    : PalCount = 255;
    : BI_RGB = 0;
    : BI_RLE8 = 1;
    : BI_RLE4 = 2;
    :
    : VAR
    : Colors : Array[0..255,1..4] Of Byte;
    : C : Char;
    : CA : Array[0..7] Of Boolean;
    : CA2 : Array[1..3] Of Byte;
    : CurrentMode : Word;
    : CurrentBlock : Byte;
    : Red, Blue, Green : Byte;
    : Temp : Byte;
    : Temp2 : Array[1..6] Of Integer;
    : Temp3 : Integer;
    : Temp4 : LongInt;
    : F : File;
    : S2 : Array[1..2] Of Char;
    : Junk : Array[0..10000] Of Char;
    : X, X2, Y, Y2, Z : Integer;
    :
    : PROCEDURE Graphix(Mode : Word);
    : Begin
    : ASM
    : Cmp Mode, $FF
    : Jg @VESA
    : Mov Ax, Mode
    : INT 10h
    : Mov ScreenW, 320
    : Mov ScreenH, 200
    : Mov BPP, 8
    : @MT1:
    : Cmp Mode, $11
    : Jne @MT2
    : Mov ScreenW, 640
    : Mov ScreenH, 480
    : Mov BPP, 1
    : @MT2:
    : Cmp Mode, $12
    : Jne @MT3
    : Mov ScreenW, 640
    : Mov ScreenH, 480
    : Mov BPP, 4
    : @MT3:
    : Cmp Mode, $13
    : Jne @MT4
    : Mov ScreenW, 320
    : Mov ScreenH, 200
    : Mov BPP, 8
    : @MT4:
    : Jmp @End
    : @VESA:
    : Mov Ax, $4F02
    : Mov Bx, Mode
    : INT 10h
    : @VMT01:
    : Cmp Mode, $101
    : Jne @VMT0F
    : Mov ScreenW, 640
    : Mov ScreenH, 480
    : Mov BPP, 8
    : @VMT0F:
    : Cmp Mode, $10F
    : Jne @VMT10
    : Mov ScreenW, 320
    : Mov ScreenH, 200
    : Mov BPP, 32
    : @VMT10:
    : Cmp Mode, $110
    : Jne @VMT11
    : Mov ScreenW, 640
    : Mov ScreenH, 480
    : Mov BPP, 16
    : @VMT11:
    : Cmp Mode, $111
    : Jne @VMT12
    : Mov ScreenW, 640
    : Mov ScreenH, 480
    : Mov BPP, 16
    : @VMT12:
    : Cmp Mode, $112
    : Jne @VMT15
    : Mov ScreenW, 640
    : Mov ScreenH, 480
    : Mov BPP, 32
    : @VMT15:
    : Cmp Mode, $115
    : Jne @VMT5
    : Mov ScreenW, 800
    : Mov ScreenH, 600
    : Mov BPP, 32
    : @VMT5:
    : @End:
    : End;
    : CurrentMode := Mode;
    : End;
    :
    : PROCEDURE SetTextMode; assembler;
    : ASM
    : Mov Ax, $0003
    : INT 10h
    : Mov ScreenW, 80
    : Mov ScreenH, 25
    : End;
    :
    : PROCEDURE SetPal(Num : Byte;Red, Green, Blue : Byte);
    : Begin
    : Port[$3c8] := Num;
    : Port[$3c9] := Red;
    : Port[$3c9] := Green;
    : Port[$3c9] := Blue;
    : End;
    :
    : PROCEDURE GetPal(Num : Byte;VAR Red, Green, Blue : Byte);
    : Begin
    : Port[$3c7] := Num;
    : Red := Port[$3c9];
    : Green := Port[$3c9];
    : Blue := Port[$3c9];
    : End;
    :
    : PROCEDURE SetBlock(X,Y : Integer);
    : Begin
    : Temp := (((LONGINT(Y)*ScreenW*(BPP Shr 3)+X)) Shr 16);
    : If CurrentBlock <> Temp Then
    : Begin
    : ASM
    : Mov Ax, $4f05
    : Xor Bh, Bh
    : Mov Dl, Temp
    : Int $10
    : END;
    : CurrentBlock := Temp;
    : End;
    : End;
    : [/code]
    :
    : Phat Nat
    :
    :
    Perhaps it was better to place the code in the codepedia and post the link to it. That way you didn't need to split it into 2 halves.
  • NinthAngleNinthAngle Posts: 98Member

    :
    : If you are using SHOW_BMP.PAS, then to see if it will do color BMPs, check below the Mode listing at the top. Right below [b]Mode1280x1024x24 = $11B;[/b] should be a line that says [b]Grayscale : Boolean = False;[/b] right above [b]MaxPal = 215;[/b]
    : If not, you have an old version. Post back and I will post the new version.
    :
    : Phat Nat
    :

    I am using the SHOW_BMP.PAS unit. There is nothing like [b]Grayscale : Boolean = False;[/b] right above [b]MaxPal = 215;[/b] below [b]Mode1280x1024x24 = $11B;[/b]. So I guess Im using the old version. Ill try and use the new unit you posted...
    thanks!
    na
  • NinthAngleNinthAngle Posts: 98Member
    : Here is the second half. Sorry for the split.
    : [code]
    : PROCEDURE GetPixel(X,Y : Integer;VAR Color : ColorType);
    : Begin
    : If (X < 0) or (Y < 0) or (X >= ScreenW) or (Y >= ScreenH) Then Exit;
    : With Color Do
    : Begin
    : If BPP <= 8 Then
    : Begin
    : SetBlock(X*(BPP Shr 3),Y);
    : Index := Mem[$A000:((X+Y*ScreenW)*(BPP Shr 3)) - Temp Shl 16]
    : End
    : ELSE
    : Begin
    : SetBlock(X*(BPP Shr 3),Y);
    : Blue := Mem[$A000:((X+Y*ScreenW)*(BPP Shr 3)+0) - Temp Shl 16];
    : SetBlock(X*(BPP Shr 3)+1,Y);
    : Green := Mem[$A000:((X+Y*ScreenW)*(BPP Shr 3)+1) - Temp Shl 16];
    : SetBlock(X*(BPP Shr 3)+2,Y);
    : Red := Mem[$A000:((X+Y*ScreenW)*(BPP Shr 3)+2) - Temp Shl 16];
    : Index := -1;
    : End;
    : End;
    : End;
    :
    : PROCEDURE PutPixel(X,Y : Integer;Color, ClearColor : ColorType; Where : Word);
    : VAR Z : Byte;
    : Begin
    : If (X < 0) or (Y < 0) or (X >= ScreenW) or (Y >= ScreenH) Then Exit;
    : With Color Do
    : Begin
    : If BPP <= 8 Then
    : Begin
    : If Color.Index = ClearColor.Index Then Exit;
    : Z := BPP Shr 3;
    : SetBlock(X*Integer(Z),Y);
    : Mem[Where:((X+Y*ScreenW)*Integer(Z)) - (CurrentBlock Shl 16)] := Index;
    : End
    : ELSE
    : If (Color.Red = ClearColor.Red) AND
    : (Color.Green = ClearColor.Green) AND
    : (Color.Blue = ClearColor.Blue) Then Exit
    : ELSE
    : If Index = -1 Then
    : Begin
    : Case BPP Of
    : 16 : Begin
    : SetBlock(X*2,Y);
    : Mem[Where:((X+Y*ScreenW)*2+0) - CurrentBlock Shl 16] :=
    : (Blue Shr 3) AND 31 + ((Green Shr 3) Shl 7) AND 224;
    : SetBlock(X*2+1,Y);
    : Mem[Where:((X+Y*ScreenW)*2+1) - CurrentBlock Shl 16] :=
    : (((Green Shr 3) Shr 2) AND 7) + (((RED Shr 3) Shl 3) AND 248);
    : End;
    : 24,
    : 32 : Begin
    : SetBlock(X*(BPP Shr 3)+0,Y);
    : Mem[Where:((X+Y*ScreenW)*(BPP Shr 3)+0) - CurrentBlock Shl 16] := Blue;
    : SetBlock(X*(BPP Shr 3)+1,Y);
    : Mem[Where:((X+Y*ScreenW)*(BPP Shr 3)+1) - CurrentBlock Shl 16] := Green;
    : SetBlock(X*(BPP Shr 3)+2,Y);
    : Mem[Where:((X+Y*ScreenW)*(BPP Shr 3)+2) - CurrentBlock Shl 16] := Red;
    : End;
    : End;
    : End
    : ELSE
    : Begin
    : Color.Blue := Colors[Index,1];
    : Color.Green := Colors[Index,2];
    : Color.Red := Colors[Index,3];
    : SetBlock(X*(BPP Shr 3),Y);
    : Mem[Where:((X+Y*ScreenW)*(BPP Shr 3)+0) - CurrentBlock Shl 16] := Blue;
    : SetBlock(X*(BPP Shr 3)+1,Y);
    : Mem[Where:((X+Y*ScreenW)*(BPP Shr 3)+1) - CurrentBlock Shl 16] := Green;
    : SetBlock(X*(BPP Shr 3)+2,Y);
    : Mem[Where:((X+Y*ScreenW)*(BPP Shr 3)+2) - CurrentBlock Shl 16] := Red;
    : End;
    : End;
    : End;
    :
    : FUNCTION GetBMPInfo(Name : String; VAR Info : InfoBlock) : Boolean;
    : VAR Final : Boolean;
    : Begin
    : GetBMPInfo := False;
    : Assign(F, Name);{$I-}Reset(F,1);{$I+}
    : If IOResult <> 0 Then Exit;
    : BlockRead(F, Info.BMPHeader, SizeOf(Info.BMPHeader));
    :
    : Info.Valid := Info.BMPHeader.Identifier = Header;
    : Final := Info.Valid;
    :
    : Info.Cmp := Info.BMPHeader.Compression;
    : If Info.Cmp In[0] Then Final := True;
    :
    : Close(F);
    : GetBMPInfo := True;
    : End;
    :
    : PROCEDURE ShowBMPInfo(Info : InfoBlock);
    : Begin
    : With Info.BMPHeader Do
    : Begin
    : GotoXY(21, 1);WriteLn('Size = ',Size);
    : GotoXY(21, 2);WriteLn('BitMapOffset= ',BitMapOffset);
    : GotoXY(21, 3);WriteLn('Type = ',CheckType);
    : GotoXY(21, 4);WriteLn('Width = ',Width);
    : GotoXY(21, 5);WriteLn('Height = ',Height);
    : GotoXY(21, 6);WriteLn('Bits = ',ORD(Bits));
    : GotoXY(21, 7);WriteLn('Planes = ',ORD(Planes));
    : GotoXY(21, 8);WriteLn('FileSize = ',ImageSize);
    : GotoXY(21, 9);WriteLn('RealSize = ',Width*Height);
    : GotoXY(21,10);WriteLn('XPelsPerMet = ',XPels);
    : GotoXY(21,11);WriteLn('YPelsPerMet = ',YPels);
    : GotoXY(21,12);WriteLn('Color Used = ',ColorUsed);
    : GotoXY(21,13);WriteLn('Color Imp. = ',ColorImportant);
    : End;
    : End;
    :
    : FUNCTION ShowBMP(StartX, StartY : Integer; Name : String; DoColors : Boolean; Clear : ColorType; Where : Word) : Boolean;
    : VAR
    : Info : InfoBlock;
    : Color : ColorType;
    : Begin
    : If GetBMPInfo(Name,Info) = False Then
    : Begin
    : ShowBMP := False;
    : Exit;
    : End
    : ELSE ShowBMP := True;
    : Assign(F, Name);Reset(F,1);
    : BlockRead(F, Info.BMPHeader, SizeOf(Info.BMPHeader));
    :
    : Reset(F,1);
    : BlockRead(F, Junk, 14);
    : BlockRead(F, Junk, Info.BMPHeader.CheckType);
    : With Info.BMPHeader Do
    : If Bits = 1 Then
    : Begin
    : BlockRead(F, Colors[0], 8);
    : If DoColors Then
    : For X := 0 to 1 Do
    : SetPal(X*63, Colors[X,3]*63 DIV 255, Colors[X,2]*63 DIV 255, Colors[X,1]*63 DIV 255);
    : Reset(F,1);
    : BlockRead(F, Junk, BitMapOffset);
    : Z := Width SHR 3;
    : While Z MOD(4) <> 0 Do Inc(Z);
    : For Y := 0 to Height-1 Do
    : Begin
    : BlockRead(F, Junk, Z);
    : For X := 0 to Z-1 Do
    : Mem[Where:StartX+X+(StartY+Height-Y)*80] := ORD(Junk[X]);
    : End;
    : End;
    :
    : With Info.BMPHeader Do
    : If Bits = 4 Then
    : Begin
    : BlockRead(F, Colors[0], 64);
    : If DoColors Then
    : For X := 0 to 15 Do
    : SetPal(X, Colors[X,3]*63 DIV 255, Colors[X,2]*63 DIV 255, Colors[X,1]*63 DIV 255);
    : Reset(F,1);
    : BlockRead(F, Junk, BitMapOffset);
    : Z := Width SHR 1;
    : While Z MOD(4) <> 0 Do Inc(Z);
    : For Y := 0 to Height-1 Do
    : Begin
    : BlockRead(F, Junk, Z);
    : For X := 0 to (Width SHR 1)-1 Do
    : Begin
    : If BPP < 8 Then
    : Begin
    : Mem[Where:StartX+X*2+0+(StartY+Height-Y)*ScreenW] := ORD(Junk[X]) SHR 4;
    : Mem[Where:StartX+X*2+1+(StartY+Height-Y)*ScreenW] := ORD(Junk[X]) AND 15;
    : End
    : ELSE
    : Begin
    : Color.Index := ORD(Junk[X]) SHR 4;
    : PutPixel(StartX+X*2,StartY+Y,Color,Clear,Where);
    : Color.Index := ORD(Junk[X]) AND 15;
    : PutPixel(StartX+X*2+1,StartY+Y,Color,Clear,Where);
    : End;
    : End;
    : End;
    : End;
    :
    : With Info.BMPHeader Do
    : If (Bits = 8) Then
    : Begin
    : BlockRead(F, Colors[0], (PalCount+1)*4);
    : If DoColors Then
    : For X := 0 to PalCount Do
    : SetPal(X, Colors[X,3]*62 DIV 255, Colors[X,2]*63 DIV 255, Colors[X,1]*63 DIV 255);
    : Reset(F,1);
    : BlockRead(F, Junk, BitMapOffset);
    : Z := (Width*Bits) SHR 3;
    : While Z MOD(4) <> 0 Do Inc(Z);
    : For Y := Height-1 downto 0 Do
    : Begin
    : BlockRead(F, Junk, Width);
    : For X := 0 to Width-1 do
    : Begin
    : Color.Index := ORD(Junk[X]);
    : PutPixel(StartX+X,StartY+Y,Color,Clear,Where);
    : End;
    : For X := 1 to Z-Width Do BlockRead(F, C, 1);
    : End;
    : End;
    :
    : With Info.BMPHeader Do
    : If (Bits = 24) or (Bits = 32) Then
    : Begin
    : If CurrentMode <= $109 Then
    : Begin
    : If Grayscale Then
    : Begin
    : { GrayScale }
    : For X := 0 to PalCount Do
    : SetPal(X, X*63 DIV 255, X*63 DIV 255, X*63 DIV 255);
    : End
    : ELSE
    : Begin
    : { Color }
    : { Using a Default Palette, closest color using diff in R,G & B }
    : If DoColors Then
    : Begin
    : For X := 0 to MaxPal Do
    : Move(DefaultPal[X],Colors[X],SizeOf(DefaultPal[X]));
    : { Convert default Palette from 8-bit to 6-bit }
    : For X := 0 to MaxPal Do
    : SetPal(X, Colors[X,1]*63 DIV 255,
    : Colors[X,2]*63 DIV 255,
    : Colors[X,3]*63 DIV 255);
    : End;
    : End;
    : End;
    : Reset(F,1);
    : BlockRead(F, Junk, BitMapOffset);
    : Z := (Width*Bits) SHR 3;
    : While Z MOD(4) <> 0 Do Inc(Z);
    : Color.Index := -1; Bits := (Bits shr 3);
    : For Y := Height-1 downto 0 Do
    : Begin
    : BlockRead(F, Junk, Z);
    : Temp4 := 0;
    : For X := 0 to Width-1 do
    : Begin
    : If BPP <= 8 Then
    : Begin
    : If GrayScale Then
    : Color.Index := (Ord(Junk[Temp4+0])+
    : Ord(Junk[Temp4+1])+
    : Ord(Junk[Temp4+2])) DIV 3
    : ELSE
    : Begin
    : Temp2[5] := 0; Temp2[6] := $7FFF;
    : For Temp3 := 0 to MaxPal Do
    : Begin
    : Temp2[1] := Ord(Junk[Temp4+0])-(Colors[Temp3,3]);
    : Temp2[2] := Ord(Junk[Temp4+1])-(Colors[Temp3,2]);
    : Temp2[3] := Ord(Junk[Temp4+2])-(Colors[Temp3,1]);
    : Temp2[4] := (Abs(Temp2[1])+Abs(Temp2[2])+Abs(Temp2[3]));
    : If Temp2[4] <= Temp2[6] Then
    : Begin
    : Temp2[5] := Temp3;
    : Temp2[6] := Temp2[4];
    : End;
    : End;
    : Color.Index := Temp2[5];
    : End;
    : End
    : ELSE
    : Begin
    : Color.Blue := Ord(Junk[Temp4+0]);
    : Color.Green := Ord(Junk[Temp4+1]);
    : Color.Red := Ord(Junk[Temp4+2]);
    : End;
    : PutPixel(StartX+X,StartY+Y,Color,Clear,Where);
    : Temp4 := Temp4+Bits; { Faster than a multiply }
    : End;
    : If KeyPressed Then Begin While KeyPressed Do ReadKey; Break; End;
    : End;
    : End;
    : Close(F);
    : End;
    :
    : End.
    : [/code]
    :
    : Phat Nat
    :
    :


    I copied the code into notepad and saved the whole thing as SHOW_BMP.TPU in the UNITS directory. However, the program that uses the unit now doesnt recognise this file. How do I save notepad files as *.TPU?

    thank you SO much! :)
    na
  • zibadianzibadian Posts: 6,349Member
    : : Here is the second half. Sorry for the split.
    : : [code]
    : : PROCEDURE GetPixel(X,Y : Integer;VAR Color : ColorType);
    : : Begin
    : : If (X < 0) or (Y < 0) or (X >= ScreenW) or (Y >= ScreenH) Then Exit;
    : : With Color Do
    : : Begin
    : : If BPP <= 8 Then
    : : Begin
    : : SetBlock(X*(BPP Shr 3),Y);
    : : Index := Mem[$A000:((X+Y*ScreenW)*(BPP Shr 3)) - Temp Shl 16]
    : : End
    : : ELSE
    : : Begin
    : : SetBlock(X*(BPP Shr 3),Y);
    : : Blue := Mem[$A000:((X+Y*ScreenW)*(BPP Shr 3)+0) - Temp Shl 16];
    : : SetBlock(X*(BPP Shr 3)+1,Y);
    : : Green := Mem[$A000:((X+Y*ScreenW)*(BPP Shr 3)+1) - Temp Shl 16];
    : : SetBlock(X*(BPP Shr 3)+2,Y);
    : : Red := Mem[$A000:((X+Y*ScreenW)*(BPP Shr 3)+2) - Temp Shl 16];
    : : Index := -1;
    : : End;
    : : End;
    : : End;
    : :
    : : PROCEDURE PutPixel(X,Y : Integer;Color, ClearColor : ColorType; Where : Word);
    : : VAR Z : Byte;
    : : Begin
    : : If (X < 0) or (Y < 0) or (X >= ScreenW) or (Y >= ScreenH) Then Exit;
    : : With Color Do
    : : Begin
    : : If BPP <= 8 Then
    : : Begin
    : : If Color.Index = ClearColor.Index Then Exit;
    : : Z := BPP Shr 3;
    : : SetBlock(X*Integer(Z),Y);
    : : Mem[Where:((X+Y*ScreenW)*Integer(Z)) - (CurrentBlock Shl 16)] := Index;
    : : End
    : : ELSE
    : : If (Color.Red = ClearColor.Red) AND
    : : (Color.Green = ClearColor.Green) AND
    : : (Color.Blue = ClearColor.Blue) Then Exit
    : : ELSE
    : : If Index = -1 Then
    : : Begin
    : : Case BPP Of
    : : 16 : Begin
    : : SetBlock(X*2,Y);
    : : Mem[Where:((X+Y*ScreenW)*2+0) - CurrentBlock Shl 16] :=
    : : (Blue Shr 3) AND 31 + ((Green Shr 3) Shl 7) AND 224;
    : : SetBlock(X*2+1,Y);
    : : Mem[Where:((X+Y*ScreenW)*2+1) - CurrentBlock Shl 16] :=
    : : (((Green Shr 3) Shr 2) AND 7) + (((RED Shr 3) Shl 3) AND 248);
    : : End;
    : : 24,
    : : 32 : Begin
    : : SetBlock(X*(BPP Shr 3)+0,Y);
    : : Mem[Where:((X+Y*ScreenW)*(BPP Shr 3)+0) - CurrentBlock Shl 16] := Blue;
    : : SetBlock(X*(BPP Shr 3)+1,Y);
    : : Mem[Where:((X+Y*ScreenW)*(BPP Shr 3)+1) - CurrentBlock Shl 16] := Green;
    : : SetBlock(X*(BPP Shr 3)+2,Y);
    : : Mem[Where:((X+Y*ScreenW)*(BPP Shr 3)+2) - CurrentBlock Shl 16] := Red;
    : : End;
    : : End;
    : : End
    : : ELSE
    : : Begin
    : : Color.Blue := Colors[Index,1];
    : : Color.Green := Colors[Index,2];
    : : Color.Red := Colors[Index,3];
    : : SetBlock(X*(BPP Shr 3),Y);
    : : Mem[Where:((X+Y*ScreenW)*(BPP Shr 3)+0) - CurrentBlock Shl 16] := Blue;
    : : SetBlock(X*(BPP Shr 3)+1,Y);
    : : Mem[Where:((X+Y*ScreenW)*(BPP Shr 3)+1) - CurrentBlock Shl 16] := Green;
    : : SetBlock(X*(BPP Shr 3)+2,Y);
    : : Mem[Where:((X+Y*ScreenW)*(BPP Shr 3)+2) - CurrentBlock Shl 16] := Red;
    : : End;
    : : End;
    : : End;
    : :
    : : FUNCTION GetBMPInfo(Name : String; VAR Info : InfoBlock) : Boolean;
    : : VAR Final : Boolean;
    : : Begin
    : : GetBMPInfo := False;
    : : Assign(F, Name);{$I-}Reset(F,1);{$I+}
    : : If IOResult <> 0 Then Exit;
    : : BlockRead(F, Info.BMPHeader, SizeOf(Info.BMPHeader));
    : :
    : : Info.Valid := Info.BMPHeader.Identifier = Header;
    : : Final := Info.Valid;
    : :
    : : Info.Cmp := Info.BMPHeader.Compression;
    : : If Info.Cmp In[0] Then Final := True;
    : :
    : : Close(F);
    : : GetBMPInfo := True;
    : : End;
    : :
    : : PROCEDURE ShowBMPInfo(Info : InfoBlock);
    : : Begin
    : : With Info.BMPHeader Do
    : : Begin
    : : GotoXY(21, 1);WriteLn('Size = ',Size);
    : : GotoXY(21, 2);WriteLn('BitMapOffset= ',BitMapOffset);
    : : GotoXY(21, 3);WriteLn('Type = ',CheckType);
    : : GotoXY(21, 4);WriteLn('Width = ',Width);
    : : GotoXY(21, 5);WriteLn('Height = ',Height);
    : : GotoXY(21, 6);WriteLn('Bits = ',ORD(Bits));
    : : GotoXY(21, 7);WriteLn('Planes = ',ORD(Planes));
    : : GotoXY(21, 8);WriteLn('FileSize = ',ImageSize);
    : : GotoXY(21, 9);WriteLn('RealSize = ',Width*Height);
    : : GotoXY(21,10);WriteLn('XPelsPerMet = ',XPels);
    : : GotoXY(21,11);WriteLn('YPelsPerMet = ',YPels);
    : : GotoXY(21,12);WriteLn('Color Used = ',ColorUsed);
    : : GotoXY(21,13);WriteLn('Color Imp. = ',ColorImportant);
    : : End;
    : : End;
    : :
    : : FUNCTION ShowBMP(StartX, StartY : Integer; Name : String; DoColors : Boolean; Clear : ColorType; Where : Word) : Boolean;
    : : VAR
    : : Info : InfoBlock;
    : : Color : ColorType;
    : : Begin
    : : If GetBMPInfo(Name,Info) = False Then
    : : Begin
    : : ShowBMP := False;
    : : Exit;
    : : End
    : : ELSE ShowBMP := True;
    : : Assign(F, Name);Reset(F,1);
    : : BlockRead(F, Info.BMPHeader, SizeOf(Info.BMPHeader));
    : :
    : : Reset(F,1);
    : : BlockRead(F, Junk, 14);
    : : BlockRead(F, Junk, Info.BMPHeader.CheckType);
    : : With Info.BMPHeader Do
    : : If Bits = 1 Then
    : : Begin
    : : BlockRead(F, Colors[0], 8);
    : : If DoColors Then
    : : For X := 0 to 1 Do
    : : SetPal(X*63, Colors[X,3]*63 DIV 255, Colors[X,2]*63 DIV 255, Colors[X,1]*63 DIV 255);
    : : Reset(F,1);
    : : BlockRead(F, Junk, BitMapOffset);
    : : Z := Width SHR 3;
    : : While Z MOD(4) <> 0 Do Inc(Z);
    : : For Y := 0 to Height-1 Do
    : : Begin
    : : BlockRead(F, Junk, Z);
    : : For X := 0 to Z-1 Do
    : : Mem[Where:StartX+X+(StartY+Height-Y)*80] := ORD(Junk[X]);
    : : End;
    : : End;
    : :
    : : With Info.BMPHeader Do
    : : If Bits = 4 Then
    : : Begin
    : : BlockRead(F, Colors[0], 64);
    : : If DoColors Then
    : : For X := 0 to 15 Do
    : : SetPal(X, Colors[X,3]*63 DIV 255, Colors[X,2]*63 DIV 255, Colors[X,1]*63 DIV 255);
    : : Reset(F,1);
    : : BlockRead(F, Junk, BitMapOffset);
    : : Z := Width SHR 1;
    : : While Z MOD(4) <> 0 Do Inc(Z);
    : : For Y := 0 to Height-1 Do
    : : Begin
    : : BlockRead(F, Junk, Z);
    : : For X := 0 to (Width SHR 1)-1 Do
    : : Begin
    : : If BPP < 8 Then
    : : Begin
    : : Mem[Where:StartX+X*2+0+(StartY+Height-Y)*ScreenW] := ORD(Junk[X]) SHR 4;
    : : Mem[Where:StartX+X*2+1+(StartY+Height-Y)*ScreenW] := ORD(Junk[X]) AND 15;
    : : End
    : : ELSE
    : : Begin
    : : Color.Index := ORD(Junk[X]) SHR 4;
    : : PutPixel(StartX+X*2,StartY+Y,Color,Clear,Where);
    : : Color.Index := ORD(Junk[X]) AND 15;
    : : PutPixel(StartX+X*2+1,StartY+Y,Color,Clear,Where);
    : : End;
    : : End;
    : : End;
    : : End;
    : :
    : : With Info.BMPHeader Do
    : : If (Bits = 8) Then
    : : Begin
    : : BlockRead(F, Colors[0], (PalCount+1)*4);
    : : If DoColors Then
    : : For X := 0 to PalCount Do
    : : SetPal(X, Colors[X,3]*62 DIV 255, Colors[X,2]*63 DIV 255, Colors[X,1]*63 DIV 255);
    : : Reset(F,1);
    : : BlockRead(F, Junk, BitMapOffset);
    : : Z := (Width*Bits) SHR 3;
    : : While Z MOD(4) <> 0 Do Inc(Z);
    : : For Y := Height-1 downto 0 Do
    : : Begin
    : : BlockRead(F, Junk, Width);
    : : For X := 0 to Width-1 do
    : : Begin
    : : Color.Index := ORD(Junk[X]);
    : : PutPixel(StartX+X,StartY+Y,Color,Clear,Where);
    : : End;
    : : For X := 1 to Z-Width Do BlockRead(F, C, 1);
    : : End;
    : : End;
    : :
    : : With Info.BMPHeader Do
    : : If (Bits = 24) or (Bits = 32) Then
    : : Begin
    : : If CurrentMode <= $109 Then
    : : Begin
    : : If Grayscale Then
    : : Begin
    : : { GrayScale }
    : : For X := 0 to PalCount Do
    : : SetPal(X, X*63 DIV 255, X*63 DIV 255, X*63 DIV 255);
    : : End
    : : ELSE
    : : Begin
    : : { Color }
    : : { Using a Default Palette, closest color using diff in R,G & B }
    : : If DoColors Then
    : : Begin
    : : For X := 0 to MaxPal Do
    : : Move(DefaultPal[X],Colors[X],SizeOf(DefaultPal[X]));
    : : { Convert default Palette from 8-bit to 6-bit }
    : : For X := 0 to MaxPal Do
    : : SetPal(X, Colors[X,1]*63 DIV 255,
    : : Colors[X,2]*63 DIV 255,
    : : Colors[X,3]*63 DIV 255);
    : : End;
    : : End;
    : : End;
    : : Reset(F,1);
    : : BlockRead(F, Junk, BitMapOffset);
    : : Z := (Width*Bits) SHR 3;
    : : While Z MOD(4) <> 0 Do Inc(Z);
    : : Color.Index := -1; Bits := (Bits shr 3);
    : : For Y := Height-1 downto 0 Do
    : : Begin
    : : BlockRead(F, Junk, Z);
    : : Temp4 := 0;
    : : For X := 0 to Width-1 do
    : : Begin
    : : If BPP <= 8 Then
    : : Begin
    : : If GrayScale Then
    : : Color.Index := (Ord(Junk[Temp4+0])+
    : : Ord(Junk[Temp4+1])+
    : : Ord(Junk[Temp4+2])) DIV 3
    : : ELSE
    : : Begin
    : : Temp2[5] := 0; Temp2[6] := $7FFF;
    : : For Temp3 := 0 to MaxPal Do
    : : Begin
    : : Temp2[1] := Ord(Junk[Temp4+0])-(Colors[Temp3,3]);
    : : Temp2[2] := Ord(Junk[Temp4+1])-(Colors[Temp3,2]);
    : : Temp2[3] := Ord(Junk[Temp4+2])-(Colors[Temp3,1]);
    : : Temp2[4] := (Abs(Temp2[1])+Abs(Temp2[2])+Abs(Temp2[3]));
    : : If Temp2[4] <= Temp2[6] Then
    : : Begin
    : : Temp2[5] := Temp3;
    : : Temp2[6] := Temp2[4];
    : : End;
    : : End;
    : : Color.Index := Temp2[5];
    : : End;
    : : End
    : : ELSE
    : : Begin
    : : Color.Blue := Ord(Junk[Temp4+0]);
    : : Color.Green := Ord(Junk[Temp4+1]);
    : : Color.Red := Ord(Junk[Temp4+2]);
    : : End;
    : : PutPixel(StartX+X,StartY+Y,Color,Clear,Where);
    : : Temp4 := Temp4+Bits; { Faster than a multiply }
    : : End;
    : : If KeyPressed Then Begin While KeyPressed Do ReadKey; Break; End;
    : : End;
    : : End;
    : : Close(F);
    : : End;
    : :
    : : End.
    : : [/code]
    : :
    : : Phat Nat
    : :
    : :
    :
    :
    : I copied the code into notepad and saved the whole thing as SHOW_BMP.TPU in the UNITS directory. However, the program that uses the unit now doesnt recognise this file. How do I save notepad files as *.TPU?
    :
    : thank you SO much! :)
    : na
    :
    Save it as a .txt file. Then use the explorer to change the extension (extensions must be visible). Notepad adds .txt automatically.
  • NinthAngleNinthAngle Posts: 98Member
    : : : Here is the second half. Sorry for the split.
    : : : [code]
    : : : PROCEDURE GetPixel(X,Y : Integer;VAR Color : ColorType);
    : : : Begin
    : : : If (X < 0) or (Y < 0) or (X >= ScreenW) or (Y >= ScreenH) Then Exit;
    : : : With Color Do
    : : : Begin
    : : : If BPP <= 8 Then
    : : : Begin
    : : : SetBlock(X*(BPP Shr 3),Y);
    : : : Index := Mem[$A000:((X+Y*ScreenW)*(BPP Shr 3)) - Temp Shl 16]
    : : : End
    : : : ELSE
    : : : Begin
    : : : SetBlock(X*(BPP Shr 3),Y);
    : : : Blue := Mem[$A000:((X+Y*ScreenW)*(BPP Shr 3)+0) - Temp Shl 16];
    : : : SetBlock(X*(BPP Shr 3)+1,Y);
    : : : Green := Mem[$A000:((X+Y*ScreenW)*(BPP Shr 3)+1) - Temp Shl 16];
    : : : SetBlock(X*(BPP Shr 3)+2,Y);
    : : : Red := Mem[$A000:((X+Y*ScreenW)*(BPP Shr 3)+2) - Temp Shl 16];
    : : : Index := -1;
    : : : End;
    : : : End;
    : : : End;
    : : :
    : : : PROCEDURE PutPixel(X,Y : Integer;Color, ClearColor : ColorType; Where : Word);
    : : : VAR Z : Byte;
    : : : Begin
    : : : If (X < 0) or (Y < 0) or (X >= ScreenW) or (Y >= ScreenH) Then Exit;
    : : : With Color Do
    : : : Begin
    : : : If BPP <= 8 Then
    : : : Begin
    : : : If Color.Index = ClearColor.Index Then Exit;
    : : : Z := BPP Shr 3;
    : : : SetBlock(X*Integer(Z),Y);
    : : : Mem[Where:((X+Y*ScreenW)*Integer(Z)) - (CurrentBlock Shl 16)] := Index;
    : : : End
    : : : ELSE
    : : : If (Color.Red = ClearColor.Red) AND
    : : : (Color.Green = ClearColor.Green) AND
    : : : (Color.Blue = ClearColor.Blue) Then Exit
    : : : ELSE
    : : : If Index = -1 Then
    : : : Begin
    : : : Case BPP Of
    : : : 16 : Begin
    : : : SetBlock(X*2,Y);
    : : : Mem[Where:((X+Y*ScreenW)*2+0) - CurrentBlock Shl 16] :=
    : : : (Blue Shr 3) AND 31 + ((Green Shr 3) Shl 7) AND 224;
    : : : SetBlock(X*2+1,Y);
    : : : Mem[Where:((X+Y*ScreenW)*2+1) - CurrentBlock Shl 16] :=
    : : : (((Green Shr 3) Shr 2) AND 7) + (((RED Shr 3) Shl 3) AND 248);
    : : : End;
    : : : 24,
    : : : 32 : Begin
    : : : SetBlock(X*(BPP Shr 3)+0,Y);
    : : : Mem[Where:((X+Y*ScreenW)*(BPP Shr 3)+0) - CurrentBlock Shl 16] := Blue;
    : : : SetBlock(X*(BPP Shr 3)+1,Y);
    : : : Mem[Where:((X+Y*ScreenW)*(BPP Shr 3)+1) - CurrentBlock Shl 16] := Green;
    : : : SetBlock(X*(BPP Shr 3)+2,Y);
    : : : Mem[Where:((X+Y*ScreenW)*(BPP Shr 3)+2) - CurrentBlock Shl 16] := Red;
    : : : End;
    : : : End;
    : : : End
    : : : ELSE
    : : : Begin
    : : : Color.Blue := Colors[Index,1];
    : : : Color.Green := Colors[Index,2];
    : : : Color.Red := Colors[Index,3];
    : : : SetBlock(X*(BPP Shr 3),Y);
    : : : Mem[Where:((X+Y*ScreenW)*(BPP Shr 3)+0) - CurrentBlock Shl 16] := Blue;
    : : : SetBlock(X*(BPP Shr 3)+1,Y);
    : : : Mem[Where:((X+Y*ScreenW)*(BPP Shr 3)+1) - CurrentBlock Shl 16] := Green;
    : : : SetBlock(X*(BPP Shr 3)+2,Y);
    : : : Mem[Where:((X+Y*ScreenW)*(BPP Shr 3)+2) - CurrentBlock Shl 16] := Red;
    : : : End;
    : : : End;
    : : : End;
    : : :
    : : : FUNCTION GetBMPInfo(Name : String; VAR Info : InfoBlock) : Boolean;
    : : : VAR Final : Boolean;
    : : : Begin
    : : : GetBMPInfo := False;
    : : : Assign(F, Name);{$I-}Reset(F,1);{$I+}
    : : : If IOResult <> 0 Then Exit;
    : : : BlockRead(F, Info.BMPHeader, SizeOf(Info.BMPHeader));
    : : :
    : : : Info.Valid := Info.BMPHeader.Identifier = Header;
    : : : Final := Info.Valid;
    : : :
    : : : Info.Cmp := Info.BMPHeader.Compression;
    : : : If Info.Cmp In[0] Then Final := True;
    : : :
    : : : Close(F);
    : : : GetBMPInfo := True;
    : : : End;
    : : :
    : : : PROCEDURE ShowBMPInfo(Info : InfoBlock);
    : : : Begin
    : : : With Info.BMPHeader Do
    : : : Begin
    : : : GotoXY(21, 1);WriteLn('Size = ',Size);
    : : : GotoXY(21, 2);WriteLn('BitMapOffset= ',BitMapOffset);
    : : : GotoXY(21, 3);WriteLn('Type = ',CheckType);
    : : : GotoXY(21, 4);WriteLn('Width = ',Width);
    : : : GotoXY(21, 5);WriteLn('Height = ',Height);
    : : : GotoXY(21, 6);WriteLn('Bits = ',ORD(Bits));
    : : : GotoXY(21, 7);WriteLn('Planes = ',ORD(Planes));
    : : : GotoXY(21, 8);WriteLn('FileSize = ',ImageSize);
    : : : GotoXY(21, 9);WriteLn('RealSize = ',Width*Height);
    : : : GotoXY(21,10);WriteLn('XPelsPerMet = ',XPels);
    : : : GotoXY(21,11);WriteLn('YPelsPerMet = ',YPels);
    : : : GotoXY(21,12);WriteLn('Color Used = ',ColorUsed);
    : : : GotoXY(21,13);WriteLn('Color Imp. = ',ColorImportant);
    : : : End;
    : : : End;
    : : :
    : : : FUNCTION ShowBMP(StartX, StartY : Integer; Name : String; DoColors : Boolean; Clear : ColorType; Where : Word) : Boolean;
    : : : VAR
    : : : Info : InfoBlock;
    : : : Color : ColorType;
    : : : Begin
    : : : If GetBMPInfo(Name,Info) = False Then
    : : : Begin
    : : : ShowBMP := False;
    : : : Exit;
    : : : End
    : : : ELSE ShowBMP := True;
    : : : Assign(F, Name);Reset(F,1);
    : : : BlockRead(F, Info.BMPHeader, SizeOf(Info.BMPHeader));
    : : :
    : : : Reset(F,1);
    : : : BlockRead(F, Junk, 14);
    : : : BlockRead(F, Junk, Info.BMPHeader.CheckType);
    : : : With Info.BMPHeader Do
    : : : If Bits = 1 Then
    : : : Begin
    : : : BlockRead(F, Colors[0], 8);
    : : : If DoColors Then
    : : : For X := 0 to 1 Do
    : : : SetPal(X*63, Colors[X,3]*63 DIV 255, Colors[X,2]*63 DIV 255, Colors[X,1]*63 DIV 255);
    : : : Reset(F,1);
    : : : BlockRead(F, Junk, BitMapOffset);
    : : : Z := Width SHR 3;
    : : : While Z MOD(4) <> 0 Do Inc(Z);
    : : : For Y := 0 to Height-1 Do
    : : : Begin
    : : : BlockRead(F, Junk, Z);
    : : : For X := 0 to Z-1 Do
    : : : Mem[Where:StartX+X+(StartY+Height-Y)*80] := ORD(Junk[X]);
    : : : End;
    : : : End;
    : : :
    : : : With Info.BMPHeader Do
    : : : If Bits = 4 Then
    : : : Begin
    : : : BlockRead(F, Colors[0], 64);
    : : : If DoColors Then
    : : : For X := 0 to 15 Do
    : : : SetPal(X, Colors[X,3]*63 DIV 255, Colors[X,2]*63 DIV 255, Colors[X,1]*63 DIV 255);
    : : : Reset(F,1);
    : : : BlockRead(F, Junk, BitMapOffset);
    : : : Z := Width SHR 1;
    : : : While Z MOD(4) <> 0 Do Inc(Z);
    : : : For Y := 0 to Height-1 Do
    : : : Begin
    : : : BlockRead(F, Junk, Z);
    : : : For X := 0 to (Width SHR 1)-1 Do
    : : : Begin
    : : : If BPP < 8 Then
    : : : Begin
    : : : Mem[Where:StartX+X*2+0+(StartY+Height-Y)*ScreenW] := ORD(Junk[X]) SHR 4;
    : : : Mem[Where:StartX+X*2+1+(StartY+Height-Y)*ScreenW] := ORD(Junk[X]) AND 15;
    : : : End
    : : : ELSE
    : : : Begin
    : : : Color.Index := ORD(Junk[X]) SHR 4;
    : : : PutPixel(StartX+X*2,StartY+Y,Color,Clear,Where);
    : : : Color.Index := ORD(Junk[X]) AND 15;
    : : : PutPixel(StartX+X*2+1,StartY+Y,Color,Clear,Where);
    : : : End;
    : : : End;
    : : : End;
    : : : End;
    : : :
    : : : With Info.BMPHeader Do
    : : : If (Bits = 8) Then
    : : : Begin
    : : : BlockRead(F, Colors[0], (PalCount+1)*4);
    : : : If DoColors Then
    : : : For X := 0 to PalCount Do
    : : : SetPal(X, Colors[X,3]*62 DIV 255, Colors[X,2]*63 DIV 255, Colors[X,1]*63 DIV 255);
    : : : Reset(F,1);
    : : : BlockRead(F, Junk, BitMapOffset);
    : : : Z := (Width*Bits) SHR 3;
    : : : While Z MOD(4) <> 0 Do Inc(Z);
    : : : For Y := Height-1 downto 0 Do
    : : : Begin
    : : : BlockRead(F, Junk, Width);
    : : : For X := 0 to Width-1 do
    : : : Begin
    : : : Color.Index := ORD(Junk[X]);
    : : : PutPixel(StartX+X,StartY+Y,Color,Clear,Where);
    : : : End;
    : : : For X := 1 to Z-Width Do BlockRead(F, C, 1);
    : : : End;
    : : : End;
    : : :
    : : : With Info.BMPHeader Do
    : : : If (Bits = 24) or (Bits = 32) Then
    : : : Begin
    : : : If CurrentMode <= $109 Then
    : : : Begin
    : : : If Grayscale Then
    : : : Begin
    : : : { GrayScale }
    : : : For X := 0 to PalCount Do
    : : : SetPal(X, X*63 DIV 255, X*63 DIV 255, X*63 DIV 255);
    : : : End
    : : : ELSE
    : : : Begin
    : : : { Color }
    : : : { Using a Default Palette, closest color using diff in R,G & B }
    : : : If DoColors Then
    : : : Begin
    : : : For X := 0 to MaxPal Do
    : : : Move(DefaultPal[X],Colors[X],SizeOf(DefaultPal[X]));
    : : : { Convert default Palette from 8-bit to 6-bit }
    : : : For X := 0 to MaxPal Do
    : : : SetPal(X, Colors[X,1]*63 DIV 255,
    : : : Colors[X,2]*63 DIV 255,
    : : : Colors[X,3]*63 DIV 255);
    : : : End;
    : : : End;
    : : : End;
    : : : Reset(F,1);
    : : : BlockRead(F, Junk, BitMapOffset);
    : : : Z := (Width*Bits) SHR 3;
    : : : While Z MOD(4) <> 0 Do Inc(Z);
    : : : Color.Index := -1; Bits := (Bits shr 3);
    : : : For Y := Height-1 downto 0 Do
    : : : Begin
    : : : BlockRead(F, Junk, Z);
    : : : Temp4 := 0;
    : : : For X := 0 to Width-1 do
    : : : Begin
    : : : If BPP <= 8 Then
    : : : Begin
    : : : If GrayScale Then
    : : : Color.Index := (Ord(Junk[Temp4+0])+
    : : : Ord(Junk[Temp4+1])+
    : : : Ord(Junk[Temp4+2])) DIV 3
    : : : ELSE
    : : : Begin
    : : : Temp2[5] := 0; Temp2[6] := $7FFF;
    : : : For Temp3 := 0 to MaxPal Do
    : : : Begin
    : : : Temp2[1] := Ord(Junk[Temp4+0])-(Colors[Temp3,3]);
    : : : Temp2[2] := Ord(Junk[Temp4+1])-(Colors[Temp3,2]);
    : : : Temp2[3] := Ord(Junk[Temp4+2])-(Colors[Temp3,1]);
    : : : Temp2[4] := (Abs(Temp2[1])+Abs(Temp2[2])+Abs(Temp2[3]));
    : : : If Temp2[4] <= Temp2[6] Then
    : : : Begin
    : : : Temp2[5] := Temp3;
    : : : Temp2[6] := Temp2[4];
    : : : End;
    : : : End;
    : : : Color.Index := Temp2[5];
    : : : End;
    : : : End
    : : : ELSE
    : : : Begin
    : : : Color.Blue := Ord(Junk[Temp4+0]);
    : : : Color.Green := Ord(Junk[Temp4+1]);
    : : : Color.Red := Ord(Junk[Temp4+2]);
    : : : End;
    : : : PutPixel(StartX+X,StartY+Y,Color,Clear,Where);
    : : : Temp4 := Temp4+Bits; { Faster than a multiply }
    : : : End;
    : : : If KeyPressed Then Begin While KeyPressed Do ReadKey; Break; End;
    : : : End;
    : : : End;
    : : : Close(F);
    : : : End;
    : : :
    : : : End.
    : : : [/code]
    : : :
    : : : Phat Nat
    : : :
    : : :
    : :
    : :
    : : I copied the code into notepad and saved the whole thing as SHOW_BMP.TPU in the UNITS directory. However, the program that uses the unit now doesnt recognise this file. How do I save notepad files as *.TPU?
    : :
    : : thank you SO much! :)
    : : na
    : :
    : Save it as a .txt file. Then use the explorer to change the extension (extensions must be visible). Notepad adds .txt automatically.
    :

    This is ther error I get. I dont understand why this is happening seeing as pascal obviously recognizes the file as a TPU..
    Error 72: Unit file format error C:TPUNITSSHOW_BMP.TPU

  • zibadianzibadian Posts: 6,349Member
    : : : : Here is the second half. Sorry for the split.
    : : : : [code]
    : : : : PROCEDURE GetPixel(X,Y : Integer;VAR Color : ColorType);
    : : : : Begin
    : : : : If (X < 0) or (Y < 0) or (X >= ScreenW) or (Y >= ScreenH) Then Exit;
    : : : : With Color Do
    : : : : Begin
    : : : : If BPP <= 8 Then
    : : : : Begin
    : : : : SetBlock(X*(BPP Shr 3),Y);
    : : : : Index := Mem[$A000:((X+Y*ScreenW)*(BPP Shr 3)) - Temp Shl 16]
    : : : : End
    : : : : ELSE
    : : : : Begin
    : : : : SetBlock(X*(BPP Shr 3),Y);
    : : : : Blue := Mem[$A000:((X+Y*ScreenW)*(BPP Shr 3)+0) - Temp Shl 16];
    : : : : SetBlock(X*(BPP Shr 3)+1,Y);
    : : : : Green := Mem[$A000:((X+Y*ScreenW)*(BPP Shr 3)+1) - Temp Shl 16];
    : : : : SetBlock(X*(BPP Shr 3)+2,Y);
    : : : : Red := Mem[$A000:((X+Y*ScreenW)*(BPP Shr 3)+2) - Temp Shl 16];
    : : : : Index := -1;
    : : : : End;
    : : : : End;
    : : : : End;
    : : : :
    : : : : PROCEDURE PutPixel(X,Y : Integer;Color, ClearColor : ColorType; Where : Word);
    : : : : VAR Z : Byte;
    : : : : Begin
    : : : : If (X < 0) or (Y < 0) or (X >= ScreenW) or (Y >= ScreenH) Then Exit;
    : : : : With Color Do
    : : : : Begin
    : : : : If BPP <= 8 Then
    : : : : Begin
    : : : : If Color.Index = ClearColor.Index Then Exit;
    : : : : Z := BPP Shr 3;
    : : : : SetBlock(X*Integer(Z),Y);
    : : : : Mem[Where:((X+Y*ScreenW)*Integer(Z)) - (CurrentBlock Shl 16)] := Index;
    : : : : End
    : : : : ELSE
    : : : : If (Color.Red = ClearColor.Red) AND
    : : : : (Color.Green = ClearColor.Green) AND
    : : : : (Color.Blue = ClearColor.Blue) Then Exit
    : : : : ELSE
    : : : : If Index = -1 Then
    : : : : Begin
    : : : : Case BPP Of
    : : : : 16 : Begin
    : : : : SetBlock(X*2,Y);
    : : : : Mem[Where:((X+Y*ScreenW)*2+0) - CurrentBlock Shl 16] :=
    : : : : (Blue Shr 3) AND 31 + ((Green Shr 3) Shl 7) AND 224;
    : : : : SetBlock(X*2+1,Y);
    : : : : Mem[Where:((X+Y*ScreenW)*2+1) - CurrentBlock Shl 16] :=
    : : : : (((Green Shr 3) Shr 2) AND 7) + (((RED Shr 3) Shl 3) AND 248);
    : : : : End;
    : : : : 24,
    : : : : 32 : Begin
    : : : : SetBlock(X*(BPP Shr 3)+0,Y);
    : : : : Mem[Where:((X+Y*ScreenW)*(BPP Shr 3)+0) - CurrentBlock Shl 16] := Blue;
    : : : : SetBlock(X*(BPP Shr 3)+1,Y);
    : : : : Mem[Where:((X+Y*ScreenW)*(BPP Shr 3)+1) - CurrentBlock Shl 16] := Green;
    : : : : SetBlock(X*(BPP Shr 3)+2,Y);
    : : : : Mem[Where:((X+Y*ScreenW)*(BPP Shr 3)+2) - CurrentBlock Shl 16] := Red;
    : : : : End;
    : : : : End;
    : : : : End
    : : : : ELSE
    : : : : Begin
    : : : : Color.Blue := Colors[Index,1];
    : : : : Color.Green := Colors[Index,2];
    : : : : Color.Red := Colors[Index,3];
    : : : : SetBlock(X*(BPP Shr 3),Y);
    : : : : Mem[Where:((X+Y*ScreenW)*(BPP Shr 3)+0) - CurrentBlock Shl 16] := Blue;
    : : : : SetBlock(X*(BPP Shr 3)+1,Y);
    : : : : Mem[Where:((X+Y*ScreenW)*(BPP Shr 3)+1) - CurrentBlock Shl 16] := Green;
    : : : : SetBlock(X*(BPP Shr 3)+2,Y);
    : : : : Mem[Where:((X+Y*ScreenW)*(BPP Shr 3)+2) - CurrentBlock Shl 16] := Red;
    : : : : End;
    : : : : End;
    : : : : End;
    : : : :
    : : : : FUNCTION GetBMPInfo(Name : String; VAR Info : InfoBlock) : Boolean;
    : : : : VAR Final : Boolean;
    : : : : Begin
    : : : : GetBMPInfo := False;
    : : : : Assign(F, Name);{$I-}Reset(F,1);{$I+}
    : : : : If IOResult <> 0 Then Exit;
    : : : : BlockRead(F, Info.BMPHeader, SizeOf(Info.BMPHeader));
    : : : :
    : : : : Info.Valid := Info.BMPHeader.Identifier = Header;
    : : : : Final := Info.Valid;
    : : : :
    : : : : Info.Cmp := Info.BMPHeader.Compression;
    : : : : If Info.Cmp In[0] Then Final := True;
    : : : :
    : : : : Close(F);
    : : : : GetBMPInfo := True;
    : : : : End;
    : : : :
    : : : : PROCEDURE ShowBMPInfo(Info : InfoBlock);
    : : : : Begin
    : : : : With Info.BMPHeader Do
    : : : : Begin
    : : : : GotoXY(21, 1);WriteLn('Size = ',Size);
    : : : : GotoXY(21, 2);WriteLn('BitMapOffset= ',BitMapOffset);
    : : : : GotoXY(21, 3);WriteLn('Type = ',CheckType);
    : : : : GotoXY(21, 4);WriteLn('Width = ',Width);
    : : : : GotoXY(21, 5);WriteLn('Height = ',Height);
    : : : : GotoXY(21, 6);WriteLn('Bits = ',ORD(Bits));
    : : : : GotoXY(21, 7);WriteLn('Planes = ',ORD(Planes));
    : : : : GotoXY(21, 8);WriteLn('FileSize = ',ImageSize);
    : : : : GotoXY(21, 9);WriteLn('RealSize = ',Width*Height);
    : : : : GotoXY(21,10);WriteLn('XPelsPerMet = ',XPels);
    : : : : GotoXY(21,11);WriteLn('YPelsPerMet = ',YPels);
    : : : : GotoXY(21,12);WriteLn('Color Used = ',ColorUsed);
    : : : : GotoXY(21,13);WriteLn('Color Imp. = ',ColorImportant);
    : : : : End;
    : : : : End;
    : : : :
    : : : : FUNCTION ShowBMP(StartX, StartY : Integer; Name : String; DoColors : Boolean; Clear : ColorType; Where : Word) : Boolean;
    : : : : VAR
    : : : : Info : InfoBlock;
    : : : : Color : ColorType;
    : : : : Begin
    : : : : If GetBMPInfo(Name,Info) = False Then
    : : : : Begin
    : : : : ShowBMP := False;
    : : : : Exit;
    : : : : End
    : : : : ELSE ShowBMP := True;
    : : : : Assign(F, Name);Reset(F,1);
    : : : : BlockRead(F, Info.BMPHeader, SizeOf(Info.BMPHeader));
    : : : :
    : : : : Reset(F,1);
    : : : : BlockRead(F, Junk, 14);
    : : : : BlockRead(F, Junk, Info.BMPHeader.CheckType);
    : : : : With Info.BMPHeader Do
    : : : : If Bits = 1 Then
    : : : : Begin
    : : : : BlockRead(F, Colors[0], 8);
    : : : : If DoColors Then
    : : : : For X := 0 to 1 Do
    : : : : SetPal(X*63, Colors[X,3]*63 DIV 255, Colors[X,2]*63 DIV 255, Colors[X,1]*63 DIV 255);
    : : : : Reset(F,1);
    : : : : BlockRead(F, Junk, BitMapOffset);
    : : : : Z := Width SHR 3;
    : : : : While Z MOD(4) <> 0 Do Inc(Z);
    : : : : For Y := 0 to Height-1 Do
    : : : : Begin
    : : : : BlockRead(F, Junk, Z);
    : : : : For X := 0 to Z-1 Do
    : : : : Mem[Where:StartX+X+(StartY+Height-Y)*80] := ORD(Junk[X]);
    : : : : End;
    : : : : End;
    : : : :
    : : : : With Info.BMPHeader Do
    : : : : If Bits = 4 Then
    : : : : Begin
    : : : : BlockRead(F, Colors[0], 64);
    : : : : If DoColors Then
    : : : : For X := 0 to 15 Do
    : : : : SetPal(X, Colors[X,3]*63 DIV 255, Colors[X,2]*63 DIV 255, Colors[X,1]*63 DIV 255);
    : : : : Reset(F,1);
    : : : : BlockRead(F, Junk, BitMapOffset);
    : : : : Z := Width SHR 1;
    : : : : While Z MOD(4) <> 0 Do Inc(Z);
    : : : : For Y := 0 to Height-1 Do
    : : : : Begin
    : : : : BlockRead(F, Junk, Z);
    : : : : For X := 0 to (Width SHR 1)-1 Do
    : : : : Begin
    : : : : If BPP < 8 Then
    : : : : Begin
    : : : : Mem[Where:StartX+X*2+0+(StartY+Height-Y)*ScreenW] := ORD(Junk[X]) SHR 4;
    : : : : Mem[Where:StartX+X*2+1+(StartY+Height-Y)*ScreenW] := ORD(Junk[X]) AND 15;
    : : : : End
    : : : : ELSE
    : : : : Begin
    : : : : Color.Index := ORD(Junk[X]) SHR 4;
    : : : : PutPixel(StartX+X*2,StartY+Y,Color,Clear,Where);
    : : : : Color.Index := ORD(Junk[X]) AND 15;
    : : : : PutPixel(StartX+X*2+1,StartY+Y,Color,Clear,Where);
    : : : : End;
    : : : : End;
    : : : : End;
    : : : : End;
    : : : :
    : : : : With Info.BMPHeader Do
    : : : : If (Bits = 8) Then
    : : : : Begin
    : : : : BlockRead(F, Colors[0], (PalCount+1)*4);
    : : : : If DoColors Then
    : : : : For X := 0 to PalCount Do
    : : : : SetPal(X, Colors[X,3]*62 DIV 255, Colors[X,2]*63 DIV 255, Colors[X,1]*63 DIV 255);
    : : : : Reset(F,1);
    : : : : BlockRead(F, Junk, BitMapOffset);
    : : : : Z := (Width*Bits) SHR 3;
    : : : : While Z MOD(4) <> 0 Do Inc(Z);
    : : : : For Y := Height-1 downto 0 Do
    : : : : Begin
    : : : : BlockRead(F, Junk, Width);
    : : : : For X := 0 to Width-1 do
    : : : : Begin
    : : : : Color.Index := ORD(Junk[X]);
    : : : : PutPixel(StartX+X,StartY+Y,Color,Clear,Where);
    : : : : End;
    : : : : For X := 1 to Z-Width Do BlockRead(F, C, 1);
    : : : : End;
    : : : : End;
    : : : :
    : : : : With Info.BMPHeader Do
    : : : : If (Bits = 24) or (Bits = 32) Then
    : : : : Begin
    : : : : If CurrentMode <= $109 Then
    : : : : Begin
    : : : : If Grayscale Then
    : : : : Begin
    : : : : { GrayScale }
    : : : : For X := 0 to PalCount Do
    : : : : SetPal(X, X*63 DIV 255, X*63 DIV 255, X*63 DIV 255);
    : : : : End
    : : : : ELSE
    : : : : Begin
    : : : : { Color }
    : : : : { Using a Default Palette, closest color using diff in R,G & B }
    : : : : If DoColors Then
    : : : : Begin
    : : : : For X := 0 to MaxPal Do
    : : : : Move(DefaultPal[X],Colors[X],SizeOf(DefaultPal[X]));
    : : : : { Convert default Palette from 8-bit to 6-bit }
    : : : : For X := 0 to MaxPal Do
    : : : : SetPal(X, Colors[X,1]*63 DIV 255,
    : : : : Colors[X,2]*63 DIV 255,
    : : : : Colors[X,3]*63 DIV 255);
    : : : : End;
    : : : : End;
    : : : : End;
    : : : : Reset(F,1);
    : : : : BlockRead(F, Junk, BitMapOffset);
    : : : : Z := (Width*Bits) SHR 3;
    : : : : While Z MOD(4) <> 0 Do Inc(Z);
    : : : : Color.Index := -1; Bits := (Bits shr 3);
    : : : : For Y := Height-1 downto 0 Do
    : : : : Begin
    : : : : BlockRead(F, Junk, Z);
    : : : : Temp4 := 0;
    : : : : For X := 0 to Width-1 do
    : : : : Begin
    : : : : If BPP <= 8 Then
    : : : : Begin
    : : : : If GrayScale Then
    : : : : Color.Index := (Ord(Junk[Temp4+0])+
    : : : : Ord(Junk[Temp4+1])+
    : : : : Ord(Junk[Temp4+2])) DIV 3
    : : : : ELSE
    : : : : Begin
    : : : : Temp2[5] := 0; Temp2[6] := $7FFF;
    : : : : For Temp3 := 0 to MaxPal Do
    : : : : Begin
    : : : : Temp2[1] := Ord(Junk[Temp4+0])-(Colors[Temp3,3]);
    : : : : Temp2[2] := Ord(Junk[Temp4+1])-(Colors[Temp3,2]);
    : : : : Temp2[3] := Ord(Junk[Temp4+2])-(Colors[Temp3,1]);
    : : : : Temp2[4] := (Abs(Temp2[1])+Abs(Temp2[2])+Abs(Temp2[3]));
    : : : : If Temp2[4] <= Temp2[6] Then
    : : : : Begin
    : : : : Temp2[5] := Temp3;
    : : : : Temp2[6] := Temp2[4];
    : : : : End;
    : : : : End;
    : : : : Color.Index := Temp2[5];
    : : : : End;
    : : : : End
    : : : : ELSE
    : : : : Begin
    : : : : Color.Blue := Ord(Junk[Temp4+0]);
    : : : : Color.Green := Ord(Junk[Temp4+1]);
    : : : : Color.Red := Ord(Junk[Temp4+2]);
    : : : : End;
    : : : : PutPixel(StartX+X,StartY+Y,Color,Clear,Where);
    : : : : Temp4 := Temp4+Bits; { Faster than a multiply }
    : : : : End;
    : : : : If KeyPressed Then Begin While KeyPressed Do ReadKey; Break; End;
    : : : : End;
    : : : : End;
    : : : : Close(F);
    : : : : End;
    : : : :
    : : : : End.
    : : : : [/code]
    : : : :
    : : : : Phat Nat
    : : : :
    : : : :
    : : :
    : : :
    : : : I copied the code into notepad and saved the whole thing as SHOW_BMP.TPU in the UNITS directory. However, the program that uses the unit now doesnt recognise this file. How do I save notepad files as *.TPU?
    : : :
    : : : thank you SO much! :)
    : : : na
    : : :
    : : Save it as a .txt file. Then use the explorer to change the extension (extensions must be visible). Notepad adds .txt automatically.
    : :
    :
    : This is ther error I get. I dont understand why this is happening seeing as pascal obviously recognizes the file as a TPU..
    : Error 72: Unit file format error C:TPUNITSSHOW_BMP.TPU
    :
    :
    Check if the it starts with the word [b]unit[/b] followed by the filename without the extension and a semi-colon. Then it should have the word [b]interface[/b]. And after the public declarations it must contain the word [b]implementation[/b].
    The file must also be in plain text and not formatted text or be a word-document.
  • Phat NatPhat Nat Posts: 757Member
    : : : I copied the code into notepad and saved the whole thing as SHOW_BMP.TPU in the UNITS directory. However, the program that uses the unit now doesnt recognise this file. How do I save notepad files as *.TPU?
    : : :
    : : : thank you SO much! :)
    : : : na
    : : :
    : : Save it as a .txt file. Then use the explorer to change the extension (extensions must be visible). Notepad adds .txt automatically.
    : :
    :
    : This is ther error I get. I dont understand why this is happening seeing as pascal obviously recognizes the file as a TPU..
    : Error 72: Unit file format error C:TPUNITSSHOW_BMP.TPU

    You need to save it as a .PAS file because it is not compiled yet. It will automatically convert it to .TPU for you.

    Phat Nat

«1
Sign In or Register to comment.