Grafika Vesa, 10eh - Część praktyczna.docx

(27 KB) Pobierz

Grafika 10eh

Część praktyczna



Poniżej jest kod źródlowy modulu graficznego graph10Eh z objaśnieniami. Możesz troszkę pokopiować do siebie, żeby otrzymać szybką grafikę w trybie 320x200x16bitów.

- Dochodzi do 500 klatek na sekundę.
- Odtwarza pliki bmp.
- Symuluje przezroczystość
- Rysuje szybką linię
- Potrafi robić print screeny

Zapraszam do nauki

KOD ŹRÓDLOWY:


{$G+}
UNIT Graph10E;


INTERFACE
USES Types, Fonts, Errors, Standard, MMX;


CONST
 V_MaxEX=320;
 V_MaxEY=200;

 BrakZnaku:ARRAY[0..7] OF Byte=
 {(00, 66, 36, 24, 24, 36, 66, 00);}
 (0, 0, 0, 0, 0, 0, 0, 0);

 EkranRect:TRect=
 (X:0;Y:0;W:320;H:200);

 MMX_Enabled=FALSE;

 VerticalRetrace:Boolean=True;

 V_TextNormal:Boolean=True;
 VGA_Tryb:Boolean=FAlse;

TYPE
 TEkran10Eh=RECORD
   Ekr1 : Pointer;
   Ekr2 : Pointer;
 END;

 TObraz=RECORD
   W,
   H             : Word;
   TCol          : Word;
   Transparent   : Boolean;
   BMP           : Pointer;
   BPP           : Byte;
   Paleta        : Pointer;
 END;

 TPicture       =^TObraz;

 TBMPCaption    = RECORD
   BM           : Word;
   Size         : Longint;
   rezerw       : Longint;
   obraz_offset : Longint;
   info         : Longint;
   Width        : Longint;
   Height       : Longint;
   LPO          : Word;
   BPP          : Word;
   kompresja    : Longint;
   Size_Obr     : Longint;
   HDPI         : Longint;
   VDPI         : Longint;
   Colors       : Longint;
   UColors      : Longint;
 END;

 TRGB           = RECORD
   R, G, B      : Byte;
 END;

 TPaleta        = RECORD
   Color        : ARRAY[0..255] OF TRGB;
 END;

 PPaleta        =^TPaleta;



VAR
   DefaultRect  : TRect;
   V_Ekran      : TEkran10Eh;




FUNCTION V_RGB(r, g, b : Byte) : Word;
{FUNCTION  V_RGB(R, G, B:Byte):Word;}
FUNCTION  V_GetBuf(VAR Buf:TEkran10Eh):Byte;
FUNCTION  V_LoadBMP24(Buf:TPicture;CONST Fn:STRING):Boolean;

PROCEDURE V_PrintScreen(CONST Fn:STRING);
PROCEDURE V_ToRGB(c : Word; VAR r, g, b : Byte);
{PROCEDURE V_ToRGB(Col:Word;VAR R, G, B:Byte);}
PROCEDURE V_FreeBuf(VAR Buf:TEkran10Eh);
PROCEDURE ShowCaptionBMP(CONST Fn:STRING);
PROCEDURE V_VRet;
PROCEDURE V_FillChar32(Dest:Pointer;Count:word; Value:Word);
PROCEDURE V_FlipBuf(Buf : TEkran10Eh);
PROCEDURE V_Set10Eh;
PROCEDURE V_End10Eh;
PROCEDURE V_ClearScreen(Buf:TEkran10Eh; Col:Word);
PROCEDURE V_HLine(Buf:TEkran10Eh; X, Y, W:Integer;C:Word);
PROCEDURE V_VLine(Buf:TEkran10Eh; X, Y, H:Integer;C:Word);
PROCEDURE V_Pix(Buf:TEkran10Eh; X, Y:Integer;C:Word);
PROCEDURE V_Line(Buf:TEkran10Eh; X1, Y1, X2, Y2:Integer;C:Word);
PROCEDURE V_HLineAlpha1(Buf:TEkran10Eh; X, Y, W:Integer;C:Word;Alpha:Byte);
PROCEDURE V_RozmyjEkran(Buf:TEkran10Eh; Speed:Byte);
PROCEDURE V_KopiujObraz(Buf:TEkran10Eh; Obraz:TPicture; X, Y:Integer);
PROCEDURE V_NewImage(VAR Picture:TPicture);
PROCEDURE V_FreeImage(VAR Picture:TPicture);
PROCEDURE V_WriteXY(Buf:TEkran10Eh;Font:PFont;X, Y:Integer;CONST S:STRING;C:Word;StepX:Byte);
PROCEDURE V_CenterText(Buf:TEkran10Eh;Font:PFont;X, Y:Integer;CONST S:STRING;C:Word;StepX:Byte);
PROCEDURE V_CopyLine(Buf:TEkran10Eh; Dest:Pointer; X, Y, W:Integer);
PROCEDURE V_CopyFromLine(Buf:TEkran10Eh; Line:Pointer; X, Y, W:Integer);
PROCEDURE V_LineX(X1, Y1, X2, Y2 : Integer; C: Word);
PROCEDURE V_CreateMirroredBMP(VAR Source, Dest:TPicture);


