Page 2 sur 2

Re: Canvas dessin mode tablette.

Publié : lun. 04/juil./2011 18:38
par blendman
très sympa tout ça :D.

J'ai testé le zoom fonctionne pas mal, mais effectivement ce serait mieux en gardant le "focus" sur la souris.
Par contre, j'ai testé et la rotation d'image ne marche pas chez moi :(, que ce soit avec les flèches ou le signe * , ça me crée juste un carré blanc de la taille du sprite.

Mais en tout cas, c'est pas mal du tout, merci ;).

Re: Canvas dessin mode tablette.

Publié : lun. 04/juil./2011 19:08
par kernadec
mince Alors...
je viens de remettre le code au cas ou...
je fais toujours une vérification avec aperçu pour voir si le code fonctionne.
Comprend pas..
ça marche chez moi sur XP sp2 pas tester sur Seven, mais je vais le faire demain.
sinon le clic droit de la souris fait aussi des rotations
Cordialement

Re: Canvas dessin mode tablette.

Publié : lun. 04/juil./2011 19:24
par kernadec
; peut être la profondeur de l'image
; j'avais modifier ça, mais bon...

Code : Tout sélectionner

  Depth.l=ImageDepth(image,#PB_Image_InternalDepth)

  If Height>Width
    temp=CreateImage(#PB_Any,Height,Height,Depth)
  Else
    temp=CreateImage(#PB_Any,Width,Width,Depth)
  EndIf
  

c'était comme ça:

Code : Tout sélectionner

   If Height>Width
    temp=CreateImage(#PB_Any,Height,Height)
  Else
    temp=CreateImage(#PB_Any,Width,Width)
  EndIf

Re: Canvas dessin mode tablette.

Publié : lun. 04/juil./2011 19:39
par blendman
Je suis sous xp, sp2, et pourtant, ça ne marche toujours pas :(.

Je ne sais pas pourquoi ça ne marche pas c'est bizarre, ça devrait marcher pourtant.

Re: Canvas dessin mode tablette.

Publié : lun. 04/juil./2011 19:51
par venom
La rotation s’effectue bien chez moi :wink:







@++

Re: Canvas dessin mode tablette.

Publié : lun. 04/juil./2011 20:03
par kernadec
regarde les options de ton compilateur
je n'ai que les themes xp et thread

Re: Canvas dessin mode tablette.

Publié : lun. 04/juil./2011 20:17
par blendman
kernadec a écrit :regarde les options de ton compilateur
je n'ai que les themes xp et thread
alors, ça marche avec un jpg, ou avec un png (sans canal alpha) mais pas avec un png avec canal alpha chez moi.

De plus, la rotation est de 90, 180, 270 , mais on ne peut pas avoir d'autres rottions ? genre de 1 à 360 degrés ? :)

EDIT :
Pour l'alpha, j'ai compris, il manquait le drawingmode ;), dans la procedure image_ rotate()

Code : Tout sélectionner

DC=StartDrawing(ImageOutput(temp))
  DrawingMode(#PB_2DDrawing_AllChannels)
  DrawImage(ImageID(image),0,0)
  PlgBlt_(DC,@rect(),DC,0,0,Width,Height,0,0,0)
  StopDrawing()
Sinon, je n'ai pas trouvé comment avoir d'autres rotations non multiple de 90 :P

Re: Canvas dessin mode tablette.

Publié : lun. 04/juil./2011 20:52
par kernadec
pourtant UsePNGImageDecoder() est en début de code...

sinon pour une rotation en degrés je te conseil le code du "Soldat Inconnu - Djes - psychopanta"
ici: http://www.purebasic.fr/english/viewtop ... t=rotation
ca va être difficile de trouver mieux.. :mrgreen:

Bonne soirée

Re: Canvas dessin mode tablette.

Publié : lun. 04/juil./2011 21:13
par blendman
kernadec a écrit :sinon pour une rotation en degrés je te conseil le code du "Soldat Inconnu - Djes - psychopanta"
ici: http://www.purebasic.fr/english/viewtop ... t=rotation
ca va être difficile de trouver mieux.. :mrgreen:
il y a une erreur sur ton lien ;)

le bon lien doit être celui-ci :
http://www.purebasic.fr/english/viewtop ... 12&t=28894

Re: Canvas dessin mode tablette.

Publié : lun. 04/juil./2011 21:24
par kernadec
mer... j'ai oublié des données :oops:
http://www.purebasic.fr/english/viewtop ... t=rotation

bonne soirée

Re: Canvas dessin mode tablette.

Publié : mar. 05/juil./2011 8:04
par kernadec
bonjour blendman
j'ai une astuce pour les lignes dont tu recherche un effect comme sur l'image,
alors il faut diviser la valeur alpha par 5 pour les lignes
avec épaisseur par rapport à l' alpha d'une figure pleine
car c'est une succession de cercles, Et ensuite ajouter cette option au dessin.
Aperçu dans la mise à jour le 1er code .

Code : Tout sélectionner

Circle(X1+DeltaX, Y1+DeltaY, Random(Thickness/2), Color) 
même chose pour tes brush tu modifie la taille en mode aléatoire ça devrait être top aussi :lol:

Cordialement

Re: Canvas dessin mode tablette.

Publié : mar. 05/juil./2011 12:38
par blendman
kernadec a écrit :bonjour blendman
j'ai une astuce pour les lignes dont tu recherche un effect comme sur l'image,
alors il faut diviser la valeur alpha par 5 pour les lignes
avec épaisseur par rapport à l' alpha d'une figure pleine
car c'est une succession de cercles, Et ensuite ajouter cette option au dessin.

Code : Tout sélectionner

Circle(X1+DeltaX, Y1+DeltaY, Random(Thickness/2), Color) 
même chose pour tes brush tu modifie la taille en mode aléatoire ça devrait être top aussi :lol:
oki, ça marche pas mal, c'est vrai, je l'ai ajouté mettre sur les lignes.

Sinon, voici le nouveau code, agrémenté de quelques ajouts :
- speedline radial (outil)
- pinceau rond
- 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 raccourcis
- 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.

le code :

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



Re: Canvas dessin mode tablette.

Publié : mar. 05/juil./2011 13:13
par kernadec
bonjour blendman
super.. tu bosse dis donc.
dans le premier post
j'ai mis une méthode différente pour les menus en simple clic
avec (Finx=0 and Finy=0) et au départ de chaque menu mises à zéro
et le test pour passer dans ce mode.

Cordialement

Re: Canvas dessin mode tablette.

Publié : mar. 05/juil./2011 13:38
par kernadec
pardon, je me suis trompé de code, celui là sautait dans la boucle de point
mais ça peut être intéressant toi qui aime les surprise du mode aléatoire :mrgreen:
il faut mettre la remise à zéro de variables FinX=0:FinY=0

Cordialement

Code : Tout sélectionner

If (FinX=0 And FinY=0)                              ; mode clic gauche appuyé 
	If EventType() =  #PB_EventType_MouseMove   
	DrawingMode(#PB_2DDrawing_AlphaBlend) 
	Clic_Gauche=#False  
	If GetGadgetAttribute(#Canvas, #PB_Canvas_Buttons) &  #PB_Canvas_LeftButton 
	If menu=7 
	Circle(X,Y, 5, lcolor) 
	EndIf 
	If menu=8 
	Circle(X,Y,Random(20), lcolor) 
	EndIf 
	EndIf  
	EndIf 
	FinX=0:FinY=0   ;ajout 
	EndIf    

Re: Canvas dessin mode tablette.

Publié : mar. 05/juil./2011 23:40
par blendman
j'ai testé tout ça, c'est intéressant :);

De mon coté, j'ai réalisé l'interface, avec pureform et en retouchant pas mal derrière, j'ai réussi à avoir ce que je voulais : des onglets, des splitter, etc...

2 fichiers maintenant, mais je vais encore dispatcher en plusieurs fichiers :

main.pb :

Code : Tout sélectionner

;{ infos
; PureBasic Visual Designer v3.95 build 1485 (PB4Code) 
; et pureform aussi, hein

; blendman juin 2011
; animatoon  version 0.1
; ce code est libre, vous pouvez l'utiliser, le changer, l'améliorer, etc..
; si vous le modifiez, dites-le moi histoire que j'ajoute ces choses dans animatoon ;)

; un très grand merci à Kernadec et kwandjeen, ainsi que le soldat inconnu, Djes, G-rom...
;}

;{ include
IncludeFile "Include.pb"
;}

Open_Window_0()
Repeat ; Start of the event loop  
  event_()
  gadget_event()    
Until Event = #PB_Event_CloseWindow Or quit = 1; End of the event loop

closeAppli()
End
Et l'include.pb

Code : Tout sélectionner

; PureBasic Visual Designer v3.95 build 1485 (PB4Code)

;{ Window Constants
;
Enumeration
  #Window_0
EndEnumeration

;- MenuBar Constants
;
Enumeration
  #MenuBar_0
EndEnumeration

Enumeration
  #menu1
  #menu2
  #menu3
  #menu4
  #menu5
  #menu6
  #menu7
  #menu8
  #menu9
  #MENU_3
  #MENU_4
  #MENU_5
EndEnumeration

;- Gadget Constants
;
Enumeration
  #container0
  #cont_layer
  #cont_swatch
  
  #Panel_0
  #Panel_r
  #panel_r2
  #panel_r3
  #panel_r4
  
  #Combo_0
  #Combo_1
  #canvas
  #scroll
  #imagegadget
  #imagegadget2
  #imagegadget3
  #imagegadget4
  
  #ScrollBar_0
  #ScrollBar_1
  
  #TrackBar_0
  #TrackBar_1
  #TrackBar_2
  #TrackBar_3
  #TrackBar_4
  #TrackBar_5
  #TrackBar_6
  #TrackBar_7
  #tb_layer_op
  
  #Radio_0
  #CheckBox_0
  #CheckBox_1
  #CheckBox_2
  #CheckBox_3
  #Cb_layer_op
  
  #textgadget_0
  #textgadget_1
  #textgadget_2
  #textgadget_3
  
  #splitter_0
  #splitter_1 
  #splitter_2
  #splitter_3 
EndEnumeration

;- StatusBar Constants
;
Enumeration
  #StatusBar_0
EndEnumeration

;- Brush
Enumeration
  #Image0
  #Image1
  #IMAGE_LoadSave
  #brush
  #pbrush
EndEnumeration

;}

;{ variables
Global quit.b, event, info$,WindowID,GadgetID,EventType,doc_w.w=2000,doc_h.w=2000
Global win_w, win_h

ExamineDesktops()
win_w = DesktopWidth(0)
win_h = DesktopHeight(0)

;}

;{ init
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

;}

;{ 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=-50, y=-50, DepartX=-50, DepartY=-50, 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

;}



Procedure BalloonTip(WindowID, Gadget, Text$ , Title$, Icon)
  
  ToolTip=CreateWindowEx_(0,"ToolTips_Class32","",#WS_POPUP | #TTS_NOPREFIX | #TTS_BALLOON,0,0,0,0,WindowID,0,GetModuleHandle_(0),0)
  SendMessage_(ToolTip,#TTM_SETTIPTEXTCOLOR,GetSysColor_(#COLOR_INFOTEXT),0)
  SendMessage_(ToolTip,#TTM_SETTIPBKCOLOR,GetSysColor_(#COLOR_INFOBK),0)
  SendMessage_(ToolTip,#TTM_SETMAXTIPWIDTH,0,180)
  Balloon.TOOLINFO\cbSize=SizeOf(TOOLINFO)
  Balloon\uFlags=#TTF_IDISHWND | #TTF_SUBCLASS
  Balloon\hWnd=GadgetID(Gadget)
  Balloon\uId=GadgetID(Gadget)
  Balloon\lpszText=@Text$
  SendMessage_(ToolTip, #TTM_ADDTOOL, 0, Balloon)
  If Title$ > ""
    SendMessage_(ToolTip, #TTM_SETTITLE, Icon, @Title$)
  EndIf
  
EndProcedure

Procedure Open_Window_0()
  If OpenWindow(#Window_0, 0,0, 1024,768, "Animatoon",  #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered | #PB_Window_WindowCentered |#PB_Window_Maximize)
    SmartWindowRefresh(#Window_0,1)
    ;SetWindowColor(#Window_0,#gray) 
    
    ;{ images
    ; on load les images
    LoadImage(0,"brush9.png") 
    ResizeImage(0,50,50)
    LoadImage(2,"brush11.png") 
    ResizeImage(2,50,50)
    
    ; on crée le fond pour le preview du brush
    CreateImage(1,50,50,32)
    CreateImage(3,30,30) ; color fg
    CreateImage(4,30,30); color bg
    
    
    StartDrawing(ImageOutput(1))
    DrawingMode(#PB_2DDrawing_AlphaChannel)
    Box(0,0,50,50,RGBA(15,15,15,255))
    DrawingMode(#PB_2DDrawing_Default)
    Box(0,0,50,50,RGBA(125,125,125,0))
    DrawingMode(#PB_2DDrawing_AlphaBlend)    
    DrawImage(ImageID(0),0,0)
    DrawImage(ImageID(2),0,0)
    StopDrawing()
    
    StartDrawing(ImageOutput(3))
    Box(0,0,30,30,RGB(198,157,125))
    StopDrawing()
    
    StartDrawing(ImageOutput(4))
    Box(0,0,30,30,RGB(169,125,198))
    StopDrawing()
    
    
    
    ;}
    
    ;{ menu
    If CreateMenu(#MenuBar_0, WindowID(#Window_0))
      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")
      
      
;       MenuTitle("Fichier")
;       MenuItem(0, "Nouveau"+Chr(9)+"Ctr+N")
;       MenuItem(1, "Ouvrir")
;       MenuItem(2, "Enregistrer")
;       MenuBar()
;       MenuItem(10,"Quitter")
;       
;       MenuTitle("Edition")
;       MenuItem(20, "Effacer ")
    EndIf
    ;}
    
    ;{ status bar
    If CreateStatusBar(#StatusBar_0, WindowID(#Window_0))
      AddStatusBarField(300)
      AddStatusBarField(#PB_Ignore )      
      StatusBarText(0, 0, "") 
      StatusBarText(0, 1, info$, #PB_StatusBar_Center)       
    EndIf
    ;}
    
    ;{ toolbar
    If CreateToolBar(0, WindowID(0))
      ToolBarStandardButton(0, #PB_ToolBarIcon_New)
      ToolBarToolTip(0, 0, "Nouveau")
      ToolBarStandardButton(1, #PB_ToolBarIcon_Open)
      ToolBarToolTip(0, 1, "Ouvrir")
      ToolBarStandardButton(2, #PB_ToolBarIcon_Save)
      ToolBarToolTip(0, 2, "Enregistrer")

      ToolBarSeparator()
      ToolBarStandardButton(10, #PB_ToolBarIcon_Delete)
      ToolBarSeparator()
      ToolBarStandardButton(11, #PB_ToolBarIcon_Undo)
      ToolBarStandardButton(12, #PB_ToolBarIcon_Redo)
      ToolBarSeparator()
    EndIf
    ;}
   
    ;{ Panel tool
    ContainerGadget(#container0,0,30,130,WindowHeight(0)-72-60)
      PanelGadget(#Panel_0, 0, 0, WindowWidth(0)-600, WindowHeight(0)-72-30-60)
      SetGadgetColor(#panel_0,#PB_Gadget_BackColor,#Gray)
      AddGadgetItem(#Panel_0, 0, "Gen")
      ImageGadget(#imagegadget,  10, 10, 50, 50, ImageID(1),#PB_Image_Border|#PB_Image_Smooth) 
      
      TextGadget    (#textgadget_0, 10, 88, 120, 20,"Taille", #PB_Text_Center)
      TrackBarGadget(#TrackBar_0, 8, 108, 110, 20, 0, 500)
      
      TextGadget    (#textgadget_1, 10, 128, 120, 20,"Opacité", #PB_Text_Center)
      TrackBarGadget(#TrackBar_1, 8, 148, 110, 20, 0, 255)
      
      TextGadget    (#textgadget_2, 10, 168, 120, 20,"Diffusion", #PB_Text_Center)
      TrackBarGadget(#TrackBar_2, 8, 188, 110, 20, 0, 100)
      
      ;OptionGadget(#Radio_0, 8, 198, 20, 30, "")
      CheckBoxGadget(#CheckBox_0, 8, 258, 200, 20, "Taille")
      CheckBoxGadget(#CheckBox_1, 8, 278, 200, 20, "Rotation")
      CheckBoxGadget(#CheckBox_2, 8, 298, 200, 20, "Diffusion")
      CheckBoxGadget(#CheckBox_3, 8, 318, 200, 20, "Couleur")
      AddGadgetItem(#Panel_0, 1, "Dyn")
      ComboBoxGadget(#Combo_0, 10, 30, 90, 20)
      For a = 1 To 5
          AddGadgetItem(#Combo_0, -1,"Elément de liste déroulante " + Str(a))
        Next
      AddGadgetItem(#Panel_0, 2, "Coul")
      TrackBarGadget(#TrackBar_5, 8, 68, 110, 20, 0, 10)
      TrackBarGadget(#TrackBar_6, 8, 88, 110, 20, 0, 10)
      TrackBarGadget(#TrackBar_7, 8, 108, 110, 20, 0, 10)
      CloseGadgetList()
      ImageGadget(#imagegadget2,  10, WindowHeight(0)-150, 50, 50, ImageID(1),#PB_Image_Border|#PB_Image_Smooth) 
      ; couleurs
      ImageGadget(#imagegadget3,  80, WindowHeight(0)-140, 30, 30, ImageID(3),#PB_Image_Border) 
      ImageGadget(#imagegadget4,  100, WindowHeight(0)-120, 30, 30, ImageID(4),#PB_Image_Border) 
     CloseGadgetList()
    ;}
    ;{ canvas
      
    ScrollAreaGadget(#Scroll, 0,0,WindowWidth(0)-140-150 ,WindowHeight(0)-70, doc_w-150, doc_h, 30)
    SetGadgetColor(#Scroll,#PB_Gadget_BackColor,#White)
    CanvasGadget(#canvas,0,0,doc_w,doc_h,#PB_Canvas_ClipMouse)
    CloseGadgetList()
    
    SplitterGadget(#splitter_0,0,30,WindowWidth(0)-150,WindowHeight(0)-72,#container0,#scroll,#PB_Splitter_Vertical|#PB_Splitter_FirstFixed)
    SetGadgetState(#Splitter_0, 150)
    SetGadgetAttribute(#splitter_0,#PB_Splitter_FirstMinimumSize ,80)
    SetGadgetAttribute(#splitter_0,#PB_Splitter_SecondMinimumSize ,300)
  
    ;}
    ;{ panel layer, etc.
    
    ; Nuanciers

    ContainerGadget(#cont_layer, 0,0,0,0,#PB_Container_Single) 
    ; nuanciers
    PanelGadget(#Panel_r2, 0,30, WindowWidth(0)-156,120)      ;
      AddGadgetItem(#Panel_r2, 0, "Nuanciers")       
      AddGadgetItem(#Panel_r2, 1, "Options")     
      CloseGadgetList()  

       ; brush
       PanelGadget(#panel_r3, 0,150, WindowWidth(0)-156, 200) 
       AddGadgetItem(#Panel_r3, 0, "Brush")
       AddGadgetItem(#Panel_r3, 1, "Presets")
       CloseGadgetList() 
       ; layers
      PanelGadget(#Panel_r, 0,350, WindowWidth(0)-156, 600) 
      AddGadgetItem(#Panel_r, 0, "Layers")
      ; opacité calque (opacity layer)
        TrackBarGadget(#tb_layer_op, 0, 10, 110, 20, 0, 100)
        ;calque mode de fusion   (blendmode layers)   
        ComboBoxGadget(#Combo_1, 0, 30, 90, 20,#PB_ComboBox_UpperCase)
        AddGadgetItem(#Combo_1, -1,"Normal")
        AddGadgetItem(#Combo_1, 1,"Multiply")
        AddGadgetItem(#Combo_1, 2,"Color Burn")
        AddGadgetItem(#Combo_1, 3,"Color Add")
        
       AddGadgetItem(#Panel_r, 1, "Channels")
       
       
       
      CloseGadgetList()
    CloseGadgetList()
      
    
    SplitterGadget(#splitter_1,0,30,WindowWidth(0),WindowHeight(0)-72,#splitter_0,#cont_layer,#PB_Splitter_Vertical|#PB_Splitter_FirstFixed)
    SetGadgetState(#Splitter_1, WindowWidth(0)-150)
    SetGadgetAttribute(#splitter_1,#PB_Splitter_FirstMinimumSize ,600)
    SetGadgetAttribute(#splitter_1,#PB_Splitter_SecondMinimumSize ,50)
    

    
    ;}

    ;{ 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) ; escape - quit the programm
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

;}     
    
  EndIf
  
     
EndProcedure

Procedure event_()
   Event = WaitWindowEvent() ; This line waits until an event is received from Windows
  
  WindowID = EventWindow() ; The Window where the event is generated, can be used in the gadget procedures  
  GadgetID = EventGadget() ; Is it a gadget event?  
  EventType = EventType() ; The event type
  
  Select event
    Case #PB_Event_CloseWindow
      quit=1  
  EndSelect  
EndProcedure

Procedure gadget_event()
  
 If Event = #PB_Event_Menu    
    MenuID = EventMenu()    
    Select MenuID 
      Case 0 ; 
        
      Case 1
        
      Case 2
            
      
      Case 20
       
      Case 23 ; escape
        quit = 1
      Case 30
        
        
    EndSelect
  EndIf
    
  
  If Event = #PB_Event_Gadget    
    If GadgetID = #Panel_0      
    ElseIf GadgetID = #ScrollBar_0      
    ElseIf GadgetID = #ScrollBar_1      
    ElseIf GadgetID = #TrackBar_0
    ElseIf GadgetID = #TrackBar_1      
    ElseIf GadgetID = #Radio_0      
    ElseIf GadgetID = #CheckBox_0    
    ElseIf GadgetID = #CheckBox_1 
    ElseIf GadgetID = #CheckBox_2 
    EndIf
  EndIf 
  
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
Les images sont les mêmes que celles du zip, voir le lien que j'ai posté un peu plus haut :)

Pour l'instant, les outils ne marchent plus, car là, je m'occupe de l'interface et j'ai appris plein de trucs nouveaux, c'est classe :).

Si vous voyez des bugs ou des ajouts intéressants à faire n'hésitez pas.