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()