Creare una GIF animata con le funzioni esterne del API di Libplot

Da Gambas-it.org - Wikipedia.

Libplot è una libreria di funzioni gratuita per disegnare grafica vettoriale bidimensionale. Può produrre, animazioni per il sistema X Window, e può esportare file grafici in molti formati di file.

Per poter utilizzare in Gambas le risorse di LIbplot, è necessario installare e richiamare la libreria dinamica condivisa: "libplot.so.2.2.4"

Mostriamo un semplice esempio, nel quale sarà generato un'immagine GIF animata delle dimensioni 150 x 100 pixel:

Library "libplot:2.2.4"

' plPlotterParams * pl_newplparams (void)
' Constructor constructor for the plPlotterParams type.
Private Extern pl_newplparams() As Pointer

' int pl_setplparam (plPlotterParams *plotter_params, const char *parameter, void *value)
' A function for setting a single Plotter parameter in a plPlotterParams instance.
Private Extern pl_setplparam(plotter_params As Pointer, parameter As String, value As String) As Integer

' plPlotter * pl_newpl_r (const char *type, FILE *infile, FILE *outfile, FILE *errfile, const plPlotterParams *plotter_params)
' Constructor for the plPlotter type.
Private Extern pl_newpl_r(type As String, infile As Pointer, outfile As Pointer, errfile As Pointer, plotter_params As Pointer) As Pointer

' int pl_openpl_r (plPlotter *plotter)
Private Extern pl_openpl_r(plPlotter As Pointer) As Integer

' int pl_fspace_r (plPlotter *plotter, double x0, double y0, double x1, double y1)
Private Extern pl_fspace_r(plPlotter As Pointer, x0 As Float, y0 As Float, x1 As Float, y1 As Float) As Integer

' int pl_pencolorname_r (plPlotter *plotter, const char *name)
Private Extern pl_pencolorname_r(plPlotter As Pointer, name As String) As Integer

' int pl_linewidth_r (plPlotter *plotter, int size)
Private Extern pl_linewidth_r(plPlotter As Pointer, size As Integer) As Integer

' int pl_filltype_r (plPlotter *plotter, int level)
Private Extern pl_filltype_r(plPlotter As Pointer, level As Integer) As Integer

' int pl_fillcolorname_r (plPlotter *plotter, const char *name)
Private Extern pl_fillcolorname_r(plPlotter As Pointer, name As String) As Integer

' int pl_erase_r (plPlotter *plotter)
Private Extern pl_erase_r(plPlotter As Pointer) As Integer

' int pl_ellipse_r (plPlotter *plotter, int x, int y, int rx, int ry, int angle)
Private Extern pl_ellipse_r(plPlotter As Pointer, xI As Integer, yI As Integer, rx As Integer, ry As Integer, angle As Integer) As Integer

' int pl_deleteplparams (plPlotterParams *plotter_params)
' Destructor for the plPlotterParams type.
Private Extern pl_deleteplparams(plotter_params As Pointer) As Integer

' int pl_closepl_r (plPlotter *plotter)
Private Extern pl_closepl_r(plPlotter As Pointer) As Integer

' int pl_deletepl_r (plPlotter *plotter)
' Destructor for the plPlotter type.
Private Extern pl_deletepl_r(plPlotter As Pointer) As Integer


Library "libc:6"

' FILE *fopen(const char *filename, const char *mode)
' Opens the filename pointed to by filename using the given mode.
Private Extern fopen(filename As String, mode As String) As Pointer

' int fclose(FILE *stream)
' Closes the stream. All buffers are flushed.
Private Extern fclose(fs As Pointer) As Integer


Public Sub Main()

  Dim fl, param, plotter As Pointer
  Dim i As Integer

  fl = fopen("/percorso/del/file.gif", "wb")
 
' Imposta i parametri del disegnatore:
  param = pl_newplparams()
  If param == 0 Then Error.Raise("Errore !")

  pl_setplparam(param, "BITMAPSIZE", "150x100")
  pl_setplparam(param, "BG_COLOR", "orange")
  pl_setplparam(param, "TRANSPARENT_COLOR", "orange")
  pl_setplparam(param, "GIF_ITERATIONS", "100")
  pl_setplparam(param, "GIF_DELAY", "5")
      
' Crea un disegnatore di GIF con i parametri specificati:
  plotter = pl_newpl_r("gif", 0, fl, 0, param)
  If plotter == 0 Then Error.Raise("Errore !")
   
  pl_openpl_r(plotter)
  pl_fspace_r(plotter, -0.5, -0.5, 149.5, 99.5)
   
' Usa il colore rosso per disegnare l'oggetto grafico:
  pl_pencolorname_r(plotter, "red")
  pl_linewidth_r(plotter, 5)
' L'oggetto grafico viene riempito:
  pl_filltype_r(plotter, 1)
' Imposta il colore di riempimento:
  pl_fillcolorname_r(plotter, "yellow")
   
  For i = 0 To 180 - 1 Step 15
    pl_erase_r(plotter)
' Disegna un'ellisse:
    pl_ellipse_r(plotter, 75, 50, 40, 20, i)
  Next

' Va in chiusura:
  pl_deleteplparams(param)
  pl_closepl_r(plotter)
  pl_deletepl_r(plotter)
  fclose(fl)

End


Riferimenti