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

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
Guillot
Messages : 522
Inscription : jeu. 25/juin/2015 16:18

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

Message 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()
Avatar de l’utilisateur
Huitbit
Messages : 939
Inscription : jeu. 08/déc./2005 5:19
Localisation : Guadeloupe

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

Message 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 !
Elevé au MSX !
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

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

Message 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.
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
Huitbit
Messages : 939
Inscription : jeu. 08/déc./2005 5:19
Localisation : Guadeloupe

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

Message par Huitbit »

Merci pour l'info :wink: !
Elevé au MSX !
Fred
Site Admin
Messages : 2648
Inscription : mer. 21/janv./2004 11:03

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

Message 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
Avatar de l’utilisateur
JohnJohnsonSHERMAN
Messages : 648
Inscription : dim. 13/déc./2015 11:05
Localisation : Allez, cherche...
Contact :

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

Message par JohnJohnsonSHERMAN »

Absolument génial ! Merci du partage :)
"Le bug se situe entre la chaise et le clavier"
Votre expert national en bogage et segfaults.

CPU : AMD A8 Quad core - RAM 8Gb - HDD 2To
  • Windows 10 x64 - PB 5.61 x64
  • Linux Ubuntu 16.04 LTS x64 (dual boot) - PB pas encore réinstallé
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

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

Message par djes »

Wow ! Ca c'est de la démo ! :)
Avatar de l’utilisateur
Guillot
Messages : 522
Inscription : jeu. 25/juin/2015 16:18

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

Message 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)
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

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

Message par blendman »

Siouper goude :)
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

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

Message par Kwai chang caine »

Reste t'il des mots pour qualifier la beauté ton travail ??? 8O 8O
Milles merci du partage 8)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Répondre