Page 1 sur 1

Fonction - Brush (compatible PB/SB(2.00))

Publié : ven. 25/nov./2016 12:07
par Guillot
salut les artistes,

une mis à jour de mon dernier code (Fonction - ImageFont)
(pour afficher du texte dont la fonte est 'mixée' avec une image)

j'ai ajouté la fonction pour la vectordrawing
mais comme elle fonctionne aussi pour les 'path', j'ai rebatisée l'ensemble 'xxxbrush'

pour vectordrawing:
- DrawVectorTextBrush(text.s,image,centerX.w=-1,centerY.w=-1)
- StrokePathBrush(image,centerX.w=-1,centerY.w=-1)
- FillPathBrush(image,centerX.w=-1,centerY.w=-1)

pour 2ddrawing:
- initIF(image,centerX.w=-1,centerY.w=-1)
- DrawTextBrush(x,y,text.s)
(un peu plus d'info dans mon dernier poste : http://www.purebasic.fr/french/viewtopi ... =6&t=16379)

j'espere que ça pourra vous etre utile

Code : Tout sélectionner

CompilerIf #PB_Compiler_OS<>5
    Macro doevents:Repeat:Until WaitWindowEvent() = #PB_Event_CloseWindow:EndMacro
CompilerElse
    Macro doevents:i=i:EndMacro
CompilerEndIf

Macro VStroke(w,c,flag=#PB_Path_Default)
    VectorSourceColor(c)
    StrokePath(w,flag)
EndMacro

Macro VFill(c,flag=#PB_Path_Default)
    VectorSourceColor(c)
    FillPath(flag)
EndMacro

Macro vcolor(c)
    VectorSourceColor(c)
EndMacro
    
;####################################################################################
Procedure SortIdx(Array t.l(1),Array idx.l(1),deb=0, fin=-1) ;<= met dans le tableau idx() la position des element trié du tableau t()  
    Protected min,i,j,v,idmin
    If fin=-1: fin=ArraySize(t()):EndIf
    Dim idx(fin)
    For i=deb To fin:idx(i)=i:Next
    For i=deb To fin
        min=$7fffffff
        For j=i To fin
            v=t(idx(j))
            If v<min:min=v:idmin=j:EndIf
        Next
        Swap idx(i),idx(idmin)
    Next 
EndProcedure

Procedure initIF(image,centerX.w=-1,centerY.w=-1)
    ;image : numero de l'image
    ;centerx/y : definit le centre de l'image
    Structure IFsij
        i.b
        j.b
    EndStructure
    
    Protected i,j,n,di,dj
    Protected idx=ImageWidth (image)
    Protected idy=ImageHeight(image)
    Protected Dim IFdis.l(idx * idy-1)
    Global IFcenterx:If centerX=-1:IFcenterx=idx/2:Else:IFcenterx=centerx:EndIf
    Global IFcenterY:If centery=-1:IFcentery=idy/2:Else:IFcentery=centery:EndIf
    Global Dim IFidx.l(idx * idy-1)
    Global Dim IFbmp.l(idx-1,idy-1)
    Global Dim IFpos.IFsij(idx * idy-1)
    
    StartDrawing(ImageOutput(image))
    DrawingMode(#PB_2DDrawing_AllChannels)  
    For j=0 To idy-1
        For i=0 To idx-1
            IFbmp(i,j)=Point(i,j)
            IFpos(n)\i=i:di=i-IFcenterx
            IFpos(n)\j=j:dj=j-IFcentery
            ;IFdis(n)=di*di+dj*dj
            IFdis(n)=Abs(di)+Abs(dj)
            n+1
        Next
    Next
    StopDrawing()    
    sortidx(IFdis(),IFidx())
EndProcedure

Procedure DrawTextBrush(x,y,text.s) ; ================================================== 2Ddrawing
    Protected n,nn=ArraySize(IFidx())
    DrawingMode(#PB_2DDrawing_Transparent |#PB_2DDrawing_AlphaBlend)
    For n=0 To nn
        With IFpos(IFidx(nn-n))
            If Alpha(IFbmp(\i,\j)):DrawText(x+\i-ifcenterX+1,y+\j-ifcentery+1,text,IFbmp(\i,\j)):EndIf
        EndWith
    Next   
EndProcedure

Procedure DrawVectorTextBrush(text.s,image,centerX.w=-1,centerY.w=-1) ; ====================== Vectordrawing
    initIF(image,centerX,centerY)
    Protected n,nn=ArraySize(IFidx())
    Protected.f x=PathCursorX()
    Protected.f y=PathCursorY()
    For n=0 To nn
        With IFpos(IFidx(nn-n))
            If Alpha(IFbmp(\i,\j)):MovePathCursor(x+\i-ifcenterX+1,y+\j-ifcentery+1):Vcolor(IFbmp(\i,\j)):DrawVectorText(text):EndIf
        EndWith
    Next   
EndProcedure

Procedure StrokePathBrush(image,centerX.w=-1,centerY.w=-1)
    initIF(image,centerX,centerY)
    Protected s.s=PathSegments(),   n,nn=ArraySize(IFidx())
    ResetPath()
    For n=0 To nn
        With IFpos(IFidx(nn-n))
            If Alpha(IFbmp(\i,\j)):MovePathCursor(\i-ifcenterX+1,\j-ifcentery+1):AddPathSegments(s,#PB_Path_Relative):VStroke(1,IFbmp(\i,\j)):EndIf
        EndWith
    Next   
EndProcedure

Procedure FillPathBrush(image,centerX.w=-1,centerY.w=-1)
    initIF(image,centerX,centerY)
    Protected s.s=PathSegments(),   n,nn=ArraySize(IFidx())
    ResetPath()
    For n=0 To nn
        With IFpos(IFidx(nn-n))
            If Alpha(IFbmp(\i,\j)):MovePathCursor(\i-ifcenterX+1,\j-ifcentery+1):AddPathSegments(s,#PB_Path_Relative):Vfill(IFbmp(\i,\j)):EndIf
        EndWith
    Next   
EndProcedure
;####################################################################################

Procedure exemple()
    EnableExplicit
    Protected i,j,n, a.f,y, idx=800,idy=600
    For n=0 To 7
        CreateImage(10+n,16,16,32,#PB_Image_Transparent)
        StartVectorDrawing(ImageVectorOutput(10+n))
        Select n
            Case 0
                VectorSourceCircularGradient(8-3,8-3,10)
                VectorSourceGradientColor($ffffffff, 0.0)
                VectorSourceGradientColor($ffffaaaa, 0.4)
                VectorSourceGradientColor($ff886666, 1.0)     
                VectorSourceGradientColor($00886666, 1.0) 
                AddPathCircle(8,8,7):FillPath()
            Case 1
                AddPathBox(11,11,4,4):VFill($08000000)
                AddPathBox(8,8,2,2):vfill($ff0000ff)
            Case 2
                AddPathCircle(12,12,3):Vfill($11000000)
                AddPathCircle(8,8,3)
                vfill($ff008800,#PB_Path_Preserve)
                VStroke(2,$ffffffff)
            Case 3
                AddPathBox(6,6,4,4)
                VFill($ffaaaaff,#PB_Path_Preserve)
                VStroke(1,$ffffffff)
                AddPathBox(6,10,4,4):VFill($ff8888ff)
            Case 4
                VectorSourceCircularGradient(8,8,7)
                VectorSourceGradientColor($ff008800, 0.0)
                VectorSourceGradientColor($ff00ffff, 0.8)     
                VectorSourceGradientColor($0000ffff, 1.0)     
                FillVectorOutput()
            Case 5
                AddPathCircle(8,8,7):VFill($ffffffff)
                AddPathCircle(8,8,1):VStroke(1,$ff0000ff)
                AddPathCircle(8,8,4):VStroke(1,$ff0000ff)
            Case 6
                RandomSeed(1)
                For i=0 To 15
                    AddPathBox(Random(8)+4,Random(8)+4,1,1)
                    Vfill(RGBA(0,Random(255),0,$44))
                Next
            Case 7
                AddPathBox(11,11,4,4):Vfill($10000000)
                AddPathBox(7,7,4,4):VFill($ffff4444)
                AddPathBox(5,5,4,4):VFill($ffffbbbb)
                AddPathBox(6,6,4,4):VFill($ffff8888)
        EndSelect    
        StopVectorDrawing()
    Next
    
    LoadFont(0, "Courier New", 45)
    CreateImage(0,idx,idy,32,$888888)
    
If 1=1  ; --------------------------------------------------> VectorDrawing
    StartVectorDrawing(ImageVectorOutput(0))
    For j=0 To idx Step 16
        For i=16 To idx Step 16
            AddPathBox(i,j,16,16):vFill($ff<<24|($a0+Bool((i+j) & 16)*8) * $010101)
        Next
    Next    
    For i=0 To 7
        VectorFont(FontID(0))
        y=i*72+10
        MovePathCursor(0,30+y):DrawVectorImage(ImageID(10+i))
        MovePathCursor(20,y):DrawVectorTextBrush("BONJOUR",10+i)
        AddPathBox(300,y+0,60,60):StrokePathBrush(10+i)
        AddPathBox(380,y+0,60,60):FillPathBrush(10+i)
        AddPathCircle(460+30,y+30,28):StrokePathBrush(10+i)
        AddPathCircle(540+30,y+30,28):FillPathBrush(10+i)
        MovePathCursor(740+40,y+30):For j=0 To 255:a=(j/64)*#PI:AddPathLine(740+Cos(a)*80-40,y+30+Sin(a*4)*24):Next:StrokePathBrush(10+i)
    Next
    StopVectorDrawing()
Else    ; --------------------------------------------------> 2DDrawing
    StartDrawing(ImageOutput(0))
    For j=0 To idx Step 16
        For i=16 To idx Step 16
            Box(i,j,16,16,($a0+Bool((i+j) & 16)*8) * $010101)
        Next
    Next    
    StopDrawing()    
    For i=0 To 7
        initif(10+i)        
        StartDrawing(ImageOutput(0))
        DrawAlphaImage(ImageID(10+i),0,30+i*72)
        DrawingFont(FontID(0))   
        DrawTextBrush(20,i*72,"BONJOUR tout le monde")
        StopDrawing()
    Next
        EndIf
    OpenWindow(0, 0, 0, idx, idy, "VectorDrawing-Brush", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    ImageGadget(0, 0, 0, idx, idy,ImageID(0))
    doevents 
EndProcedure

exemple()

Re: Fonction - Brush (compatible PB/SB(2.00))

Publié : sam. 26/nov./2016 22:22
par Huitbit
Hello,
Guillot a écrit :salut les artistes,
Sur le coup, l'artiste, ici, c'est toi !

Le code ne compile pas alors que le précédent (qui était très impressionnant :P ) compilait sans problème.

PathSegments() et AddPathSegments() sont de nouvelles fonctions de la bibliothèque VectorDrawing (je suis encore avec PureBasic 5.43 LTS (Windows - x64))?

C'est peut-être pour ça qu'il n'y a pas de réponses au post :roll: ?


Hasta la vista !

Re: Fonction - Brush (compatible PB/SB(2.00))

Publié : sam. 26/nov./2016 23:00
par falsam
Hey mais c'est bon ça.
Huitbit a écrit :Le code ne compile pas alors que le précédent (qui était très impressionnant ) compilait sans problème.
Fonctionne avec PB 5.50 mais pas avec PB 5.43 LTS. La fonctionnalité PathSegments() n'existe pas avec la version 5.43 LTS.

Re: Fonction - Brush (compatible PB/SB(2.00))

Publié : dim. 27/nov./2016 2:49
par Huitbit
Merci pour l'info :wink: !

Re: Fonction - Brush (compatible PB/SB(2.00))

Publié : dim. 27/nov./2016 13:31
par Fred
Je n'arrive pas à le faire marcher sur SB, peut etre un bug sur la lib vector ? Ton autre version (Font) marche nickel

Re: Fonction - Brush (compatible PB/SB(2.00))

Publié : dim. 27/nov./2016 13:52
par JohnJohnsonSHERMAN
Absolument génial ! Merci du partage :)

Re: Fonction - Brush (compatible PB/SB(2.00))

Publié : dim. 27/nov./2016 17:39
par djes
Wow ! Ca c'est de la démo ! :)

Re: Fonction - Brush (compatible PB/SB(2.00))

Publié : dim. 27/nov./2016 18:07
par Guillot
à huitbit:

ouai, ça fonctionne a partir de la 5.50
DrawVectorTextBrush devrait toutefois fonctionner en 5.43

à fred:

ouai, j'ai parlé un peu vite pour la compatibilité SB
la fonction AddPathSegments foire avec l'option #PB_Path_Relative
donc pas de StrokePathBrush et de FillPathBrush en SB
de plus, le probleme de lenteur de vectordrawing en SB rend cet exemple inutilisable
(rien que le damier met des plombes à s'afficher)
cependant j'ai remarqué que DrawVectorTextBrush (donc DrawVectorText) ne pose pas de probleme de lenteur
(commenter les lignes 175 (damier), 183,184,185,186 et 187)

mais je suis sur que tout fonctionnera avec la version final 2.00 ;o)

Re: Fonction - Brush (compatible PB/SB(2.00))

Publié : mar. 12/sept./2017 10:23
par blendman
Siouper goude :)

Re: Fonction - Brush (compatible PB/SB(2.00))

Publié : mar. 12/sept./2017 10:27
par Kwai chang caine
Reste t'il des mots pour qualifier la beauté ton travail ??? 8O 8O
Milles merci du partage 8)