IMPLEMENTATION



{FUNCTION V_RGB(r, g, b : Byte) : Word;ASSEMBLER;
ASM
 Mov  Al, [r]
 Shl  Ax, 5
 Mov  Al, [g]
 Shl  Ax, 3
 And  Al, 11100000b
 Shr  [b], 3
 Or   Al, [b]
END;

PROCEDURE V_ToRGB(c : Word; VAR r, g, b : Byte); ASSEMBLER;
ASM
 Mov  Cx, Ds
 Mov  Ax, [c]
 Lds  Bx, [b]
 Mov  [Bx], Al
 Shl  BYTE PTR [Bx], 3
 Shr  Ax, 5
 Lds  Bx, [g]
 Mov  [Bx], Al
 Shl  BYTE PTR [Bx], 2
 Shr  Ax, 6
 Lds  Bx, [r]
 Mov  [Bx], Al
 Shl  BYTE PTR [Bx], 3
 Mov  Ds, Cx
END;


FUNCTION V_RGB(R, G, B:Byte):Word;
BEGIN
 V_RGB:=(B SHR 3) OR ((G SHR 2) SHL 5) OR ((R SHR 3) SHL 11);
END;
{*************************************************************************
PROCEDURE V_ToRGB(Col:Word;VAR R, G, B:Byte);
BEGIN
 R:=(Col AND (31 SHL 11)) SHR 8;
 G:=(Col AND (63 SHL 5)) SHR 3;
 B:=BYTE(Col SHL 3);
END;


FUNCTION V_GetBuf(VAR Buf:TEkran10Eh):Byte;
BEGIN
 Buf.EKR1:=NIL;
 Buf.EKR2:=NIL;

 V_GetBuf:=E_OK;
 IF MemAvail<128000 THEN
 BEGIN
   V_GetBuf:=E_PAMIEC;
   Exit;
 END;

 GetMem(Buf.EKR1, 64000);
 GetMem(Buf.EKR2, 64000);

 V_Ekran.EKR1:=Buf.EKR1;
 V_Ekran.EKR2:=Buf.EKR2;
END;

PROCEDURE V_FreeBuf(VAR Buf:TEkran10Eh);
BEGIN
 FreeMem(Buf.EKR1, 64000);
 FreeMem(Buf.EKR2, 64000);
 Buf.EKR1:=NIL;
 Buf.EKR2:=NIL;

 V_Ekran.EKR1:=NIL;
 V_Ekran.EKR2:=NIL;
END;

PROCEDURE V_VRet;
BEGIN
IF VerticalRetrace THEN
  ASM

      Mov Dx, 3dah

      @Powrot:

        In   Al, Dx
        Test Al, 00001000b
        Jnz  @Powrot

  ...

Zgłoś jeśli naruszono regulamin