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 : 4 102

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 :)
 

Commentaires et avis

Aucun commentaire pour le moment.

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,203 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.