Page 1 sur 1

Canvas Boost - Procedures utiles

Publié : mar. 20/nov./2012 18:12
par Ar-S
Image

Je compte me faire une lib pour me faciliter la vie lors de l'utilisation de Canvas.

Voilà les deux 1ères procédures et un exemple d'utilisation.
- PaintBackGround_Canvas(Gadget, Color, BorderColor = $0, BorderSize = 2)
- CanvasText(Gadget, canvas_text.s, Fcolor, BGcolor, FONT_NAME.s, FONT_SIZE = 12)

S'en serve qui voudra ;)

Code : Tout sélectionner

; LIB Canvas_Boost par Ar-S / 2012 - PB 5.00 / Nov 2012

; ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
; // Repeindre le canvas avec ou sans bordure. Pour ne pas mettre la bordure, indiquez juste la même couleur pour Color et BorderColor
; // Paint Canvas With or Without a border. To not see border color, just put the same color to Color and BorderColor value
; ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Procedure.i PaintBackGround_Canvas(Gadget, Color, BorderColor = $0, BorderSize = 2)
  StartDrawing(CanvasOutput(Gadget))
    Box(0, 0, GadgetWidth(Gadget), GadgetHeight(Gadget), BorderColor) 
    Box(BorderSize, BorderSize, GadgetWidth(Gadget)-(BorderSize*2), GadgetHeight(Gadget)-(BorderSize*2), Color) 
  StopDrawing()
EndProcedure


; ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
; Resultat = CanvasText(Gadget, canvas_text.s, Fcolor, BGcolor, FONT_NAME.s, FONT_SIZE = 12)
; Retourne 1 si réussi, 0 si echec
; ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Procedure CanvasText(Gadget, canvas_text.s, Fcolor, BGcolor, FONT_NAME.s, FONT_SIZE = 12)
  Protected  LF, LC, HC, LTxt, Htxt, DiffL, DiffH, XTexte, YTexte
  If LF = 0
    FontB = LoadFont(#PB_Any, FONT_NAME, FONT_SIZE , #PB_Font_HighQuality)
    LF = 1
  EndIf 
  
  If StartDrawing(CanvasOutput(Gadget)) <> 0
      DrawingFont(FontID(FontB))
      LC = GadgetWidth(Gadget)
      HC = GadgetHeight(Gadget)
      
      LTxt = TextWidth(canvas_text.s)
      HTxt = TextHeight(canvas_text.s)
      
      DiffL = LC - LTxt
      DiffH = HC - HTxt
      
      XTexte = DiffL / 2
      YTexte = DiffH / 2
      
      ; Ecriture du texte et ombre portée
      ; Text and DropShadow
      
      DrawingMode(#PB_2DDrawing_Transparent)
      DrawText(XTexte-1, YTexte+1, canvas_text, BGcolor) 
      
      
      DrawText(XTexte, YTexte, canvas_text, Fcolor ) 
      
    StopDrawing()
    
    retour = 1
  Else
    retour = 0
  EndIf
  
  ProcedureReturn  retour
EndProcedure






;; ////////////////////////////////////////////////////// EXEMPLE  //////////////////////////////////////////////////////

hwnd = OpenWindow(0, #PB_Ignore, #PB_Ignore, 400, 400, "Canvas", #PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_TitleBar)
If hwnd <> 0
  CanvasGadget (1, 1, 1, 150,150)
  CanvasGadget (2, 151, 1, 200,200)
  CanvasGadget (3, 1, 201, 350,100)
  
  
  ; ; ////////////// TEST DU RESULTAT ICI / TEST & RESULT HERE ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  ; Peindre le canvas en noir avec une bordure rouge ($FF) de 10 pixels. / Paint Canvas with a 10 px Red ($FF) border
  PaintBackGround_Canvas(1, $0 ,$FF, 10) 


  PaintBackGround_Canvas(2, $0 ,#Green, 2)
  PaintBackGround_Canvas(3, #Red , $0, 4)
    
    ; Centre le texte en police Microsoft Sans Serif de taille 24 ; Draw a Center Text with shadow in  "Microsoft Sans Serif" size 24
  CanvasText(1, "Hello World !", $FFFFFF, $FF,  "Microsoft Sans Serif", 16) 
  
  
  CanvasText(2, "Hello World !", $00CCFF, $0,  "Microsoft Sans Serif", 20) 
  CanvasText(3, "PURE BASIC !", $0, $0,  "Microsoft Sans Serif", 25)
  ; /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////   
  
  Repeat
    If WaitWindowEvent() = #PB_Event_CloseWindow And EventWindow() = 0
      CloseWindow(0)
      End
    EndIf   
    
  ForEver
  
EndIf

; \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ FIN EXEMPLE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

Re: Canvas Boost - Procedures utiles

Publié : mar. 20/nov./2012 18:32
par Fred
Il vaut mieux appeler une fois CanvasOutput() faire toutes les operations d'un coup, car l'appel est couteux.

Re: Canvas Boost - Procedures utiles

Publié : mar. 20/nov./2012 19:04
par Ar-S
Il faudrait donc fusionner les 2 procédures ?
Sinon je ne vois pas comment simplifier le nombre d'appels de CanvasOutput()

Re: Canvas Boost - Procedures utiles

Publié : mar. 20/nov./2012 22:09
par graph100
bah non, tu ne mets que le dessin dans tes procédures, que tu peux garder séparée (mais l'appel d'une procedure prend bcp de temps), et tu appelles tes procédures au milieu du startdrawing(canvasoutput()) / stopdrawing.

Comme des proc de dessin standart de PB
évidement, pour les loadfonts etc... faut que tu le fasse avant, pour le préparer. Et puis si tu utilises tes procédures plusieurs fois, charger la même font à chaque fois n'est pas nécessaire.

utilise une map pour charger les fonts dont tu as besoin dès le début. Dans ce que j'avais fait sur les CG_CustomGadget, le chargement des fonts pour l’éditeur de texte (et tout les autres gadgets à texte) fonctionne comme ça.

Re: Canvas Boost - Procedures utiles

Publié : mar. 20/nov./2012 23:23
par Ar-S
graph100 a écrit :bah non, tu ne mets que le dessin dans tes procédures, que tu peux garder séparée (mais l'appel d'une procedure prend bcp de temps), et tu appelles tes procédures au milieu du startdrawing(canvasoutput()) / stopdrawing.

Comme des proc de dessin standart de PB
évidement, pour les loadfonts etc... faut que tu le fasse avant, pour le préparer. Et puis si tu utilises tes procédures plusieurs fois, charger la même font à chaque fois n'est pas nécessaire.

utilise une map pour charger les fonts dont tu as besoin dès le début. Dans ce que j'avais fait sur les CG_CustomGadget, le chargement des fonts pour l’éditeur de texte (et tout les autres gadgets à texte) fonctionne comme ça.
Pour ce qui est du chargement des fonts, l'avantage ici est de changer la taille/police au choix plutôt que de toutes les charger.
Mais j'ai surtout fait ça pour que la procédure soit indépendante pour l'exemple. Il va de soit que dans la majorité des codes on charge les fonts nécessaires une fois pour toute en début de code.
tu appelles tes procédures au milieu du startdrawing(canvasoutput()) / stopdrawing.
Je modifierai ça demain.

Re: Canvas Boost - Procedures utiles

Publié : mer. 21/nov./2012 1:30
par graph100
oui mais on ne peux pas appeler loadfont au milieu d'un startdrawing / stopdrawing :roll:
c'est pour ça que j'ai suggéré de le faire au début.
Après l’intérêt d'utiliser une map, c'est que tu peux quand même appeler la police que tu veux.

et, mettons qu'elle ne soit pas dans la map, tu fait un stopdrawing, tu ajoutes la police dans la map, puis tu dessines :D

Re: Canvas Boost - Procedures utiles

Publié : jeu. 22/nov./2012 17:28
par Golfy
Ca me rappelle l'époque de Dunjeon Master sur Atari ST :)

J'avais entrepris l'idée de créer ma propre interface graphique avec un affichage comme les fenêtre de DM.
J'avais fait des équivalent MessageRequest avec les boutons, etc. (à la place des hideuses fenêtres GEM)

Fenêtre GEM :
Image

Fenêtre DM :
Image

Bon courage Ar-S :|

Re: Canvas Boost - Procedures utiles

Publié : jeu. 22/nov./2012 19:02
par Ar-S
Pas de soucis, j'aime les canvas et je vais me faire une lib, mais j'ai eu un manque de temps soudain.
Mais "je reviendrai" comme dirait schwarzy :P

Re: Canvas Boost - Procedures utiles

Publié : ven. 23/nov./2012 11:47
par Fred
Pareil, j'avais refait pas mal de controles sur Amiga pour avoir un look plus sympa:

Image

ha la jeunesse :D