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

Da Gambas-it.org - Wikipedia.
 
Riga 80: Riga 80:
 
   
 
   
 
   
 
   
  '''Public''' Sub Main()
+
  Public Sub Main()
 
  Dim cv, mai As Pointer
 
  Dim lenI, i, j, a As Integer
 
  Dim buffer As String
 
  Dim fl As File
 
 
   
 
   
 +
  Dim mai, cv As Pointer
 +
  Dim lenI, i, j, a As Integer
 +
  Dim buffer As String
 +
  Dim fl As File
 
   
 
   
 
   mai = caca_create_canvas(0, 0)
 
   mai = caca_create_canvas(0, 0)
 +
  If mai == 0 Then Error.Raise("Errore !")
 
   
 
   
 
   caca_import_canvas_from_memory(mai, testo, Len(testo), "text")
 
   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)
 
   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 cv == 0 Then Error.Raise("Impossibile creare un supporto grafico 'caca' !")
 
   
 
   
 
   caca_blit(cv, 0, 0, mai, Null)
 
   caca_blit(cv, 0, 0, mai, Null)
Riga 106: Riga 106:
 
   
 
   
 
   For j = 0 To (caca_get_canvas_height(cv) - 1)
 
   For j = 0 To (caca_get_canvas_height(cv) - 1)
     
+
    For i = 0 To (caca_get_canvas_width(cv) - 1) Step 2
      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)
        caca_set_color_ansi(cv, CACA_LIGHTBLUE + (i + j) Mod 6, CACA_DEFAULT)
+
      a = caca_get_attr(cv, -1, -1)
        a = caca_get_attr(cv, -1, -1)
+
      caca_put_attr(cv, i, j, a)
        caca_put_attr(cv, i, j, a)
+
      caca_put_attr(cv, i + 1, j, a)
        caca_put_attr(cv, i + 1, j, a)
+
    Next  
      Next
 
     
 
 
   Next
 
   Next
 
+
 
  <FONT color=gray>' ''Apre il file-device "stdout" del Terminale per la scrittura del testo:''</font>
 
  <FONT color=gray>' ''Apre il file-device "stdout" del Terminale per la scrittura del testo:''</font>
    fl = Open "/dev/stdout" For Output
+
  fl = Open "/dev/stdout" For Output
 
   
 
   
    buffer = caca_export_canvas_to_memory(cv, "utf8", VarPtr(lenI))
+
  buffer = caca_export_canvas_to_memory(cv, "utf8", VarPtr(lenI))
 
   
 
   
 
  <FONT color=gray>' ''Scrive il testo nel Terminale attraverso il suo file-device "pts" individuato:''</font>
 
  <FONT color=gray>' ''Scrive il testo nel Terminale attraverso il suo file-device "pts" individuato:''</font>
    Print #fl, buffer
+
  Print #fl, buffer
 
   
 
   
    caca_rotate_left(cv)
+
  caca_rotate_left(cv)
    buffer = caca_export_canvas_to_memory(cv, "utf8", VarPtr(lenI))
+
  buffer = caca_export_canvas_to_memory(cv, "utf8", VarPtr(lenI))
 
   
 
   
 
  <FONT color=gray>' ''Scrive il testo nel Terminale attraverso il suo file-device "pts" individuato:''</font>
 
  <FONT color=gray>' ''Scrive il testo nel Terminale attraverso il suo file-device "pts" individuato:''</font>
    Print #fl, buffer
+
  Print #fl, buffer
 
   
 
   
 
  <FONT color=gray>' ''Va in chiusura:''</font>
 
  <FONT color=gray>' ''Va in chiusura:''</font>
    fl.Close
+
  fl.Close
    caca_free_canvas(mai)
+
  caca_free_canvas(mai)
    caca_free_canvas(cv)
+
  caca_free_canvas(cv)
 
   
 
   
  '''End'''
+
  End
  
 
      
 
      

Versione attuale delle 13:38, 1 lug 2024

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 mai, cv As Pointer
  Dim lenI, i, j, a As Integer
  Dim buffer As String
  Dim fl As File

  mai = caca_create_canvas(0, 0)
  If mai == 0 Then Error.Raise("Errore !")

  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 cv == 0 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