Code : Tout sélectionner
Procedure.l ReverseRGB(Color.l)
ProcedureReturn RGB(Blue(Color),Green(Color),Red(Color))
EndProcedure
Procedure.l PointMemory(Image.l,X.l,Y.l)
Protected bmp.BITMAP,Color.l,Width.l,Height.l,Depth.b,offset.b,*Address
;On initialise la taille de l'image
Width=ImageWidth(Image)
Height=ImageHeight(Image)
Depth=ImageDepth(Image)/8
;On vérifie les coordonnées
If X<0 Or X>Width-1 Or Y<0 Or Y>Height-1
ProcedureReturn -1
EndIf
;Adresse de l'image
GetObject_(ImageID(Image),SizeOf(BITMAP),@bmp)
;Adresse de l'image
*Address=bmp\bmBits
;Longueur en octets d'une ligne
offset=bmp\bmWidthBytes
;Récupération de la couleur du point
If *Address
CopyMemory(*Address+X*Depth+Y*offset,@Color,Depth)
EndIf
;Attention à bien inverser les conventions BGR et RGB
ProcedureReturn ReverseRGB(Color)
EndProcedure
Procedure.b PlotMemory(Image.l,X.l,Y.l,Color.l)
Protected bmp.BITMAP,Width.l,Height.l,Depth.b,offset.l,*Address
;On initialise la taille de l'image
Width=ImageWidth(Image)
Height=ImageHeight(Image)
Depth=ImageDepth(Image)/8
;On vérifie les coordonnées
If X<0 Or X>Width-1 Or Y<0 Or Y>Height-1
;Echec de l'opération
ProcedureReturn #False
EndIf
GetObject_(ImageID(Image),SizeOf(BITMAP),@bmp)
;Adresse de l'image
*Address=bmp\bmBits
;Longueur en octets d'une ligne
offset=bmp\bmWidthBytes
;Inversion de la convention RGB et BGR
Color=ReverseRGB(Color)
;Collage du point dans l'image
If *Address
CopyMemory(@Color,*Address+X*Depth+Y*offset,Depth)
EndIf
;Réussite de l'opération
ProcedureReturn #True
EndProcedure
Procedure rapide_Point(X,Y)
; AdresseVideo = Buffer + ( x * PF ) + (BufferP/PF) * (y * PF)
Select DrawingBufferPixelFormat()
Case #PB_PixelFormat_16Bits:PF=2
Color = PeekW( DrawingBuffer() + (X * PF) +(DrawingBufferPitch()/PF)* ( Y*PF ) )
Case #PB_PixelFormat_32Bits_RGB : PF=4
Color= PeekL(DrawingBuffer() + (X * PF) +(DrawingBufferPitch()/PF)* ( Y*PF ) )
Case #PB_PixelFormat_32Bits_BGR : PF=4
Color= PeekL(DrawingBuffer() + (X * PF) +(DrawingBufferPitch()/PF)* ( Y*PF ) )
rouge=Red(Color)
vert=Green(Color)
bleu=Blue(Color)
Color=RGB(bleu,vert,rouge)
EndSelect
ProcedureReturn Color
EndProcedure
Procedure rapide_Plot(X,Y,Color)
; AdresseVideo = Buffer + ( x * PF ) + (BufferP/PF) * (y * PF)
Select DrawingBufferPixelFormat()
Case #PB_PixelFormat_16Bits :PF=2
rouge=Red(Color)
vert=Green(Color)
bleu=Blue(Color)
Color=RGB(bleu,vert,rouge)
Color=Color>>2
PokeW( DrawingBuffer() + (X * PF) +(DrawingBufferPitch()/PF)* ( Y *PF) , Color )
Case #PB_PixelFormat_32Bits_RGB : PF=4:t=0
PokeL(DrawingBuffer() + (X * PF) +(DrawingBufferPitch()/PF)* ( Y *PF) ,Color )
Case #PB_PixelFormat_32Bits_BGR : PF=4:t=1
rouge=Red(Color)
vert=Green(Color)
bleu=Blue(Color)
Color=RGB(bleu,vert,rouge)
PokeL(DrawingBuffer() + (X * PF) +(DrawingBufferPitch()/PF)* ( Y *PF) ,Color )
EndSelect
EndProcedure
;*********************************************
InitSprite()
OpenScreen(800,600,32,"")
CreateSprite(0,1024,1024)
time=GetTickCount_()
If StartDrawing(SpriteOutput(0))
For X=0 To SpriteWidth(0)-1
For Y=0 To SpriteHeight(0)-1
rapide_Plot(X,Y,$FFFFFF)
Next Y
Next X
StopDrawing() : EndIf
time=GetTickCount_()-time
If StartDrawing(ScreenOutput())
DrawText(10,10,"La fonction de Cpl.Bator & Dobro rapide_Plot() : "+Str(time)+" ms",RGB(255,255,255),RGB(0,0,0))
SaveSprite(0,"image1.bmp")
EndIf
FlipBuffers()
;*********************************************
CreateSprite(0,1024,1024)
time=GetTickCount_()
If StartDrawing(SpriteOutput(0))
For X=0 To SpriteWidth(0)-1
For Y=0 To SpriteHeight(0)-1
Plot(X,Y,$FFFFFF)
Next Y
Next X
StopDrawing() : EndIf
time=GetTickCount_()-time
If StartDrawing(ScreenOutput())
DrawText(10,10,"La fonction native Plot() : "+Str(time)+" ms",RGB(255,255,255),RGB(0,0,0))
SaveSprite(0,"image2.bmp")
EndIf
FlipBuffers()
Delay(3000)