Nom de code : TEO
Pour Tile Editor Organisation
FONCTIONS
Cet éditeur permet notamment de concevoir :
1) Des sprites
- pour jeu vidéo : avec palette ou non, animé ou non...
2) des TileSet (à partir d'un tileset pré-existant ou non)
3) des SpriteSheet ou des animations
- A partir d'une série d'image ou d'un sprite sheet existant.
- en créant les images nous-même ou en les important.
4) des images quelconques (painting)
- de créer des spritesheet : par exemple, la suite d'images d'animation de personnage
- de créer des tileset : depuis une image, on devrait pouvoir sortir un tileset et ajouter des tile dessus, mixer des tileset entre eux, etc..
- modifier le centre des images d'une animation et peut être pouvoir les retoucher
- accessoirement en bonus, on pourra retoucher et modifier un peu les images (dessin basique, gomme.. ), mais ce n'est pas tellement le but à la base.
Détails des fonctions
Version 0.2807
- outil texte : on peut ajouter un calque de texte, changer le texte, la couleur de la police, la police, son style, etc..
- l'affichage des calques est modifié : ce n'est plus une liste mais un scrollarea avec des imagegadgets pour chaque layer. ON voit donc désormais des icones sur le calque, ainsi qu'une miniature de l'image du calque correspondant.
- UI : j'ai ajouté dans les options des outils le scatter et l'espace entre les points.
- ajout de raccourcis : X/C pour changer les brosses, 1 : réduit la taille de la brosse, 2 : augmente la taille.
- en cliquant sur la couleur Foreground, on ouvre un colorrequester() pour changer cette couleur.
- avec l'outil "bouger le calque", les flèches permettent de le bouger au pixel près
- Menu transformation : contraste/luminosité (merci Dobro et LSI)
- Menu Affichage : on peut afficher ou non les toolbar (fichier et outils) ainsi que la barre d'état.
- Désormais, la position des toolbar est sauvegardé à la fermeture et replacée à l'ouverture du logiciel.
Version 0.2622
- outil tampon : permet de dessiner avec un motif (pattern). ON choisit le motif dans l'onglet "pattern" (du côté des onglets couleurs/swatch...)
- Brush : optimisation du trait, ajout de la rotation
- ajout de type d'outil : blur, pixel, glass, noise
- ajout d'un filtre : noise
- transformation : désaturation, inversion de couleur, balance des couleurs (bugué)
- outil sélection fonctionne, on peut dessiner sur la sélection, etc..
- début de la fenêtre de préférence
- corrections de plusieurs bugs (voir message précédent)
- calque : fusionner les calques invisibles, fusionner tous les calques
Version 0.228
Fonctions principales :
⦁ Fichier : new, open (image, .teo avec calques), save (image calques écrasé, teo (avec tous les calques)
⦁ Affichage : grid, zoom
⦁ Editions : cut/copy/paste, clear,
⦁ Calques : add, delete, merge all, position, voir le calque, lock (alpha, peinture, move), blendmode, opacité, nom
⦁ Transform : changer taille de l'image, de la surface de travail, ajuster le calque à la taille de l'image
⦁ Aide : à propos
⦁ Outils : pinceaux, spray, gomme, sélection, forme (boite, cercle, ligne, libre), dégradé, pot de peinture, color picker, zoom, bouger le canvas
⦁ Options des outils : taille, alpha (BG et FG), pas (espace entre 2 points), scatter (diffusion), couleur Bg et FG, forme de la brosse, type d'outil
⦁ Interface : changer le fond (papier), on peut déplacer les toolbar
Bugs à corriger
1. Outil zoom bug avec control (pour un zoom -)
2. les blendmode ne sont pas updatés en temps réel, il faut changer de blendmode pour voir le changement
3. Bug avec sélection : desaturation, color balance
4. bug outil hand : canvas décalé par rapport à la souris
5. Bug avec un calque Text et les blendmode : le texte n'apparait que pour le normal
Outils/fonctions pas encore fonctionnels
1. Particules
2. Forme libre
3. Changer la taille de la sélection
4. Menu Aide : Aide
Choses à revoir
1. Menu> transformation : changer la couleur de l'image à revoir
2. Tooltip des outils que en fr
Screenshots
Nouvelle version revue entièrement (09 - 10/2013) :
http://www.dracaena-studio.com/tools/te ... 0.2622.jpg
http://www.dracaena-studio.com/tools/teo/Teo_v0.228.jpg
Ancienne version
Version 0.2215 :
http://blendman.free.fr/dev/pb/teo/teo_ ... 0.2215.jpg
Version 0.1670 :
http://dracaena-studio.com/tools/teo/te ... n0.167.jpg
DOWNLOAD
Nouvelle version
Version 0.2623 (19/10/2013)
http://host-a.net/u/blendman/Teo.zip
Ancienne version
Version 0.2215 (20/06/2012):
http://blendman.free.fr/dev/pb/teo/TEO.zip
CODE
Le code de la version 0.11 (je le laisse au cas où).
Le code complet est contenu dans le Zip.
Code : Tout sélectionner
;{ infos
; basé sur un code de Fred/Fantaisie Software et de B.Vignoli
; Remerciements : Demivec
; icone by marco martin
; dev : blendman 04/06/2012/
; modif
; version pb : 4.61
;}
;{ enum
#statubar =0
#menu=1
#maximages=1000
Enumeration ; window
#WinMain
#WinPref
#WinResize
#winNewTileset
EndEnumeration
Enumeration; images
#IMAGE_Content ; stores the previous CanvasGadget content while the mouse is down
#IMAGE_Color
#IMAGE_LoadSave
#IMAGE_Grid
#IMAGE_LayerActif
EndEnumeration
Enumeration ; gadgets
; window main
#GADGET_ScrollCanvas
#GADGET_Canvas
#GADGET_Color
#GADGET_Brush
#GADGET_Line
#GADGET_Box
#GADGET_Circle
#GADGET_Fill
#GADGET_Clear
#GADGET_BrushSize
#GADGET_BrushType
#GADGET_BrushTra
#GADGET_BrushTool
#GADGET_BrushKeepAlpha
; window preference
#GADGET_PrefPanel
#GADGET_GridW
#GADGET_GridH
#GADGET_GridColor
; window resize
#GADGET_WResW
#GADGET_WResH
#GADGET_WResbtn
#GADGET_WResbtn2
#GADGET_WResSiz
#GADGET_WResLink
; window newtileset
#GADGET_WNewTile
#GADGET_WNewBtnOk
#GADGET_WNewW
#GADGET_WNewH
EndEnumeration
;}
;{ declare
Declare updateScreen() : Declare DrawAction(x, y, EventType) : Declare CreateCheckker()
Declare AddCanvas() : Declare ClearCanvas() : Declare ResizeCanvas(mode=0)
Declare AddImage() : Declare ClearLayer(img=#IMAGE_LayerActif)
Declare OpenImg() : Declare SaveImg() : Declare ConvertImg() : Declare NewTileSet() : Declare ImportImg()
Declare WindowPref() :
Declare SetBrush() :
Declare WindowDocResize() : Declare ResizeDoc()
;}
;{ structures
Structure option ; the option of the program, document..
name$ : version$ : grid.a
gridW.w : gridH.w : gridColor.l
EndStructure
Structure StDocument ; the document (size, depth..)
w.w : h.w
w_def.w : h_def.w
EndStructure
Structure StBrush ; for the brush tool (size, type, color..)
size.w : type.a : alpha.a : tool.a
keepAlpha.a
EndStructure
;}
;{ variables
Global Dim im(#maximages)
Global Dim imx(#maximages)
Global Dim imy(#maximages)
Dim img$(#maximages)
Global NbImgImport=0, sel=0
Global CurrentColor, CurrentMode, StartX, StartY
;}
;{ init
If UsePNGImageDecoder()=0 Or UsePNGImageEncoder()=0 Or UseJPEGImageDecoder()=0 Or UseTGAImageDecoder()=0 Or UseJPEGImageEncoder()=0
MessageRequester("Erreur","Impossible d'initialiser un des formats image (jpg, png, tga)!")
End
EndIf
;{ initialisation
Global option.option
With option
\name$ ="Tile Editor"
\version$ ="0.11"
\grid = 1
\gridW = 32
\gridH = 32
\gridColor = 0
EndWith
Global Doc.StDocument
With doc
\w = 800
\h = 600
\w_def = 800
\h_def = 600
EndWith
Global brush.StBrush
With brush
\size =5
\alpha = 255
\type =0
\tool = 0
EndWith
;}
;}
;{ openwindow
flag = #PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_MaximizeGadget|#PB_Window_MinimizeGadget
If OpenWindow(#WinMain,0,0,1024,768,option\name$,flag)=0
MessageRequester("Erreur","Impossible d'initialiser la fenêtre !")
End
EndIf
;SmartWindowRefresh(#WinMain, #True)
;{ create menu
If CreateImageMenu(#menu,WindowID(#WinMain),#PB_Menu_ModernLook)
MenuTitle("Fichier")
MenuItem(9, "New Tileset")
MenuItem(0, "Open an Image (Tileset...)")
MenuItem(8, "Ouvrir une image et la convertir en TileSet")
MenuBar()
MenuItem(10, "New Animation (sprite sheet)")
MenuItem(1, "Importer des image(s) (animation)")
MenuBar()
;MenuItem(11, "Open an image")
MenuItem(6, "Importer une image sur le document")
MenuBar()
MenuItem(7, "Sauvegarder le document")
MenuItem(5, "Exporter le tileSet")
;MenuItem(2, "Exporter sequence d'images")
;MenuItem(3, "Exporter animation en Animstrip")
MenuBar()
MenuItem(4, "Quitter")
MenuTitle("Edition");21-40
MenuItem(32,"Redimensionner l'image")
MenuBar()
MenuItem(31, "Préférences")
MenuTitle("View") ; 61 -90
MenuItem(70, "Grille"+Chr(9)+"Ctrl+G")
MenuBar()
MenuItem(61, "Zoom +")
MenuItem(62, "Zoom -")
OpenSubMenu("Zoom")
MenuItem(63, "Zoom 500%")
MenuItem(64, "Zoom 400%")
MenuItem(65, "Zoom 300%")
MenuItem(66, "Zoom 200%")
MenuItem(67, "Zoom 100%")
MenuItem(68, "Zoom 50%")
MenuItem(69, "Zoom 25%")
CloseSubMenu()
MenuBar()
; MenuTitle("Tools");41-60
; OpenSubMenu("Type d'outil")
; MenuItem(42, "Cercle")
; MenuItem(43, "Carré")
; MenuItem(44, "Custom")
; CloseSubMenu()
; MenuItem(41, "Taille Pinceau")
MenuTitle("Aide");121-140
MenuItem(121, "Infos")
MenuItem(122, "A propos...")
EndIf
;}
;{ image
CurrentColor = RGBA(0, 0, 0, $FF) ;add alpha value
CurrentMode = #GADGET_Brush
CreateImage(#IMAGE_Color, 25, 25, 24); pour la sélection de couleur
If CreateImage(#IMAGE_Grid,doc\w,doc\h,32) ; le fond checker
CreateCheckker()
EndIf
AddImage()
;}
;{ gadgets
;{ Tools bar top
ComboBoxGadget(#GADGET_BrushTool,5,5,40,20)
AddGadgetItem(#GADGET_BrushTool,0,"Brush")
AddGadgetItem(#GADGET_BrushTool,1,"Pencil")
AddGadgetItem(#GADGET_BrushTool,2,"Eraser")
ComboBoxGadget(#GADGET_BrushType,48,5,50,20)
AddGadgetItem(#GADGET_BrushType,0,"Circle")
AddGadgetItem(#GADGET_BrushType,1,"Box")
AddGadgetItem(#GADGET_BrushType,2,"Ellipse")
AddGadgetItem(#GADGET_BrushType,3,"Custom")
LoadFont(1,"Arial.ttf",7)
SetGadgetFont(#GADGET_BrushType,FontID(1))
SetGadgetFont(#GADGET_BrushTool,FontID(1))
SpinGadget(#GADGET_BrushSize,100 , 5, 50,20,1,100,#PB_Spin_Numeric)
GadgetToolTip(#GADGET_BrushSize,"Size of the brush")
TrackBarGadget(#GADGET_BrushTra,155 , 5, 100,20,0,255)
GadgetToolTip(#GADGET_BrushTra,"Transparence of the brush")
CheckBoxGadget(#GADGET_BrushKeepAlpha,260,5,75,20,"Keep Alpha")
;}
;{ canvas
AddCanvas()
;}
;{ tools (right)
ButtonGadget(#GADGET_Brush, 5, 110, 25, 25, "Brush", #PB_Button_Toggle)
ButtonGadget(#GADGET_Line, 31, 110, 25, 25, "Line", #PB_Button_Toggle)
ButtonGadget(#GADGET_Box, 5, 137, 25, 25, "Box", #PB_Button_Toggle)
ButtonGadget(#GADGET_Circle, 31, 137, 25, 25, "Circle", #PB_Button_Toggle)
ButtonGadget(#GADGET_Fill, 5, 164, 25, 25, "Fill", #PB_Button_Toggle)
ButtonGadget(#GADGET_Clear, 31, 164, 25, 25, "Clear")
ButtonImageGadget(#GADGET_Color, 5, 210, 30, 30, ImageID(#IMAGE_Color))
;}
;{ set gadget
SetGadgetState(#GADGET_Brush, 1)
SetGadgetState(#GADGET_BrushSize,brush\size)
SetGadgetState(#GADGET_BrushTra,brush\alpha)
SetGadgetState(#GADGET_BrushType,brush\type)
SetGadgetState(#GADGET_BrushTool,brush\tool)
SetGadgetAttribute(#GADGET_Canvas, #PB_Canvas_Cursor, #PB_Cursor_Cross)
;}
;}
;{ statusbar
If CreateStatusBar(#statubar,WindowID(#WinMain))
AddStatusBarField(100)
AddStatusBarField(200)
AddStatusBarField(100)
EndIf
;}
;{ set gadget, menu..
SetMenuItemState(#menu,70,option\grid)
updateScreen()
SetActiveGadget(#GADGET_Canvas)
StatusBarText(#statubar,1,"Doc : "+Str(doc\w)+"/"+Str(doc\h))
;}
;}
;{ loop
Repeat
event=WaitWindowEvent(5)
win = EventWindow()
Select event
Case #PB_Event_Menu
Select EventMenu()
;{ files
;{ open an image/tileset/spritesheet
Case 0
OpenImg()
;}
;{ importer une/des images
Case 1
If NbImgImport<#maximages
NomFichier$=OpenFileRequester("Importer image(s)","","",0,#PB_Requester_MultiSelection)
If NomFichier$<>"" And (GetExtensionPart(NomFichier$)="png" Or GetExtensionPart(NomFichier$)="bmp" Or GetExtensionPart(NomFichier$)="jpg" Or GetExtensionPart(NomFichier$)="tga")
NbImgImport+1
While NomFichier$<>""
im(NbImgImport)=LoadImage(#PB_Any,NomFichier$)
imx(NbImgImport)=0
imy(NbImgImport)=0
img$(NbImgImport)=NomFichier$
NomFichier$ = NextSelectedFileName()
If NomFichier$<>""
NbImgImport+1
EndIf
If NbImgImport>#maximages
NbImgImport=#maximages
Break
EndIf
Wend
sel=1
UpdateScreen()
Else
If NomFichier$<>""
MessageRequester("Erreur","Seuls les fichiers 'png/jpg/bmp/tga' sont autorisés !")
EndIf
EndIf
EndIf ;}
;{ exportation en série d'images
Case 2
If NbImgImport>0
p$=PathRequester("Choisissez le répertoire d'exportation des images","")
If p$<>""
xleft=imx(1)
xright=imx(1)+ImageWidth(im(1))-1
yup=imy(1)
ydown=imy(1)+ImageHeight(im(1))-1
If xleft<0
xleft=0
EndIf
If yup<0
yup=0
EndIf
If xright>1023
xright=1023
EndIf
If ydown>767
ydown=767
EndIf
For i=2 To NbImgImport
If imx(i)<xleft
xleft=imx(i)
EndIf
If imx(i)+ImageWidth(im(i))-1>xright
xright=imx(i)+ImageWidth(im(i))-1
EndIf
If imy(i)<yup
yup=imy(i)
EndIf
If imy(i)+ImageHeight(im(i))-1>ydown
ydown=imy(i)+ImageHeight(im(i))-1
EndIf
If xleft<0
xleft=0
EndIf
If yup<0
yup=0
EndIf
If xright>1023
xright=1023
EndIf
If ydown>767
ydown=767
EndIf
tempimg=CreateImage(#PB_Any,1024,768,32 | #PB_Image_Transparent)
StartDrawing(ImageOutput(tempimg))
DrawingMode(#PB_2DDrawing_AllChannels)
DrawAlphaImage(ImageID(im(i)),imx(i),imy(i))
StopDrawing()
StartDrawing(ImageOutput(tempimg))
xl=xleft
For y=0 To 767
For x=0 To xl
If Alpha(Point(x,y))>0
If x<xleft
xleft=x
EndIf
EndIf
Next
Next
xr=xright
For y=0 To 767
For x=1023 To xr Step -1
If Alpha(Point(x,y))>0
If x>xright
xright=x
EndIf
EndIf
Next
Next
yu=yup
For x=0 To 1023
For y=0 To yu
If Alpha(Point(x,y))>0
If y<yup
yup=y
EndIf
EndIf
Next
Next
yd=ydown
For x=0 To 1023
For y=767 To yd Step -1
If Alpha(Point(x,y))>0
If y>ydown
ydown=y
EndIf
EndIf
Next
Next
StopDrawing()
Next
For i=1 To NbImgImport
tempimg=CreateImage(#PB_Any,1024,768,32 | #PB_Image_Transparent)
StartDrawing(ImageOutput(tempimg))
DrawingMode(#PB_2DDrawing_AllChannels)
DrawAlphaImage(ImageID(im(i)),imx(i),imy(i))
StopDrawing()
tempimg2=GrabImage(tempimg,#PB_Any,xleft,yup,xright-xleft+1,ydown-yup+1)
SaveImage(tempimg2,p$+GetFilePart(img$(i)),#PB_ImagePlugin_PNG)
FreeImage(tempimg2)
FreeImage(tempimg)
Next
EndIf
EndIf
;}
;{ exporter
Case 3
If NbImgImport>1
p$=SaveFileRequester("Choisissez le fichier animstrip à exporter","","",0)
If GetExtensionPart(p$)=""
p$=p$+".png"
EndIf
If p$<>"" And LCase(Right(p$,3))="png"
xleft=imx(1)
xright=imx(1)+ImageWidth(im(1))-1
yup=imy(1)
ydown=imy(1)+ImageHeight(im(1))-1
If xleft<0
xleft=0
EndIf
If yup<0
yup=0
EndIf
If xright>1023
xright=1023
EndIf
If ydown>767
ydown=767
EndIf
For i=2 To NbImgImport
If imx(i)<xleft
xleft=imx(i)
EndIf
If imx(i)+ImageWidth(im(i))-1>xright
xright=imx(i)+ImageWidth(im(i))-1
EndIf
If imy(i)<yup
yup=imy(i)
EndIf
If imy(i)+ImageHeight(im(i))-1>ydown
ydown=imy(i)+ImageHeight(im(i))-1
EndIf
If xleft<0
xleft=0
EndIf
If yup<0
yup=0
EndIf
If xright>1023
xright=1023
EndIf
If ydown>767
ydown=767
EndIf
tempimg=CreateImage(#PB_Any,1024,768,32 | #PB_Image_Transparent)
StartDrawing(ImageOutput(tempimg))
DrawingMode(#PB_2DDrawing_AllChannels)
DrawAlphaImage(ImageID(im(i)),imx(i),imy(i))
StopDrawing()
StartDrawing(ImageOutput(tempimg))
xl=xleft
For y=0 To 767
For x=0 To xl
If Alpha(Point(x,y))>0
If x<xleft
xleft=x
EndIf
EndIf
Next
Next
xr=xright
For y=0 To 767
For x=1023 To xr Step -1
If Alpha(Point(x,y))>0
If x>xright
xright=x
EndIf
EndIf
Next
Next
yu=yup
For x=0 To 1023
For y=0 To yu
If Alpha(Point(x,y))>0
If y<yup
yup=y
EndIf
EndIf
Next
Next
yd=ydown
For x=0 To 1023
For y=767 To yd Step -1
If Alpha(Point(x,y))>0
If y>ydown
ydown=y
EndIf
EndIf
Next
Next
StopDrawing()
Next
memi=1
memj=NbImgImport
iwidth=xright-xleft+1
iheight=ydown-yup+1
animstrip=CreateImage(#PB_Any,memi*iwidth,memj*iheight,32 | #PB_Image_Transparent)
i=1
For y=1 To memj
For x=1 To memi
If i<=NbImgImport
tempimg=CreateImage(#PB_Any,1024,768,32 | #PB_Image_Transparent)
StartDrawing(ImageOutput(tempimg))
DrawingMode(#PB_2DDrawing_AllChannels)
DrawAlphaImage(ImageID(im(i)),imx(i),imy(i))
StopDrawing()
tempimg2=GrabImage(tempimg,#PB_Any,xleft,yup,iwidth,iheight)
StartDrawing(ImageOutput(animstrip))
DrawingMode(#PB_2DDrawing_AllChannels)
DrawAlphaImage(ImageID(tempimg2),(x-1)*iwidth,(y-1)*iheight)
StopDrawing()
FreeImage(tempimg2)
FreeImage(tempimg)
EndIf
i=i+1
Next
Next
SaveImage(animstrip,p$,#PB_ImagePlugin_PNG)
FreeImage(animstrip)
Else
If p$<>""
MessageRequester("Erreur","Seuls les fichiers 'Png' sont autorisés !")
EndIf
EndIf
EndIf;}
;{ import img on doc
Case 6 ; open img
ImportImg()
;}
;{ save the document as img (png, jpg..)
Case 7 ; save img
SaveImg()
;}
;{ convertion image tileset
Case 8
ConvertImg()
;}
;{ new tileset
Case 9
NewTileSet()
;}
;{ new AnimSprite
Case 10
;}
;{ quitter
Case 4
Break
;}
;}
;{ Edition
Case 32
WindowDocResize()
Case 31
WindowPref()
;}
;{ view
Case 70
option\grid = 1-option\grid
SetMenuItemState(#menu,70,option\grid)
UpdateScreen()
Case 61 ; zoom +
Case 62 ; zoom -
Case 63 To 69
MessageRequester("Info","Not Finished")
;}
;{ outils
Case 41
brush\Size=Val(InputRequester("Brush","Taille du Brush",Str(brush\Size)))
Case 42
brush\type =0
Case 43
brush\type =1
;}
;{ menu Help
Case 121
txt$="Infos prochainement disponibles"
MessageRequester("Infos",txt$)
Case 122
MessageRequester("A propos...","Tile Editor (version "+option\version$+")"+Chr(13)+"Développé par Blendman"+Chr(13)+Chr(13)+"Mai-2012"+Chr(13)+Chr(13)+"Merci à Fred & B.Vignoli pour la base"+Chr(13)+Chr(13)+"Icone by Marco Martin")
;}
EndSelect
Case #PB_Event_Gadget
Select win
Case #winNewTileset
Select EventGadget()
Case #GADGET_WNewW
newW = Val(GetGadgetText(#GADGET_WNewW))
Case #GADGET_WNewH
newH = Val(GetGadgetText(#GADGET_WNewH))
Case #GADGET_WNewBtnOk
newW = Val(GetGadgetText(#GADGET_WNewW))
newH = Val(GetGadgetText(#GADGET_WNewH))
If newW <>0 And newH <>0
CloseWindow(#winNewTileset)
SetActiveWindow(#WinMain)
StatusBarText(#statubar,1,"Doc : "+Str(doc\w)+"/"+Str(doc\h))
AddImage()
ClearCanvas()
doc\w = newW
doc\h = newH
ResizeDoc()
ResizeCanvas(1)
UpdateScreen()
Else
MessageRequester("Error", "The width and Height should be > 0")
EndIf
EndSelect
Case #WinResize
Select EventGadget()
Case #GADGET_WResW
temp_w = Val(GetGadgetText(#GADGET_WResW))
Case #GADGET_WResH
temp_h = Val(GetGadgetText(#GADGET_WResH))
Case #GADGET_WResbtn ; ok
CloseWindow(#WinResize)
SetActiveGadget(#WinMain)
If temp_h > 0
doc\h = temp_h
EndIf
If temp_w > 0
doc\w = temp_w
EndIf
StatusBarText(#statubar,1,"Doc : "+Str(doc\w)+"/"+Str(doc\h))
ResizeDoc()
ResizeCanvas()
UpdateScreen()
Case #GADGET_WResbtn2 ; cancel
CloseWindow(#WinResize)
EndSelect
Case #WinPref
Select EventGadget()
Case #GADGET_GridW
option\gridW = GetGadgetState(#GADGET_GridW)
UpdateScreen()
Case #GADGET_GridH
option\gridH = GetGadgetState(#GADGET_GridH)
UpdateScreen()
Case #GADGET_GridColor
option\gridColor = ColorRequester(option\gridColor)
UpdateScreen()
EndSelect
Case #WinMain
Select EventGadget()
Case #GADGET_BrushSize
brush\Size = GetGadgetState(#GADGET_BrushSize)
Case #GADGET_BrushType
brush\type = GetGadgetState(#GADGET_BrushType)
Case #GADGET_BrushTra
brush\alpha = GetGadgetState(#GADGET_BrushTra)
SetBrush()
Case #GADGET_BrushTool
brush\tool = GetGadgetState(#GADGET_BrushTool)
SetBrush()
Case #GADGET_BrushKeepAlpha
brush\keepAlpha = GetGadgetState(#GADGET_BrushKeepAlpha)
Case #GADGET_Canvas
X = GetGadgetAttribute(#GADGET_Canvas, #PB_Canvas_MouseX)
Y = GetGadgetAttribute(#GADGET_Canvas, #PB_Canvas_MouseY)
Type = EventType()
Select EventType()
Case #PB_EventType_LeftButtonDown ;
; This stores the current content of the CanvasGadget in #IMAGE_Content,
; so it can be re-drawn while the mouse moves
If StartDrawing(ImageOutput(#IMAGE_Content))
;DrawingMode(#PB_2DDrawing_AlphaBlend) ;canvas gadget doesn't have alpha
;DrawImage(GetGadgetAttribute(#GADGET_Canvas, #PB_Canvas_Image), 0, 0)
DrawingMode(#PB_2DDrawing_AlphaBlend)
If sel>0
DrawAlphaImage(ImageID(im(sel)),imx(sel),imy(sel))
EndIf
DrawAlphaImage(ImageID(#IMAGE_LayerActif),0,0)
StopDrawing()
EndIf
StartX = X
StartY = Y
DrawAction(X, Y, EventType())
mouseDown = #True ;handles problems of mouse being used in OpenFileRequester
Case #PB_EventType_LeftButtonUp
If mouseDown
DrawAction(x, y, EventType())
mouseDown = #False
EndIf
Case #PB_EventType_MouseMove
If GetGadgetAttribute(#GADGET_Canvas, #PB_Canvas_Buttons) & #PB_Canvas_LeftButton
DrawAction(X, Y, EventType())
EndIf
EndSelect
Case #GADGET_Color
CurrentColor = ColorRequester(CurrentColor)
SetBrush()
If StartDrawing(ImageOutput(#IMAGE_Color))
Box(0, 0, 30,30, CurrentColor)
StopDrawing()
SetGadgetAttribute(#GADGET_Color, #PB_Button_Image, ImageID(#IMAGE_Color))
EndIf
Case #GADGET_Brush, #GADGET_Line, #GADGET_Box, #GADGET_Circle, #GADGET_Fill
EventGadget = EventGadget()
For Gadget = #GADGET_Brush To #GADGET_Fill
If Gadget = EventGadget
SetGadgetState(Gadget, 1)
Else
SetGadgetState(Gadget, 0) ; unset the state of all other gadgets
EndIf
Next Gadget
CurrentMode = EventGadget
Case #GADGET_Clear
AddImage()
ClearCanvas()
UpdateScreen()
EndSelect
EndSelect
Case #PB_Event_SizeWindow,#PB_Event_MaximizeWindow
ResizeCanvas()
Case #PB_Event_CloseWindow
If GetActiveWindow() = #WinMain
quit = 1
Else
CloseWindow(GetActiveWindow())
SetActiveWindow(#WinMain)
UpdateScreen()
EndIf
EndSelect
Until quit = 1
;}
;{ procedures
; canvas
Procedure AddCanvas()
If EventWindow() = #WinMain
If WindowWidth(#WinMain)/2-doc\w/2 > 60
ww = WindowWidth(#WinMain)/2-doc\w/2
Else
ww = 60
EndIf
If WindowHeight(#WinMain)/2-doc\h/2 > 50
hh = WindowHeight(#WinMain)/2-doc\h/2
Else
hh = 50
EndIf
If ScrollAreaGadget(#GADGET_ScrollCanvas,60,50,WindowWidth(#WinMain)-120,WindowHeight(#WinMain)-100, doc\w*4,doc\h*4,#PB_ScrollArea_Center)
areaw = GetGadgetAttribute(#GADGET_ScrollCanvas,#PB_ScrollArea_InnerWidth)
areah = GetGadgetAttribute(#GADGET_ScrollCanvas,#PB_ScrollArea_InnerHeight)
CanvasGadget(#GADGET_Canvas,areaw/2-doc\w/2,areah/2-doc\h/2,doc\w,doc\h,#PB_Canvas_ClipMouse | #PB_Canvas_Keyboard)
SetGadgetAttribute(#GADGET_ScrollCanvas,#PB_ScrollArea_X,areaw/2-doc\w/2-30)
SetGadgetAttribute(#GADGET_ScrollCanvas,#PB_ScrollArea_Y,areah/2-doc\h/2-25)
CloseGadgetList()
EndIf
UpdateScreen()
EndIf
EndProcedure
Procedure ResizeCanvas(mode=0)
If GetActiveGadget() = #WinMain Or mode= 1
If WindowWidth(#WinMain)/2-doc\w/2 > 60
ww = WindowWidth(#WinMain)/2-doc\w/2
Else
ww = 60
EndIf
If WindowHeight(#WinMain)/2-doc\h/2 > 50
hh = WindowHeight(#WinMain)/2-doc\h/2
Else
hh = 50
EndIf
ResizeGadget(#GADGET_ScrollCanvas,60,50,WindowWidth(#WinMain)-120,WindowHeight(#WinMain)-100)
SetGadgetAttribute(#GADGET_ScrollCanvas,#PB_ScrollArea_InnerWidth,doc\w*4)
SetGadgetAttribute(#GADGET_ScrollCanvas,#PB_ScrollArea_InnerHeight,doc\h*4)
areaw = GetGadgetAttribute(#GADGET_ScrollCanvas,#PB_ScrollArea_InnerWidth)
areah = GetGadgetAttribute(#GADGET_ScrollCanvas,#PB_ScrollArea_InnerHeight)
ResizeGadget(#GADGET_Canvas,areaw/2-doc\w/2,areah/2-doc\h/2,doc\w,doc\h)
SetGadgetAttribute(#GADGET_ScrollCanvas,#PB_ScrollArea_X,areaw/2-doc\w/2-30)
SetGadgetAttribute(#GADGET_ScrollCanvas,#PB_ScrollArea_Y,areah/2-doc\h/2-25)
EndIf
EndProcedure
Procedure UpdateScreen()
; If NbImgImport>0 And sel>0
; SetWindowTitle(#WinMain,option\name$+" ... "+Str(sel))
; Else
; SetWindowTitle(#WinMain,option\name$)
; EndIf
tempimg=CreateImage(#PB_Any,doc\w,doc\h)
StartDrawing(ImageOutput(tempimg))
DrawingMode(#PB_2DDrawing_Default)
DrawImage(ImageID(#IMAGE_Grid),0,0)
DrawingMode(#PB_2DDrawing_AlphaBlend)
If sel>0
DrawAlphaImage(ImageID(im(sel)),imx(sel),imy(sel))
EndIf
DrawAlphaImage(ImageID(#IMAGE_LayerActif),0,0)
StopDrawing()
StartDrawing(CanvasOutput(#GADGET_Canvas))
DrawingMode(#PB_2DDrawing_Default)
DrawImage(ImageID(tempimg),0,0)
; grid
DrawingMode(#PB_2DDrawing_AllChannels)
If option\grid
For i = 0 To Round(doc\w/option\gridW,1)+1
For j = 0 To Round(doc\h/option\gridH,1)+1
Line(i * option\gridW ,0,1,doc\h,option\gridColor)
Line(0 ,j * option\gridH,doc\w,1,option\gridColor)
Next j
Next i
EndIf
StopDrawing()
FreeImage(tempimg)
EndProcedure
Procedure ClearLayer(img=#IMAGE_LayerActif)
If StartDrawing(ImageOutput(img))
;DrawingMode(#PB_2DDrawing_AlphaChannel)
Box(0,0,doc\w,doc\h,RGBA(0,0,0,0))
StopDrawing()
EndIf
EndProcedure
Procedure ClearCanvas()
If StartDrawing(CanvasOutput(#GADGET_Canvas))
DrawingMode(#PB_2DDrawing_Default)
DrawImage(ImageID(#IMAGE_Grid),0,0)
StopDrawing()
EndIf
EndProcedure
Procedure UpdateCanvas()
If StartDrawing(CanvasOutput(#GADGET_Canvas))
;DrawingMode(#PB_2DDrawing_AlphaChannel)
;Box(0,0,doc\w,doc\h,RGBA(0,0,0,0))
;DrawingMode(#PB_2DDrawing_AlphaBlend)
DrawAlphaImage(ImageID(#IMAGE_LayerActif),0,0)
StopDrawing()
EndIf
EndProcedure
; utils
Procedure CreateCheckker()
If StartDrawing(ImageOutput(#IMAGE_Grid))
c=255
For y=0 To 767 Step 16
For x=0 To 1023 Step 16
Box(x,y,16,16,RGBA(c,c,c,255))
If c=255
c=192
Else
c=255
EndIf
Next
If c=255
c=192
Else
c=255
EndIf
Next
StopDrawing()
EndIf
EndProcedure
; brush
Procedure SetBrush()
Select brush\tool
Case 0, 1
;CurrentColor = RGBA(Red(CurrentColor), Blue(CurrentColor),Green(CurrentColor), brush\alpha)
CurrentColor = RGBA(Red(CurrentColor), Green(CurrentColor),Blue(CurrentColor), brush\alpha)
Case 2
;CurrentColor = RGB(Red(CurrentColor), Blue(CurrentColor),Green(CurrentColor))
CurrentColor = RGB(Red(CurrentColor), Green(CurrentColor),Blue(CurrentColor))
EndSelect
EndProcedure
; image
Procedure ResizeDoc()
ResizeImage(#IMAGE_Content,doc\w,doc\h,#PB_Image_Smooth)
ResizeImage(#IMAGE_LayerActif,doc\w,doc\h,#PB_Image_Smooth)
EndProcedure
Procedure AddImage()
If IsImage(#IMAGE_Content)
FreeImage(#IMAGE_Content)
EndIf
If IsImage(#IMAGE_LayerActif)
FreeImage(#IMAGE_LayerActif)
EndIf
If CreateImage(#IMAGE_Content, doc\w,doc\h, 32|#PB_Image_Transparent)
EndIf
If CreateImage(#IMAGE_LayerActif,doc\w,doc\h,32|#PB_Image_Transparent)
EndIf
EndProcedure
; drawing & editing
Procedure DrawAction(x, y, EventType)
If StartDrawing(ImageOutput(#IMAGE_LayerActif))
If brush\tool = 2 ; eraser
DrawingMode(#PB_2DDrawing_AllChannels)
Else
If brush\keepAlpha = 0
DrawingMode(#PB_2DDrawing_AlphaBlend)
EndIf
EndIf
Select CurrentMode
Case #GADGET_Brush
If EventType = #PB_EventType_LeftButtonDown Or EventType = #PB_EventType_MouseMove
Select brush\type
Case 0 ; cercle
Circle(x, y, brush\Size, CurrentColor)
Case 1 ; carré
Box(x-brush\Size/2,y-brush\Size/2,brush\Size,brush\Size,CurrentColor)
Case 2 ; ellipse
Ellipse(X, Y, brush\Size, brush\Size/2, CurrentColor)
Case 3 ; custom
EndSelect
EndIf
Case #GADGET_Line
DrawImage(ImageID(#IMAGE_Content), 0, 0)
LineXY(StartX, StartY, x, y, CurrentColor)
Case #GADGET_Box
DrawImage(ImageID(#IMAGE_Content), 0, 0)
Box(StartX, StartY, x-StartX, y-StartY, CurrentColor)
Case #GADGET_Circle
DrawImage(ImageID(#IMAGE_Content), 0, 0)
If x > StartX
rx = x - StartX
Else
rx = StartX - x
EndIf
If y > StartY
ry = y - StartY
Else
ry = StartY - y
EndIf
If GetGadgetAttribute(#GADGET_Canvas, #PB_Canvas_Modifiers) & #PB_Canvas_Control
ry = rx
EndIf
Ellipse(StartX, StartY, rx, ry, CurrentColor)
Case #GADGET_Fill
If EventType = #PB_EventType_LeftButtonDown
FillArea(x, y, -1, CurrentColor)
EndIf
EndSelect
StopDrawing()
EndIf
UpdateScreen()
EndProcedure
; window
Procedure WindowPref()
If OpenWindow(#WinPref,0,0,400,300,"Preferences",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
If PanelGadget(#GADGET_PrefPanel,5,5,390,290)
;OpenGadgetList(#GADGET_PrefPanel)
AddGadgetItem(#GADGET_PrefPanel,0,"General")
AddGadgetItem(#GADGET_PrefPanel,1,"Grille")
SpinGadget(#GADGET_GridW,5,10,50,20,1,500,#PB_Spin_Numeric)
SpinGadget(#GADGET_GridH,60,10,50,20,1,500,#PB_Spin_Numeric)
ButtonGadget(#GADGET_GridColor,120,10,60,20,"Grid Color")
SetGadgetState(#GADGET_GridW,option\gridW)
SetGadgetState(#GADGET_GridH,option\gridH)
;CloseGadgetList()
CloseGadgetList()
EndIf
EndIf
EndProcedure
Procedure WindowDocResize()
If OpenWindow(#WinResize,0,0,400,300,"",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
Frame3DGadget(#GADGET_WResSiz,10,10,250,150,"Pixel Dimension")
StringGadget(#GADGET_WResW,80,50,50,20,"",#PB_String_Numeric)
StringGadget(#GADGET_WResH,80,80,50,20,"",#PB_String_Numeric)
SetGadgetText(#GADGET_WResW,Str(doc\w))
SetGadgetText(#GADGET_WResH,Str(doc\h))
CheckBoxGadget(#GADGET_WResLink,40,120,120,20,"Constraint proportion")
ButtonGadget(#GADGET_WResbtn,330,20,60,20,"Ok")
ButtonGadget(#GADGET_WResbtn2,330,45,60,20,"Cancel")
EndIf
EndProcedure
Procedure NewTileSet()
If OpenWindow(#winNewTileset,0,0,400,300,"New Image",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
Frame3DGadget(#GADGET_WNewTile,10,10,250,150,"Image Dimension")
StringGadget(#GADGET_WNewW,80,50,50,20,"",#PB_String_Numeric)
StringGadget(#GADGET_WNewH,80,80,50,20,"",#PB_String_Numeric)
SetGadgetText(#GADGET_WNewW,Str(doc\w_def))
SetGadgetText(#GADGET_WNewH,Str(doc\h_def))
ButtonGadget(#GADGET_WNewBtnOk,330,20,60,20,"Ok")
;ButtonGadget(#GADGET_WResbtn2,330,45,60,20,"Cancel")
EndIf
EndProcedure
; save, load
Procedure ConvertImg()
EndProcedure
Procedure OpenImg()
File$ = OpenFileRequester("Load Image...", "", "PNG Images|*.png|JPEG Images|*.jpeg|All Files|*.*", 0)
If File$
If LoadImage(#IMAGE_LoadSave, File$)
doc\w = ImageWidth(#IMAGE_LoadSave)
doc\h = ImageHeight(#IMAGE_LoadSave)
StatusBarText(#statubar,1,"Doc : "+Str(doc\w)+"/"+Str(doc\h))
ClearLayer()
AddImage()
ResizeCanvas(1)
If StartDrawing(ImageOutput(#IMAGE_LayerActif))
DrawingMode(#PB_2DDrawing_AllChannels)
DrawAlphaImage(ImageID(#IMAGE_LoadSave), 0, 0)
StopDrawing()
EndIf
UpdateScreen()
FreeImage(#IMAGE_LoadSave)
Else
MessageRequester("CanvasGadget", "Cannot load image: " + File$)
EndIf
EndIf
EndProcedure
Procedure ImportImg()
File$ = OpenFileRequester("Import Image...", "", "PNG Images|*.png|JPEG Images|*.jpeg|All Files|*.*", 0)
If File$
If LoadImage(#IMAGE_LoadSave, File$)
If StartDrawing(ImageOutput(#IMAGE_LayerActif))
DrawingMode(#PB_2DDrawing_AllChannels)
DrawAlphaImage(ImageID(#IMAGE_LoadSave), 0, 0)
StopDrawing()
EndIf
doc\w = ImageWidth(#IMAGE_LoadSave)
doc\h = ImageHeight(#IMAGE_LoadSave)
ResizeCanvas()
FreeImage(#IMAGE_LoadSave)
Else
MessageRequester("CanvasGadget", "Cannot load image: " + File$)
EndIf
EndIf
EndProcedure
Procedure SaveImg()
File$ = SaveFileRequester("Save Image...", File$, "PNG Images|*.png|JPEG Images|*.jpeg", 0)
If File$ And (FileSize(File$) = -1 Or MessageRequester("CanvasGadget", "Overwrite this file? " + File$, #PB_MessageRequester_YesNo) = #PB_MessageRequester_Yes)
If CreateImage(#IMAGE_LoadSave, doc\w, doc\h, 32|#PB_Image_Transparent) And StartDrawing(ImageOutput(#IMAGE_LoadSave))
;DrawImage(GetGadgetAttribute(#GADGET_Canvas, #PB_Canvas_Image), 0, 0)
DrawAlphaImage(ImageID(#IMAGE_LayerActif), 0, 0)
StopDrawing()
If SelectedFilePattern() = 0 ; png
If SaveImage(#IMAGE_LoadSave, RemoveString(File$,".png")+".png", #PB_ImagePlugin_PNG) = 0
MessageRequester("CanvasGadget", "Cannot save image: " + File$)
EndIf
ElseIf SelectedFilePattern() = 1 ; jpg
If SaveImage(#IMAGE_LoadSave, RemoveString(File$,".jpg")+".jpg", #PB_ImagePlugin_JPEG) = 0
MessageRequester("CanvasGadget", "Cannot save image: " + File$)
EndIf
ElseIf SelectedFilePattern() = 2 ; bmp
If SaveImage(#IMAGE_LoadSave, RemoveString(File$,".bmp")+".bmp", #PB_ImagePlugin_BMP) = 0
MessageRequester("CanvasGadget", "Cannot save image: " + File$)
EndIf
EndIf
EndIf
FreeImage(#IMAGE_LoadSave)
EndIf
EndProcedure
;}
REMERCIEMENT
- Demivec
- Marco Martin pour l'icone : http://www.iconfinder.com/icondetails/7 ... write_icon
- B Vignoli et Fred pour le code de Base, même si je ne m'en sers plus vraiment ^^.
Le code est fourni en GPL. Vous pouvez le modifier, le changer, l'utiliser, etc.. (en indiquant le nom des auteurs, etc ).
N'hésitez pas à l'améliorer si vous le souhaitez .