oki, ça marche pas mal, c'est vrai, je l'ai ajouté mettre sur les lignes.
- pinceau lié (ne marche pas encore) : il faut que je trouve comment faire un trait entre 2 points, lorsque l'on peint et l'on a le clic appuyé.
- ajout de l'espace du brush (fonctionne avec les lignes à épaisseur, et le brush lié par la la suite)
- sauvegarde de préférences : outils et paramètres des outils.
J'ai testé la rotation, mais ça ne marche pas pour le moment. Je ne sais pas encore pourquoi, je vais y réfléchir.
Code : Tout sélectionner
;{ Infos
; Dev initial : kernadec
; date : juin 2011
; divers : Forum français ver 4.60 b3
; Ajout : pinceau : blendman
; Aide : le soldat inconnu : fatroundbox() et fat box()
; Aide : merci à Kwanjeen pour son aide très précieuse pour l'utilisation des brushes !
;}
;{ structures
Structure MDIWindow
; info about the loaded image
Image.i
ImageWidth.l
ImageHeight.l
; Our MDI Window
Window.i
; gadget numbers
ScrollAreaGadget.i
ImageGadget.i
EndStructure
Global NewList MDIWindow.MDIWindow()
;}
;{ Enumeration
Enumeration
#Window
#Image0
#Image1
#IMAGE_LoadSave
#Scroll
#canvas
#brush
#pbrush
EndEnumeration
Enumeration
#menu0
#menu1
#menu2
#menu3
#menu4
#menu5
#menu6
#menu7
#menu8
#menu9
#menu10
EndEnumeration
#TOOLBAR = 0
#MENU = 0
#MDI_Base = 1
Enumeration
#MENU_Open
#MENU_Close
#MENU_CloseAll
#MENU_Quit
#MENU_TileV
#MENU_TileH
#MENU_Cascade
#MENU_Arrange
#MENU_Previous
#MENU_Next
#MENU_FirstMDI
EndEnumeration
#GADGET_MDI = 0
#WindowFlags = #PB_Window_ScreenCentered|#PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_SizeGadget
;}
;{ init et loadImage
If UseJPEGImageDecoder() = 0 Or UsePNGImageDecoder() = 0 Or UseJPEGImageEncoder() = 0 Or UsePNGImageEncoder()=0 Or UseTGAImageDecoder()=0 Or UseTIFFImageDecoder() =0
MessageRequester("Erreur", "Erreur de chargement des decoder images")
End
EndIf
; If InitKeyboard() = 0
; MessageRequester("Erreur", "Erreur de chargement des sprites")
; End
; EndIf
;}
;{ declare
Declare openAppli()
Declare CloseAppli()
;}
;{ variables
; general
Global lang$, version${5}, event.i, quit.b,clic_gauche.b, menu.a = 9,key.u, resize.b=1, tool.a
; brush, defaut
Global brush_w, brush_h, brush_nb.w,brush_dir$
; document
Global size_imgX.u=3000, Size_imgY.u=3000
; position souris, donc pinceau, etc..
Global x, y, DepartX, DepartY, rx, ry, finX, finY
; paramètres brush
Global brushId.u=1, transparence.a = 255, color.i, linesize.u=100, color_R.a, color_G.a, color_B.a, space.i = 10
; aléatoire du brush
Global random_size.b, random_rotation.b, random_scatter.b, radiusX.u=5,radiusY.u=5, size.u=100, scatter.u=20
openAppli()
CloseAppli()
; langage
;}
;{ procedures
; procedure transformations d'image
ProcedureDLL.l RotateImageEx2(ImageID, Angle.f) ; Rotation d'une image d'un angle en °
Protected bmi.BITMAPINFO, bmi2.BITMAPINFO, Hdc.l, NewImageID, Mem, n, nn, bm.BITMAP
Angle*#PI/180 ; On convertit en radian
Protected Cos.f = Cos(Angle)
Protected Sin.f = Sin(Angle)
Protected CouleurFond = 0
GetObject_(ImageID, SizeOf(BITMAP), @bm.BITMAP)
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
bmi2\bmiHeader\biSize = SizeOf(BITMAPINFOHEADER)
bmi2\bmiHeader\biWidth = bm\bmWidth * Abs(Cos) + bm\bmHeight * Abs(Sin)
bmi2\bmiHeader\biHeight = bm\bmHeight * Abs(Cos) + bm\bmWidth * Abs(Sin)
bmi2\bmiHeader\biPlanes = 1
bmi2\bmiHeader\biBitCount = 32
bmi2\bmiHeader\biCompression = #BI_RGB
Mem = AllocateMemory(bm\bmWidth * bm\bmHeight * 4)
If Mem
Protected Mem2 = AllocateMemory(bmi2\bmiHeader\biWidth * bmi2\bmiHeader\biHeight * 4)
If Mem2
Hdc = CreateCompatibleDC_(GetDC_(ImageID))
If Hdc
GetDIBits_(Hdc, ImageID, 0, bm\bmHeight, Mem, @bmi, #DIB_RGB_COLORS) ; on envoie la liste dans l'image
ReleaseDC_(0, Hdc)
EndIf
Protected CX1 = bm\bmWidth - 1
Protected CY1 = bm\bmHeight - 1
Protected CX2 = bmi2\bmiHeader\biWidth - 1
Protected CY2 = bmi2\bmiHeader\biHeight - 1
Protected Mem01 = Mem + bm\bmWidth * 4
Protected Mem10 = Mem + 4
Protected Mem11 = Mem01 + 4
Protected Mem2Temp = Mem2
Protected deb=-CX2/2 : Protected fin=(CX2*2-CX2)/2
For nn = 0 To CY2
Protected y1b.l = nn * 2 - CY2
Protected Temp1.f = (CX1 - y1b * Sin)/2
Protected Temp2.f = (CY1 + y1b * Cos)/2
Protected x1b.l
For x1b = deb To fin
Protected x1.f = Temp1 + x1b * Cos ;on pourrait virer ces mult avec des tables mais le gain n'est pas évident
Protected y1.f = Temp2 + x1b * Sin
Protected x2.l = x1
Protected y2.l = y1
If x1 < x2
!dec dword[p.v_x2]
EndIf
If y1 < y2
!dec dword[p.v_y2]
EndIf
Protected x2b = x2 + 1
Protected y2b = y2 + 1
If x2b >= 0 And x2 <= CX1 And y2b >= 0 And y2 <= CY1 ; On filtre si on est completement en dehors de l'image
Protected fx.f = x1 - x2
Protected fy.f = y1 - y2
Protected f00.f = 1 - fx
Protected f10.f = 1 - fy
Protected f01.f = f00 * fy
f00 * f10
f10 * fx
Protected f11.f = fx * fy
Protected MemTemp = (x2 + y2 * bm\bmWidth) * 4
Protected c00.l, c01.l, c11.l, c10.l
If x2 >= 0 And x2 <= CX1
If y2 >= 0 And y2 <= CY1
!mov eax,dword[p.v_Mem]
!add eax,dword[p.v_MemTemp]
!mov eax,dword[eax]
!mov dword[p.v_c00],eax
;c00 = PeekL(Mem + MemTemp)
Else
c00 = 0
EndIf
If y2b >= 0 And y2b <= CY1
!mov eax,dword[p.v_Mem01]
!add eax,dword[p.v_MemTemp]
!mov eax,dword[eax]
!mov dword[p.v_c01],eax
;c01 = PeekL(Mem01 + MemTemp)
Else
c01 = 0
EndIf
Else
c00 = 0
c01 = 0
EndIf
If x2b >= 0 And x2b <= CX1
If y2 >= 0 And y2 <= CY1
!mov eax,dword[p.v_Mem10]
!add eax,dword[p.v_MemTemp]
!mov eax,dword[eax]
!mov dword[p.v_c10],eax
;c10 = PeekL(Mem10 + MemTemp)
Else
c10 = 0
EndIf
If y2b >= 0 And y2b <= CY1
!mov eax,dword[p.v_Mem11]
!add eax,dword[p.v_MemTemp]
!mov eax,dword[eax]
!mov dword[p.v_c11],eax
;c11 = PeekL(Mem11 + MemTemp)
Else
c11 = 0
EndIf
Else
c10 = 0
c11 = 0
EndIf
Protected r1.l,r2.l,r3.l,r4.l,g1.l,g2.l,g3.l,g4.l,b1.l,b2.l,b3.l,b4.l
!mov eax,dword[p.v_c00]
!mov ebx,eax
!mov ecx,eax
!and eax,$FF
!mov dword[p.v_r1],eax
!and ebx,$FF00
!mov dword[p.v_g1],ebx
!and ecx,$FF0000
!mov dword[p.v_b1],ecx
!mov eax,dword[p.v_c10]
!mov ebx,eax
!mov ecx,eax
!and eax,$FF
!mov dword[p.v_r2],eax
!and ebx,$FF00
!mov dword[p.v_g2],ebx
!and ecx,$FF0000
!mov dword[p.v_b2],ecx
!mov eax,dword[p.v_c01]
!mov ebx,eax
!mov ecx,eax
!and eax,$FF
!mov dword[p.v_r3],eax
!and ebx,$FF00
!mov dword[p.v_g3],ebx
!and ecx,$FF0000
!mov dword[p.v_b3],ecx
!mov eax,dword[p.v_c11]
!mov ebx,eax
!mov ecx,eax
!and eax,$FF
!mov dword[p.v_r4],eax
!and ebx,$FF00
!mov dword[p.v_g4],ebx
!and ecx,$FF0000
!mov dword[p.v_b4],ecx
Protected r.l = r1 * f00 + r2 * f10 + r3 * f01 + r4 * f11 ;pure fait très bien tout ça
Protected g.l = g1 * f00 + g2 * f10 + g3 * f01 + g4 * f11
Protected b.l = b1 * f00 + b2 * f10 + b3 * f01 + b4 * f11
!mov eax,dword[p.v_r]
!mov ebx,dword[p.v_g]
!mov ecx,dword[p.v_b]
!and eax,$FF ;toute l'astuce consiste à laisser les triplets à leur place et à les multiplier là. On évite ainsi les décalages
!and ebx,$FF00
!and ecx,$FF0000
!or eax,ebx
!or eax,ecx
!mov ebx,dword[p.v_Mem2Temp]
!mov dword[ebx],eax
Else
!mov ebx,dword[p.v_Mem2Temp]
!xor eax,eax
!mov dword[ebx],eax
EndIf
Mem2Temp + 4
Next
Next
; On crée la nouvelle image
NewImageID = CreateImage(#PB_Any, bmi2\bmiHeader\biWidth, bmi2\bmiHeader\biHeight,32)
Hdc = CreateCompatibleDC_(GetDC_(ImageID(NewImageID)))
If Hdc
SetDIBits_(Hdc, ImageID(NewImageID), 0, bmi2\bmiHeader\biHeight, Mem2, @bmi2, #DIB_RGB_COLORS) ; on envoie la liste dans l'image
ReleaseDC_(0, Hdc)
EndIf
FreeMemory(Mem2)
EndIf
FreeMemory(Mem)
EndIf
ProcedureReturn NewImageID
EndProcedure
; save et load preferences
Procedure openAppli()
OpenPreferences("options.ini")
PreferenceGroup("general")
version$ = ReadPreferenceString("version","0.1")
Debug "Version : "+version$
lang$ = ReadPreferenceString("lang","fr")
PreferenceGroup("brush")
; read the preferences
brush_nb = ReadPreferenceInteger("brush_nb",59)
brush_dir$ = ReadPreferenceString("brush_directory","blendman")
brushId = ReadPreferenceInteger("brush",1)
space = ReadPreferenceInteger("space",1)
linesize = ReadPreferenceInteger("size",1)
tool = ReadPreferenceInteger("Tool",1)
Debug tool
ClosePreferences()
menu = tool
LoadImage(#brush,"data\"+brush_dir$+"\brush"+Str(brushId)+".png")
EndProcedure
Procedure closeAppli()
CreatePreferences("options.ini")
PreferenceGroup("general")
WritePreferenceString("lang",lang$)
WritePreferenceString("version",version$)
PreferenceGroup("brush")
WritePreferenceInteger("brush_nb",brush_nb)
WritePreferenceString("brush_directory",brush_dir$)
WritePreferenceInteger("brush",brushId)
WritePreferenceInteger("space",space)
WritePreferenceInteger("size",linesize)
WritePreferenceInteger("Tool",tool)
Debug tool
ClosePreferences()
EndProcedure
; mdi (pas actif)
Procedure SelectMDIWindow(Window)
ForEach MDIWindow()
If MDIWindow()\Window = Window
ProcedureReturn 1
EndIf
Next
EndProcedure
;{ procedure tools
Procedure FatBox(x, y, Width, Height, Fat, Color)
;le soldat inconu
For i = 1 To Fat
Box(x + i, y + i, Width - 2 * i, Height - 2 * i, Color)
Next
EndProcedure
Procedure FatRoundBox(x, y, Width, Height, RoundX, RoundY, Fat, Color)
For i = 1 To Fat
RoundBox(x + i, y + i, Width - 2 * i, Height - 2 * i, RoundX, RoundY, Color)
RoundBox(x, y + i, Width, Height - 2 * i, RoundX, RoundY, Color)
RoundBox(x + i, y, Width - 2 * i, Height, RoundX, RoundY, Color)
If i > 1
RoundBox(x + i - 1, y + i, Width - 2 * i + 2, Height - 2 * i, RoundX, RoundY, Color)
RoundBox(x + i, y + i - 1, Width - 2 * i, Height - 2 * i + 2, RoundX, RoundY, Color)
EndIf
Next
EndProcedure
Procedure ThickLineXY(X1.i, Y1.i, X2.i, Y2.i, Thickness.i, Color.i)
; Procedure épaisseur de : STARGATE forum Purebasic Allemand
Protected Length.i = Sqr((X2-X1)*(X2-X1)+(Y2-Y1)*(Y2-Y1))
Protected I, DeltaX.i, DeltaY.i
If Length = 0
If random_size = 1
Circle(X1, Y1, Random(Thickness/2), Color)
Else
Circle(X1, Y1, Thickness/2, Color)
EndIf
Else
For I = 0 To Length
DeltaX = (X2-X1)*I/Length
DeltaY = (Y2-Y1)*I/Length
If random_size =1
Circle(X1+DeltaX, Y1+DeltaY, Random(Thickness/2), Color)
Else
Circle(X1+DeltaX, Y1+DeltaY, Thickness/2, Color)
EndIf
Next
EndIf
EndProcedure
Procedure elipse(x0,y0,x1,y1,r1,r2,a1,a2,Thickness,color)
For i=0 To 359
r3=(Sqr(Pow(x1,2)+Pow(y1,2)))
x2.i=x0+r3*Cos(Radian(i))
y2.i=y0+r3*Sin(Radian(i))
Circle(X2,Y2,Thickness/2,Color)
Next i
EndProcedure
Procedure paint_brush()
CopyImage(#brush,#pbrush) ; on copie le brush pour travailler sans modifier l'origine
If resize = 1
ResizeImage(#pbrush,linesize,linesize,1) ;on modifie la taille du brush
EndIf
brush_w = ImageWidth(#pbrush)
brush_h = ImageHeight(#pbrush)
StartDrawing(ImageOutput(#pbrush))
For y=0 To ImageHeight(#pbrush)-1
For x=0 To ImageWidth(#pbrush)-1
DrawingMode(#PB_2DDrawing_AlphaChannel)
alpha_point = Alpha(Point(x,y))-(255-transparence) ;on récupère l'alpha du brush (pixel par pixel) qu'on modifie par la valeur transparence
If alpha_point<0
alpha_point = 0
EndIf
DrawingMode(#PB_2DDrawing_AllChannels)
Plot(x,y,RGBA(color_R, color_G,color_B,alpha_point)) ;on redessine chaque point par la nouvelle couleur et l'alpha modifiée
Next x
Next y
StopDrawing()
EndProcedure
Procedure paint_brush_line(X1.i, Y1.i, X2.i, Y2.i, Thickness.i, Color.i)
; Procedure épaisseur de : STARGATE forum Purebasic Allemand
Protected Length.i = Sqr((X2-X1)*(X2-X1)+(Y2-Y1)*(Y2-Y1))
Protected I, DeltaX.i, DeltaY.i
If Length = 0
;DrawImage(ImageID(#pbrush),X1, Y1,random_size*Random(Thickness/2)+((1-random_size)*Thickness/2),random_size*Random(Thickness/2)+((1-random_size)*Thickness/2))
Circle(X1, Y1, random_size*Random(Thickness/2)+((1-random_size)*Thickness/2), Color)
Else
For I = 0 To Round(Length/space,0)
DeltaX = (X2-X1)*I/(Length)
DeltaY = (Y2-Y1)*I/(Length)
;DrawImage(ImageID(#pbrush),X1+DeltaX, Y1+DeltaY,random_size*Random(Thickness/2)+((1-random_size)*Thickness/2),random_size*Random(Thickness/2)+((1-random_size)*Thickness/2))
Circle(X1+DeltaX, Y1+DeltaY,random_size*Random(Thickness/2)+((1-random_size)*Thickness/2), Color)
Next
EndIf
EndProcedure
;}
; event
Procedure Event_painting()
key = GetGadgetAttribute(#canvas,#PB_Canvas_Keyboard)
X = GetGadgetAttribute(#canvas, #PB_Canvas_MouseX)
Y = GetGadgetAttribute(#canvas, #PB_Canvas_MouseY)
StartDrawing(CanvasOutput(#canvas))
;{ dessin (outils & pinceau)
If Clic_Gauche=#True And menu <>9 And menu <12
;{ EventType() = #PB_EventType_MouseMove
If EventType() = #PB_EventType_MouseMove
DrawImage(ImageID(#Image0), 0, 0) ; transparence avec couleur RGBA
DrawingMode(#PB_2DDrawing_AlphaBlend| #PB_2DDrawing_Transparent)
Select menu
Case 1
LineXY(DepartX, DepartY, x, y, color)
FinX=x:FinY=y
Case 2
ThickLineXY(DepartX, DepartY, x, y, linesize, Color)
FinX=x:FinY=y
Case 3
; calcul des distances pixels entre DepartX,DepartY du debut et X,Y actuel = taille de l'élipse
If x > DepartX:rx = x - DepartX:Else:rx = DepartX - x:EndIf
If y > DepartY:ry = y - DepartY:Else:ry = DepartY - y:EndIf
Ellipse(DepartX, DepartY, rx, ry, color)
Case 4
elipse(DepartX,DepartY,x-DepartX,y-DepartY,r1,r2,a1,a2,linesize,color)
Case 5
Box(DepartX, DepartY,x-DepartX,y-DepartY,color)
Case 10
DrawingMode(#PB_2DDrawing_AlphaBlend| #PB_2DDrawing_Transparent|#PB_2DDrawing_Outlined)
FatBox(DepartX, DepartY,x-DepartX,y-DepartY,linesize,color)
Case 11
FatRoundBox(DepartX, DepartY,x-DepartX,y-DepartY,10,10,linesize,color)
; Case 14
; departx = x
; departy = y
; FinX=x:FinY=y
; ;ThickLineXY(DepartX, DepartY, x, y, linesize, Color)
; LineXY(DepartX, DepartY, x, y, color)
; ; DrawImage(ImageID(#Image1),0,0)
; ; StopDrawing()
; ; If StartDrawing(ImageOutput(#Image0))
; ; DrawImage(GetGadgetAttribute(#canvas,#PB_Canvas_Image),0,0) ;fixe le dessin
; ; StopDrawing()
; ; EndIf
EndSelect
EndIf
;}
ElseIf menu =9 Or menu >= 12
If clic_gauche = #True
DrawingMode(#PB_2DDrawing_AlphaBlend)
size =(1-random_size)*linesize +Random(linesize-1)*random_size
If random_rotation = 1
rot.w = Round(Random(360),0)
img_rotation = RotateImageEx2(ImageID(#pbrush), rot)
Debug rot
Else
img_rotation = #pbrush
EndIf
If menu = 9
If random_scatter =1
DrawImage(ImageID(img_rotation),x-(ImageWidth(#pbrush)/2)+Random(scatter)-Random(scatter),y-(ImageHeight(#pbrush)/2)+Random(scatter)-Random(scatter),size,size)
;drawAlphaImage(ImageID(#pbrush),x-(ImageWidth(#pbrush)/2)+Random(scatter)-Random(scatter),y-(ImageHeight(#pbrush)/2)+Random(scatter)-Random(scatter))
ElseIf random_scatter=0
DrawImage(ImageID(img_rotation),x-(ImageWidth(#pbrush)/2),y-(ImageHeight(#pbrush)/2),size,size)
;DrawAlphaImage(ImageID(#pbrush),x-(ImageWidth(#pbrush)/2),y-(ImageHeight(#pbrush)/2))
EndIf
ElseIf menu= 12 ; brush circle
Circle(X, Y, linesize, Color)
ElseIf menu = 13 ; pinceau lié
paint_brush_line(DepartX, DepartY, x, y, linesize, Color)
DepartX = x
DepartY = y
FinX=x
FinY=y
ElseIf menu = 14 ; speedline
LineXY(DepartX, DepartY, x, y, color)
;paint_brush_line(DepartX, DepartY, x, y, linesize, Color)
FinX=x:FinY=y
EndIf
EndIf
EndIf
;}
;{ mouse
If menu = 9 Or menu >=12
If EventType() = #PB_EventType_LeftButtonDown
departX = X
departY = Y
If Clic_Gauche=#True
Clic_Gauche=#False
color= RGBA(color_R, color_G,color_B,transparence) ; couleur aléatoire
Else
Clic_Gauche=#True
EndIf
ElseIf EventType() = #PB_EventType_LeftButtonUp
If Clic_Gauche=#True
Clic_Gauche=#False
color= RGBA(color_R, color_G,color_B,transparence) ; couleur aléatoire
CopyImage(#Image0,#Image1)
Else
Clic_Gauche=#True
EndIf
EndIf
EndIf
If EventType() = #PB_EventType_RightButtonDown And Clic_Gauche=#True And menu <>9
Clic_Gauche=#False ; annule fin du dessin en cours
DrawImage(ImageID(#Image1),0,0) ; restore le dessin precedent
FinX=-500:FinY=-500 ; remise à zero pour test fin ligne
EndIf
StopDrawing()
; capture de la couleur, pour mode aquarelle
If mouse_ok = 1
StartDrawing(CanvasOutput(#canvas))
color1 = AlphaBlend(color,Point(x,y))
color=color1
StopDrawing()
EndIf
;}
;{ eventType()
Select EventType()
Case #PB_EventType_LeftButtonDown
If menu <>9 And menu<12
If StartDrawing(ImageOutput(#Image0))
DrawImage(GetGadgetAttribute(#canvas,#PB_Canvas_Image),0,0) ;fixe le dessin
StopDrawing()
EndIf
If Clic_Gauche=#False ; valide la fin du dessin avec le click gauche = 0
Clic_Gauche=#True ; debut du dessin avec le click gauche = 1
color= RGBA(color_R, color_G,color_B,transparence) ; couleur aléatoire
CopyImage(#Image0,#Image1) ; copie Image pour eventuelle annulation
Else
Clic_Gauche=#False ; valide la fin du dessin avec le click gauche = 0
EndIf
DepartX = X ; coordonnée DepartX Clic_Gauche
DepartY = Y ; coordonnée DepartY Clic_Gauche
If menu=1 Or menu=2
If (FinX<>0 And FinY<>0)
Clic_Gauche=#True ; reactive le clic_Gauche pour ligne suivante
CopyImage(#Image0,#Image1) ; copie Image pour eventuelle annulation
DepartX = FinX ; transfert dernier clic_Gauche FinX vers DepartX suivant mode line chainée
DepartY = FinY ; transfert dernier clic_Gauche FinY vers DepartY suivant
EndIf
EndIf
ElseIf menu =9 Or menu <= 12
If StartDrawing(ImageOutput(#Image0))
DrawImage(GetGadgetAttribute(#canvas,#PB_Canvas_Image),0,0) ;fixe le dessin
StopDrawing()
EndIf
EndIf
EndSelect
;}
Select event
;{ #PB_Event_Menu
Case #PB_Event_Menu
Select EventMenu()
Case #menu1: menu=1 : tool = 1
Debug tool
Case #menu2: menu=2 : tool = 2
Debug tool
Case #menu3: menu=3 : tool = 3
Debug tool
Case #menu4: menu=4 : tool = 4
Debug tool
Case #menu5: menu=5 : tool = 5
Debug tool
Case #menu6 ; transparence
transparence = Val(InputRequester("Transparence","transparence du pinceau", Str(transparence)))
If transparence <0
transparence = 0
color= RGBA(color_R, color_G,color_B,transparence)
ElseIf transparence>255
transparence = 255
color= RGBA(color_R, color_G,color_B,transparence)
EndIf
resize = 0
paint_brush()
Case #menu7 ; on choisit couleur (to choose the color)
couleur = ColorRequester(couleur)
color_R=Red(couleur)
color_G=Green(couleur)
color_B=Blue(couleur)
color= RGBA(color_R, color_G,color_B,transparence)
resize = 1
paint_brush()
Case #menu8 ; random size
linesize = Val(InputRequester("Taille","Epaisseur de la ligne", Str(linesize)))
color= RGBA(color_R, color_G,color_B,transparence)
resize = 1
paint_brush()
resize = 0
Case #menu9 ; outil = pinceau (tool = brush)
menu = 9
color= RGBA(color_R, color_G,color_B,transparence)
resize = 0
Case 10 : menu = 10 : tool = 10 ; box empty
Debug tool
Case 11 : menu = 11 : tool = 11 ; round box
Debug tool
Case 12 : menu = 12 : tool = 12 ; circle brush
Debug tool
Case 13 : menu = 13 : tool = 13 ; paint brush line
Debug tool
Case 14 : menu = 14 : tool = 14 ; speed line radial
Debug tool
Case 15 : menu = 15 ; speed line verticale
Case 20 ; nouveau (new)
Case 21 ; Ouvrir (open)
Case 22 ; enregistrer (save)
Case 23 ; quitter (quit)
quit = 1
Case 24 ; importer une image - import an image
File$ = OpenFileRequester("Load Image...", "", "JPEG Images|*.jpg|PNG IMages|*.png|All Files|*.*", 0)
If File$
If LoadImage(#IMAGE_LoadSave, File$)
If StartDrawing(CanvasOutput(#Canvas))
Box(0, 0, 380, 380, $FFFFFF)
DrawImage(ImageID(#IMAGE_LoadSave), 0, 0)
StopDrawing()
EndIf
FreeImage(#IMAGE_LoadSave)
Else
MessageRequester("CanvasGadget", "Impossible de charger une image: " + File$)
EndIf
EndIf
Case 25 ; exporter l'image - export image in jpg
File$ = SaveFileRequester("Save Image...", File$, "JPEG Images|*.jpg", 0)
If File$ And (FileSize(File$) = -1 Or MessageRequester("CanvasGadget", "Ecraser le fichier? " + File$, #PB_MessageRequester_YesNo) = #PB_MessageRequester_Yes)
If CreateImage(#IMAGE_LoadSave, size_imgX,size_imgX, 24) And StartDrawing(ImageOutput(#IMAGE_LoadSave))
DrawImage(GetGadgetAttribute(#Canvas, #PB_Canvas_Image), 0, 0)
StopDrawing()
If SaveImage(#IMAGE_LoadSave, File$, #PB_ImagePlugin_JPEG,9,24) = 0
MessageRequester("CanvasGadget", "Sauvegarde impossible: " + File$)
EndIf
FreeImage(#IMAGE_LoadSave)
EndIf
EndIf
Case 26 ; save As png
File$ = SaveFileRequester("Save Image...", File$, "PNG Images|*.png", 0)
If File$ And (FileSize(File$) = -1 Or MessageRequester("CanvasGadget", "Ecraser le fichier? " + File$, #PB_MessageRequester_YesNo) = #PB_MessageRequester_Yes)
If CreateImage(#IMAGE_LoadSave, size_imgX,size_imgX, 32) And StartDrawing(ImageOutput(#IMAGE_LoadSave))
DrawImage(GetGadgetAttribute(#Canvas, #PB_Canvas_Image), 0, 0)
StopDrawing()
If SaveImage(#IMAGE_LoadSave, File$, #PB_ImagePlugin_PNG,32) = 0
MessageRequester("CanvasGadget", "Sauvegarde impossible: " + File$)
EndIf
FreeImage(#IMAGE_LoadSave)
EndIf
EndIf
Case 30 ; effacer le canvas - erase the canvas
If StartDrawing(CanvasOutput(#Canvas))
Box(0, 0, size_imgX,size_imgy, $FFFFFF)
StopDrawing()
EndIf
Case 40
MessageRequester("A propos", "Canvas gadget est un logiciel créé par Kernadec et Blendman."+Chr(10)+"Ce logiciel est développé en purebasic"+Chr(10)+Chr(10)+"Canvas Gadget est libre et gratuit."+Chr(10)+Chr(10)+"Créé en Juillet 2011"+Chr(10)+"Version : "+version$)
Case 50 ; afficher les calques
Case 65 ; taille de l'image
MessageRequester("Taille", "Taille de l'image : "+Str(size_imgX)+" / "+Str(size_imgy))
Case 100 ; taille aléatoire
random_size = 1-random_size
SetMenuItemState(0,100,random_size)
Case 101 ; random_rotation
random_rotation =1-random_rotation
Debug random_rotation
SetMenuItemState(0,101,random_rotation)
Case 102 ; random scatter (diffusion aléatoire
random_scatter =1-random_scatter
SetMenuItemState(0,102,random_scatter)
Case 103 ; scatter (diffusion)
scatter = Val(InputRequester("Diffusion","Valeur de transparence du pinceau", Str(scatter)))
If scatter <0 : scatter = 0
ElseIf scatter>500 : scatter = 500
EndIf
Case 104 ; sapce brush
space = Val(InputRequester("Space Brush","Valeur d'espace des points", Str(space)))
If space <0 : space = 1
ElseIf space>500 : space = 500
EndIf
;{ keyboard - brush shortcut
Case 201 ; touche C
If brushid >1
brushId - 1
Else
brushId = brush_nb
EndIf
Debug brushId
LoadImage(#brush,"data\"+brush_dir$+"\brush"+Str(brushId)+".png")
resize = 1
paint_brush()
Case 202 ; touche X -> changer le brush
If brushid < brush_nb
brushId + 1
Else
brushId = 1
EndIf
Debug brushId
LoadImage(#brush,"data\"+brush_dir$+"\brush"+Str(brushId)+".png")
resize = 1
paint_brush()
;}
EndSelect
;}
;{ #PB_Event_SizeWindow
Case #PB_Event_SizeWindow ; redimensione le scroll avec la fenetre
ResizeGadget(#Scroll,#PB_Ignore,#PB_Ignore,WindowWidth(#Window),WindowHeight(#Window)-20) ; -20 = scroll horizontal et menu
SetGadgetColor(#Scroll,#PB_Gadget_BackColor,#White)
;}
;{ #PB_Event_CloseWindow
Case #PB_Event_CloseWindow
quit=1
;}
EndSelect
EndProcedure
; openwidnow et creation de menu, etc...
Procedure OpenWin()
CreateImage(#Image0, size_imgX, size_imgY, 32|#PB_Image_Transparent)
CreateImage(#Image1, size_imgX, size_imgY, 32|#PB_Image_Transparent)
size = linesize
If OpenWindow(#Window, 0, 0,600,600, "CanvasGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered| #PB_Window_MinimizeGadget | #PB_Window_SizeGadget|#PB_Window_MaximizeGadget|#PB_Window_Maximize)
;{ canvas et set attribute
ScrollAreaGadget(#Scroll, 0, 0, 550,600, size_imgX, size_imgY, 30)
CanvasGadget(#canvas,0,0,size_imgX, size_imgY, #PB_Canvas_ClipMouse| #PB_Canvas_Keyboard)
; SetWindowColor(#Window,RGB(125,125,125))
; SetGadgetColor(#Scroll,#PB_Gadget_BackColor,#Gray)
SetGadgetAttribute(#Scroll,#PB_ScrollArea_X,200)
SetGadgetAttribute(#Scroll,#PB_ScrollArea_Y,200)
;}
;{ menu
If CreateMenu(#menu0, WindowID(0))
; menu Fichier
MenuTitle("Fichier")
MenuItem(20,"Nouveau"+Chr(9)+"Ctrl+N")
MenuItem(21,"Ouvrir"+Chr(9)+"Ctrl+O")
MenuItem(24,"Importer une image sur le calque"+Chr(9)+"Ctrl+Shift+I")
MenuBar()
MenuItem(25,"Exporter L'image en jpg"+Chr(9)+"Ctrl+Shift+s")
MenuItem(26,"Exporter L'image en png"+Chr(9)+"Ctrl+Alt+S")
MenuItem(22,"Enregistrer"+Chr(9)+"Ctrl+S")
MenuBar()
MenuItem(23,"Quitter"+Chr(9)+"Esc")
; menu Edition
MenuTitle("Edition")
MenuItem(30,"Effacer"+Chr(9)+"Ctrl+X")
; menu image
MenuTitle("Images")
MenuItem(65,"Taille de l'image")
; Menu outils
MenuTitle("Outils")
MenuItem(#menu1, "Ligne")
MenuItem(#menu2, "Ligne Epaisse")
MenuBar()
MenuItem(#menu3, "Cercle")
MenuItem(#menu4, "Cercle vide")
MenuItem(#menu5, "Box")
MenuItem(10,"Box vide")
MenuItem(11,"Roundbox")
MenuBar()
MenuItem(12, "Brosse Ronde")
MenuItem(#menu9, "Pinceau")
MenuItem(13, "Pinceau lié")
MenuBar()
MenuItem(14, "SpeedLine (radial)")
; Menu paramètres
MenuTitle("Paramètres")
MenuItem(100,"Taille Aléatoire")
SetMenuItemState(0,100,random_size)
MenuItem(101,"Rotation Aléatoire")
SetMenuItemState(0,101,random_rotation)
MenuItem(102,"Diffusion Aléatoire")
SetMenuItemState(0,101,random_scatter)
MenuBar()
MenuItem(103,"Diffusion")
MenuItem(#menu6, "Transparence")
MenuItem(#menu7, "Couleur")
MenuItem(#menu8, "Taille")
MenuItem(104,"Brush Space")
; menu fenêtre
MenuTitle("Affichage")
MenuItem(50,"Calques")
; Menu Aides
MenuTitle("Aides")
MenuItem(40,"A propos")
MenuItem(41,"Aide")
EndIf
;}
;{ toolbar
; If CreateToolBar(#TOOLBAR, WindowID(#WINDOW))
; ToolBarStandardButton(#MENU_Open, #PB_ToolBarIcon_Open)
; ToolBarStandardButton(#MENU_Close, #PB_ToolBarIcon_Delete)
; ToolBarSeparator()
; ToolBarStandardButton(#MENU_Previous, #PB_ToolBarIcon_Undo)
; ToolBarStandardButton(#MENU_Next, #PB_ToolBarIcon_Redo)
; EndIf
;}
;MDIGadget(#GADGET_MDI, 0, 0, 0, 0, 1, #MENU_FirstMDI, #PB_MDI_AutoSize)
color= RGBA(color_R, color_G,color_B,transparence)
Else
MessageRequester("Erreur", "impossible d'ouvrir une fenêtre")
End
EndIf
;{ les raccourcis claviers
AddKeyboardShortcut(0, #PB_Shortcut_X, 201) ; the previous brush
AddKeyboardShortcut(0, #PB_Shortcut_C, 202) ; the next brush
AddKeyboardShortcut(0, #PB_Shortcut_Escape, 23)
AddKeyboardShortcut(0, #PB_Shortcut_X|#PB_Shortcut_Control, 30) ; erase the surface
AddKeyboardShortcut(0, #PB_Shortcut_N|#PB_Shortcut_Control, 20) ; new
AddKeyboardShortcut(0, #PB_Shortcut_O|#PB_Shortcut_Control, 21) ; open
AddKeyboardShortcut(0, #PB_Shortcut_S|#PB_Shortcut_Control, 22) ; save
AddKeyboardShortcut(0, #PB_Shortcut_S|#PB_Shortcut_Control|#PB_Shortcut_Shift, 25) ; export jpg
AddKeyboardShortcut(0, #PB_Shortcut_S|#PB_Shortcut_Control|#PB_Shortcut_Alt, 26) ; export png
AddKeyboardShortcut(0, #PB_Shortcut_I|#PB_Shortcut_Control|#PB_Shortcut_Shift, 24) ; import
;}
EndProcedure
;}
;{ boucle principale
OpenWin()
paint_brush()
Repeat
event=WaitWindowEvent()
Event_painting()
Until quit
;}
closeAppli()
End