J'ai essayé d'utiliser le FillArea avec une image, mais je n'ai pas réussi.
Quelque chose doit m'échapper (ou y aurait-il une sorte de bug) ?
Testé sous windows8, quand j'utilise le fillarea, ça me remplit toute l'image, qu'il y ait ou des traits dans l'image d'une autre couleur.
ça marche avec une image sans couche alpha transparente créée avec CreateImage(#IMAGE_Draw, 380, 380, 32), mais j'ai besoin d'une couche alpha pour gérer la transparence.
Code tiré de l'exemple du canvasgadget, modifié pour s'utiliser avec une image et un canvas gadget (pour l'affichage)
Code : Tout sélectionner
Enumeration
#IMAGE_Color
#IMAGE_Draw
EndEnumeration
Enumeration
#GADGET_Canvas
#GADGET_Color
#GADGET_Brush
#GADGET_Fill
#GADGET_Clear
EndEnumeration
Global CurrentColor, CurrentMode
Procedure DrawAction(x, y, EventType)
If StartDrawing(ImageOutput(#IMAGE_Draw))
DrawingMode(#PB_2DDrawing_AlphaBlend)
Select CurrentMode
Case #GADGET_Brush
If EventType = #PB_EventType_LeftButtonDown Or EventType = #PB_EventType_MouseMove
Circle(x, y, 5, CurrentColor)
EndIf
Case #GADGET_Fill
If EventType = #PB_EventType_LeftButtonDown
; DrawingMode(#PB_2DDrawing_Default) ; si je dé-commente, ça ressemble à #PB_2DDrawing_Alphaclip
FillArea(x, y, -1, CurrentColor) ; si je change l'alpha de currentcolor, ça ne fait que changer l'alpha global
EndIf
EndSelect
StopDrawing()
EndIf
If StartDrawing(CanvasOutput(#GADGET_Canvas))
DrawingMode(#PB_2DDrawing_AlphaBlend)
DrawAlphaImage(ImageID(#IMAGE_Draw),0,0)
StopDrawing()
EndIf
EndProcedure
CurrentColor = $000000
CurrentColor = RGBA(Red(CurrentColor),Green(CurrentColor),Blue(CurrentColor), 255)
CurrentMode = #GADGET_Brush
If CreateImage(#IMAGE_Color, 35, 35, 24) = 0 : End : EndIf
If CreateImage(#IMAGE_Draw, 380, 380, 32, #PB_Image_Transparent) = 0 : End : EndIf
If OpenWindow(0, 0, 0, 460, 400, "CanvasGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
CanvasGadget(#GADGET_Canvas, 10, 10, 380, 380)
ButtonImageGadget(#GADGET_Color, 400, 10, 50, 50, ImageID(#IMAGE_Color))
ButtonGadget(#GADGET_Brush, 400, 100, 50, 25, "Brush", #PB_Button_Toggle)
ButtonGadget(#GADGET_Fill, 400, 130, 50, 25, "Fill", #PB_Button_Toggle)
ButtonGadget(#GADGET_Clear, 400, 180, 50, 25, "Clear")
SetGadgetState(#GADGET_Brush, 1)
SetGadgetAttribute(#GADGET_Canvas, #PB_Canvas_Cursor, #PB_Cursor_Cross)
Repeat
Event = WaitWindowEvent()
If Event = #PB_Event_Gadget
Select EventGadget()
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
DrawAction(X, Y, EventType())
Case #PB_EventType_LeftButtonUp
DrawAction(X, Y, EventType())
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)
CurrentColor = RGBA(Red(CurrentColor),Green(CurrentColor),Blue(CurrentColor), 255)
If StartDrawing(ImageOutput(#IMAGE_Color))
Box(0, 0, 35, 35, CurrentColor)
StopDrawing()
SetGadgetAttribute(#GADGET_Color, #PB_Button_Image, ImageID(#IMAGE_Color))
EndIf
Case #GADGET_Brush, #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
If StartDrawing(CanvasOutput(#GADGET_Canvas))
Box(0, 0, 380,380, RGB(255,255,255))
StopDrawing()
EndIf
If StartDrawing(ImageOutput(#IMAGE_Draw))
DrawingMode(#PB_2DDrawing_AlphaBlend)
Box(0, 0, 380,380, RGBA(0,0,0,255))
DrawingMode(#PB_2DDrawing_AlphaChannel)
Box(0, 0, 380,380, RGBA(0,0,0,0))
StopDrawing()
EndIf
EndSelect
EndIf
Until Event = #PB_Event_CloseWindow
EndIf
