begin process at 2008 08 28 21:47:00
1 233 393 membres
485 nouveaux aujourd'hui
14 291 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

3 FONCTIONS GRAPHIQUES PLUS RAPIDES QUE LES FONCTIONS DE BASES DE DELPHI


Information sur la source

Catégorie :Delphi et asm Niveau : Débutant Date de création : 25/06/2003 Date de mise à jour : 25/06/2003 15:51:25 Vu : 3 671

Note :
Aucune note

Commentaire sur cette source (0)
Ajouter un commentaire et/ou une note

Description

Voici 3 fonctions graphique, la premiere permet de creer un point sur 1 bitmap, la seconde a crée une droite horizontal, et la derniere à colorer tout le bitmap...

Les 2 premiers sont environs 5 fois plus rapides que les fonctions de bases de delphi, la derniere tres peu parcontre (5%+) enfin c deja ça de gagné :)

Aussi pour ASMClear, en mode 24 bits elle fonctionne mais pas comme il faut :-\ si quelqu'un sait pourquoi je suis preneur

Si l'image n'est pas en 32 ou 24 bits on a la procedure tout bete de delphi,

Source

  • procedure ASMPoint(Bitmap:TBitmap;X,Y:dword;color:dword);
  • var
  • p1:pointer;
  • begin
  • if (X>Bitmap.Height-1) or (Y>Bitmap.Width-1) then exit;
  • p1:=Bitmap.ScanLine[X-1];
  • case Bitmap.PixelFormat of
  • pf32bit:
  • asm
  • push edi
  • mov edi,p1
  • mov eax,y
  • shl eax,2
  • add edi,eax
  • mov eax,color
  • mov [edi],eax
  • pop edi
  • end;
  • pf24bit:
  • asm
  • push edi
  • mov edi,p1
  • mov eax,y
  • imul eax,3
  • add edi,eax
  • mov eax,color
  • mov ecx,eax
  • shr ecx,16
  • mov [edi],ax
  • mov [edi+2],cl
  • pop edi
  • end;
  • else
  • bitmap.Canvas.Pixels[X,Y]:=Color;
  • end;
  • procedure ASMHorizontal(Bitmap:TBitmap;Y:dword;color:dword);
  • var
  • p1:pointer;m:dword;
  • begin
  • p1:=Bitmap.ScanLine[Y];
  • m:=Bitmap.Width;
  • case Bitmap.PixelFormat of
  • pf32bit:
  • asm
  • push edi
  • mov ecx,m
  • mov eax,color
  • mov edi,p1
  • rep stosd
  • pop edi
  • end;
  • pf24bit:
  • asm
  • push edi
  • xor ecx,ecx
  • mov eax,color
  • mov edi,p1
  • @Loop1:
  • mov [edi],eax
  • add edi,3
  • inc ecx
  • cmp ecx,m
  • jne @Loop1
  • pop edi
  • end;
  • else
  • Bitmap.Canvas.Pen.Color:=Color;
  • Bitmap.Canvas.MoveTo(0,Y);
  • Bitmap.Canvas.LineTo(m,Y);
  • end;
  • end;
  • procedure ASMClear(Bitmap:TBitmap;color:dword);
  • var
  • p1:pointer;m:dword;
  • begin
  • with bitmap do begin
  • p1:=ScanLine[height-1];
  • m:=Width*Height;
  • end;
  • case Bitmap.PixelFormat of
  • pf32bit:
  • asm
  • push edi
  • mov ecx,m
  • mov eax,color
  • mov edi,p1
  • rep stosd
  • pop edi
  • end;
  • pf24bit:
  • asm
  • push edi
  • xor ecx,ecx
  • mov eax,color
  • mov edx,color
  • shr edx,16
  • mov edi,p1
  • @Loop1:
  • mov [edi],ax
  • mov [edi+2],dl
  • add edi,3
  • inc ecx
  • cmp ecx,m
  • jne @Loop1
  • pop edi
  • end;
  • else
  • Bitmap.Canvas.Brush.Color:=Color;
  • Bitmap.Canvas.Rectangle(0,0,Bitmap.Width,Bitmap.Height);
  • end;
  • end;
procedure ASMPoint(Bitmap:TBitmap;X,Y:dword;color:dword);
var
p1:pointer;
begin
if (X>Bitmap.Height-1) or (Y>Bitmap.Width-1) then exit;
p1:=Bitmap.ScanLine[X-1];
case Bitmap.PixelFormat of
pf32bit:
  asm
  push edi
  mov edi,p1
  mov eax,y
  shl eax,2
  add edi,eax
  mov eax,color
  mov [edi],eax
  pop edi
  end;
pf24bit:
  asm
  push edi
  mov edi,p1
  mov eax,y
  imul eax,3
  add edi,eax
  mov eax,color
  mov ecx,eax
  shr ecx,16
  mov [edi],ax
  mov [edi+2],cl
  pop edi
  end;
else
bitmap.Canvas.Pixels[X,Y]:=Color;
end;

procedure ASMHorizontal(Bitmap:TBitmap;Y:dword;color:dword);
var
p1:pointer;m:dword;
begin
p1:=Bitmap.ScanLine[Y];
m:=Bitmap.Width;
case Bitmap.PixelFormat of
pf32bit:
  asm
  push  edi
  mov ecx,m
  mov eax,color
  mov edi,p1
  rep stosd
  pop  edi
  end;
pf24bit:
  asm
  push  edi
  xor ecx,ecx
  mov eax,color
  mov edi,p1
  @Loop1:
  mov [edi],eax
  add edi,3
  inc ecx
  cmp ecx,m
  jne @Loop1
  pop  edi
  end;
else
Bitmap.Canvas.Pen.Color:=Color;
Bitmap.Canvas.MoveTo(0,Y);
Bitmap.Canvas.LineTo(m,Y);
end;
end;

procedure ASMClear(Bitmap:TBitmap;color:dword);
var
p1:pointer;m:dword;
begin
with bitmap do begin
p1:=ScanLine[height-1];
m:=Width*Height;
end;
case Bitmap.PixelFormat of
pf32bit:
asm
push  edi
mov ecx,m
mov eax,color
mov edi,p1
rep stosd
pop  edi
end;
pf24bit:
asm
push  edi
xor ecx,ecx
mov eax,color
mov edx,color
shr edx,16
mov edi,p1
@Loop1:
mov [edi],ax
mov [edi+2],dl
add edi,3
inc ecx
cmp ecx,m
jne @Loop1
pop  edi
end;
else
Bitmap.Canvas.Brush.Color:=Color;
Bitmap.Canvas.Rectangle(0,0,Bitmap.Width,Bitmap.Height);
end;
end;

Conclusion

ça peu etre interressant pour faires de petit jeux sans lag, et sans utilisé scanline tout le temps :)
    Aucun commentaire pour le moment.

Ajouter un commentaire

Pub



Appels d'offres

Recherche developpeur ...
Budget : 700€
SITE MARCHAND LOCATION...
Budget : 3 000€
SITE MARCHAND POUR HOTEL
Budget : 4 000€

CalendriCode

Août 2008
LMMJVSD
    123
45678910
11121314151617
18192021222324
25262728293031

Boutique

Boutique de goodies CodeS-SourceS