Photos veille - Le code
Publié : mar. 11/nov./2008 17:13
Donc voilà le code de mon dernier logiciel (vous le trouverez sur mon site)
C'est un écran de veille qui permet d'afficher vos images préférées.
C'est pas trop commenté. Alors voila le principe de base :
Pour les images, je les charge en copiant le fichier image en mémoire, mais pas avec LoadImage, je les charge avec un CopyData, en gros je met le fichier en mémoire, c'est en "décompresser" le contenu (pour du jpg)
Le but est de minimiser l'e^space mémoire nécessaire, surtout si il y a beaucoup d'image.
Si je prend une image 1024*768 par exemple, si je charge avec LoadImage, ca donne 2Mo en mémoire en gros, *40 image, ouille
Tandis que si je laisse en format jpg, en bonne qualité ca donne 500ko en mémoire, j'ai diviser par 4
Donc je copie le fichier image en mémoire. Et quand j'ai besoin d'afficher l'image, j'utilise CatchImage(
Et dès que je n'ai plus besoin de l'image, je fais un FreeImage(
Voir les procedure Charger() et Decharger()
Ensuite, la partie affichage.
Pour ête fluide, l'idée est de ne JAMAIS utiliser de Sprite classique, même avec StartSpecialFX()
Cela est beaucoup trop lent comparer au Sprite3D
Si j'ai tout compris, dite moi si je dis une bétise
Le sprite classique est en mémoire normale du PC, et utilise le processeur pour s'afficher. Cela deveint vite pénalisant
tandis que le Sprite3D utilse pleinement la carte graphique et pas le processeur.
Le gain en affichage est énorme, au minimum * 4 en vitesse, juste sur des sprite sans aucun effet.
Et l'avantage avec le Sprite3D, c'est qu'un effet de transparence ou l'utilisation de Sprite avec une couche Alpha non pratiquement aucune insidence, c'est comme si on affichait un Sprite3D sans effet.
J'ai vu ça pour un jeu que j'ai commencé. L'affichage des dalles qui forme le terrain va bien plus vite avec des sprites3D qu'avec des sprite classique (j'étais rendu avec un FPS de 30 juste avec le terrain, ouille, mais avec les sprite3D, je suis a fond FPS 75Hz, avec terrain, décor, véhicule, etc ... )
Donc pour être fluide --> Sprite3D
Ensuite, les effets :
Du classique, je garde l'ancienne image en mémoire, et je charge l'image suivante.
Puis je lance mon animation avec ces deux images pour faite la transition.
L'effet le plus lent est le rectangle, j'explique.
Quand je dessine le rectanglme sur le sprite pour découper une zone dedans, Je passe avec un startDrawing, donc sur la mémoire et le processeur, et plus la carte graphique. Voila , vlan, je deviens plus lent.
Si quelqu'un a une astuces pour dessiner sur un sprite plus rapidement, je prends
Amusez vous bien.
Note : Il faut compiler sous la forme machin.scr et pas machin.exe pour tester.
UNe fois le scr créer, vous pourrez tester
Sinon, vous n'aurez que la configuration de l'écran de veille.
C'est un écran de veille qui permet d'afficher vos images préférées.
C'est pas trop commenté. Alors voila le principe de base :
Pour les images, je les charge en copiant le fichier image en mémoire, mais pas avec LoadImage, je les charge avec un CopyData, en gros je met le fichier en mémoire, c'est en "décompresser" le contenu (pour du jpg)
Le but est de minimiser l'e^space mémoire nécessaire, surtout si il y a beaucoup d'image.
Si je prend une image 1024*768 par exemple, si je charge avec LoadImage, ca donne 2Mo en mémoire en gros, *40 image, ouille
Tandis que si je laisse en format jpg, en bonne qualité ca donne 500ko en mémoire, j'ai diviser par 4
Donc je copie le fichier image en mémoire. Et quand j'ai besoin d'afficher l'image, j'utilise CatchImage(
Et dès que je n'ai plus besoin de l'image, je fais un FreeImage(
Voir les procedure Charger() et Decharger()
Ensuite, la partie affichage.
Pour ête fluide, l'idée est de ne JAMAIS utiliser de Sprite classique, même avec StartSpecialFX()
Cela est beaucoup trop lent comparer au Sprite3D
Si j'ai tout compris, dite moi si je dis une bétise
Le sprite classique est en mémoire normale du PC, et utilise le processeur pour s'afficher. Cela deveint vite pénalisant
tandis que le Sprite3D utilse pleinement la carte graphique et pas le processeur.
Le gain en affichage est énorme, au minimum * 4 en vitesse, juste sur des sprite sans aucun effet.
Et l'avantage avec le Sprite3D, c'est qu'un effet de transparence ou l'utilisation de Sprite avec une couche Alpha non pratiquement aucune insidence, c'est comme si on affichait un Sprite3D sans effet.
J'ai vu ça pour un jeu que j'ai commencé. L'affichage des dalles qui forme le terrain va bien plus vite avec des sprites3D qu'avec des sprite classique (j'étais rendu avec un FPS de 30 juste avec le terrain, ouille, mais avec les sprite3D, je suis a fond FPS 75Hz, avec terrain, décor, véhicule, etc ... )
Donc pour être fluide --> Sprite3D
Ensuite, les effets :
Du classique, je garde l'ancienne image en mémoire, et je charge l'image suivante.
Puis je lance mon animation avec ces deux images pour faite la transition.
L'effet le plus lent est le rectangle, j'explique.
Quand je dessine le rectanglme sur le sprite pour découper une zone dedans, Je passe avec un startDrawing, donc sur la mémoire et le processeur, et plus la carte graphique. Voila , vlan, je deviens plus lent.
Si quelqu'un a une astuces pour dessiner sur un sprite plus rapidement, je prends
Amusez vous bien.
Note : Il faut compiler sous la forme machin.scr et pas machin.exe pour tester.
UNe fois le scr créer, vous pourrez tester
Sinon, vous n'aurez que la configuration de l'écran de veille.
Code : Tout sélectionner
Structure Structure_Image
Memoire.l
Sprite.l
Sprite3D.l
Fichier.s
EndStructure
Global NewList Image.Structure_Image()
Global Ecran_X, Ecran_Y
Global Option_Image_Redim, Option_Image_Aleatoire, Option_Image_Presentation
Global Option_Temps_Effet, Option_Temps_Image
Global Option_Dossier.s
#Effet_Nombre = 5
Global Dim Option_Effet(#Effet_Nombre)
#Effet_Defilement_Nombre = 4
Global Dim Option_Effet_Defilement(#Effet_Defilement_Nombre)
#Effet_Diagonale_Nombre = 4
Global Dim Option_Effet_Diagonale(#Effet_Diagonale_Nombre)
#Effet_Rectangle_Nombre = 2
Global Dim Option_Effet_Rectangle(#Effet_Rectangle_Nombre)
UseJPEGImageDecoder()
Procedure.l LoadWindowFont(Bold = -1, Italic = -1, UnderLine = -1, Size.f = -1)
Protected ncm.NONCLIENTMETRICS
ncm\cbSize = SizeOf(NONCLIENTMETRICS)
SystemParametersInfo_(#SPI_GETNONCLIENTMETRICS, SizeOf(NONCLIENTMETRICS), @ncm, 0)
If Bold = 0
ncm\lfMessageFont\lfWeight = 0
ElseIf Bold = 1
ncm\lfMessageFont\lfWeight = 700
EndIf
If Italic = 0
ncm\lfMessageFont\lfItalic = 0
ElseIf Italic = 1
ncm\lfMessageFont\lfItalic = 1
EndIf
If UnderLine = 0
ncm\lfMessageFont\lfUnderline = 0
ElseIf UnderLine = 1
ncm\lfMessageFont\lfUnderline = 1
EndIf
If Size > 0
ncm\lfMessageFont\lfheight * Size
EndIf
ProcedureReturn CreateFontIndirect_(@ncm\lfMessageFont)
EndProcedure
Global Langue.s
Global Dim Langue.s(100)
Declare Configuration_Sauver()
Procedure SelectLanguage()
Protected WinID, Liste, Bouton
WinID = OpenWindow(#PB_Any, 0, 0, 200, 63, "Langue / Language", #PB_Window_ScreenCentered | #PB_Window_SystemMenu)
If WinID
If CreateGadgetList(WindowID(WinID))
Liste = ComboBoxGadget(#PB_Any, 5, 5, 190, 200)
Bouton = ButtonGadget(#PB_Any, 5, 35, 190, 23, "OK")
If ExamineDirectory(0, "Lng-Photos veille\", "*.txt")
While NextDirectoryEntry(0)
FileType = DirectoryEntryType(0)
If FileType = 1
AddGadgetItem(Liste, -1, RemoveString(DirectoryEntryName(0), ".txt", 1))
EndIf
Wend
If Langue <> "Inconnu"
Nb = CountGadgetItems(Liste)
For n = 0 To Nb - 1
If GetGadgetItemText(Liste, n, 0) = Langue
SetGadgetState(Liste, n)
Break
EndIf
Next
Else
Nb = CountGadgetItems(Liste)
For n = 0 To Nb - 1
If GetGadgetItemText(Liste, n, 0) = "Francais"
SetGadgetState(Liste, n)
Break
EndIf
Next
EndIf
Repeat
Event = WaitWindowEvent()
If Event = #PB_Event_Gadget
Select EventGadget()
Case Bouton
If Langue <> GetGadgetText(Liste)
Langue = GetGadgetText(Liste)
Configuration_Sauver()
RunProgram(ProgramFilename(), "", ProgramFiledirectory()) ; on relance le programme
End
Else
Event = #PB_Event_CloseWindow
EndIf
EndSelect
EndIf
Until Event = #PB_Event_CloseWindow
EndIf
EndIf
CloseWindow(WinID)
If Langue = "Inconnu"
End
EndIf
EndIf
EndProcedure
Procedure Configuration_Langue()
; Langue
If Langue = "Inconnu" Or FileSize("Lng-Photos veille\" + Langue + ".txt") = -1
SelectLanguage()
EndIf
If ReadFile(0, "Lng-Photos veille\Francais.txt")
Repeat
Txt.s = ReadString(0)
If Left(Txt, 1) <> "[" And Txt <> ""
n = FindString(Txt, "=", 1)
nn = Val(Left(Txt, n - 1))
Txt = Right(Txt, Len(Txt) - n)
If Left(Txt, 1) = "#"
Txt = Langue(Val(Right(Txt, Len(Txt) - 1)))
EndIf
Langue(nn) = Txt
EndIf
Until Eof(0)
CloseFile(0)
EndIf
If Langue <> "Francais" And ReadFile(0, "Lng-Photos veille\" + Langue + ".Txt")
Repeat
Txt.s = ReadString(0)
If Left(Txt, 1) <> "[" And Txt <> ""
n = FindString(Txt, "=", 1)
nn = Val(Left(Txt, n - 1))
Txt = Right(Txt, Len(Txt) - n)
If Left(Txt, 1) = "#"
Txt = Langue(Val(Right(Txt, Len(Txt) - 1)))
EndIf
If Txt <> ""
Langue(nn) = Txt
EndIf
EndIf
Until Eof(0)
CloseFile(0)
EndIf
EndProcedure
Procedure Apercu()
WindowPreview = Val(ProgramParameter())
GetClientRect_(WindowPreview, @WindowPreview_Size.RECT)
If OpenWindow(0, 0, 0, WindowPreview_Size\right, WindowPreview_Size\bottom, "Photos veille", #WS_CHILD, WindowPreview) And CreateGadgetList(WindowID(0))
SetWindowColor(0, $FFFFFF)
If LoadImage(0, "Ressources\Apercu.jpg")
If WindowPreview_Size\right < ImageWidth(0) Or WindowPreview_Size\bottom < ImageHeight(0)
If WindowPreview_Size\right * ImageHeight(0) <= ImageWidth(0) * WindowPreview_Size\bottom
ResizeImage(0, WindowPreview_Size\right, ImageHeight(0) * WindowPreview_Size\right / ImageWidth(0))
Else
ResizeImage(0, ImageWidth(0) * WindowPreview_Size\bottom / ImageHeight(0), WindowPreview_Size\bottom)
EndIf
EndIf
ImageGadget(0, (WindowPreview_Size\right - ImageWidth(0)) / 2, (WindowPreview_Size\bottom - ImageHeight(0)) / 2, 0, 0, ImageID(0))
EndIf
Repeat
Event = WaitWindowEvent(10)
Until Event = #WM_CLOSE Or IsWindow_(WindowPreview) = 0
EndIf
End
EndProcedure
Procedure Configuration_Charger()
SetCurrentDirectory(ProgramFiledirectory())
OpenPreferences("Photos veille.ini")
Dossier.s = ReadPreferenceString("Dossier_Programme", "")
ClosePreferences()
If Dossier And FileSize(Dossier) = -2
SetCurrentDirectory(Dossier)
EndIf
OpenPreferences("Photos veille.ini")
Langue = ReadPreferenceString("Langue", "Inconnu")
Option_Dossier = ReadPreferenceString("Dossier_Images", "")
Option_Image_Redim = ReadPreferenceLong("Image_Redim", 0)
Option_Image_Aleatoire = ReadPreferenceLong("Image_Aleatoire", 0)
Option_Image_Presentation = ReadPreferenceLong("Image_Presentation", 0)
Option_Temps_Image = ReadPreferenceLong("Temps_Image", 3000)
Option_Temps_Effet = ReadPreferenceLong("Temps_Effet", 1000)
For n = 1 To #Effet_Nombre
Option_Effet(n) = ReadPreferenceLong("Effet " + Str(n), 1)
Next
For n = 1 To #Effet_Defilement_Nombre
Option_Effet_Defilement(n) = ReadPreferenceLong("Effet_Defilement " + Str(n), 1)
Next
For n = 1 To #Effet_Diagonale_Nombre
Option_Effet_Diagonale(n) = ReadPreferenceLong("Effet_Diagonale " + Str(n), 1)
Next
For n = 1 To #Effet_Rectangle_Nombre
Option_Effet_Rectangle(n) = ReadPreferenceLong("Effet_Rectangle " + Str(n), 1)
Next
ClosePreferences()
EndProcedure
Procedure Configuration_Sauver()
If CreatePreferences("Photos veille.ini")
WritePreferenceString("Langue", Langue)
WritePreferenceString("Dossier_Images", Option_Dossier)
WritePreferenceLong("Image_Redim", Option_Image_Redim)
WritePreferenceLong("Image_Aleatoire", Option_Image_Aleatoire)
WritePreferenceLong("Image_Presentation", Option_Image_Presentation)
WritePreferenceLong("Temps_Image", Option_Temps_Image)
WritePreferenceLong("Temps_Effet", Option_Temps_Effet)
For n = 1 To #Effet_Nombre
WritePreferenceLong("Effet " + Str(n), Option_Effet(n))
Next
For n = 1 To #Effet_Defilement_Nombre
WritePreferenceLong("Effet_Defilement " + Str(n), Option_Effet_Defilement(n))
Next
For n = 1 To #Effet_Diagonale_Nombre
WritePreferenceLong("Effet_Diagonale " + Str(n), Option_Effet_Diagonale(n))
Next
For n = 1 To #Effet_Rectangle_Nombre
WritePreferenceLong("Effet_Rectangle " + Str(n), Option_Effet_Rectangle(n))
Next
ClosePreferences()
EndIf
EndProcedure
Procedure Configuration()
#Fenetre_B = 5
#Fenetre_L = 300
Configuration_Langue()
If OpenWindow(0, 0, 0, #Fenetre_L + 2 * #Fenetre_B, 100 + 2 * #Fenetre_B, "Photos veille", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0))
x = #Fenetre_B
y = #Fenetre_B
If LoadImage(0, "Ressources\Photos veille.jpg")
ImageGadget(0, x, y, 0, 0, ImageID(0))
y + #Fenetre_B + ImageHeight(0)
EndIf
Police_Gras = LoadWindowFont(1, -1, -1, 1.2)
;- Dossier des images
Gadget = 100
TextGadget(Gadget, x, y, #Fenetre_L, 20, Langue(1), #PB_Text_Border)
SetGadgetFont(Gadget, Police_Gras)
SetGadgetColor(Gadget, #PB_Gadget_FrontColor, $6C7460)
SetGadgetColor(Gadget, #PB_Gadget_BackColor, $FFFFFF)
y + GadgetHeight(Gadget) + #Fenetre_B
Gadget = 101
TextGadget(Gadget, x, y, #Fenetre_L, 15, Langue(2))
y + GadgetHeight(Gadget)
Gadget = 102
StringGadget(Gadget, x, y, #Fenetre_L - 75, 20, Option_Dossier, #PB_String_ReadOnly)
Gadget = 103
ButtonGadget(Gadget, x + #Fenetre_L - 75, y, 75, 20, Langue(3))
y + GadgetHeight(Gadget) + #Fenetre_B
;- Affichage
Gadget = 200
TextGadget(Gadget, x, y, #Fenetre_L, 20, Langue(4), #PB_Text_Border)
SetGadgetFont(Gadget, Police_Gras)
SetGadgetColor(Gadget, #PB_Gadget_FrontColor, $6C7460)
SetGadgetColor(Gadget, #PB_Gadget_BackColor, $FFFFFF)
y + GadgetHeight(Gadget) + #Fenetre_B
Gadget = 201
OptionGadget(Gadget, x, y, #Fenetre_L, 15, Langue(5))
SetGadgetState(Gadget, 1 - Option_Image_Aleatoire)
y + GadgetHeight(Gadget)
Gadget = 202
OptionGadget(Gadget, x, y, #Fenetre_L, 15, Langue(6))
SetGadgetState(Gadget, Option_Image_Aleatoire)
y + GadgetHeight(Gadget)
Gadget = 203
CheckBoxGadget(Gadget, x, y, #Fenetre_L, 15, Langue(7))
SetGadgetState(Gadget, Option_Image_Presentation)
y + GadgetHeight(Gadget)
Gadget = 204
CheckBoxGadget(Gadget, x, y, #Fenetre_L, 15, Langue(8))
SetGadgetState(Gadget, Option_Image_Redim)
y + GadgetHeight(Gadget) + #Fenetre_B
Gadget = 205
TextGadget(Gadget, x, y, #Fenetre_L, 15, Langue(9))
y + GadgetHeight(Gadget)
Gadget = 206
TextGadget(Gadget, x, y, 75, 15, StrF(Option_Temps_Image / 1000, 1) +Langue(10))
Gadget = 207
TrackBarGadget(Gadget, x + 75, y, #Fenetre_L - 75, 25, 0, 19, #PB_TrackBar_Ticks)
SetGadgetState(Gadget, (Option_Temps_Image - 500) / 500)
y + GadgetHeight(Gadget) + #Fenetre_B
Gadget = 208
TextGadget(Gadget, x, y, #Fenetre_L, 15, Langue(11))
y + GadgetHeight(Gadget)
Gadget = 209
TextGadget(Gadget, x, y, 75, 15, StrF(Option_Temps_Effet / 1000, 2) +Langue(12))
Gadget = 210
TrackBarGadget(Gadget, x + 75, y, #Fenetre_L - 75, 25, 0, 18, #PB_TrackBar_Ticks)
SetGadgetState(Gadget, (Option_Temps_Effet - 250) / 250)
y + GadgetHeight(Gadget) + #Fenetre_B
;- Effets de transition
Gadget = 300
TextGadget(Gadget, x, y, #Fenetre_L, 25, Langue(13), #PB_Text_Border)
SetGadgetFont(Gadget, Police_Gras)
SetGadgetColor(Gadget, #PB_Gadget_FrontColor, $6C7460)
SetGadgetColor(Gadget, #PB_Gadget_BackColor, $FFFFFF)
y + GadgetHeight(Gadget) + #Fenetre_B
Gadget = 398
TextGadget(Gadget, x, y, #Fenetre_L, 30, Langue(14))
y + GadgetHeight(Gadget)
Gadget = 399
ScrollAreaGadget(Gadget, x, y, #Fenetre_L, 100, #Fenetre_L - 75, 100, 10, #PB_ScrollArea_Single)
y + GadgetHeight(Gadget) + #Fenetre_B
y2 = #Fenetre_B
Gadget = 305
CheckBoxGadget(Gadget, x, y2, #Fenetre_L, 15, Langue(15))
SetGadgetState(Gadget, Option_Effet(1))
y2 + GadgetHeight(Gadget) + #Fenetre_B
Gadget = 310
CheckBoxGadget(Gadget, x, y2, #Fenetre_L, 15, Langue(16))
SetGadgetState(Gadget, Option_Effet(2))
y2 + GadgetHeight(Gadget)
x + 25
Gadget = 311
CheckBoxGadget(Gadget, x, y2, #Fenetre_L, 15, Langue(17))
SetGadgetState(Gadget, Option_Effet_Defilement(1))
y2 + GadgetHeight(Gadget)
Gadget = 312
CheckBoxGadget(Gadget, x, y2, #Fenetre_L, 15, Langue(18))
SetGadgetState(Gadget, Option_Effet_Defilement(2))
y2 + GadgetHeight(Gadget)
Gadget = 313
CheckBoxGadget(Gadget, x, y2, #Fenetre_L, 15, Langue(19))
SetGadgetState(Gadget, Option_Effet_Defilement(3))
y2 + GadgetHeight(Gadget)
Gadget = 314
CheckBoxGadget(Gadget, x, y2, #Fenetre_L, 15, Langue(20))
SetGadgetState(Gadget, Option_Effet_Defilement(4))
y2 + GadgetHeight(Gadget)
x - 25
y2 + #Fenetre_B
Gadget = 315
CheckBoxGadget(Gadget, x, y2, #Fenetre_L, 15, Langue(21))
SetGadgetState(Gadget, Option_Effet(3))
y2 + GadgetHeight(Gadget) + #Fenetre_B
Gadget = 320
CheckBoxGadget(Gadget, x, y2, #Fenetre_L, 15, Langue(22))
SetGadgetState(Gadget, Option_Effet(4))
y2 + GadgetHeight(Gadget)
x + 25
Gadget = 321
CheckBoxGadget(Gadget, x, y2, #Fenetre_L, 15, Langue(23))
SetGadgetState(Gadget, Option_Effet_Diagonale(1))
y2 + GadgetHeight(Gadget)
Gadget = 322
CheckBoxGadget(Gadget, x, y2, #Fenetre_L, 15, Langue(24))
SetGadgetState(Gadget, Option_Effet_Diagonale(2))
y2 + GadgetHeight(Gadget)
Gadget = 323
CheckBoxGadget(Gadget, x, y2, #Fenetre_L, 15, Langue(25))
SetGadgetState(Gadget, Option_Effet_Diagonale(3))
y2 + GadgetHeight(Gadget)
Gadget = 324
CheckBoxGadget(Gadget, x, y2, #Fenetre_L, 15, Langue(26))
SetGadgetState(Gadget, Option_Effet_Diagonale(4))
y2 + GadgetHeight(Gadget)
x - 25
Gadget = 325
CheckBoxGadget(Gadget, x, y2, #Fenetre_L, 15, Langue(37))
SetGadgetState(Gadget, Option_Effet(5))
y2 + GadgetHeight(Gadget)
x + 25
Gadget = 326
CheckBoxGadget(Gadget, x, y2, #Fenetre_L, 15, Langue(38))
SetGadgetState(Gadget, Option_Effet_Rectangle(1))
y2 + GadgetHeight(Gadget)
Gadget = 327
CheckBoxGadget(Gadget, x, y2, #Fenetre_L, 15, Langue(39))
SetGadgetState(Gadget, Option_Effet_Rectangle(2))
y2 + GadgetHeight(Gadget)
x - 25
y2 + #Fenetre_B
SetGadgetAttribute(399, #PB_ScrollArea_InnerHeight, y2)
CloseGadgetList()
;- Barre de boutons
ResizeWindow(0, #PB_Ignore, WindowY(0) - (y + 25 + #Fenetre_B - WindowHeight(0)) / 2, #PB_Ignore, y + 25 + #Fenetre_B)
Gadget = 500
ButtonGadget(Gadget, x, y, 25, 25, Langue(27))
x + GadgetWidth(Gadget)
Gadget = 501
ButtonGadget(Gadget, x, y, 75, 25, "Language")
x + GadgetWidth(Gadget)
x + 50
Gadget = 502
ButtonGadget(Gadget, x, y, 75, 25, Langue(28))
x + GadgetWidth(Gadget)
Gadget = 503
ButtonGadget(Gadget, x, y, 75, 25, Langue(29), #PB_Button_Default)
x + GadgetWidth(Gadget)
Repeat
Event = WaitWindowEvent()
Select Event
Case #PB_Event_Gadget
Select EventGadget()
Case 103
Dossier.s = PathRequester(Langue(30), Option_Dossier)
If Dossier
Option_Dossier = Dossier
SetGadgetText(102, Option_Dossier)
EndIf
Case 201, 202
Option_Image_Aleatoire = GetGadgetState(202)
Case 203
Option_Image_Presentation = GetGadgetState(203)
Case 204
Option_Image_Redim = GetGadgetState(204)
Case 207
Option_Temps_Image = GetGadgetState(207) * 500 + 500
SetGadgetText(206, StrF(Option_Temps_Image / 1000, 1) +Langue(31))
Case 210
Option_Temps_Effet = GetGadgetState(210) * 250 + 250
SetGadgetText(209, StrF(Option_Temps_Effet / 1000, 2) +Langue(32))
Case 305
Option_Effet(1) = GetGadgetState(305)
Case 310
Option_Effet(2) = GetGadgetState(310)
For n = 1 To #Effet_Defilement_Nombre
Option_Effet_Defilement(n) = Option_Effet(2)
SetGadgetState(310 + n, Option_Effet(2))
Next
Case 311, 312, 313, 314
nn = 0
For n = 1 To #Effet_Defilement_Nombre
Option_Effet_Defilement(n) = GetGadgetState(310 + n)
nn + Option_Effet_Defilement(n)
Next
If nn
SetGadgetState(310, 1)
Option_Effet(2) = 1
Else
SetGadgetState(310, 0)
Option_Effet(2) = 0
EndIf
Case 315
Option_Effet(3) = GetGadgetState(315)
Case 320
Option_Effet(4) = GetGadgetState(320)
For n = 1 To #Effet_Defilement_Nombre
Option_Effet_Diagonale(n) = Option_Effet(4)
SetGadgetState(320 + n, Option_Effet(4))
Next
Case 321, 322, 323, 324
nn = 0
For n = 1 To #Effet_Defilement_Nombre
Option_Effet_Diagonale(n) = GetGadgetState(320 + n)
nn + Option_Effet_Diagonale(n)
Next
If nn
SetGadgetState(320, 1)
Option_Effet(4) = 1
Else
SetGadgetState(320, 0)
Option_Effet(4) = 0
EndIf
Case 325
Option_Effet(5) = GetGadgetState(325)
For n = 1 To #Effet_Rectangle_Nombre
Option_Effet_Rectangle(n) = Option_Effet(5)
SetGadgetState(325 + n, Option_Effet(5))
Next
Case 326, 327
nn = 0
For n = 1 To #Effet_Rectangle_Nombre
Option_Effet_Rectangle(n) = GetGadgetState(325 + n)
nn + Option_Effet_Rectangle(n)
Next
If nn
SetGadgetState(325, 1)
Option_Effet(5) = 1
Else
SetGadgetState(325, 0)
Option_Effet(5) = 0
EndIf
Case 500
Licence("Photos veille", 0)
Case 501
SelectLanguage()
Case 502
Configuration_Sauver()
RunProgram(ProgramFilename(), "/s", ProgramFiledirectory())
Case 503
Configuration_Sauver()
Event = #PB_Event_CloseWindow
EndSelect
EndSelect
Until Event = #PB_Event_CloseWindow
If Police_Gras
DeleteObject_(Police_Gras)
EndIf
EndIf
End
EndProcedure
Procedure Charger(Numero.l)
SelectElement(Image(), Numero)
If Image()\Memoire = 0
If ReadFile(0, Image()\Fichier)
Longueur.q = Lof(0)
Image()\Memoire = AllocateMemory(Longueur)
ReadData(0, Image()\Memoire, Longueur)
CloseFile(0)
EndIf
EndIf
If IsSprite(Image()\Sprite) = 0
Image = CatchImage(#PB_Any, Image()\Memoire)
;{ Traitement anti point noir
; Protected bmi.BITMAPINFO, bm.BITMAP, hdc
; GetObject_(ImageID(Image), SizeOf(BITMAP), @bm.BITMAP)
;
; Dim ImageBits.l(bm\bmWidth * bm\bmHeight - 1)
; hdc = CreateCompatibleDC_(GetDC_(ImageID(Image)))
; If hdc
;
; bmi\bmiHeader\biSize = SizeOf(BITMAPINFOHEADER)
; bmi\bmiHeader\biWidth = bm\bmWidth
; bmi\bmiHeader\biHeight = bm\bmHeight
; bmi\bmiHeader\biPlanes = 1
; bmi\bmiHeader\biBitCount = 32
; bmi\bmiHeader\biCompression = #BI_RGB
;
; GetDIBits_(hdc, ImageID(Image), 0, bm\bmHeight, @ImageBits(), @bmi, #DIB_RGB_COLORS) ; on envoie la liste dans l'image
;
; For x = 0 To bm\bmWidth * bm\bmHeight - 1
; If ImageBits(x) = 0
; ImageBits(x) = 1
; EndIf
; Next
;
; SetDIBits_(hdc, ImageID(Image), 0, bm\bmHeight, @ImageBits(), @bmi, #DIB_RGB_COLORS) ; on envoie la liste dans l'image
; DeleteDC_(hdc)
; EndIf
;}
If Option_Image_Redim Or ImageHeight(Image) > Ecran_Y Or ImageWidth(Image) > Ecran_X
If Ecran_X * ImageHeight(Image) <= ImageWidth(Image) * Ecran_Y
ResizeImage(Image, Ecran_X, ImageHeight(Image) * Ecran_X / ImageWidth(Image), #PB_Image_Smooth)
Else
ResizeImage(Image, ImageWidth(Image) * Ecran_Y / ImageHeight(Image), Ecran_Y, #PB_Image_Smooth)
EndIf
EndIf
x = (Ecran_X - ImageWidth(Image)) / 2
y = (Ecran_Y - ImageHeight(Image)) / 2
Image()\Sprite = CreateSprite(#PB_Any, Ecran_X, Ecran_Y, #PB_Sprite_Texture)
If StartDrawing(SpriteOutput(Image()\Sprite))
; Box(0, 0, Ecran_X, Ecran_Y, $010000)
DrawImage(ImageID(Image), x, y)
StopDrawing()
EndIf
FreeImage(Image)
Image()\Sprite3D = CreateSprite3D(#PB_Any, Image()\Sprite)
EndIf
EndProcedure
Procedure DeCharger(Numero.l)
SelectElement(Image(), Numero)
If IsSprite(Image()\Sprite)
FreeSprite3D(Image()\Sprite3D)
FreeSprite(Image()\Sprite)
Image()\Sprite = 0
EndIf
EndProcedure
Procedure Liberer()
ForEach Image()
If Image()\Memoire
FreeMemory(Image()\Memoire)
Image()\Memoire = 0
EndIf
If IsSprite(Image()\Sprite)
FreeSprite3D(Image()\Sprite3D)
FreeSprite(Image()\Sprite)
Image()\Sprite = 0
EndIf
Next
EndProcedure
Procedure Image_Chercher(Dossier.s)
If Right(Dossier, 1) <> "\"
Dossier + "\"
EndIf
If ExamineDirectory(0, Dossier, "*.*")
ClearList(Image())
While NextDirectoryEntry(0)
If DirectoryEntryType(0) = #PB_DirectoryEntry_File
Extension.s = LCase(GetExtensionPart(DirectoryEntryName(0)))
If Extension = "jpg" Or Extension = "bmp"
AddElement(Image())
Image()\Fichier = Dossier + DirectoryEntryName(0)
EndIf
EndIf
Wend
SortStructuredList(Image(), 2, OffsetOf(Structure_Image\Fichier), #PB_Sort_String)
FinishDirectory(0)
EndIf
EndProcedure
Configuration_Charger()
Configuration_Langue()
Parametre.s = LCase(ProgramParameter())
Parametre = Left(Parametre, 2)
Select Parametre
Case "p", "-p", "/p" ; Pour l'aperçu en petit
Apercu()
Case "s", "-s", "/s" ; Pour lancer normalement
; on continue le code
Case "c", "-c", "/c" ; pour la configuration
Configuration()
Case "a", "-a", "/a" ; Mot de passe
End ; on ne fait rien
Case "" ; Sans aucune demande, on demande si on veut faire l'installation ou la configuration
Configuration()
Default ; Autre chose, on fait rien
End
EndSelect
SystemParametersInfo_(#SPI_SCREENSAVERRUNNING, 1, @ScreenSaver, 0)
Image_Chercher(Option_Dossier)
If CountList(Image()) = 0
MessageRequester("Photos veille", Langue(33), 0)
End
EndIf
Ecran_Nb = ExamineDesktops()
If Ecran_Nb
Ecran_X = DesktopWidth(0)
Ecran_Y = DesktopHeight(0)
Ecran_F = DesktopFrequency(0)
Ecran_D = DesktopDepth(0)
For Index = 1 To Ecran_Nb - 1 ; on masque les autres écrans
If OpenWindow(Index, DesktopX(Index), DesktopY(Index), DesktopWidth(Index), DesktopHeight(Index), "Photo veille", #PB_Window_BorderLess)
SetWindowColor(Index, 0)
EndIf
Next
Else
MessageRequester("Photos veille", Langue(34), 0)
End
EndIf
; On ouvre l'openscreen
If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0 Or InitSprite3D() = 0
MessageRequester("Photos veille", Langue(35), 0)
End
EndIf
SetRefreshRate(Ecran_F)
If OpenScreen(Ecran_X, Ecran_Y, Ecran_D, "Photos veille") = 0
MessageRequester("Photos veille", Langue(36), 0)
End
EndIf
Sprite3DQuality(1)
TransparentSpriteColor(#PB_Default, $FF00FF)
Souris_X_Mem = Ecran_X / 2
Souris_Y_Mem = Ecran_Y / 2
MouseLocate(Souris_X_Mem, Souris_Y_Mem)
Temps_Memoire = ElapsedMilliseconds()
If Option_Image_Presentation Or Option_Image_Aleatoire = 0
Image = 0
Else
Image = Random(CountList(Image()) - 1)
EndIf
Charger(Image)
If Start3D()
SelectElement(Image(), Image)
DisplaySprite3D(Image()\Sprite3D, 0, 0)
Stop3D()
EndIf
FlipBuffers()
Repeat
; On lit les évènements clavier et souris
ExamineMouse()
ExamineKeyboard()
If KeyboardReleased(#PB_Key_Left) Or KeyboardReleased(#PB_Key_Up)
Touche_Reculer = 1
ElseIf KeyboardReleased(#PB_Key_Right) Or KeyboardReleased(#PB_Key_Down)
Touche_Avancer = 1
ElseIf KeyboardReleased(#PB_Key_F1)
Touche_Information = Touche_Information ! 1
ElseIf KeyboardReleased(#PB_Key_All)
Quitter = 1
EndIf
; Position de la souris
Souris_X = MouseX()
Souris_Y = MouseY()
Temps_Systeme = ElapsedMilliseconds()
If Effet_Principal = 0 ;- Affichage de l'image normalement
; Ici, on n'affiche rien, on garde l'image actuelle sans la rafraichir
Delay(100) ; Pour diminuer l'utilisation processeur pendant l'affichage fixe d'une image
If Touche_Avancer Or Touche_Reculer
If Touche_Avancer
Image_Nouvelle = Image + 1
Else
Image_Nouvelle = Image - 1
EndIf
If Image_Nouvelle < 0
Image_Nouvelle = CountList(Image()) - 1
EndIf
If Image_Nouvelle >= CountList(Image())
Image_Nouvelle = Option_Image_Presentation
EndIf
Effet_Principal = -1
Touche_Reculer = 0
Touche_Avancer = 0
ElseIf Temps_Systeme - Temps_Memoire > Option_Temps_Image
; Nouvelle image
If Option_Image_Aleatoire = 0 ; Ordre alphabétique
Image_Nouvelle = Image + 1
If Image_Nouvelle >= CountList(Image())
Image_Nouvelle = Option_Image_Presentation
EndIf
Else ; Ordre aléatoire
Repeat
Image_Nouvelle = Random(CountList(Image()) - Option_Image_Presentation - 1) + Option_Image_Presentation
Until Image_Nouvelle <> Image
EndIf
Charger(Image_Nouvelle)
; Choix de l'effet
Effet_Actif = 0
For n = 1 To #Effet_Nombre
Effet_Actif + Option_Effet(n)
Next
If Effet_Actif = 0
Effet_Principal = -1
Else
Effet_Actif = Random(Effet_Actif - 1) + 1
For Effet_Principal = 1 To #Effet_Nombre
If Option_Effet(Effet_Principal)
Effet_Actif - 1
If Effet_Actif = 0
Break
EndIf
EndIf
Next
EndIf
; Préparation de l'effet
Effet_Fin = 0
Select Effet_Principal
Case -1 ;- Aucun effet
Case 1 ;- Effet de fondu
Effet_Transparence.f = 0
Effet_Transparence_Pas.f = 255 / Ecran_F * 1000 / Option_Temps_Effet
Case 2 ;- Défilement
; Choix de l'effet secondaire
Effet_Actif = 0
For n = 1 To #Effet_Defilement_Nombre
Effet_Actif + Option_Effet_Defilement(n)
Next
Effet_Actif = Random(Effet_Actif - 1) + 1
For Effet_Secondaire = 1 To #Effet_Defilement_Nombre
If Option_Effet_Defilement(Effet_Secondaire)
Effet_Actif - 1
If Effet_Actif = 0
Break
EndIf
EndIf
Next
; Parametre de l'effet
Select Effet_Secondaire
Case 1 ; Défilement vers la gauche
Effet_Defilement.f = Ecran_X
Effet_Defilement_Pas.f = Ecran_X / Ecran_F * 1000 / Option_Temps_Effet
Case 2 ; Défilement vers le bas
Effet_Defilement.f = 0
Effet_Defilement_Pas.f = Ecran_Y / Ecran_F * 1000 / Option_Temps_Effet
Case 3 ; Défilement vers la droite
Effet_Defilement.f = 0
Effet_Defilement_Pas.f = Ecran_X / Ecran_F * 1000 / Option_Temps_Effet
Case 4 ; Défilement vers le haut
Effet_Defilement.f = Ecran_Y
Effet_Defilement_Pas.f = Ecran_Y / Ecran_F * 1000 / Option_Temps_Effet
EndSelect
Case 3 ;- Zoom
Effet_Zoom.f = 1
Effet_Zoom_Pas.f = 2 / Ecran_F * 1000 / Option_Temps_Effet
Effet_Zoom_Etape = 1
Case 4 ;- Diagonale
; Choix de l'effet secondaire
Effet_Actif = 0
For n = 1 To #Effet_Diagonale_Nombre
Effet_Actif + Option_Effet_Diagonale(n)
Next
Effet_Actif = Random(Effet_Actif - 1) + 1
For Effet_Secondaire = 1 To #Effet_Diagonale_Nombre
If Option_Effet_Diagonale(Effet_Secondaire)
Effet_Actif - 1
If Effet_Actif = 0
Break
EndIf
EndIf
Next
; Parametre de l'effet
Effet_Zoom.f = 1
Effet_Zoom_Pas.f = 1 / Ecran_F * 1000 / Option_Temps_Effet
Case 5 ;- Rectangle
; Choix de l'effet secondaire
Effet_Actif = 0
For n = 1 To #Effet_Rectangle_Nombre
Effet_Actif + Option_Effet_Rectangle(n)
Next
Effet_Actif = Random(Effet_Actif - 1) + 1
For Effet_Secondaire = 1 To #Effet_Rectangle_Nombre
If Option_Effet_Rectangle(Effet_Secondaire)
Effet_Actif - 1
If Effet_Actif = 0
Break
EndIf
EndIf
Next
; Parametre de l'effet
Select Effet_Secondaire
Case 1 ; Vers l'intérieur
Effet_Rectangle.f = 1
Effet_Rectangle_Pas.f = 1 / Ecran_F * 1000 / Option_Temps_Effet
SelectElement(Image(), Image)
Effet_Rectangle_Image2 = CatchImage(#PB_Any, Image()\Memoire)
Case 2 ; Vers l'extérieur
Effet_Rectangle.f = 0
Effet_Rectangle_Pas.f = 1 / Ecran_F * 1000 / Option_Temps_Effet
SelectElement(Image(), Image_Nouvelle)
Effet_Rectangle_Image2 = CatchImage(#PB_Any, Image()\Memoire)
EndSelect
If Option_Image_Redim Or ImageHeight(Effet_Rectangle_Image2) > Ecran_Y Or ImageWidth(Effet_Rectangle_Image2) > Ecran_X
If Ecran_X * ImageHeight(Effet_Rectangle_Image2) <= ImageWidth(Effet_Rectangle_Image2) * Ecran_Y
ResizeImage(Effet_Rectangle_Image2, Ecran_X, ImageHeight(Effet_Rectangle_Image2) * Ecran_X / ImageWidth(Effet_Rectangle_Image2), #PB_Image_Smooth)
Else
ResizeImage(Effet_Rectangle_Image2, ImageWidth(Effet_Rectangle_Image2) * Ecran_Y / ImageHeight(Effet_Rectangle_Image2), Ecran_Y, #PB_Image_Smooth)
EndIf
EndIf
x = (Ecran_X - ImageWidth(Effet_Rectangle_Image2)) / 2
y = (Ecran_Y - ImageHeight(Effet_Rectangle_Image2)) / 2
Effet_Rectangle_Image = CreateImage(#PB_Any, Ecran_X, Ecran_Y)
If StartDrawing(ImageOutput(Effet_Rectangle_Image))
DrawImage(ImageID(Effet_Rectangle_Image2), x, y)
StopDrawing()
EndIf
FreeImage(Effet_Rectangle_Image2)
EndSelect
Temps_Memoire = ElapsedMilliseconds()
EndIf
Else ;- Effet de transition
; On ne change l'affichage que pendant une transition.
ClearScreen($000000)
If Start3D()
Select Effet_Principal
Case -1 ;- Aucun effet
Charger(Image_Nouvelle)
SelectElement(Image(), Image_Nouvelle)
DisplaySprite3D(Image()\Sprite3D, 0, 0)
Effet_Fin = 1
Case 1 ;- Effet de fondu
Effet_Transparence + Effet_Transparence_Pas
If Effet_Transparence >= 255
Effet_Fin = 1
Effet_Transparence = 255
EndIf
SelectElement(Image(), Image)
DisplaySprite3D(Image()\Sprite3D, 0, 0)
SelectElement(Image(), Image_Nouvelle)
DisplaySprite3D(Image()\Sprite3D, 0, 0, Effet_Transparence)
Case 2 ;- Defilement
Select Effet_Secondaire
Case 1 ; Défilement vers la gauche
Effet_Defilement - Effet_Defilement_Pas
If Effet_Defilement <= 0
Effet_Fin = 1
Effet_Defilement = 0
EndIf
SelectElement(Image(), Image)
DisplaySprite3D(Image()\Sprite3D, Effet_Defilement - Ecran_X, 0)
SelectElement(Image(), Image_Nouvelle)
DisplaySprite3D(Image()\Sprite3D, Effet_Defilement, 0)
Case 2 ; Défilement vers le bas
Effet_Defilement + Effet_Defilement_Pas
If Effet_Defilement >= Ecran_Y
Effet_Fin = 1
Effet_Defilement = Ecran_Y
EndIf
SelectElement(Image(), Image)
DisplaySprite3D(Image()\Sprite3D, 0, Effet_Defilement)
SelectElement(Image(), Image_Nouvelle)
DisplaySprite3D(Image()\Sprite3D, 0, Effet_Defilement - Ecran_Y)
Case 3 ; Défilement vers la droite
Effet_Defilement + Effet_Defilement_Pas
If Effet_Defilement >= Ecran_X
Effet_Fin = 1
Effet_Defilement = Ecran_X
EndIf
SelectElement(Image(), Image)
DisplaySprite3D(Image()\Sprite3D, Effet_Defilement, 0)
SelectElement(Image(), Image_Nouvelle)
DisplaySprite3D(Image()\Sprite3D, Effet_Defilement - Ecran_X, 0)
Case 4 ; Défilement vers le haut
Effet_Defilement - Effet_Defilement_Pas
If Effet_Defilement <= 0
Effet_Fin = 1
Effet_Defilement = 0
EndIf
SelectElement(Image(), Image)
DisplaySprite3D(Image()\Sprite3D, 0, Effet_Defilement - Ecran_Y)
SelectElement(Image(), Image_Nouvelle)
DisplaySprite3D(Image()\Sprite3D, 0, Effet_Defilement)
EndSelect
Case 3 ;- Zoom
If Effet_Zoom_Etape = 1
SelectElement(Image(), Image)
Effet_Zoom - Effet_Zoom_Pas
If Effet_Zoom <= 0
Effet_Zoom_Etape = 2
Effet_Zoom = 0
Else
ZoomSprite3D(Image()\Sprite3D, Ecran_X * Effet_Zoom, Ecran_Y * Effet_Zoom)
DisplaySprite3D(Image()\Sprite3D, Ecran_X * (1 - Effet_Zoom) / 2, Ecran_Y * (1 - Effet_Zoom) / 2)
EndIf
Else
SelectElement(Image(), Image_Nouvelle)
Effet_Zoom + Effet_Zoom_Pas
If Effet_Zoom >= 1
Effet_Zoom_Etape = 2
Effet_Zoom = 1
Effet_Fin = 1
ZoomSprite3D(Image()\Sprite3D, Ecran_X, Ecran_Y)
DisplaySprite3D(Image()\Sprite3D, 0, 0)
Else
ZoomSprite3D(Image()\Sprite3D, Ecran_X * Effet_Zoom, Ecran_Y * Effet_Zoom)
DisplaySprite3D(Image()\Sprite3D, Ecran_X * (1 - Effet_Zoom) / 2, Ecran_Y * (1 - Effet_Zoom) / 2)
EndIf
EndIf
Case 4 ;- Diagonale
Select Effet_Secondaire
Case 1 ; Haut gauche vers bas droit
Effet_Zoom - Effet_Zoom_Pas
If Effet_Zoom <= 0
Effet_Zoom = 0
Effet_Fin = 1
SelectElement(Image(), Image_Nouvelle)
ZoomSprite3D(Image()\Sprite3D, Ecran_X, Ecran_Y)
DisplaySprite3D(Image()\Sprite3D, 0, 0)
Else
SelectElement(Image(), Image_Nouvelle)
ZoomSprite3D(Image()\Sprite3D, Ecran_X * (1 - Effet_Zoom), Ecran_Y * (1 - Effet_Zoom))
DisplaySprite3D(Image()\Sprite3D, 0, 0)
SelectElement(Image(), Image)
ZoomSprite3D(Image()\Sprite3D, Ecran_X * Effet_Zoom, Ecran_Y * Effet_Zoom)
DisplaySprite3D(Image()\Sprite3D, Ecran_X * (1 - Effet_Zoom), Ecran_Y * (1 - Effet_Zoom))
EndIf
Case 2 ; Bas gauche vers haut droit
Effet_Zoom - Effet_Zoom_Pas
If Effet_Zoom <= 0
Effet_Zoom = 0
Effet_Fin = 1
SelectElement(Image(), Image_Nouvelle)
ZoomSprite3D(Image()\Sprite3D, Ecran_X, Ecran_Y)
DisplaySprite3D(Image()\Sprite3D, 0, 0)
Else
SelectElement(Image(), Image_Nouvelle)
ZoomSprite3D(Image()\Sprite3D, Ecran_X * (1 - Effet_Zoom), Ecran_Y * (1 - Effet_Zoom))
DisplaySprite3D(Image()\Sprite3D, Ecran_X * Effet_Zoom, 0)
SelectElement(Image(), Image)
ZoomSprite3D(Image()\Sprite3D, Ecran_X * Effet_Zoom, Ecran_Y * Effet_Zoom)
DisplaySprite3D(Image()\Sprite3D, 0, Ecran_Y * (1 - Effet_Zoom))
EndIf
Case 3 ; Haut droit vers bas gauche
Effet_Zoom - Effet_Zoom_Pas
If Effet_Zoom <= 0
Effet_Zoom = 0
Effet_Fin = 1
SelectElement(Image(), Image_Nouvelle)
ZoomSprite3D(Image()\Sprite3D, Ecran_X, Ecran_Y)
DisplaySprite3D(Image()\Sprite3D, 0, 0)
Else
SelectElement(Image(), Image_Nouvelle)
ZoomSprite3D(Image()\Sprite3D, Ecran_X * (1 - Effet_Zoom), Ecran_Y * (1 - Effet_Zoom))
DisplaySprite3D(Image()\Sprite3D, 0, Ecran_Y * Effet_Zoom)
SelectElement(Image(), Image)
ZoomSprite3D(Image()\Sprite3D, Ecran_X * Effet_Zoom, Ecran_Y * Effet_Zoom)
DisplaySprite3D(Image()\Sprite3D, Ecran_X * (1 - Effet_Zoom), 0)
EndIf
Case 4 ; Bas droit vers haut gauche
Effet_Zoom - Effet_Zoom_Pas
If Effet_Zoom <= 0
Effet_Zoom = 0
Effet_Fin = 1
SelectElement(Image(), Image_Nouvelle)
ZoomSprite3D(Image()\Sprite3D, Ecran_X, Ecran_Y)
DisplaySprite3D(Image()\Sprite3D, 0, 0)
Else
SelectElement(Image(), Image_Nouvelle)
ZoomSprite3D(Image()\Sprite3D, Ecran_X * (1 - Effet_Zoom), Ecran_Y * (1 - Effet_Zoom))
DisplaySprite3D(Image()\Sprite3D, Ecran_X * Effet_Zoom, Ecran_Y * Effet_Zoom)
SelectElement(Image(), Image)
ZoomSprite3D(Image()\Sprite3D, Ecran_X * Effet_Zoom, Ecran_Y * Effet_Zoom)
DisplaySprite3D(Image()\Sprite3D, 0, 0)
EndIf
EndSelect
Case 5 ;- Rectangle
If IsSprite(Effet_Rectangle_Sprite)
FreeSprite3D(Effet_Rectangle_Sprite3D)
FreeSprite(Effet_Rectangle_Sprite)
EndIf
Select Effet_Secondaire
Case 1 ; Vers l'intérieur
Effet_Rectangle - Effet_Rectangle_Pas
If Effet_Rectangle <= 0
Effet_Fin = 1
SelectElement(Image(), Image_Nouvelle)
DisplaySprite3D(Image()\Sprite3D, 0, 0)
FreeImage(Effet_Rectangle_Image)
Else
SelectElement(Image(), Image_Nouvelle)
Effet_Rectangle_X = Ecran_X * (1 - Effet_Rectangle) / 2
Effet_Rectangle_Y = Ecran_Y * (1 - Effet_Rectangle) / 2
Effet_Rectangle_L = Ecran_X * Effet_Rectangle
Effet_Rectangle_H = Ecran_Y * Effet_Rectangle
Effet_Rectangle_Image2 = GrabImage(Effet_Rectangle_Image, #PB_Any, Effet_Rectangle_X, Effet_Rectangle_Y, Effet_Rectangle_L, Effet_Rectangle_H)
Effet_Rectangle_Sprite = CopySprite(Image()\Sprite, #PB_Any, #PB_Sprite_Texture)
If StartDrawing(SpriteOutput(Effet_Rectangle_Sprite))
DrawImage(ImageID(Effet_Rectangle_Image2), Effet_Rectangle_X, Effet_Rectangle_Y)
StopDrawing()
EndIf
FreeImage(Effet_Rectangle_Image2)
Effet_Rectangle_Sprite3D = CreateSprite3D(#PB_Any, Effet_Rectangle_Sprite)
DisplaySprite3D(Effet_Rectangle_Sprite3D, 0, 0)
EndIf
Case 2 ; Vers l'extérieur
Effet_Rectangle + Effet_Rectangle_Pas
If Effet_Rectangle >= 1
Effet_Fin = 1
SelectElement(Image(), Image_Nouvelle)
DisplaySprite3D(Image()\Sprite3D, 0, 0)
FreeImage(Effet_Rectangle_Image)
Else
SelectElement(Image(), Image)
Effet_Rectangle_X = Ecran_X * (1 - Effet_Rectangle) / 2
Effet_Rectangle_Y = Ecran_Y * (1 - Effet_Rectangle) / 2
Effet_Rectangle_L = Ecran_X * Effet_Rectangle
Effet_Rectangle_H = Ecran_Y * Effet_Rectangle
Effet_Rectangle_Image2 = GrabImage(Effet_Rectangle_Image, #PB_Any, Effet_Rectangle_X, Effet_Rectangle_Y, Effet_Rectangle_L, Effet_Rectangle_H)
Effet_Rectangle_Sprite = CopySprite(Image()\Sprite, #PB_Any, #PB_Sprite_Texture)
If StartDrawing(SpriteOutput(Effet_Rectangle_Sprite))
DrawImage(ImageID(Effet_Rectangle_Image2), Effet_Rectangle_X, Effet_Rectangle_Y)
StopDrawing()
EndIf
FreeImage(Effet_Rectangle_Image2)
Effet_Rectangle_Sprite3D = CreateSprite3D(#PB_Any, Effet_Rectangle_Sprite)
DisplaySprite3D(Effet_Rectangle_Sprite3D, 0, 0)
EndIf
EndSelect
EndSelect
Stop3D()
EndIf
If Touche_Information
Information_NombreImage + 1
If Effet_Fin
StartDrawing(ScreenOutput())
DrawText(0, 0, "FPS = " + StrF(Information_NombreImage*1000/(Temps_Systeme - Temps_Memoire), 1))
Information_NombreImage = 0
StopDrawing()
EndIf
EndIf
If Effet_Fin
DeCharger(Image)
Temps_Memoire = Temps_Systeme
Effet_Principal = 0
Image = Image_Nouvelle
EndIf
FlipBuffers(1)
EndIf
If IsScreenActive() = 0
Quitter = 1
EndIf
If Abs(Souris_X - Souris_X_Mem) > 50 Or Abs(Souris_Y - Souris_Y_Mem) > 50 Or MouseButton(#PB_MouseButton_Left) Or MouseButton(#PB_MouseButton_Right)
Quitter = 1
EndIf
Until Quitter
Liberer()
SystemParametersInfo_(#SPI_SCREENSAVERRUNNING, 0, @ScreenSaver, 0)