Differenze tra le versioni di "Inviare il testo, colorato e ruotato, in un Terminale con l'API di libcaca"

Da Gambas-it.org - Wikipedia.
(Creata pagina con 'La libreria '''''libcaca''''' è una libreria grafica che crea testo anziché pixel, e che, pertanto, è utilizzabile su terminali di testo. Per poter utilizzare le funziona...')
 
 
(10 versioni intermedie di uno stesso utente non sono mostrate)
Riga 2: Riga 2:
  
  
Per poter utilizzare le funzionalità di ''libcaca'', è necessario richiamare la libreria condivisa attualmente: "''libcaca.so.0.99.18'''''".
+
Per poter utilizzare le funzionalità di ''libcaca'', è necessario richiamare la libreria condivisa attualmente: "''libcaca.so.0.99.19''".
  
  
 
Mostriamo di seguito un breve codice esemplificativo, con il quale si scriverà in un Terminale una stringa di caratteri ASCII variamente colorati, raffigurante la testa di un maialino, nonché per tre volte ancora la medesima stringa, ma ruotata sempre in modo diverso.
 
Mostriamo di seguito un breve codice esemplificativo, con il quale si scriverà in un Terminale una stringa di caratteri ASCII variamente colorati, raffigurante la testa di un maialino, nonché per tre volte ancora la medesima stringa, ma ruotata sempre in modo diverso.
'''Private''' Const CACA_LIGHTBLUE As Byte = 9    <FONT color=gray>' ''l'indice di colore per il blu''</font>
+
<BR>Del seguente codice andrà creato l'eseguibile .gambas, che verrà avviato in Terminale.
  '''Private''' Const CACA_DEFAULT As Byte = 16      <FONT color=gray>' ''Il colore prestabilito del driver di uscita''</font>
+
  Private testo As String = " |_| \n" &
'''Private''' testo As String = " |_| \n" &
 
 
  " _,----._ | | \n" &
 
  " _,----._ | | \n" &
 
  " (/ @ @ \\) __ \n" &
 
  " (/ @ @ \\) __ \n" &
Riga 19: Riga 18:
 
   
 
   
 
   
 
   
  Library "libcaca:0.99.18"
+
  Library "libcaca:0.99.19"
 +
 +
Private Const CACA_LIGHTBLUE As Byte = 9    <FONT color=gray>' ''L'indice di colore per il blu''</font>
 +
Private Const CACA_DEFAULT As Byte = 16      <FONT color=gray>' ''Il colore prestabilito del driver di uscita''</font>
 
   
 
   
 
  <FONT color=gray>' ''caca_canvas_t * caca_create_canvas(int, int)''
 
  <FONT color=gray>' ''caca_canvas_t * caca_create_canvas(int, int)''
 
  ' ''Initialise a libcaca canvas.''</font>
 
  ' ''Initialise a libcaca canvas.''</font>
  '''Private''' Extern caca_create_canvas(ca As Integer, cb As Integer) As Pointer
+
  Private Extern caca_create_canvas(ca As Integer, cb As Integer) As Pointer
 
   
 
   
  <FONT color=gray>' ''ssize_t caca_import_canvas_from_memory (caca_canvas_t *, void const *, size_t, char const *)''
+
  <FONT color=gray>' ''ssize_t caca_import_canvas_from_memory (caca_canvas_t *, void const *, size_t, char const *)''
 
  ' ''Import a memory buffer into a canvas.''</font>
 
  ' ''Import a memory buffer into a canvas.''</font>
  '''Private''' Extern caca_import_canvas_from_memory(caca_canvas_t As Pointer, testo1 As String, size_t As Integer, testo2 As String) As Integer
+
  Private Extern caca_import_canvas_from_memory(caca_canvas_t As Pointer, testo1 As String, size_t As Integer, testo2 As String) As Integer
 
   
 
   
 
  <FONT color=gray>' ''int caca_get_canvas_width(caca_canvas_t const *)''
 
  <FONT color=gray>' ''int caca_get_canvas_width(caca_canvas_t const *)''
 
  ' ''Get the canvas width.''</font>
 
  ' ''Get the canvas width.''</font>
  '''Private''' Extern caca_get_canvas_width(caca_canvas_t As Pointer) As Integer
+
  Private Extern caca_get_canvas_width(caca_canvas_t As Pointer) As Integer
 
   
 
   
 
  <FONT color=gray>' ''int caca_get_canvas_height(caca_canvas_t const *)''
 
  <FONT color=gray>' ''int caca_get_canvas_height(caca_canvas_t const *)''
 
  ' ''Get the canvas height.''</font>
 
  ' ''Get the canvas height.''</font>
  '''Private''' Extern caca_get_canvas_height(caca_canvas_t As Pointer) As Integer
+
  Private Extern caca_get_canvas_height(caca_canvas_t As Pointer) As Integer
 
   
 
   
 
  <FONT color=gray>' ''int caca_blit(caca_canvas_t *, int, int, caca_canvas_t const *, caca_canvas_t const *)''
 
  <FONT color=gray>' ''int caca_blit(caca_canvas_t *, int, int, caca_canvas_t const *, caca_canvas_t const *)''
 
  ' ''Blit a canvas onto another one.''</font>
 
  ' ''Blit a canvas onto another one.''</font>
  '''Private''' Extern caca_blit(caca_canvas_t As Pointer, ca As Integer, cb As Integer, caca_canvas_t As Pointer, caca_canvas_t As Pointer) As Integer
+
  Private Extern caca_blit(caca_canvas_t As Pointer, ca As Integer, cb As Integer, caca_canvas_t As Pointer, caca_canvas_t As Pointer) As Integer
 
   
 
   
 
  <FONT color=gray>' ''int caca_flip(caca_canvas_t *)''
 
  <FONT color=gray>' ''int caca_flip(caca_canvas_t *)''
 
  ' ''Flip a canvas horizontally.''</font>
 
  ' ''Flip a canvas horizontally.''</font>
  '''Private''' Extern caca_flip(caca_canvas_t As Pointer) As Integer
+
  Private Extern caca_flip(caca_canvas_t As Pointer) As Integer
 
   
 
   
 
  <FONT color=gray>' ''int caca_flop(caca_canvas_t *)''
 
  <FONT color=gray>' ''int caca_flop(caca_canvas_t *)''
 
  ' ''Flip a canvas vertically.''</font>
 
  ' ''Flip a canvas vertically.''</font>
  '''Private''' Extern caca_flop(caca_canvas_t As Pointer) As Integer
+
  Private Extern caca_flop(caca_canvas_t As Pointer) As Integer
 
   
 
   
 
  <FONT color=gray>' ''int caca_rotate_180(caca_canvas_t *)''
 
  <FONT color=gray>' ''int caca_rotate_180(caca_canvas_t *)''
 
  ' ''Rotate a canvas.''</font>
 
  ' ''Rotate a canvas.''</font>
  '''Private''' Extern caca_rotate_180(caca_canvas_t As Pointer) As Integer
+
  Private Extern caca_rotate_180(caca_canvas_t As Pointer) As Integer
 
   
 
   
 
  <FONT color=gray>' ''int caca_set_color_ansi(caca_canvas_t *, uint8_t, uint8_t)''
 
  <FONT color=gray>' ''int caca_set_color_ansi(caca_canvas_t *, uint8_t, uint8_t)''
 
  ' ''Set the default colour pair for text (ANSI version).''</font>
 
  ' ''Set the default colour pair for text (ANSI version).''</font>
  '''Private''' Extern caca_set_color_ansi(caca_canvas_t As Pointer, cby1 As Byte, cby2 As Byte) As Integer
+
  Private Extern caca_set_color_ansi(caca_canvas_t As Pointer, cby1 As Byte, cby2 As Byte) As Integer
 
   
 
   
 
  <FONT color=gray>' ''uint32_t caca_get_attr(caca_canvas_t const *, int, int)''
 
  <FONT color=gray>' ''uint32_t caca_get_attr(caca_canvas_t const *, int, int)''
 
  ' ''Get the text attribute at the given coordinates.''</font>
 
  ' ''Get the text attribute at the given coordinates.''</font>
  '''Private''' Extern caca_get_attr(caca_canvas_t As Pointer, ca As Integer, cb As Integer) As Integer
+
  Private Extern caca_get_attr(caca_canvas_t As Pointer, ca As Integer, cb As Integer) As Integer
 
   
 
   
 
  <FONT color=gray>' ''int caca_put_attr(caca_canvas_t *, int, int, uint32_t)''
 
  <FONT color=gray>' ''int caca_put_attr(caca_canvas_t *, int, int, uint32_t)''
 
  ' ''Set the character attribute at the given coordinates.''</font>
 
  ' ''Set the character attribute at the given coordinates.''</font>
  '''Private''' Extern caca_put_attr(caca_canvas_t As Pointer, ca As Integer, cb As Integer, cc As Integer) As Integer
+
  Private Extern caca_put_attr(caca_canvas_t As Pointer, ca As Integer, cb As Integer, cc As Integer) As Integer
 
   
 
   
 
  <FONT color=gray>' ''void *caca_export_canvas_to_memory(caca_canvas_t const *, char const *, size_t *)''
 
  <FONT color=gray>' ''void *caca_export_canvas_to_memory(caca_canvas_t const *, char const *, size_t *)''
 
  ' ''Export a canvas into a foreign format.''</font>
 
  ' ''Export a canvas into a foreign format.''</font>
  '''Private''' Extern caca_export_canvas_to_memory(caca_canvas_t As Pointer, tes As String, lenP As Pointer) As String
+
  Private Extern caca_export_canvas_to_memory(caca_canvas_t As Pointer, tes As String, lenP As Pointer) As String
 
   
 
   
 
  <FONT color=gray>' ''int caca_rotate_left(caca_canvas_t *)''
 
  <FONT color=gray>' ''int caca_rotate_left(caca_canvas_t *)''
 
  ' ''Rotate a canvas, 90 degrees counterclockwise.''</font>
 
  ' ''Rotate a canvas, 90 degrees counterclockwise.''</font>
  '''Private''' Extern caca_rotate_left(caca_canvas_t As Pointer) As Integer
+
  Private Extern caca_rotate_left(caca_canvas_t As Pointer) As Integer
 
   
 
   
 
  <FONT color=gray>' ''int caca_free_canvas(caca_canvas_t *)''
 
  <FONT color=gray>' ''int caca_free_canvas(caca_canvas_t *)''
 
  ' ''Free a libcaca canvas.''</font>
 
  ' ''Free a libcaca canvas.''</font>
  '''Private''' Extern caca_free_canvas(caca_canvas_t As Pointer) As Integer
+
  Private Extern caca_free_canvas(caca_canvas_t As Pointer) As Integer
 
   
 
   
 
   
 
   
  '''Public''' Sub Form_Open()
+
  '''Public''' Sub Main()
 
   
 
   
 
   Dim cv, mai As Pointer
 
   Dim cv, mai As Pointer
 
   Dim lenI, i, j, a As Integer
 
   Dim lenI, i, j, a As Integer
   Dim s, buffer As String
+
   Dim buffer As String
 
   Dim fl As File
 
   Dim fl As File
 
   
 
   
Riga 91: Riga 93:
 
   
 
   
 
   cv = caca_create_canvas(caca_get_canvas_width(mai) * 2, caca_get_canvas_height(mai) * 2)
 
   cv = caca_create_canvas(caca_get_canvas_width(mai) * 2, caca_get_canvas_height(mai) * 2)
   If IsNull(mai) Or IsNull(cv) Then Error.Raise("Impossibile creare un supporto grafico "caca" !")
+
   If IsNull(mai) Or IsNull(cv) Then Error.Raise("Impossibile creare un supporto grafico 'caca' !")
 
   
 
   
 
   caca_blit(cv, 0, 0, mai, Null)
 
   caca_blit(cv, 0, 0, mai, Null)
Riga 113: Riga 115:
 
        
 
        
 
   Next
 
   Next
 
+
 
+
  <FONT color=gray>' ''Apre il file-device "stdout" del Terminale per la scrittura del testo:''</font>
<FONT color=gray>' ''Apre un Terminale per la scrittura del testo:''</font>
+
     fl = Open "/dev/stdout" For Output
    desktop.OpenTerminal
 
 
<FONT color=gray>' ''Chiama la funzione per individuare a quale file-device "pts" corrisponderà quello del "Terminale" che sarà aperto:''</font>
 
    s = ricavaFilePTS()
 
 
  <FONT color=gray>' ''Apre il file-device "pts" del Terminale per la scrittura del testo:''</font>
 
     fl = Open "/dev/pts/" & s For Output
 
 
   
 
   
 
     buffer = caca_export_canvas_to_memory(cv, "utf8", VarPtr(lenI))
 
     buffer = caca_export_canvas_to_memory(cv, "utf8", VarPtr(lenI))
Riga 136: Riga 131:
 
   
 
   
 
  <FONT color=gray>' ''Va in chiusura:''</font>
 
  <FONT color=gray>' ''Va in chiusura:''</font>
 +
    fl.Close
 
     caca_free_canvas(mai)
 
     caca_free_canvas(mai)
 
     caca_free_canvas(cv)
 
     caca_free_canvas(cv)
 
   
 
   
 
  '''End'''
 
  '''End'''
+
 
 
'''Private''' Function ricavaFilePTS() As String
 
 
  Dim b As Byte
 
  Dim fl$ As String
 
  Dim ss As New String[]
 
 
 
 
 
<FONT color=gray>' ''Verifica quanti file-device ci sono nella cartella "/dev/pts":''</font>
 
  b = Dir("/dev/pts").Count
 
 
<FONT color=gray>' ''Assegna ad ogni elemento della variabile array di tipo Stringa "ss" il nome di ciascun file - device:''</font>
 
  For Each fl$ In Dir("/dev/pts")
 
    ss.Add(fl$)
 
  Next
 
 
<FONT color=gray>' ''Resta in attesa sino a quando un Terminale non è stato aperto, e quindi''
 
' ''sino a quando non è aumentato di un'unità il numero dei file-device presenti nella cartella "/dev/pts":''</font>
 
  Do
 
    Wait 0.01
 
  Loop Until Dir("/dev/pts").Count = b + 1
 
 
<FONT color=gray>' ''Effettua la verifica di quale file-device corrisponde a quello del Terminale appena aperto:''
 
' ''il file-device nuovo, non presente nella variabile vettore di tipo stringa, è quello del terminale:''</font>
 
  For Each fl In Dir("/dev/pts")
 
    If Not ss.Exist(fl$) Then Exit
 
  Next
 
   
 
    Return fl$
 
 
 
'''End'''
 
 
      
 
      
  
  
 
=Riferimenti=
 
=Riferimenti=
* [http://caca.zoy.org/doxygen/libcaca/libcaca-tutorial.html L'API di Libcaca]
+
* [http://caca.zoy.org/wiki Il sito di Caca Lbs]
 
* [http://it.wikipedia.org/wiki/ASCII_art Arte ASCII]
 
* [http://it.wikipedia.org/wiki/ASCII_art Arte ASCII]

Versione attuale delle 21:12, 16 mar 2018

La libreria libcaca è una libreria grafica che crea testo anziché pixel, e che, pertanto, è utilizzabile su terminali di testo.


Per poter utilizzare le funzionalità di libcaca, è necessario richiamare la libreria condivisa attualmente: "libcaca.so.0.99.19".


Mostriamo di seguito un breve codice esemplificativo, con il quale si scriverà in un Terminale una stringa di caratteri ASCII variamente colorati, raffigurante la testa di un maialino, nonché per tre volte ancora la medesima stringa, ma ruotata sempre in modo diverso.
Del seguente codice andrà creato l'eseguibile .gambas, che verrà avviato in Terminale.

Private testo As String = " |_| \n" &
" _,----._ | | \n" &
" (/ @ @ \\) __ \n" &
" | OO | |_ \n" &
" \\ `--' / |__ \n" &
" `----' \n" &
" |_| \n" &
" Un Maialino! | \n" &
" \n"


Library "libcaca:0.99.19"

Private Const CACA_LIGHTBLUE As Byte = 9     ' L'indice di colore per il blu
Private Const CACA_DEFAULT As Byte = 16      ' Il colore prestabilito del driver di uscita

' caca_canvas_t * caca_create_canvas(int, int)
' Initialise a libcaca canvas.
Private Extern caca_create_canvas(ca As Integer, cb As Integer) As Pointer

' ssize_t caca_import_canvas_from_memory (caca_canvas_t *, void const *, size_t, char const *)
' Import a memory buffer into a canvas.
Private Extern caca_import_canvas_from_memory(caca_canvas_t As Pointer, testo1 As String, size_t As Integer, testo2 As String) As Integer

' int caca_get_canvas_width(caca_canvas_t const *)
' Get the canvas width.
Private Extern caca_get_canvas_width(caca_canvas_t As Pointer) As Integer

' int caca_get_canvas_height(caca_canvas_t const *)
' Get the canvas height.
Private Extern caca_get_canvas_height(caca_canvas_t As Pointer) As Integer

' int caca_blit(caca_canvas_t *, int, int, caca_canvas_t const *, caca_canvas_t const *)
' Blit a canvas onto another one.
Private Extern caca_blit(caca_canvas_t As Pointer, ca As Integer, cb As Integer, caca_canvas_t As Pointer, caca_canvas_t As Pointer) As Integer

' int caca_flip(caca_canvas_t *)
' Flip a canvas horizontally.
Private Extern caca_flip(caca_canvas_t As Pointer) As Integer

' int caca_flop(caca_canvas_t *)
' Flip a canvas vertically.
Private Extern caca_flop(caca_canvas_t As Pointer) As Integer

' int caca_rotate_180(caca_canvas_t *)
' Rotate a canvas.
Private Extern caca_rotate_180(caca_canvas_t As Pointer) As Integer

' int caca_set_color_ansi(caca_canvas_t *, uint8_t, uint8_t)
' Set the default colour pair for text (ANSI version).
Private Extern caca_set_color_ansi(caca_canvas_t As Pointer, cby1 As Byte, cby2 As Byte) As Integer

' uint32_t caca_get_attr(caca_canvas_t const *, int, int)
' Get the text attribute at the given coordinates.
Private Extern caca_get_attr(caca_canvas_t As Pointer, ca As Integer, cb As Integer) As Integer

' int caca_put_attr(caca_canvas_t *, int, int, uint32_t)
' Set the character attribute at the given coordinates.
Private Extern caca_put_attr(caca_canvas_t As Pointer, ca As Integer, cb As Integer, cc As Integer) As Integer

' void *caca_export_canvas_to_memory(caca_canvas_t const *, char const *, size_t *)
' Export a canvas into a foreign format.
Private Extern caca_export_canvas_to_memory(caca_canvas_t As Pointer, tes As String, lenP As Pointer) As String

' int caca_rotate_left(caca_canvas_t *)
' Rotate a canvas, 90 degrees counterclockwise.
Private Extern caca_rotate_left(caca_canvas_t As Pointer) As Integer

' int caca_free_canvas(caca_canvas_t *)
' Free a libcaca canvas.
Private Extern caca_free_canvas(caca_canvas_t As Pointer) As Integer


Public Sub Main()

 Dim cv, mai As Pointer
 Dim lenI, i, j, a As Integer
 Dim buffer As String
 Dim fl As File


  mai = caca_create_canvas(0, 0)

  caca_import_canvas_from_memory(mai, testo, Len(testo), "text")

  cv = caca_create_canvas(caca_get_canvas_width(mai) * 2, caca_get_canvas_height(mai) * 2)
  If IsNull(mai) Or IsNull(cv) Then Error.Raise("Impossibile creare un supporto grafico 'caca' !")

  caca_blit(cv, 0, 0, mai, Null)
  caca_flip(mai)
  caca_blit(cv, caca_get_canvas_width(mai), 0, mai, Null)
  caca_flip(mai)
  caca_flop(mai)
  caca_blit(cv, 0, caca_get_canvas_height(mai), mai, Null)
  caca_flop(mai)
  caca_rotate_180(mai)
  caca_blit(cv, caca_get_canvas_width(mai), caca_get_canvas_height(mai), mai, Null)

  For j = 0 To (caca_get_canvas_height(cv) - 1)
     
     For i = 0 To (caca_get_canvas_width(cv) - 1) Step 2
       caca_set_color_ansi(cv, CACA_LIGHTBLUE + (i + j) Mod 6, CACA_DEFAULT)
       a = caca_get_attr(cv, -1, -1)
       caca_put_attr(cv, i, j, a)
       caca_put_attr(cv, i + 1, j, a)
     Next
     
  Next
 
' Apre il file-device "stdout" del Terminale per la scrittura del testo:
   fl = Open "/dev/stdout" For Output

   buffer = caca_export_canvas_to_memory(cv, "utf8", VarPtr(lenI))

' Scrive il testo nel Terminale attraverso il suo file-device "pts" individuato:
   Print #fl, buffer

   caca_rotate_left(cv)
   buffer = caca_export_canvas_to_memory(cv, "utf8", VarPtr(lenI))

' Scrive il testo nel Terminale attraverso il suo file-device "pts" individuato:
   Print #fl, buffer

' Va in chiusura:
   fl.Close
   caca_free_canvas(mai)
   caca_free_canvas(cv)

End



Riferimenti