- la possibilité de travailler sur des grandes images : c'est juste un test, car je dois réfléchir à l'élaboration d'un système par Dalle, comme me l'avait suggérer Djes
- un nouveau système de création de brush, adapté de mon exemple sur les dégradés
Code : Tout sélectionner
; Blendman 07/2012 - pb 4.61
; Test for Animatoon, my 2D painting and animation software
; help by Falsam (2011) (keyboard event with canvas)
;{ constante, enum
#windowMain = 0
#statusbar =0
#toolbar = 0
Enumeration ; Gadget
#GADGET_Canvas
#GADGET_CanvasRulersTop
#GADGET_CanvasRulersLeft
; panel brush
#panel_brush
#ImageColor
; brush parameters
#Gad_BrushSize
#Gad_BrushSizeTB
#Gad_BrushAlpha
#Gad_BrushAlphaTB
#Gad_BrushTool
#Gad_BrushPreview
#Gad_BrushPas
#Gad_BrushRotationRnd
#Gad_BrushRotation
; for the circle custom brush tool
#Gadget_FrCustomBrush
#Gadget_GradientX
#Gadget_GradientX2
#Gadget_GradientX3
#Gadget_AlphaGradientX
#Gadget_AlphaGradientX2
#Gadget_AlphaGradientX3
; panel Layer
#panel_Layer
#gadget_TGLayer
#gadget_btnAddLayer
#gadget_TB_LayerAlpha
; animation
#gadget_AnimPreview
#gadget_LayerAnim
EndEnumeration
Enumeration ;image
#image_brush
#image_brushCopy
#img_brushPreview
#img_final
#img_Copy
#img_Color
EndEnumeration
;{ menu
#menu = 0
Enumeration
#menu_open
#menu_new
#menu_File_SaveLayer
#menu_exit
#menu_Edit_Clear
#menu_Image_SizeImage
#menu_Image_Document
#menu_WinAnimProp
#menu_Help_About
EndEnumeration
;}
;}
;{ structures & variables
Structure StLayer
x.w : y.w : img.l : imgcopy.l : name$ : pos.a : visible.a : alpha.a : selected.a : locked.a
EndStructure
Global NewList layer.StLayer()
Structure StDoc
LayerActif.l : LayerCopyActif.l : h.w : w.w : zoom.w
EndStructure
Global doc.stdoc
doc\w = 3000 : doc\h = 3000 : doc\zoom = 100
Structure StBrush
x.w : y.w : alpha.a : size.w : color.l : tool.a : pas.u
gradientX.d : gradientX2.d : gradientX3.d
alphaGradientX.a : alphaGradientX2.a : alphaGradientX3.a
EndStructure
Global brush.stbrush
Global scrollw,scrollh,MouseX_Old,MouseY_Old,canvas_x,canvas_y
;{ brush parameters
With brush
\alpha = 255
\color = RGBA(0,0,0,brush\alpha)
\size = 50
\gradientX = 0.1
\gradientX2 = 0.1
\gradientX3 = 0.5
\alphaGradientX = 255
\alphaGradientX2 = 0
\alphaGradientX3 = 125
\pas = 5
EndWith
;}
;}
;{ procedures
Macro point_distance(x1,y1,x2,y2)
Int(Sqr((x2-x1)*(x2-x1) + (y2-y1)*(y2-y1)))
EndMacro
Macro point_direction(x1,y1,x2,y2)
ATan2((y2- y1),(x2- x1))
EndMacro
Procedure UpdateScreen(x=0,y=0)
If StartDrawing(CanvasOutput(#GADGET_Canvas))
Box(0,0,doc\w,doc\h,RGBA(200,200,200,255))
Box(x,y,doc\w* doc\zoom/100,doc\h*doc\zoom/100,RGBA(255,255,255,255))
DrawingMode(#PB_2DDrawing_AlphaBlend)
ForEach layer()
With layer()
If layer()\visible
DrawAlphaImage(ImageID(\imgcopy),x,y, layer()\alpha)
EndIf
EndWith
Next
StopDrawing()
EndIf
EndProcedure
; layer
Procedure UpdateLayerUi()
ClearGadgetItems(#gadget_TGLayer)
ForEach layer()
AddGadgetItem(#gadget_TGLayer,layer()\pos-1,layer()\name$)
SetGadgetItemState(#gadget_TGLayer,layer()\pos-1,#PB_Tree_Checked)
Next
EndProcedure
Procedure AddLayer()
AddElement(layer())
With layer()
\img = CreateImage(#PB_Any,doc\w,doc\h,32|#PB_Image_Transparent)
\imgcopy =CopyImage(\img,#PB_Any)
\pos = ListSize(layer())
doc\LayerActif = \img
doc\LayerCopyActif = \imgcopy
\name$ = "Layer"+Str(ListSize(layer()))
\alpha = 255
\visible = 1
EndWith
UpdateLayerUi()
EndProcedure
; brush
Procedure DrawBrush(x1,y1)
Define.d paspos,x_result,y_result
Shared distTotal,x3,y3
x2 = MouseX_Old - canvas_x
y2 = MouseY_Old - canvas_y
dist = point_distance(x1,y1,x2,y2) ; to find the distance between two brush dots
d.d = point_direction(x1,y1,x2,y2) ; to find the direction between the two brush dots
sinD.d = Sin(d)
cosD.d = Cos(d)
b = brush\size*brush\pas/100
For u = 0 To dist -2
u + b
x_result = x1 + sinD * u ;+ rndX
y_result = y1 + cosD * u ;+ rndY
DrawAlphaImage(ImageID(#image_brushCopy),x_result-(brush\size/2)*doc\zoom/100,y_result-(brush\size/2)*doc\zoom/100)
Next
; other methode, don't work :(
; distTotal + dist
; nb = Round(distTotal/(brush\size * brush\pas/100),0)
;
; If nb >0
;
; b = (brush\size* brush\pas/100)
;
; distTotal - nb * b
;
; For u = 0 To nb-1
;
; x_result = x1 + sinD * u ;+ rndX
; y_result = y1 + cosD * u ;+ rndY
; DrawAlphaImage(ImageID(#image_brushCopy),x_result-(brush\size/2)*doc\zoom/100,y_result-(brush\size/2)*doc\zoom/100)
; ;Round(brush\size*(brush\pas/100),0);*doc\zoom/100
; Next
;
; EndIf
;
EndProcedure
Procedure DrawBrushFinal(x1,y1)
Define.d paspos,x_result,y_result
Shared distTotal,x3,y3
x2 = MouseX_Old - canvas_x
y2 = MouseY_Old - canvas_y
dist = point_distance(x1,y1,x2,y2) ; to find the distance between two brush dots
d.d = point_direction(x1,y1,x2,y2) ; to find the direction between the two brush dots
sinD.d = Sin(d)
cosD.d = Cos(d)
b = brush\size*brush\pas/100
For u = 0 To dist -2
u + b
x_result = x1 + sinD * u ;+ rndX
y_result = y1 + cosD * u ;+ rndY
DrawAlphaImage(ImageID(#image_brush),x_result*100/doc\zoom-brush\size/2,y_result*100/doc\zoom-brush\size/2)
Next
EndProcedure
Procedure UpdateBrushPreview()
tempimg = CopyImage(#image_brush,#PB_Any)
ResizeImage(tempimg,60,60)
If StartDrawing(ImageOutput(#img_brushPreview))
Box(0,0,60,60,RGB(255,255,255))
DrawAlphaImage(ImageID(tempimg),0,0)
StopDrawing()
EndIf
FreeImage(tempimg)
SetGadgetState(#Gad_BrushPreview,ImageID(#img_brushPreview))
EndProcedure
Procedure CreateBrush()
If IsImage(#image_brush)
FreeImage(#image_brush)
EndIf
If IsImage(#image_brushCopy)
FreeImage(#image_brushCopy)
EndIf
If CreateImage(#image_brush,brush\size,brush\size,32|#PB_Image_Transparent)
If StartDrawing(ImageOutput(#image_brush))
DrawingMode(#PB_2DDrawing_AlphaBlend)
If brush\tool = 0 ; circle hard
Circle(brush\size/2,brush\size/2,brush\size/2-1,brush\color)
ElseIf brush\tool = 1 ; circle shine
DrawingMode(#PB_2DDrawing_Gradient|#PB_2DDrawing_AllChannels)
BackColor (brush\color)
FrontColor(RGBA(0,0,0,0))
EllipticalGradient(brush\size/3,brush\size/3, brush\size,brush\size)
Circle(brush\size/2,brush\size/2,brush\size/2-1)
ElseIf brush\tool = 2 ; circle soft
DrawingMode(#PB_2DDrawing_Gradient|#PB_2DDrawing_AllChannels)
BackColor (brush\color)
FrontColor(RGBA(Red(brush\color),Green(brush\color),Blue(brush\color),0))
EllipticalGradient(brush\size/2,brush\size/2, brush\size/2,brush\size/2)
Circle(brush\size/2,brush\size/2,brush\size/2-1)
ElseIf brush\tool = 3 ; circle custom brush
DrawingMode(#PB_2DDrawing_Gradient|#PB_2DDrawing_AlphaBlend)
BackColor(RGBA(Red(brush\color),Green(brush\color),Blue(brush\color),brush\alphaGradientX))
GradientColor(brush\gradientX, RGBA(Red(brush\color),Green(brush\color),Blue(brush\color),brush\alphaGradientX))
GradientColor(brush\gradientX3,RGBA(Red(brush\color),Green(brush\color),Blue(brush\color),brush\alphaGradientX3))
GradientColor(brush\gradientX2,RGBA(Red(brush\color),Green(brush\color),Blue(brush\color),brush\alphaGradientX2))
FrontColor(RGBA(Red(brush\color),Green(brush\color),Blue(brush\color),brush\alpha))
CircularGradient(brush\size/2, brush\size/2, brush\size-1)
Circle(brush\size/2,brush\size/2,brush\size/2-1)
EndIf
StopDrawing()
EndIf
CopyImage(#image_brush,#image_brushCopy)
ResizeImage(#image_brushCopy,brush\size*doc\zoom/100,brush\size*doc\zoom/100,#PB_Image_Raw)
EndIf
UpdateBrushPreview()
EndProcedure
; drawing/painting
Procedure Zoom()
If doc\zoom < 10
doc\zoom = 10
ElseIf doc\zoom > 1200
doc\zoom = 1200
EndIf
CreateBrush()
w = ImageWidth(#img_final) * doc\zoom/100
h = ImageHeight(#img_final) * doc\zoom/100
Debug Str(w)+"/"+Str(h)
If w >0 And h> 0 And w < 8000 And h <8000
ForEach layer()
FreeImage(layer()\imgcopy)
layer()\imgcopy = CopyImage(layer()\img,#PB_Any)
ResizeImage(layer()\imgcopy,w,h,#PB_Image_Raw)
doc\LayerCopyActif = layer()\imgcopy
Next
UpdateScreen(canvas_x,canvas_y)
EndIf
StatusBarText(#statusbar,2,"Doc Width : "+Str(doc\w)+"/Height : "+Str(doc\h))
StatusBarText(#statusbar,1,"Zoom : "+Str(doc\zoom)+"%")
EndProcedure
Procedure paint(xx,yy)
;CreateBrush() ; When I will make change on brush dynamically (rotation, random size..)
If StartDrawing(ImageOutput(doc\LayerCopyActif))
DrawingMode(#PB_2DDrawing_AlphaBlend)
drawbrush(xx,yy)
StopDrawing()
EndIf
If StartDrawing(ImageOutput(doc\LayerActif))
DrawingMode(#PB_2DDrawing_AlphaBlend)
DrawBrushFinal(xx,yy)
StopDrawing()
EndIf
EndProcedure
; thread // not used and not finished at all , for the moment. But it could be great to use a thread to have a better fps, for the image original (not the preview)
;Procedure PaintThread(*Valeur)
; If StartDrawing(ImageOutput(doc\layeractif))
; DrawingMode(#PB_2DDrawing_AlphaBlend)
; Circle(brush\x,brush\y,brush\size,brush\color)
; StopDrawing()
; EndIf
;EndProcedure
;}
;{ images
; create the image for the layer and canvas (preview)
If CreateImage(#img_final,doc\w,doc\h,32|#PB_Image_Transparent)
EndIf
If CreateImage(#img_Copy,doc\w,doc\h,32|#PB_Image_Transparent)
EndIf
;CreateThread(@PaintThread(), 23)
;}
;{ open window
If ExamineDesktops()
winW = DesktopWidth(0)
winH = DesktopHeight(0)
Else
winW = 1024
winh = 768
EndIf
If UsePNGImageDecoder() And UsePNGImageEncoder() : EndIf
If OpenWindow(#windowMain, 0, 0, winw, winH, "Animatoon- Brush test", #PB_Window_SystemMenu|#PB_Window_MaximizeGadget|#PB_Window_ScreenCentered|#PB_Window_Maximize) =0
End
EndIf
SmartWindowRefresh(#windowMain,1) ; needed ?
;{ menu
CreateImageMenu(#menu,WindowID(#windowMain),#PB_Menu_ModernLook)
MenuTitle("File")
MenuItem(#menu_open, "Open")
MenuItem(#menu_New, "New")
MenuBar()
MenuItem(#menu_File_SaveLayer, "Save Layer As PNG")
MenuBar()
MenuItem(#menu_exit, "Exit"+Chr(9)+"Escape")
MenuTitle("Edition")
MenuItem(#menu_Edit_Clear, "Clear Layer"+Chr(9)+"Ctrl+X")
MenuTitle("Images")
MenuItem(#menu_Image_SizeImage, "Size Image")
MenuItem(#menu_Image_Document, "Size Document")
MenuTitle("Window")
MenuItem(#menu_WinAnimProp, "Animation properties")
MenuTitle("Help")
MenuItem(#menu_Help_About, "About")
;}
;{ toolbar
CreateToolBar(#toolbar, WindowID(0))
;}
;{ statusbar
CreateStatusBar(#statusbar,WindowID(#windowMain))
AddStatusBarField(100)
AddStatusBarField(200)
AddStatusBarField(200)
StatusBarText(#statusbar,2,"Doc Width : "+Str(doc\w)+"/Height : "+Str(doc\h))
StatusBarText(#statusbar,1,"Zoom : "+Str(doc\zoom)+"%")
;}
;{ gadgets
h = ToolBarHeight(#toolbar) + 10
PanelRight = 200
Panelleft = 200
PanelAnimationH = 150
scrollw = winw - PanelRight - Panelleft
scrollh = winh-90-h-StatusBarHeight(#statusbar)-PanelAnimationH
;Debug Str(scrollw)+"/"+Str(scrollh)
If CanvasGadget(#GADGET_Canvas, Panelleft+10, h, scrollw-20, scrollh, #PB_Canvas_Keyboard|#PB_Canvas_Border)
SetGadgetAttribute(#GADGET_Canvas,#PB_Canvas_Cursor,#PB_Cursor_Cross)
EndIf
;{ panel brush
If CreateImage(#img_Color,48,48)
EndIf
If PanelGadget(#panel_brush,5,h,Panelleft-10,scrollh)
AddGadgetItem(#panel_brush,-1,"Brush")
SpinGadget(#Gad_BrushSize,15,5,40,20,1,1000,#PB_Spin_Numeric)
SetGadgetState(#Gad_BrushSize,brush\size)
TrackBarGadget(#Gad_BrushSizeTB, 60,5,100,20,1,1000)
SetGadgetState(#Gad_BrushSizeTB,brush\size)
GadgetToolTip(#Gad_BrushSize,"Size of the brush")
SpinGadget(#Gad_BrushAlpha,15,30,40,20,0,255,#PB_Spin_Numeric)
SetGadgetState(#Gad_BrushAlpha,brush\alpha)
TrackBarGadget(#Gad_BrushAlphaTB,60,30,100,20,0,255)
SetGadgetState(#Gad_BrushAlphaTB,brush\alpha)
GadgetToolTip(#Gad_BrushAlpha,"Alpha of the brush")
; brush
ComboBoxGadget(#Gad_BrushTool,15,60,100,20)
AddGadgetItem(#Gad_BrushTool,-1,"Circle Hard")
AddGadgetItem(#Gad_BrushTool,-1,"Circle Shine")
AddGadgetItem(#Gad_BrushTool,-1,"Circle Soft")
AddGadgetItem(#Gad_BrushTool,-1,"Circle Custom")
SetGadgetState(#Gad_BrushTool,brush\tool)
GadgetToolTip(#Gad_BrushTool,"Brush Tool")
SpinGadget(#Gad_BrushPas,120,60,35,20,0,1000,#PB_Spin_Numeric)
SetGadgetState(#Gad_BrushPas,brush\pas)
GadgetToolTip(#Gad_BrushPas,"Spacing")
x = 20 : y = 90
Frame3DGadget(#Gadget_FrCustomBrush,5, y,160,x*8,"Circle Custom")
TrackBarGadget(#Gadget_GradientX,10,y+x,150,20,0,100)
SetGadgetState(#Gadget_GradientX,brush\gradientX *100)
TrackBarGadget(#Gadget_GradientX2,10,y+x*2,150,20,0,100)
SetGadgetState(#Gadget_GradientX2,brush\gradientX2 *100)
TrackBarGadget(#Gadget_GradientX3,10,y+x*3,150,20,0,100)
SetGadgetState(#Gadget_GradientX3,brush\gradientX3 *100)
TrackBarGadget(#Gadget_AlphaGradientX,10,y+x*4,150,20,0,255)
SetGadgetState(#Gadget_AlphaGradientX,brush\alphaGradientX)
TrackBarGadget(#Gadget_AlphaGradientX2,10,y+x*5,150,20,0,255)
SetGadgetState(#Gadget_AlphaGradientX2,brush\alphaGradientX2)
TrackBarGadget(#Gadget_AlphaGradientX3,10,y+x*6,150,20,0,255)
SetGadgetState(#Gadget_AlphaGradientX3,brush\alphaGradientX3)
;#Gad_BrushRotationRnd
;#Gad_BrushRotation
y = 90 + x*8 + 50
If CreateImage(#img_brushPreview,60,60)
ImageGadget(#Gad_BrushPreview, 15, y, 60, 60, ImageID(#img_brushPreview),#PB_Image_Border)
EndIf
; the image for the brush
CreateBrush()
ImageGadget(#ImageColor, 20, 450, 48, 48, ImageID(#img_Color),#PB_Image_Border)
AddGadgetItem(#panel_brush,-1,"Dyn")
CloseGadgetList()
EndIf
;}
;{ panel layer
If PanelGadget(#panel_Layer,winw-PanelRight+10,h,PanelRight-10,scrollh)
AddGadgetItem(#panel_Layer,-1,"Layer")
h1 = 50
TrackBarGadget(#gadget_TB_LayerAlpha,10,10,100,20,0,255)
TreeGadget(#gadget_TGLayer, 10,h1,PanelRight-40,scrollh-150-h1,#PB_Tree_CheckBoxes )
AddLayer()
ButtonGadget(#gadget_btnAddLayer,10,scrollh-120,60,20,"Add Layer")
CloseGadgetList()
EndIf
;}
;{ animation
h2 = winH -h - GadgetHeight(#panel_brush) - StatusBarHeight(#statusbar)-5 - 90
btn_h = 30
y = h+GadgetHeight(#panel_brush)+5+btn_h
If ScrollAreaGadget(#gadget_LayerAnim,5,y,Panelleft-10,h2-btn_h,Panelleft-50,h2-30-btn_h)
CloseGadgetList()
EndIf
If ScrollAreaGadget(#gadget_AnimPreview,Panelleft+5,y,scrollw,h2-btn_h,scrollw-50,h2-30-btn_h)
CloseGadgetList()
EndIf
;}
SetActiveGadget(#GADGET_Canvas)
;}
;{ shortcuts
AddKeyboardShortcut(#windowMain,#PB_Shortcut_Escape,#menu_exit)
AddKeyboardShortcut(#windowMain,#PB_Shortcut_X|#PB_Shortcut_Control,#menu_Edit_Clear)
;}
UpdateScreen()
;}
Repeat
event = WaitWindowEvent()
Select event
Case #PB_Event_Menu
Select EventMenu()
Case #menu_File_SaveLayer
file$= SaveFileRequester("","","PNG image|*.PNG;*.png",0)
If file$
SaveImage(#img_final,RemoveString(file$,"*.png")+".png",#PB_ImagePlugin_PNG)
EndIf
Case #menu_exit
End
Case #menu_Edit_Clear
If StartDrawing(ImageOutput(doc\LayerActif))
DrawingMode(#PB_2DDrawing_AlphaChannel)
Box(0,0,doc\w,doc\h,RGBA(0,0,0,0))
StopDrawing()
EndIf
If StartDrawing(ImageOutput(doc\LayerCopyActif))
DrawingMode(#PB_2DDrawing_AlphaChannel)
Box(0,0,doc\w,doc\h,RGBA(0,0,0,0))
StopDrawing()
EndIf
UpdateScreen(canvas_x,canvas_y)
Case #menu_Image_Document
w = Val(InputRequester("Width","Width of the document",Str(doc\w)))
h = Val(InputRequester("Height","Height of the document",Str(doc\h)))
If w >0
doc\w =w
ok = 1
EndIf
If h >0
doc\h =h
ok = 1
EndIf
If ok = 1
ok = 0
tempimg = CreateImage(#PB_Any,doc\w,doc\h,32|#PB_Image_Transparent)
If StartDrawing(ImageOutput(tempimg))
DrawAlphaImage(ImageID(#img_final),0,0)
StopDrawing()
EndIf
CopyImage(tempimg,#img_final)
w = ImageWidth(#img_Copy)
h = ImageHeight(#img_Copy)
CopyImage(#img_final,#img_Copy)
ResizeImage(#img_Copy,w,h,#PB_Image_Raw)
FreeImage(tempimg)
EndIf
EndSelect
Case #PB_Event_Gadget
Select EventGadget()
Case #GADGET_Canvas
Select EventType()
Case #PB_EventType_LeftButtonDown
paint = 1
If move_canvas = 0
xx= GetGadgetAttribute(#GADGET_Canvas,#PB_Canvas_MouseX)
yy= GetGadgetAttribute(#GADGET_Canvas,#PB_Canvas_MouseY)
brush\x = xx
brush\y = yy
startx = xx
starty = yy
MouseX_Old = xx
MouseY_Old = yy
paint((xx-canvas_x),(yy - canvas_y))
UpdateScreen(canvas_x,canvas_y)
EndIf
Case #PB_EventType_LeftButtonUp
paint = 0
Case #PB_EventType_MouseMove
xx= GetGadgetAttribute(#GADGET_Canvas,#PB_Canvas_MouseX)
yy= GetGadgetAttribute(#GADGET_Canvas,#PB_Canvas_MouseY)
If move_canvas = 0
If paint = 1
paint((xx-canvas_x),(yy - canvas_y))
MouseX_Old = xx
MouseY_Old = yy
UpdateScreen(canvas_x,canvas_y)
EndIf
Else ; on bouge le canvas
canvas_x = cx + xx - startx
canvas_y = cy + yy - starty
UpdateScreen(canvas_x,canvas_y)
EndIf
Case #PB_EventType_KeyDown
If keypressed = 0
Debug "Key Down" + Str(GetGadgetAttribute(#GADGET_Canvas,#PB_Canvas_Key ))
keypressed = 1
Select GetGadgetAttribute(#GADGET_Canvas,#PB_Canvas_Key )
Case 32 ; space
SetGadgetAttribute(#GADGET_Canvas,#PB_Canvas_Cursor,#PB_Cursor_Hand)
move_canvas = 1
xx= GetGadgetAttribute(#GADGET_Canvas,#PB_Canvas_MouseX)
yy= GetGadgetAttribute(#GADGET_Canvas,#PB_Canvas_MouseY)
startx = xx
starty = yy
Case 107; zoom +
doc\zoom + 10
Zoom()
Case 109; zoom-
doc\zoom - 10
Zoom()
EndSelect
EndIf
Case #PB_EventType_KeyUp
keypressed = 0
Select GetGadgetAttribute(#GADGET_Canvas,#PB_Canvas_Key )
Case 32 ; space
SetGadgetAttribute(#GADGET_Canvas,#PB_Canvas_Cursor,#PB_Cursor_Cross)
move_canvas = 0
cx + xx - startx
cy + yy - starty
EndSelect
Case #PB_EventType_MouseWheel
doc\zoom + GetGadgetAttribute(#GADGET_Canvas, #PB_Canvas_WheelDelta)*5
If doc\w > doc\h
w = doc\w
Else
w = doc\h
EndIf
If doc\zoom < 5
doc\zoom = 5
ElseIf doc\zoom > 800000/w
doc\zoom = 800000/w
EndIf
If (ImageWidth(#img_final) * (doc\zoom / 100)) < 8000 And (ImageHeight(#img_final) * (doc\zoom / 100)) < 8000 And doc\zoom => 5
Zoom()
EndIf
EndSelect
;{ others gadgets
Case #ImageColor
col = ColorRequester(brush\color)
brush\color = RGBA(Red(col),Green(col),Blue(col),brush\alpha)
If StartDrawing(ImageOutput(#img_Color))
Box(0,0,80,80,brush\color)
StopDrawing()
EndIf
SetGadgetState(#imagecolor,ImageID(#img_Color))
CreateBrush()
SetActiveGadget(#GADGET_Canvas)
Case #gadget_btnAddLayer
AddLayer()
Case #gadget_TGLayer
pos = GetGadgetState(#gadget_TGLayer)+1
ForEach layer()
layer()\selected = 0
Next
ForEach layer()
If layer()\pos = pos
doc\LayerActif =layer()\img
doc\LayerCopyActif =layer()\imgcopy
layer()\selected = 1
SetGadgetState(#gadget_TB_LayerAlpha,layer()\alpha);
Break
EndIf
Next
If EventType() = #PB_EventType_LeftDoubleClick
name$ = InputRequester("Animatoon","Name of the Layer",layer()\name$)
If name$ <>""
layer()\name$ = name$
EndIf
UpdateLayerUi()
Else
visible = GetGadgetItemState(#gadget_TGLayer,pos-1)
If visible & #PB_Tree_Checked
layer()\visible = 1
UpdateScreen(canvas_x,canvas_y)
Else
layer()\visible = 0
UpdateScreen(canvas_x,canvas_y)
EndIf
EndIf
Case #gadget_TB_LayerAlpha
ForEach layer()
If layer()\selected = 1
layer()\alpha = GetGadgetState(#gadget_TB_LayerAlpha)
Break
EndIf
Next
UpdateScreen(canvas_x,canvas_y)
;}
;{ brush editing
Case #Gad_BrushPas
brush\pas = GetGadgetState(#Gad_BrushPas)
Case #Gad_BrushSize,#Gad_BrushSizeTB
brush\size = GetGadgetState(EventGadget())
SetGadgetState(#Gad_BrushSize,brush\size)
SetGadgetState(#Gad_BrushSizeTB,brush\size)
CreateBrush()
Case #Gad_BrushAlpha,#Gad_BrushAlphaTB
brush\alpha = GetGadgetState(EventGadget())
SetGadgetState(#Gad_BrushAlpha,brush\alpha)
SetGadgetState(#Gad_BrushAlphaTB,brush\alpha)
brush\color = RGBA(Red(col),Green(col),Blue(col),brush\alpha)
CreateBrush()
Case #Gad_BrushTool
brush\tool = GetGadgetState(#Gad_BrushTool)
brush\color = RGBA(Red(brush\color),Green(brush\color),Blue(brush\color),brush\alpha)
createbrush()
Case #Gadget_GradientX
brush\gradientX= GetGadgetState(#Gadget_GradientX)/100
brush\color = RGBA(Red(brush\color),Green(brush\color),Blue(brush\color),brush\alpha)
createbrush()
Case #Gadget_GradientX2
brush\gradientX2 = GetGadgetState(#Gadget_GradientX2)/100
brush\color = RGBA(Red(brush\color),Green(brush\color),Blue(brush\color),brush\alpha)
createbrush()
Case #Gadget_GradientX3
brush\gradientX3 = GetGadgetState(#Gadget_GradientX3)/100
brush\color = RGBA(Red(brush\color),Green(brush\color),Blue(brush\color),brush\alpha)
createbrush()
Case #Gadget_AlphaGradientX
brush\alphaGradientX = GetGadgetState(#Gadget_AlphaGradientX)
brush\color = RGBA(Red(brush\color),Green(brush\color),Blue(brush\color),brush\alpha)
createbrush()
Case #Gadget_AlphaGradientX2
brush\alphaGradientX2 = GetGadgetState(#Gadget_AlphaGradientX2)
brush\color = RGBA(Red(brush\color),Green(brush\color),Blue(brush\color),brush\alpha)
createbrush()
Case #Gadget_AlphaGradientX3
brush\alphaGradientX3 = GetGadgetState(#Gadget_AlphaGradientX3)
brush\color = RGBA(Red(brush\color),Green(brush\color),Blue(brush\color),brush\alpha)
createbrush()
;}
Default
SetActiveGadget(#GADGET_Canvas)
EndSelect
Case #PB_Event_CloseWindow
End
EndSelect
ForEver
Pour information : Marc_256 du forum Anglais me donne un petit coup de main, et Danillo semble lui aussi très intéressé par ce type d'application.
Je vais donc lui envoyer le code au cas où il aurait envie d'y apporter sa contribution ^^.
Si parmi vous certaines personnes sont intéressées pour améliorer Animatoon, n'hésitez pas à me le dire et je vous enverrai el code aussi.
Pour le moment, je ne le poste pas car j'ai beaucoup de modifications dessus et il est encore plein de bugs et pas encore très optimisés.