Page 2 sur 4

Publié : mer. 30/avr./2008 23:14
par Anonyme
Buffer = Adresse du 1° octet de la mémoire vidéo.
PF = Format du pixel , 4,3,2,ou 1
BufferP = Taille en octet d'une ligne ex : 1024*4 , le 4 est le Pixel Format


AdresseVideo = Buffer + ( x * PF ) + (BufferP/PF) * (y * PF)


Code : Tout sélectionner

InitSprite() : InitKeyboard() : InitMouse()

dw=1024
dh=768
dc=32

OpenScreen(dw,dh,dc,"")





Repeat
  ClearScreen(0)
  ExamineKeyboard()

If KeyboardPushed(#PB_Key_Escape) : Quit=1 : EndIf 


    StartDrawing(ScreenOutput())
   
    Buffer  = DrawingBuffer()
    BufferP = DrawingBufferPitch()
    PixelF  = DrawingBufferPixelFormat()
    
    
    Select PixelF
      Case  #PB_PixelFormat_8Bits       : PF=1
      Case  #PB_PixelFormat_15Bits      : PF=2
      Case  #PB_PixelFormat_16Bits      : PF=2
      Case  #PB_PixelFormat_24Bits_RGB  : PF=3
      Case  #PB_PixelFormat_24Bits_BGR  : PF=3
      Case  #PB_PixelFormat_32Bits_RGB  : PF=4
      Case  #PB_PixelFormat_32Bits_BGR  : PF=4
    EndSelect
     
    
    
    For i = 1 To 30
    x=i
    y=i
    AdresseVideo  = Buffer + ( x * PF ) + (BufferP/PF) * (y * PF)
        PokeL(AdresseVideo,$FFFFFF)
    Next
    
    
    
    
    StopDrawing()



    FlipBuffers()
  Until quit=1
End 

Publié : jeu. 01/mai/2008 10:31
par Backup
donc en suivant ton info Cpl Bator, j'ai reactualisé les procedures que tu avais faite pour le rapide plot() et point() :)

en fait Rapide plot n'apporte rien en terme de rapidité !!
par contre le rapide point lui est nettement plus rapide !! :D

voici les 2 procedures
et un exemple d'utilisation pour remplacer le plot


  ; le CERCLE
  ; exemple de cercle
; bouge = bouge + 1
; PSet (6000 * Cos(bouge) + (Screen.Width / 2), 6000 * Sin(bouge) + (Screen.Height / 2))
; angle en degré = 180 * (angle en radian) / pi
; ;Plot(WindowMouseX(), WindowMouseY(), RGB(255,255,255))
; ;sin*compt*phase/nmbr de point *amplitude
;Plot (60 * Cos(bouge) + (512 / 2), 60 * Sin(bouge) + (512 / 2),RGB(2,0,255))
Declare rapide_Point(x,y)
Declare rapide_Plot(x,y,color)

#dobro =1
#Police =1
#Sprite =1
; ***********************************
Resultat = InitSprite ()
FontID = LoadFont ( #Police , "arial" , 50, #PB_Font_Bold )
EcranX = GetSystemMetrics_ ( #SM_CXSCREEN ): ;=largeur de l'ecran
EcranY = GetSystemMetrics_ ( #SM_CYSCREEN ): ;=hauteur de l'ecran
     WindowID = OpenWindow (1, 0, 0, EcranX, EcranY, "hello" , #PB_Window_SystemMenu|#PB_Window_BorderLess |#PB_Window_ScreenCentered )
    
     WindowID = WindowID (1)
    Result = OpenWindowedScreen ( WindowID ,0,0, EcranX, EcranY, 1, 0,0)
    Resultat = InitMouse ()
     Repeat
         ExamineMouse ()
        Event= WaitWindowEvent ()
         StartDrawing ( ScreenOutput ())
            compt+1
            y= Sin (180*(compt*1/10000)/ #PI ) * (768 / 4) +768 / 2
            x= Cos (180*(compt*1/10000)/ #PI ) * (1024 / 4)+1024 / 2
            
            rapide_Plot(x,y, RGB (0,255,0)) ; Procedure de Remplacement
            
             ;Plot(x, y,RGB(255,255,255)) ; plot ordinaire : o)
            
         StopDrawing ()
         FlipBuffers (): ; affiche l'ecran
         ; ClearScreen(0, 0, 0) :;efface l'ecran
        Event= WindowEvent ()
         ;}
        
         If MouseButton (2)
             End
         EndIf
     Until Event= #PB_Event_CloseWindow
    
    
     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



voici les 2 procedures Seules :o)


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

Publié : jeu. 01/mai/2008 11:37
par djes
Toujours à réinventer la roue... :roll:

Publié : jeu. 01/mai/2008 13:11
par Backup
djes a écrit :Toujours à réinventer la roue... :roll:
pas vraiment !!
fais une comparaison sur la procedure rapide_Point()
et la fonction point() de purebasic, tu verra si c'est avoir réinventé la roue !!

:)


tiens l'exemple qui tue !!
change le point() et decomente la version rapide
tu vas comprendre :)

j'ai 7297 avec le point() d'origine

et 781 avec le point() de remplacement...

Alors ? la roue ? hum :)

Code : Tout sélectionner

Declare rapide_Point(x,y)   
Declare rapide_Plot(x,y,color) 

#dobro=1
#Police=1
#Sprite=1
; ***********************************
Resultat = InitSprite()
FontID = LoadFont(#Police, "arial", 50, #PB_Font_Bold )
EcranX = GetSystemMetrics_(#SM_CXSCREEN):;=largeur de l'ecran
EcranY = GetSystemMetrics_(#SM_CYSCREEN):;=hauteur de l'ecran
    WindowID = OpenWindow(1, 0, 0, EcranX, EcranY, "hello", #PB_Window_SystemMenu|#PB_Window_BorderLess |#PB_Window_ScreenCentered ) 
    
    WindowID = WindowID(1) 
    Result = OpenWindowedScreen(WindowID,0,0, EcranX, EcranY, 1, 0,0)  
    Resultat = InitMouse() 
    Repeat
        ExamineMouse() 
        Event=WaitWindowEvent() 
        StartDrawing( ScreenOutput())  
            TempsDepart = ElapsedMilliseconds()  ; Récupère la valeur actuelle
            For y=0 To EcranY-1
                For x=0 To EcranX-1
                    ; coul= rapide_Point(x,y)  ; Procedure de Remplacement 
                    coul= Point(x,y) 
                Next x
            Next y 
            TempsEcoule = ElapsedMilliseconds()-TempsDepart  

        StopDrawing() 
        MessageRequester("Temps","chronos="+Str(TempsEcoule),#PB_MessageRequester_Ok )
        End
        FlipBuffers():; affiche l'ecran
        ; ClearScreen(0, 0, 0) :;efface l'ecran 
        Event=WindowEvent()   
        ;}
        
        If MouseButton(2)
            End
        EndIf 
    Until Event=#PB_Event_CloseWindow 
    
    
    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

Publié : jeu. 01/mai/2008 13:49
par SPH
Ollivier a écrit :@SPH

D'après l'image que tu as, la pronfondeur des couleurs ne semble pas altérée.

Quelle valeur te retourne ton débogueur avec ce code ci-dessous?

Code : Tout sélectionner

openscreen(1024,768,32,"")

  startdrawing(screenoutput() )

    debug drawingbufferpitch()

  stopdrawing()

closescreen()
Ton code donne 0

Par contre, sur mon code au post 1, en inserant le debug, ca me donne 4096 !

Code : Tout sélectionner

StartDrawing(ScreenOutput()) 

MemVideo = DrawingBuffer() 
CopyMemory(@p(), MemVideo, video) 

Debug DrawingBufferPitch() 
End

StopDrawing() 

Publié : jeu. 01/mai/2008 14:13
par poshu
@case:
je me suis mal exprimé, désolé, je trouve que le ton de SPH à la fois sur ce qu'il vaut et ce que vaut la communauté (je ne me permettrais pas de vous juger, vous qui m'apportez une aide précieuse assez souvent) est trop désagréable pour que j'ai envie de l'aider. Bien sur, c'est pas constructif, ce post pourrait servir à quelqu'un d'autre, mais voilà, je suis un être humain et quand on m'insulte, même indirectement, je vais pas être gentil.

Publié : jeu. 01/mai/2008 15:26
par SPH
poshu a écrit :@case:
je me suis mal exprimé, désolé, je trouve que le ton de SPH à la fois sur ce qu'il vaut et ce que vaut la communauté
J'ai beau lire et relier mon premier post, c'est bien moi contre la machine et pas moi contre la communauté. Meme les codes que l'on me donne par la suite plantent; preuve qu'il y a reellement un probleme quelque part.

Par contre, on ne peux pas dire que ton post soit ambigü; je te site :
...après avoir lu comme SPH est doué et que toute le reste de la communauté est débile, je m'en vais.
Tu n'es qu'un pauvre con !!!! Ca laisse entendre que tu as la reponse mais que finalement tu preferes ne pas la donner devant tant de débiles.
Case le resume tres bien :
si toi tu as la solution au lieu d'insulter la communauté montres nous que tu n'es pas toi même un débile juste bon a passer sur le forum pour poster des trucs encore plus stupides.
Vraiment, tu es le plus con du forum :!:

Publié : jeu. 01/mai/2008 15:50
par Ar-S
Allez les enfants, on prend son chocolat et on arrête de se disputer. :wink:

Publié : jeu. 01/mai/2008 15:53
par SPH
Ar-S a écrit :Allez les enfants, on prend son chocolat et on arrête de se disputer. :wink:
Il ferait mieux de prendre son cocktail litique...

Publié : jeu. 01/mai/2008 17:14
par djes
Dobro a écrit :
djes a écrit :Toujours à réinventer la roue... :roll:
pas vraiment !!
fais une comparaison sur la procedure rapide_Point()
et la fonction point() de purebasic, tu verra si c'est avoir réinventé la roue !!

:)


tiens l'exemple qui tue !!
change le point() et decomente la version rapide
tu vas comprendre :)

j'ai 7297 avec le point() d'origine

et 781 avec le point() de remplacement...

Alors ? la roue ? hum :)

Code : Tout sélectionner

Declare rapide_Point(x,y)   
Declare rapide_Plot(x,y,color) 

#dobro=1
#Police=1
#Sprite=1
; ***********************************
Resultat = InitSprite()
FontID = LoadFont(#Police, "arial", 50, #PB_Font_Bold )
EcranX = GetSystemMetrics_(#SM_CXSCREEN):;=largeur de l'ecran
EcranY = GetSystemMetrics_(#SM_CYSCREEN):;=hauteur de l'ecran
    WindowID = OpenWindow(1, 0, 0, EcranX, EcranY, "hello", #PB_Window_SystemMenu|#PB_Window_BorderLess |#PB_Window_ScreenCentered ) 
    
    WindowID = WindowID(1) 
    Result = OpenWindowedScreen(WindowID,0,0, EcranX, EcranY, 1, 0,0)  
    Resultat = InitMouse() 
    Repeat
        ExamineMouse() 
        Event=WaitWindowEvent() 
        StartDrawing( ScreenOutput())  
            TempsDepart = ElapsedMilliseconds()  ; Récupère la valeur actuelle
            For y=0 To EcranY-1
                For x=0 To EcranX-1
                    ; coul= rapide_Point(x,y)  ; Procedure de Remplacement 
                    coul= Point(x,y) 
                Next x
            Next y 
            TempsEcoule = ElapsedMilliseconds()-TempsDepart  

        StopDrawing() 
        MessageRequester("Temps","chronos="+Str(TempsEcoule),#PB_MessageRequester_Ok )
        End
        FlipBuffers():; affiche l'ecran
        ; ClearScreen(0, 0, 0) :;efface l'ecran 
        Event=WindowEvent()   
        ;}
        
        If MouseButton(2)
            End
        EndIf 
    Until Event=#PB_Event_CloseWindow 
    
    
    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
Ce que je veux dire, c'est que des "plot()" et des point()" soi-disant rapides, on en a déjà fait des tonnes. Je maintiens que de nos jours, attaquer la carte graphique avec le cpu, tout recalculer à chaque point, et dire qu'on fait quelque chose de rapide est faux. Bien sûr, ton code est bon à titre d'exemple, mais il faut rappeler que cette méthode est limitée, et que si on veut faire quelque chose de vraiment rapide, il faut passer par les API. Il y avait aussi un bon code qui passait par une image avec un locksurface().

Publié : ven. 02/mai/2008 2:46
par SPH
Tiens, c'est tres curieux : quand j'essaye de mettre des points rouges dans mon dim pour les afficher à l'ecran, ce sont des points bleus qui apparaissent !!! Et quand je met des points bleus, ce sont des rouges qui apparaissent !!
Le codage n'est pas RVB mais BVR !

D'ailleurs, apres mon copymemory, j'essaye ca :

Code : Tout sélectionner

Debug DrawingBufferPixelFormat()
End
Ca me donne 7; soit : #PB_PixelFormat_32Bits_BGR

Etrange non ???? Vous, c'est pareil ???

EDIT :
Tenez, voici un code mais qui affiche ligne par ligne. Ceci dit, ligne par ligne me conviens bien. Cependant, il y a quelques bizzareries entre la théorie et la pratique. J'ai commenté mon code et voyez si cela fait pareil chez vous :

Code : Tout sélectionner

InitSprite()
InitKeyboard()
InitMouse()

dw=1280 ; essayez cette resolution, et essayez aussi 1024*768
dh=1024
dc=32

If OpenScreen(dw,dh,dc,"")=0
End
EndIf

Dim p(dh-1,dw-1) ; >>>regardez ca, pkoi je dois inverser dw avec dh ici ?

For i=0 To 100
p(i,i) = RGB(0,0,255) ; >>>ligne bleue qui est rouge chez moi !
Next
p(104,104)=(RGB(255,255,255)) ; un pixel blanc au bout de ma ligne
p(dh-1,dw-1)=(RGB(255,255,255)) ; un pixel blanc en bas a droite

;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;

Repeat

StartDrawing(ScreenOutput()) 

; tracage

MemVideo = DrawingBuffer() 
For u=0 To dh-1 ; ligne par ligne (car en bloc, impossible)
CopyMemory(@p(u,0), MemVideo+DrawingBufferPitch()*u,dw*4)
Next

;Debug DrawingBufferPixelFormat() ; >>>ce truc m'affiche le mode 7 (du BVR)
;End

StopDrawing() 
FlipBuffers()

ExamineMouse()
ExamineKeyboard()

Until KeyboardPushed(#PB_Key_Escape)

Publié : ven. 02/mai/2008 8:28
par Progi1984
Ca me donne des points rouges :)

Publié : ven. 02/mai/2008 8:31
par SPH
Progi1984 a écrit :Ca me donne des points rouges :)
Etrange hein ! Car j'ai bien dit du bleu avec mon RGB(0,0,255)
La ligne rouge donc, elle est bien diagonale et en un seul morceau ? :?: :!:

Publié : ven. 02/mai/2008 10:30
par Progi1984
SPH a écrit :
Progi1984 a écrit :Ca me donne des points rouges :)
Etrange hein ! Car j'ai bien dit du bleu avec mon RGB(0,0,255)
La ligne rouge donc, elle est bien diagonale et en un seul morceau ? :?: :!:
Affirmatif !

Publié : ven. 02/mai/2008 14:56
par Neosis
effectivement c'est bizarre le rouge sort bleu et le bleu sort rouge :?: