Voilà ça marche beaucoup mieux ..Une bonne optimisation du zoom pour les grosses images ....
Code : Tout sélectionner
UseJPEG2000ImageDecoder()
UseJPEG2000ImageEncoder()
UseJPEGImageDecoder()
UseJPEGImageEncoder()
UsePNGImageDecoder()
UsePNGImageEncoder()
UseTGAImageDecoder()
UseTIFFImageDecoder()
InitSprite() : InitKeyboard() : InitMouse()
;-WorkBench
Structure Layer
Active.b ; #True ou #False si ce calque est affiché ou pas
Image.l ; Image originale
Opacity.l ; Transparence global de l'image : ConstAlpha de la function DrawAlphaImage()
BlendingMode.l ; Je sais pas si c'est gérable il y a un exemple d'utilisation sur le forum Anglais
FusionMaskImage.l ; Image comportant le Mask de fusion si il y a !
;http://www.purebasic.fr/english/viewtopic.php?f=13&t=36311
EndStructure
#Max_Layer=255
Structure Document
FileName.s ;Nom de l'image
Window.i ;Fenêtre contenant l'image
GdtImage.i ;N° du Gadget contenant l'image
GdtScrollBarV.i ;N° du Gadget pour le Scrolling de l'image Verticalement
GdtScrollBarH.i ;N°du Gadget pour le Scrolling de l'image Horizontalement
RenderImage.l ;Image de rendu des layers
Zoom.f ;Zoom de l'image
WorkImage.l ; Image redimensionné et affiché !
Depth.b ;Profondeur de l'image (peut être n'en a t'on pas besoin ImageDepth() suffit
ImageSelection.l ;Image comportant le Masque de Selection
Layer.l ;Numero du layer selectionné
NbLayer.l ;Nombre de Layer
Layers.Layer[#Max_Layer] ;Les informations sur les layers mais je ne sais pas si c'est la bonne façon de faire
EndStructure
Global NewList Workbench.Document()
;Variable général aux outils (a voir si ces infos devraient pas être propre a chaque outil)
Structure ToolsInfo
FrontColor.l ;Couleur de premier plan
BackgroundColor.l ;Couleur d'arrière plan
ToolRenderMode.l ;Mode de rendu des outils voir enumeration si dessous Couleur/Gradiant/Pattern
EndStructure
Global ToolsInfo.ToolsInfo
Structure InterfaceInfo
WinMain.i ;N° de la fenêtre principal
WinTools.i
EndStructure
Global InterfaceInfo.InterfaceInfo
;Mode de rendu d'un outil
Enumeration
#ModeCouleur ;On utilise les couleur de premier et arrière plan
#ModeGradiant ;On utilise un dégradé
#ModePattern ;On utilise un motif
EndEnumeration
;-EX GUI
Structure Ex
CLRFACE.l
CLRHILIGHT.l
CLRLIGHT.l
CLRSHADOW.l
CLRDKSHADOW.l
WINDRAG.b
WINZONE.l
EndStructure
Global Ex.Ex
Ex\CLRFACE = RGB(113,113,113);32
Ex\CLRHILIGHT = RGB(145,145,145);42
Ex\CLRLIGHT = RGB(113,113,113);32
Ex\CLRSHADOW = RGB(88,88,88);25
Ex\CLRDKSHADOW = RGB(71,71,71);20
;-ExWindows
Structure ExWindow
Sprite.i
X.l
Y.l
Width.l
Height.l
Title.s
EndStructure
Global NewList ExWindow.ExWindow()
Procedure ExDrawRect(X,Y,Width,Height,Mode)
Select Mode
Case 0
Box(X,Y,Width,Height,Ex\CLRDKSHADOW)
Box(X + 1,Y + 1,Width - 2,Height - 2,Ex\CLRSHADOW)
Box(X + 2,Y + 2,Width - 4,Height - 4,Ex\CLRFACE)
Case 1
Box(X,Y,Width,Height,Ex\CLRDKSHADOW)
Box(X,Y,Width - 1,Height - 1,Ex\CLRLIGHT)
Box(X + 1,Y + 1,Width - 2,Height - 2,Ex\CLRSHADOW)
Box(X + 1,Y + 1,Width - 3,Height - 3,Ex\CLRHILIGHT)
Box(X + 2,Y + 2,Width - 4,Height - 4,Ex\CLRFACE)
Case 2
Box(X,Y,Width,Height,Ex\CLRDKSHADOW)
EndSelect
EndProcedure
Declare RenderExGadget()
Procedure RenderExWindow()
StartDrawing(SpriteOutput(ExWindow()\Sprite))
DrawingMode(#PB_2DDrawing_Transparent)
Box(0,0,ExWindow()\Width,ExWindow()\Height,Ex\CLRDKSHADOW)
Box(0,0,ExWindow()\Width - 1,ExWindow()\Height - 1,Ex\CLRLIGHT)
Box(1,1,ExWindow()\Width - 2,25,Ex\CLRSHADOW)
Box(1,1,ExWindow()\Width - 3,24,Ex\CLRHILIGHT)
Box(2,2,ExWindow()\Width - 4,23,Ex\CLRLIGHT)
Box(1,26,ExWindow()\Width - 2,ExWindow()\Height - 27,Ex\CLRSHADOW)
Box(1,26,ExWindow()\Width - 3,ExWindow()\Height - 28,Ex\CLRHILIGHT)
Box(2,27,ExWindow()\Width - 4,ExWindow()\Height - 29,Ex\CLRFACE)
;GUI_DrawGradient(2,2,Width - 4,23,GUI_CLRSHADOW,GUI_CLRFACE)
;GUI_DrawGradient(2,27,Width - 4,Height - 29,GUI_CLRFACE,GUI_CLRSHADOW)
;DrawingFont(FontID(#GUI_Font_Icon))
;GUI_DrawRect(Width - 23,6,17,16)
;DrawText(Width - 20,9,"r",RGB(230,200,180))
;DrawingFont(FontID(#GUI_Font_Caption))
DrawText(12,8,ExWindow()\Title,RGB(60,0,0))
DrawText(10,6,ExWindow()\Title,#White)
RenderExGadget()
StopDrawing()
EndProcedure
Procedure OpenExWindow(X,Y,Width,Height,Title.s,Option.l=0)
AddElement(ExWindow())
ExWindow()\Sprite = CreateSprite(#PB_Any,Width,Height,#PB_Sprite_Memory)
ExWindow()\X=X
ExWindow()\Y=Y
ExWindow()\Width=Width
ExWindow()\Height=Height
ExWindow()\Title=Title
RenderExWindow()
ProcedureReturn ExWindow()
EndProcedure
Procedure ExResizeWindow(Handle,Width,Height)
If Handle<>0
ChangeCurrentElement(ExWindow(),Handle)
EndIf
If Width<10:Width=10:EndIf
If Height<25:Height=25:EndIf
ExWindow()\Width=Width
ExWindow()\Height=Height
FreeSprite(ExWindow()\Sprite)
ExWindow()\Sprite=CreateSprite(#PB_Any,Width,Height,#PB_Sprite_Memory)
UseBuffer(Sprite)
RenderExWindow()
EndProcedure
Procedure SetExWindowTitle(Handle,Title.s)
If Handle<>0
ChangeCurrentElement(ExWindow(),Handle)
EndIf
ExWindow()\Title=Title
RenderExWindow()
EndProcedure
Procedure ExWindowX(Handle=0)
If Handle<>0
ChangeCurrentElement(ExWindow(),Handle)
EndIf
ProcedureReturn ExWindow()\X
EndProcedure
Procedure ExWindowY(Handle=0)
If Handle<>0
ChangeCurrentElement(ExWindow(),Handle)
EndIf
ProcedureReturn ExWindow()\Y
EndProcedure
Procedure ExWindowWidth(Handle=0)
If Handle<>0
ChangeCurrentElement(ExWindow(),Handle)
EndIf
ProcedureReturn ExWindow()\Width
EndProcedure
Procedure ExWindowHeight(Handle=0)
If Handle<>0
ChangeCurrentElement(ExWindow(),Handle)
EndIf
ProcedureReturn ExWindow()\Height
EndProcedure
Procedure GetActiveExWindow()
LastElement(ExWindow())
ProcedureReturn ExWindow()
EndProcedure
Procedure ExamineExGUI()
Static MouseX.l,MouseY.l
StartDrawing(ScreenOutput())
ForEach ExWindow()
DisplaySprite(ExWindow()\Sprite,ExWindow()\X,ExWindow()\Y)
Next
StopDrawing()
If Ex\WINZONE=0 And MouseButton(#PB_MouseButton_Left)
LastElement(ExWindow())
Repeat
If MouseX()>ExWindow()\X And MouseX()<ExWindow()\X+ExWindow()\Width And MouseY()>ExWindow()\Y And MouseY()<ExWindow()\Y+ExWindow()\Height
If MouseY()>ExWindow()\Y And MouseY()<ExWindow()\Y+25:Ex\WINZONE=1:EndIf
If MouseX()>ExWindow()\X+ExWindow()\Width-25 And MouseY()>ExWindow()\Y+ExWindow()\Height-25:Ex\WINZONE=2:EndIf
*FirstElement = ExWindow()
LastElement(ExWindow())
*LastElement = ExWindow()
If *FirstElement=*LastElement
Break;
Else
SwapElements(ExWindow(),*FirstElement,*LastElement)
Break;
EndIf
EndIf
Until PreviousElement(ExWindow())=0
LastElement(ExWindow())
EndIf
If MouseButton(#PB_MouseButton_Left)
If Ex\WINZONE=1 And Ex\WINDRAG=#True
ExWindow()\X=ExWindow()\X+MouseX()-MouseX
ExWindow()\Y=ExWindow()\Y+MouseY()-MouseY
ElseIf Ex\WINZONE=2 And Ex\WINDRAG=#True
ExResizeWindow(0,ExWindow()\Width+MouseX()-MouseX,ExWindow()\Height+MouseY()-MouseY)
EndIf
MouseX=MouseX()
MouseY=MouseY()
Ex\WINDRAG=#True
Else
Ex\WINDRAG=#False
Ex\WINZONE=0
EndIf
EndProcedure
;-ExMenu
Procedure RenderExMenu()
StartDrawing(ScreenOutput())
Box(0,0,WindowWidth(0),25,Ex\CLRDKSHADOW)
Box(0,0,WindowWidth(0) - 1,24,Ex\CLRLIGHT)
Box(1,1,WindowWidth(0) - 2,25,Ex\CLRSHADOW)
Box(1,1,WindowWidth(0) - 3,24,Ex\CLRHILIGHT)
Box(2,2,WindowWidth(0) - 4,23,Ex\CLRLIGHT)
StopDrawing()
EndProcedure
;-ExGadget
Structure ExGadget
WinHandle.i
Type.l
X.l
Y.l
Width.l
Height.l
Name.s
ValueA.f
ValueB.f
ValueC.f
ValueD.f
Option.l
EndStructure
Global NewList ExGadget.ExGadget()
Procedure ScrollBarExGadget(x.l, y.l, Width.l, Height.l, Min.l, Max.l, Len.l , Options=0)
AddElement(ExGadget())
ExGadget()\WinHandle=ExWindow()
ExGadget()\X=x
ExGadget()\Y=y
ExGadget()\Width=width
ExGadget()\Height=height
ExGadget()\ValueA=Min
ExGadget()\ValueB=Max
ExGadget()\ValueC=Len
EndProcedure
Procedure ResizeExGadget(Handle.l,x.l, y.l, Width.l, Height.l)
If Handle<>0
ChangeCurrentElement(ExGadget(),Handle)
EndIf
If x<>#PB_Ignore:ExGadget()\X=x:EndIf
If y<>#PB_Ignore:ExGadget()\X=y:EndIf
If Width<>#PB_Ignore:ExGadget()\X=Width:EndIf
If Height<>#PB_Ignore:ExGadget()\X=Height:EndIf
EndProcedure
Procedure RenderExGadget()
ForEach ExGadget()
If ExGadget()\WinHandle=ExWindow()
Select ExGadget()\Type
Case 0
If Option=0
ExDrawRect(ExGadget()\X,ExGadget()\Y,ExGadget()\Height,ExGadget()\Height,0)
ExDrawRect(ExGadget()\X+ExGadget()\Width-ExGadget()\Height,ExGadget()\Y,ExGadget()\Height,ExGadget()\Height,0)
ExDrawRect(ExGadget()\X+ExGadget()\Height,ExGadget()\Y,ExGadget()\Width-ExGadget()\Height*2,ExGadget()\Height,2)
bwidth=(ExGadget()\Width-ExGadget()\Height*2)-(ExGadget()\ValueB-ExGadget()\ValueA)
ExDrawRect(ExGadget()\X+ExGadget()\Height,ExGadget()\Y+2,bwidth,ExGadget()\Height-4,1)
EndIf
EndSelect
EndIf
Next
EndProcedure
;-WorkBench Procedure
Procedure AddLayer(Image.i=0)
;si on a pas de n° d'image dans les paramètres alors on créer l'image en fonction de l'image de rendu
If Image=0
Image=CreateImage(#PB_Any,ImageWidth(Workbench()\RenderImage),ImageHeight(Workbench()\RenderImage),ImageDepth(Workbench()\RenderImage))
EndIf
Workbench()\NbLayer+1 ;On ajoute un calque
Workbench()\Layers.Layer[Workbench()\NbLayer]\Active=#True ;On l'active
Workbench()\Layers.Layer[Workbench()\NbLayer]\Image=Image ;l'image du calque
Workbench()\Layers.Layer[Workbench()\NbLayer]\Opacity=255 ;L'opacité du calque
Workbench()\Layer=Workbench()\NbLayer ; Et part defaut on selectionne le calque qu'on vient d'ajouter
EndProcedure
;Rendu des calques
Procedure RenderLayers()
Protected z.l
;Le rendu des calques se fait sur l'image de rendu
StartDrawing(ImageOutput(Workbench()\RenderImage))
For z=1 To Workbench()\NbLayer ; je dessine chaque calque
;Si le calque est bien visible(activé)
DrawingMode(#PB_2DDrawing_AlphaClip)
If Workbench()\Layers.Layer[z]\Active=#True
DrawAlphaImage(ImageID(Workbench()\Layers.Layer[z]\Image),0,0,Workbench()\Layers.Layer[z]\Opacity)
EndIf
Next
StopDrawing()
EndProcedure
;Pour écrire sur le calque selectionné
Procedure WriteLayerPixel(x.l,y.l,Color.l)
Select ToolsInfo\ToolRenderMode
;Si l'outil doit écrire avec une couleur
Case #ModeCouleur
Protected Image.i=Workbench()\Layers.Layer[Workbench()\Layer]\Image
Protected Width.l,Height.l
Width=ExWindowWidth(Workbench()\Window)-20
If Width>ImageWidth(Workbench()\RenderImage)*Workbench()\Zoom
Width=ImageWidth(Workbench()\RenderImage)*Workbench()\Zoom
EndIf
If Width<1
Width=1
EndIf
Height=ExWindowHeight(Workbench()\Window)-20
If Height>ImageHeight(Workbench()\RenderImage)*Workbench()\Zoom
Height=ImageHeight(Workbench()\RenderImage)*Workbench()\Zoom
EndIf
If Height<1
Height=1
EndIf
Dx=(ExWindowWidth(Workbench()\Window)-Width)/2
Dy=26+(ExWindowHeight(Workbench()\Window)-Height-26)/2
x=(x-ExWindowX(Workbench()\Window)-Dx)/Workbench()\Zoom
y=(y-ExWindowY(Workbench()\Window)-Dy)/Workbench()\Zoom
StartDrawing(ImageOutput(Image))
If x>0 And x<ImageWidth(Image) And y>0 And y<ImageHeight(Image)
Plot(x,y,Color)
EndIf
StopDrawing()
;Si l'outil doit écrire avec un dégradé
Case #ModeGradiant
;Si l'outil doit écrire avec un motif
Case #ModePattern
EndSelect
EndProcedure
Procedure RefreshWindow()
Protected Max.l,DeltaX.l,DeltaY.l
;Je modifie le nom de la fenêtre car elle contient des informations sur le nom le zoom et la profondeur de l'image
SetExWindowTitle(Workbench()\Window, GetFilePart(Workbench()\FileName)+" @ "+Str(Abs(Workbench()\Zoom*100))+"%"+" (Layer"+Str(Workbench()\Layer)+",???/"+Str(ImageDepth(Workbench()\RenderImage))+")")
;Dans le cas d'un redimensionnement de la fenêtre je redimenssione les ScrollBar
ResizeExGadget(Workbench()\GdtScrollBarV,ExWindowWidth(Workbench()\Window)-20, 0, 20, ExWindowHeight(Workbench()\Window))
Max=ImageHeight(Workbench()\RenderImage)*Workbench()\Zoom-ExWindowHeight(Workbench()\Window)-20
If Max<0:Max=0:EndIf
;SetGadgetAttribute(Workbench()\GdtScrollBarV,#PB_ScrollBar_Maximum,Max)
ResizeExGadget(Workbench()\GdtScrollBarH,100, ExWindowHeight(Workbench()\Window)-20, ExWindowWidth(Workbench()\Window)-120, 20)
Max=ImageWidth(Workbench()\RenderImage)*Workbench()\Zoom-ExWindowWidth(Workbench()\Window)-20
If Max<0:Max=0:EndIf
;SetGadgetAttribute(Workbench()\GdtScrollBarH,#PB_ScrollBar_Maximum,Max)
RenderLayers();Je fait un rendu complet
;Une fois le rendu finit je créer l'image qui sera affiché dans la fenêtre
If IsImage(Workbench()\WorkImage)
FreeImage(Workbench()\WorkImage)
EndIf
;Position des ScrollsBar
DeltaX=0;GetGadgetState(Workbench()\GdtScrollBarH)
DeltaY=0;GetGadgetState(Workbench()\GdtScrollBarV)
;Calcul de la taille de l'image affiché dans la fenêtre
Protected Width.l,Height.l
Width=ImageWidth(Workbench()\RenderImage)*Workbench()\Zoom
If Width>ExWindowWidth(Workbench()\Window)
Width=ExWindowWidth(Workbench()\Window)
EndIf
If Width<1
Width=1
EndIf
Height=ImageHeight(Workbench()\RenderImage)*Workbench()\Zoom
If Height>ExWindowHeight(Workbench()\Window)
Height=ExWindowHeight(Workbench()\Window)
EndIf
If Height<1
Height=1
EndIf
;tmp=GrabImage(Workbench()\RenderImage,#PB_Any,0)
Workbench()\WorkImage=GrabImage(Workbench()\RenderImage,#PB_Any,0,0,Width/Workbench()\Zoom,Height/Workbench()\Zoom)
ResizeImage(Workbench()\WorkImage,Width,Height,#PB_Image_Raw)
;Workbench()\WorkImage=CreateImage(#PB_Any,Width,Height,ImageDepth(Workbench()\RenderImage)) ; je créer l'image
;On affiche la partie de l'image qui est visible
;StartDrawing(ImageOutput(Workbench()\WorkImage))
; DrawImage(ImageID(tmp),-DeltaX,-DeltaY,ImageWidth(Workbench()\RenderImage)*Workbench()\Zoom,ImageHeight(Workbench()\RenderImage)*Workbench()\Zoom)
;StopDrawing()
;FreeImage(tmp)
;
StartDrawing(SpriteOutput(ExWindow()\Sprite))
XImage=(ExWindowWidth(Workbench()\Window)-Width)/2
YImage=26+(ExWindowHeight(Workbench()\Window)-Height-26)/2
Box(XImage-1,YImage-1,Width+2,Height+2,#Black)
DrawImage(ImageID(Workbench()\WorkImage),XImage,YImage,Width,Height)
;Grille
If Workbench()\Zoom>3
z.f=0
Repeat
z=z+Workbench()\Zoom
Line(XImage+z,YImage,1,Height,#Black)
Until z>=Width
z=0
Repeat
z=z+Workbench()\Zoom
Line(XImage,YImage+z,Width,1,#Black)
Until z>=Height
EndIf
StopDrawing()
EndProcedure
;Ouverdure d'une image ou creation d'un nouveau document
Procedure NewDocument(Name.s="")
Protected Image.i
AddElement(Workbench())
If Name=""
Name.s="Untitled "+Str(ListSize(Workbench()))
EndIf
Workbench()\FileName=Name
If FileSize(Workbench()\FileName)>0
Image=LoadImage(#PB_Any,Workbench()\FileName)
Else
Image=CreateImage(#PB_Any,320,200,32);Il faudra ici mettre des variables pour la taille part defaut (peut être prendre la taille de l'image si dans le presse papier)
StartDrawing(ImageOutput(Image))
Box(0,0,320,200,#Red)
Circle(50,50,25,#Blue)
StopDrawing()
EndIf
;Ouverture de la fenêtre contenant l'image
Workbench()\Window=OpenExWindow(ExWindowWidth(InterfaceInfo\WinTools)+ListIndex(Workbench())*16, 25+ListIndex(Workbench())*16, 640, 480, "",#PB_Window_Tool|#PB_Window_TitleBar|#PB_Window_SizeGadget|#PB_Window_SystemMenu)
;Creation des gadgets
;Workbench()\GdtScrollBarV=ScrollBarExGadget(ExWindowWidth(Workbench()\Window)-20, 0, 20, ExWindowHeight(Workbench()\Window),0,0,10,#PB_ScrollBar_Vertical)
Workbench()\GdtScrollBarH=ScrollBarExGadget(100, ExWindowHeight(Workbench()\Window)-20, ExWindowWidth(Workbench()\Window)-120, 20,0,0,10)
;On definit une Image pour le rendu final des calques
Workbench()\RenderImage=CreateImage(#PB_Any,ImageWidth(Image),ImageHeight(Image),ImageDepth(Image))
;On definit le Zoom en fonction de la taille de l'image et de la fenêtre
Workbench()\Zoom=ExWindowWidth(Workbench()\Window)/ImageWidth(Image)
AddLayer(Image);On créer le premier calque du document
RefreshWindow();On rafraichissement
*FirstElement = ExWindow()
LastElement(ExWindow())
*LastElement = ExWindow()
SwapElements(ExWindow(),*FirstElement,*LastElement)
EndProcedure
; Open Screen
OpenWindow(0,0,0,1024,768,"PBPhoto",#PB_Window_SystemMenu | #PB_Window_ScreenCentered |#PB_Window_SizeGadget)
OpenWindowedScreen(WindowID(0),0,0,1024,768,0,0,0)
InterfaceInfo\WinTools=OpenExWindow(0,25,100,250,"Tools")
EnableWindowDrop(0,#PB_Drop_Files,#PB_Drag_Copy)
NewDocument("1-avatar.jpg")
;NewDocument()
;NewDocument()
; Mouse Pointer
lpBuffer = AllocateMemory(630)
UnpackMemory(?Cursor,lpBuffer)
CatchSprite(0,lpBuffer)
TransparentSpriteColor(0,RGB(0,128,128))
FreeMemory(lpBuffer)
Repeat
Event = WindowEvent()
If inscreen
If MouseX()>WindowWidth(0)-2 Or MouseY()>WindowHeight(0)-2 Or MouseX()<1 Or MouseY()<1
ReleaseMouse(1)
inscreen = #False
EndIf
Else
;
;************************************
; Handle #PB_Event_Gadget Here
;************************************
If Event= #PB_Event_SizeWindow
;OpenWindowedScreen(WindowID(0),0,0,WindowWidth(0)+10,WindowHeight(0)+10,0,0,0)
EndIf
If Event = #PB_Event_WindowDrop
Debug "Coucou"
Debug EventDropFiles()
EndIf
If Event = #PB_Event_Gadget
If EventGadget() = 1
MessageRequester("","You pressed the button!")
EndIf
EndIf
;On verifie si on est dans l'ecran
mx = WindowMouseX(0):my = WindowMouseY(0)
If mx < WindowWidth(0)-2 And mx > 0 And my > 0 And my < WindowHeight(0)-2
ReleaseMouse(0)
MouseLocate(mx,my)
inscreen = #True
EndIf
EndIf
;On Se positionne sur le bon Document
If LastWindow<>GetActiveExWindow()
ForEach Workbench() ;On cherche a retrouver le document propre a la fenêtre active
If Workbench()\Window=GetActiveExWindow() ;Hop on l'a trouvé
Break;
EndIf
Next
LastWindow=GetActiveExWindow();Je mémorise la fenêtre histoire de ne pas faire la recherche a chaque boucle
EndIf
ClearScreen(Ex\CLRHILIGHT)
ExamineKeyboard()
ExamineExGUI():RenderExMenu()
If inscreen ; manage mouse events only if mouse is inside screen
Event=WindowEvent()
If Event = #PB_Event_WindowDrop
Debug "Coucou"
Debug EventDropFiles()
NewDocument(EventDropFiles())
EndIf
ExamineMouse()
If MouseButton(#PB_MouseButton_Left) And Ex\WINZONE=0
RefreshWindow()
WriteLayerPixel(MouseX(),MouseY(),#Red)
EndIf
If MouseWheel()
If Workbench()\Zoom+MouseWheel()*0.1>0
Workbench()\Zoom+MouseWheel()*0.1
EndIf
RefreshWindow()
EndIf
DisplayTransparentSprite(0,MouseX(),MouseY())
EndIf
LastElement(ExWindow())
FlipBuffers()
Until KeyboardPushed(1) Or Event = #PB_Event_CloseWindow
; ExamineKeyboard() : ExamineMouse() :ExamineExGUI():RenderExMenu()
;
; -------------------------------------------------------------------
; DATA SECTION
; -------------------------------------------------------------------
DataSection
Cursor:
Data.l $0276434A,$4A720000,$A9B7AACC,$146320D0,$284A6811,$01232023,$9188409D,$F3000461,$20492601,$0A0401E0
Data.l $E00081C0,$FFC0E015,$09302024,$409C3C04,$66013801,$FE4D02B6,$91FB77FB,$B7C236B7,$BDF63086,$BFEC1EC1
Data.l $C0F36107,$0F625EF7,$008A083D,$87FFF581,$C4592A11,$4287C926,$3EC90540,$69F6974F,$21E5E328,$DDDE6107
Data.l $50B353C6,$0FB86C06,$0000D893
Data.b $90,$48
EndDataSection