Palette *.gpl (gimp, mypaint, krita, animatoon...)

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Palette *.gpl (gimp, mypaint, krita, animatoon...)

Message par blendman »

salut

Aujourd'hui, j'ai intégré la gestion de palette (aussi appelé nuancier) dans mon soft 2D animatoon.

Du coup, voici le code si cela intéresse quelqu'un ;)
Ce n'est pas encore terminé, je l'updaterai lorsque j'aurai ajouté toutes les fonctions (il manque le deleteswatch(), et createpalette from image n'est pas super comme ça, mais bon c'est rapide ^^).

Infos :
- permet d'ouvrir, de créer, de modifier des palettes (format *.gpl), et de les utiliser avec des logiciels comme gimp, krita, mypaint ou animatoon.

Fonctions :
- ouvrir une palette(*.gpl), enregistrer, fusionner des palettes, créer une palette depuis une image importée (méthode rapide), ajouter une couleur, changer une couleur



Mise à jour 19/072015

Code : Tout sélectionner

; open a palette (gimp, mypaint, krita, animatoon
; by blendman
; pb 5.22 / 5.31
; date : 25 / 06 /2015

; modification 19/07/2015 
; New
; - delete, insert, sort, export
; Fixes
; - change swatch name and change global name didn't work
; - fixe name when open a swatch
; - open didn't clear the swatch array (was like merge).

#Win_Swatch = 0

Enumeration 
  
  #G_WinSwatchScroll
  #G_WinSwatchCanvas
  #G_WinSwatchNbCol
  #G_WinSwatchName
  #G_WinSwatchNameSwatch
  
  #G_WinSwatchSave
  #G_WinSwatchExport
  #G_WinSwatchNew
  #G_WinSwatchOpen
  #G_WinSwatchMerge
  #G_WinSwatchFromImg
  
  #G_WinSwatchSort
  #G_WinSwatchAdd
  #G_WinSwatchDel
  #G_WinSwatchInsert
    
EndEnumeration

UsePNGImageDecoder()
UseJPEGImageDecoder()


;{ structures
Structure sColor
  R.a
  G.a
  B.a
EndStructure
Structure sSwatch
  col.sColor
  Color.i
  x.w
  y.w
  name$
EndStructure
Structure sPalette
  name$
  column.w
  Array swatch.sSwatch(0)
  
EndStructure


Global Dim SwatchColor.sPalette(0)
SwatchColor(0)\column = 7
SwatchColor(0)\name$ = "Palette test"

Global SwatchId = 0
;}


Procedure AddSwatchColor(r,g,b,name$="",id=-1)
  
  If id=-1
    n = ArraySize(SwatchColor(SwatchId)\swatch())
    ReDim SwatchColor(SwatchId)\swatch(n+1)
  Else
    n = id
    m = ArraySize(SwatchColor(SwatchId)\swatch())
    For i=m To n+1 Step-1  
      SwatchColor(SwatchId)\swatch(i) = SwatchColor(SwatchId)\swatch(i-1)
    Next 
     ReDim SwatchColor(SwatchId)\swatch(m+1)
  EndIf
  
  With SwatchColor(SwatchId)\swatch(n)
    
    \Color = RGB(r,g,b)
    \col\R = r
    \col\G = g
    \col\B = b
    \name$ = name$
    
  EndWith
  
EndProcedure
Procedure SwatchUpdatePropCanvas(x1=0,y1=0,Selected=0)
  
  column = SwatchColor(swatchId)\column 
  u = Round((GadgetWidth(#G_WinSwatchCanvas)-25) / column, #PB_Round_Down)
  n = ArraySize(SwatchColor(swatchid)\swatch()) -1
  
  y = (1+n/column) *u
  If n> 0
  ;If GadgetHeight(#G_WinSwatchCanvas) <> y Or 
    ResizeGadget(#G_WinSwatchCanvas,#PB_Ignore,#PB_Ignore,#PB_Ignore,y+25)
    SetGadgetAttribute(#G_WinSwatchScroll,#PB_ScrollArea_InnerHeight,y+50)
  ;EndIf

  EndIf
  
  
  If StartDrawing(CanvasOutput(#G_WinSwatchCanvas))
    Box(0,0,GadgetWidth(#G_WinSwatchCanvas),GadgetHeight(#G_WinSwatchCanvas),RGB(150,150,150))
    For i = 0 To ArraySize(SwatchColor(swatchId)\swatch())-1
      
      With SwatchColor(swatchId)\swatch(i)
        x = (i%column) * u         
        y = (i/column) * u
        Box(x,y,u,u,RGB(\col\R,\col\G,\col\B))
        
      EndWith
      
    Next i 
    
    If Selected = 1
      DrawingMode(#PB_2DDrawing_Outlined)
      Box(x1*u,y1*u,u,u,RGB(255,0,0))
      Box(x1*u+1,y1*u+1,u-2,u-2,RGB(0,0,0))
    EndIf
    StopDrawing()
    
  EndIf
  
EndProcedure
Procedure SwatchOpen(merge=0)
  
  If merge = 0
    ReDim SwatchColor(SwatchId)\swatch(0)
  EndIf
  
  file$ = OpenFileRequester("Open","","GPL (gimp, krita, mypaint, animatoon)|*.gpl",0)
  If file$ <> ""
    If ReadFile(0,file$)
      
      Editor$ = ReadString(0)     
      SwatchColor(swatchId)\name$ = RemoveString(ReadString(0),"Name:") 
      line$ = ReadString(0)
      st$ = StringField(line$,2," ")
      SwatchColor(swatchId)\column = Val(st$)
      
      While Eof(0) = 0    
        line$ = ReadString(0)
        char$ = Mid(line$,1,1)
        
        If char$ <> "#" And line$ <> ""            
          line$ = ReplaceString(line$,Chr(9),Chr(32)) 
          While char$ = Chr(32)
            char$ = Mid(line$,1,1)
            line$ = Right(line$,Len(line$)-1)
          Wend            
          While FindString(line$,Chr(32)+Chr(32)) >= 1
            line$ = ReplaceString(line$,Chr(32)+Chr(32),Chr(32))
          Wend
          RGB$ = line$
          count = CountString(line$,Chr(32))
          R = Val(StringField(RGB$, 1, " "))
          G = Val(StringField(RGB$, 2, " "))
          B = Val(StringField(RGB$, 3, " "))
          name$ =""          
          For i = 0 To count 
            Name$ + StringField(RGB$, 4+i, " ")            
          Next i
          Name$ = ReplaceString(Name$,Chr(9),"")
          ;Debug Str(r)+"/"+Str(g)+"/"+Str(b)
          AddSwatchColor(r,g,b,name$)
        EndIf           
        
      Wend
      
      CloseFile(0)
    EndIf   
  EndIf
  SetGadgetState(#G_WinSwatchNbCol,SwatchColor(swatchId)\column)
  SetGadgetText(#G_WinSwatchName,SwatchColor(swatchId)\name$)
  
  SwatchUpdatePropCanvas()
    
EndProcedure
Procedure SwatchSave(export=0)
  
  Shared SwatchSaved$ 
  ; save a swatch.
  ; format supported : GPL (gimp palette, krita...)
  
  If export = 1 ; save only
   
    File$ = SaveFileRequester("Save Swatch","","GPL (Gimp, Krita, Inkscape, Animatoon)|*.gpl",0)
    
    If File$ <> ""
      
      ext$  = LCase(GetExtensionPart(File$))
      If ext$ <> "gpl"
        file$ = RemoveString(file$,ext$)
        file$ + ".gpl"
      EndIf
      SwatchSaved$ = file$
      export = 0
    EndIf
        
  EndIf
  
  If export =0 
    
     ;ext$  = GetExtensionPart(SwatchSaved$)
    
     ;If ext$ = "gpl"
       
       If OpenFile(0,SwatchSaved$)
         
         With SwatchColor(swatchid)
           
           WriteStringN(0, "Animatoon Palette")
           WriteStringN(0, "Name: "+ \name$)
           WriteStringN(0, "Columns: "+ Str(\column))
           WriteStringN(0, "# ")
           
           For i = 0 To ArraySize(SwatchColor(swatchid)\swatch())-1
             
             R$ = Str(\Swatch(i)\col\R)
             G$ = Str(\swatch(i)\col\G)
             B$ = Str(\swatch(i)\col\B)            
             WriteStringN(0, R$+" "+G$+" "+B$+"	"+\swatch(i)\name$)
             
           Next i
           
         EndWith
         
         CloseFile(0)
         
       EndIf
       
     ;EndIf
    
  EndIf
  
EndProcedure
Procedure SwatchCreateFromImage()
  File$ = OpenFileRequester("Open Image","","IMAGE|*.jpg;*.png;*.bmp",0)
  If file$ <> ""
    w = Val(InputRequester("Max colors", "Set the maximum number of colors (for the palette)",""))
    If w > 0
      If LoadImage(0,file$)
        ReDim SwatchColor(swatchId)\Swatch(0)
        width = Round(Sqr(w),#PB_Round_Down)
        Debug Sqr(w)
        ResizeImage(0,width,width,1)
        If StartDrawing(ImageOutput(0))
          For i= 0 To width-1
            For j = 0 To width-1
              color = Point(i,j)
              name$ = "color"+Str(a)
              ok = 1
              For aa = 0 To ArraySize(SwatchColor(swatchId)\Swatch())
                If color = SwatchColor(swatchId)\Swatch(aa)\Color
                  ok = 0
                  Break
                EndIf
              Next aa
              If ok = 1
                AddSwatchColor(Red(color),Green(color),Blue(color),Name$)
                a+1
              EndIf                          
            Next j
          Next i
          StopDrawing()
        EndIf
        SwatchUpdatePropCanvas()
      EndIf                  
    EndIf
  EndIf
EndProcedure
Procedure SwatchDeleteColor(id,x,y)
  
  If id < ArraySize(SwatchColor(swatchId)\Swatch())
    n = id
    m = ArraySize(SwatchColor(SwatchId)\swatch())-1
    For i=n To m
      SwatchColor(SwatchId)\swatch(i) = SwatchColor(SwatchId)\swatch(i+1)
    Next 
    ReDim SwatchColor(SwatchId)\swatch(m)
    SwatchUpdatePropCanvas(x,y,1)
  EndIf
  
EndProcedure
Procedure SwatchSort()
  
  typ = Val(InputRequester("Type of sorting ?", "Typ of sorting ? 0 = by color, 1 = by name","0"))

  Select typ 
    Case 0  
      SortStructuredArray(SwatchColor(swatchId)\Swatch(),#PB_Sort_Descending,OffsetOf(sSwatch\color),  TypeOf(sSwatch\color))
      
    Case 1
      SortStructuredArray(SwatchColor(swatchId)\Swatch(),#PB_Sort_Ascending,OffsetOf(sSwatch\name$),  TypeOf(sSwatch\name$))
  EndSelect
  
  SwatchUpdatePropCanvas()
  
EndProcedure

  If OpenWindow(#Win_Swatch,0,0,550,460,"Palette creation (Gimp, Mypaint, Krita, Animatoon...)",
                #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_ScreenCentered)
    
    SetWindowColor(0,RGB(120,120,120))
    i = 5
    column = SwatchColor(swatchId)\column 
    ; butons
    w1 = 80 ; size 
    xb = WindowWidth(#Win_Swatch) - w1 - 10 ; x  

    If StringGadget(#G_WinSwatchName,10,i,150,20,SwatchColor(swatchId)\name$)    : EndIf
    GadgetToolTip(#G_WinSwatchName, "Swatch global name")
    If SpinGadget(#G_WinSwatchNbCol,170,i,40,20,1,64,#PB_Spin_Numeric)           : EndIf
    SetGadgetState(#G_WinSwatchNbCol,column)
    i +25
    GadgetToolTip(#G_WinSwatchNbCol, "Number of Columns for the swatch")
    
    If ScrollAreaGadget(#G_WinSwatchScroll, 10,i,xb-20,400,xb-20-25,400)
      SetGadgetColor(#G_WinSwatchScroll,#PB_Gadget_BackColor,RGB(150,150,150))
      If CanvasGadget(#G_WinSwatchCanvas,0,0,xb-20,400) : EndIf
      i + 405
      CloseGadgetList()
    EndIf
    
    If StringGadget(#G_WinSwatchNameSwatch,10,i,150,20,"Swatch name")            : EndIf
    
    i = 5
    If ButtonGadget(#G_WinSwatchNew,xb,i,w1,20,"New")     : i + 25  : EndIf
    If ButtonGadget(#G_WinSwatchOpen,xb,i,w1,20,"Open")   : i + 25  : EndIf
    If ButtonGadget(#G_WinSwatchMerge,xb,i,w1,20,"Merge")   : i + 25  : EndIf
    If ButtonGadget(#G_WinSwatchFromImg,xb,i,w1,20,"From Image")   : i + 25  : EndIf
    If ButtonGadget(#G_WinSwatchSave,xb,i,w1,20,"Save")  : i + 25  : EndIf
    If ButtonGadget(#G_WinSwatchExport,xb,i,w1,20,"Export")  : i + 35  : EndIf
    If ButtonGadget(#G_WinSwatchSort,xb,i,w1,20,"Sort")  : i + 25  : EndIf
    If ButtonGadget(#G_WinSwatchInsert,xb,i,w1,20,"Insert")  : i + 25  : EndIf
    If ButtonGadget(#G_WinSwatchAdd,xb,i,w1,20,"Add")  : i + 25  : EndIf
    If ButtonGadget(#G_WinSwatchDel,xb,i,w1,20,"Delete")  : i + 25  : EndIf
       
    SwatchUpdatePropCanvas()
        
    Repeat
      
      Event       = WaitWindowEvent(1)
      EventType   = EventType()
      EventGadget = EventGadget()
            
      Select event
          
        Case #PB_Event_Gadget
          
          Select EventGadget
              
            Case #G_WinSwatchCanvas
              If EventType = #PB_EventType_LeftButtonDown
                u = Round((GadgetWidth(#G_WinSwatchCanvas)-25) / SwatchColor(swatchId)\column , #PB_Round_Down)
                x = Round(GetGadgetAttribute(#G_WinSwatchCanvas, #PB_Canvas_MouseX)/u,#PB_Round_Down)
                y = Round(GetGadgetAttribute(#G_WinSwatchCanvas, #PB_Canvas_MouseY)/u,#PB_Round_Down)
                id = x +y* SwatchColor(swatchId)\column    
                If StartDrawing(CanvasOutput(#G_WinSwatchCanvas))
                  If id <= ArraySize(SwatchColor(swatchId)\swatch())-1                    
                    SetGadgetText(#G_WinSwatchNameSwatch,SwatchColor(swatchId)\swatch(id)\name$)
                  EndIf
                  StopDrawing()
                EndIf
                SwatchUpdatePropCanvas(x,y,1)               
              ElseIf EventType = #PB_EventType_LeftDoubleClick
                Color = ColorRequester(SwatchColor(swatchId)\swatch(id)\Color)
                SwatchColor(swatchId)\swatch(id)\col\R = Red(color)
                SwatchColor(swatchId)\swatch(id)\col\G = Green(color)
                SwatchColor(swatchId)\swatch(id)\col\B = Blue(color)
                SwatchColor(swatchId)\swatch(id)\Color  = color
                SwatchUpdatePropCanvas(x,y,1)
              EndIf
                            
            Case #G_WinSwatchNbCol               
              SwatchColor(swatchId)\column  = GetGadgetState(#G_WinSwatchNbCol)              
              SwatchUpdatePropCanvas(x,y,1)
                         
            Case #G_WinSwatchNameSwatch
              If EventType = #PB_EventType_Focus  Or EventType = #PB_EventType_Change      
                If id <=ArraySize(SwatchColor(swatchId)\Swatch())
                  SwatchColor(swatchId)\Swatch(id)\name$ = GetGadgetText(#G_WinSwatchNameSwatch)     
                EndIf
              EndIf
              
            Case #G_WinSwatchName
              If EventType = #PB_EventType_Focus  Or EventType = #PB_EventType_Change  
                SwatchColor(swatchId)\Name$ = GetGadgetText(#G_WinSwatchName)        
              EndIf
            
            Case #G_WinSwatchMerge
              SwatchOpen(1)
              
            Case #G_WinSwatchNew
              ReDim SwatchColor(swatchId)\Swatch(0)
              SwatchUpdatePropCanvas(x,y,1)
              
            Case #G_WinSwatchFromImg
              SwatchCreateFromImage()
              
            Case #G_WinSwatchSave
              SwatchSave()
              
            Case #G_WinSwatchExport
              SwatchSave(1)
              
            Case #G_WinSwatchInsert
              color = ColorRequester()
              Name$ = InputRequester("Name","Name of the new swatch : ","Untitled")             
              AddSwatchColor(Red(color),Green(color),Blue(color),Name$,id)
              SwatchUpdatePropCanvas(x,y,1)
              
            Case #G_WinSwatchAdd
              color = ColorRequester()
              Name$ = InputRequester("Name","Name of the new swatch : ","Untitled")
              AddSwatchColor(Red(color),Green(color),Blue(color),Name$)
              SwatchUpdatePropCanvas(x,y,1)
              
            Case #G_WinSwatchOpen
              SwatchOpen()
              
            Case #G_WinSwatchDel               
              SwatchDeleteColor(id,x,y)
              
            Case #G_WinSwatchSort
              SwatchSort()
            
          EndSelect
          
      EndSelect
             
    Until event = #PB_Event_CloseWindow
           
  EndIf  
Dernière modification par blendman le dim. 19/juil./2015 9:51, modifié 2 fois.
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Palette *.gpl (gimp, mypaint, krita, animatoon...)

Message par falsam »

Petite erreur ligne 336
Remplacer SwacthOpen par SwatchOpen

Un fichier compressé comprenant deux palettes de couleurs à tester.
DemoGPL.zip

Merci pour ce partage Blendman :)

PS : J'ai corrigé le pack de test pour ceux qui ont downloadés le précédent qui était moisi.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Palette *.gpl (gimp, mypaint, krita, animatoon...)

Message par blendman »

J'ai mis à jour le code :
- on peut ajouter une couleur, modifier une couleur
- corrections mineures.

Il me reste un bug sur certaines couleurs ou certaines palettes qui s'ouvrent mal.
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Palette *.gpl (gimp, mypaint, krita, animatoon...)

Message par blendman »

Mis à jour du code :
- Insérer une couleur, supprimer une couleur, trier les couleur (par nom et par couleur), enregistrer la palette (écrase la palette en cours)
- correction de bugs (les noms n'étaient pas pris en compte, bugs mineurs...)
Répondre