Curvare la linea di testo in un oggetto Image

Da Gambas-it.org - Wikipedia.

Una soluzione per ottenere un testo curvato lungo una ideale circonferenza, potrebbe essere quella di creare tante piccoli oggetti di tipo Image per quante sono le lettere alfabetiche o le sillabe.
Ciascuna lettera o sillaba verrebbe quindi disegnata in uno di quegli oggetti Image.
Infine tali oggetti Image verrebbero adeguatamente ruotati in modo perpendicolare al raggio della circonferenza (o dell'arco) e disegnati/fusi in un Oggetto Image principale più grande, per formare il testo completo e apparentemente curvato.

Mostriamo un esempio pratico:

Public Sub Form_Open()
 
 Dim im, i As Image
 Dim b As Byte
 Dim x, y, x_a, y_o, r As Short
 Dim an As Float
 Dim cl As Integer
 Dim bb As New Byte[]
 Dim fo As Font
 Dim s As String
 
 With Me
   .Center
   .W = 600
   .H = 600
 End With
 
 x_a = 260   ' Rappresenta la distanza X dal punto 0 (angolo in alto a sinistra) dell'Image principale
 y_o = 260   ' Rappresenta la distanza Y dal punto 0 (angolo in alto a sinistra) dell'Image principale
 r = 150     ' Rappresenta la lunghezza del raggio (la distanza di ogni immagine-lettera dal centro)
 
' Impone il testo da disegnare.
' Carica ogni carattere del testo In un vettore Byte[] per poter estrarre di ciascuno il valore:
 bb = bb.FromString("È lì giù che saprò se vivrà.")
 
' Imposta il colore di partenza:
 cl = Color.Blue
' Imposta il punto (sulla base dei gradi) della circonferenza da dove cominciare (in senso orario) a disegnare le lettere:
 an += 204.0
 
' Crea l'Oggetto "Image" principale, ove saranno mostrate tutte le lettere alfabetiche del testo:
 im = New Image(Me.W, Me.H, Color.White, gb.Standard)
 
 For b = 0 To bb.Max
   
' Verifica se il carattere è accentato (carattere ASCII speciale):
   If bb[b] > 127 Then
' Se è un carattere accentato, per riottenerlo nell'Image, combina i due valori che lo compongono:
     s = Chr(bb[b]) & Chr(bb[b + 1])
     Inc b
   Else
     s = Chr(bb[b])
   Endif
   
' Definisce le dimensioni dell'immagine, che conterrà la lettera alfabetica, dalle specificità del carattere:
   With fo = New Font
     .Name = "FreeSans"
     .Size = 18
' Crea un oggetto "Image" per contenere il disegno di una lettera alfabetica:
     i = New Image(.TextWidth(s) + 4, .TextHeight(s) + 4, Color.Transparent, gb.Standard)
   End With
   
   With Paint
     .Begin(i)
     .Font.Size = 18
     .Font.Name = "FreeSans"
     .Brush = .Color(cl)
     .Text(s, 1, 1, i.W, i.H, Align.Center)
     .Fill
     .End
   End With
   
   i = i.Rotate(Rad(an + 90))
 
   x = x_a + r * Cos(Rad(an)) 
   y = y_o + r * Sin(Rad(an))
   With Paint
     .Begin(im)
     .DrawImage(i, x, y, i.W, i.H)
     .End
   End With
' Imposta la distanza dei caratteri fra essi:
   an += 5.0
   
   cl += 668457
 Next
   
 With PictureBox1
   .X = 0
   .Y = 0
   .W = Me.W
   .H = Me.H
   .Image = im
 End With
 
End