Autore Topic: come fare outline di testo?  (Letto 466 volte)

Offline allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
come fare outline di testo?
« il: 23 Dicembre 2020, 10:06:55 »
Salve, sto studiando il modo di poter sostituire un software che utilizziamo a lavoro e che gira su windows (ed al massimo XP), con una versione linux, piu' snella e personalizzabile.

scala infochannel designer 5:


Pero' una delle funzioni che utilizziamo di piu' e' tracciare un "outline" al testo (EVENTS nell'immagine qui sotto):


Cercando qualche info sul componente cairo, mi sono imbattuto in questa "guida", in tedesco, che sembra fatta abbastanza bene:
https://gambas-buch.de/dwen/doku.php?id=k25:k25.1:start

ma non riesco a trovare alcun accenno alla realizzazione di un "contorno" all'oggetto testo.

idee?

Grazie e buon natale :D
« Ultima modifica: 23 Dicembre 2020, 10:07:50 da allegfede »
se corri, morirai stanco (motto degli sniper)

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.152
  • Tonno verde
    • Mostra profilo
Re:come fare outline di testo?
« Risposta #1 il: 23 Dicembre 2020, 11:43:02 »
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.266
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:come fare outline di testo?
« Risposta #2 il: 23 Dicembre 2020, 16:53:01 »
Per ora Babbo Natale porta una soluzione con le funzioni esterne di Cairo:

Codice: [Seleziona]
Library "libcairo:2"

Private Enum CAIRO_FONT_SLANT_NORMAL = 0, CAIRO_FONT_SLANT_ITALIC, CAIRO_FONT_SLANT_OBLIQUE
Private Enum CAIRO_FONT_WEIGHT_NORMAL = 0, CAIRO_FONT_WEIGHT_BOLD
Private Enum CAIRO_FORMAT_INVALID = -1, CAIRO_FORMAT_ARGB32, CAIRO_FORMAT_RGB24, CAIRO_FORMAT_A8,
             CAIRO_FORMAT_A1, CAIRO_FORMAT_RGB16_565, CAIRO_FORMAT_RGB30

' cairo_surface_t * cairo_image_surface_create(cairo_format_t formatI, int width, int height)
' Creates an image surface of the specified format and dimensions.
Private Extern cairo_image_surface_create(formatI As Integer, width As Integer, height As Integer) As Pointer

' cairo_t* cairo_create(cairo_surface_t *target)
' Creates a new cairo_t with all graphics state parameters set to default values and with target as a target surface.
Private Extern cairo_create(target As Pointer) As Pointer

' void cairo_set_font_size(cairo_t *cr, double size)
' Sets the current font matrix to a scale by a factor of size.
Private Extern cairo_set_font_size(cr As Pointer, size As Float)

' void cairo_select_font_face(cairo_t *cr, const char *family, cairo_font_slant_t slant, cairo_font_weight_t weight)
' Selects a family and style of font from a simplified description as a family name, slant and weight.
Private Extern cairo_select_font_face(cr As Pointer, family As String, slant As Integer, font_weight As Integer)

' void cairo_move_to(cairo_t *cr, double x, double y)
' Begin a new sub-path.
Private Extern cairo_move_to(cr As Pointer, xF As Float, yF As Float)

' void cairo_text_path (cairo_t *cr, const char *utf8)
' Adds closed paths for text to the current path.
Private Extern cairo_text_path(cr As Pointer, utf8 As String)

' void cairo_fill_preserve (cairo_t *cr)
' Preserves the path within the cairo context.
Private Extern cairo_fill_preserve(cr As Pointer)

' void cairo_set_source_rgb(cairo_t *cr, double red, double green, double blue)
' Sets the source pattern within cr to an opaque color.
Private Extern cairo_set_source_rgb(cr As Pointer, red As Float, green As Float, blue As Float)

' void cairo_stroke (cairo_t *cr)
' void A drawing operator that strokes the current path according to the current line width.
Private Extern cairo_stroke(cr As Pointer)

' cairo_status_t cairo_surface_write_to_png(cairo_surface_t *surface, const char *filename)
' Writes the contents of surface to a new file filename as a PNG image.
Private Extern cairo_surface_write_to_png(cairo_surface As Pointer, filename As String) As Integer

' void cairo_destroy(cairo_t *cr)
' Decreases the reference count on cr by one.
Private Extern cairo_destroy(cr As Pointer)

' void cairo_surface_destroy(cairo_surface_t *surface)
' Decreases the reference count on surface by one.
Private Extern cairo_surface_destroy(cairo_surface As Pointer)


Public Sub Main()

 Dim cairo, surface As Pointer
 Dim err As Integer

' Crea la superficie dell'immagine (in questo caso trasparente):
  surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, 300, 300)
  cairo = cairo_create(surface)

' Imposta il font:
  cairo_set_font_size(cairo, 60)
  cairo_select_font_face(cairo, "URW Palladio L", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL)
 
  cairo_move_to(cairo, 50, 100)
  cairo_text_path(cairo, "Events")
  cairo_set_source_rgb(cairo, 0.5, 1.0, 0.0)
  cairo_fill_preserve(cairo)
 
' Crea il contorno:
  cairo_set_source_rgb(cairo, 1, 0, 0)
  cairo_stroke(cairo)
 
  err = cairo_surface_write_to_png(surface, "/tmp/esempio_Cairo.png")
  If err > 0 Then Error.Raise("Errore nella creazione del file immagine .png !")

' Per generare il file stabilito, è necessario distruggere il contesto grafico "cairo_t" e la superficie dell'immagine:
  cairo_destroy(cairo)
  cairo_surface_destroy(surface)

End
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.266
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:come fare outline di testo?
« Risposta #3 il: 23 Dicembre 2020, 20:55:17 »
Poi arrivò la Befana, e dicendo: " Scusate, ma io chi sono ? Figlia di N.N. ?",  pose sul tavolo il suo dono contenente il Componente "gb.cairo":

Codice: [Seleziona]
Public Sub Main()

  Dim png As CairoSvgSurface

' Specifica la superficie grafica da creare per disegnarvi sopra (i valori sono espressi in millimetri !):
  png = New CairoSvgSurface(Null, 100, 100)

 
' Inizia il disegno sulla superficie impostata:
  Cairo.Begin(png)

' Imposta il font:
  Cairo.Font.Size = 60
  Cairo.Font.Name = "URW Palladio L"
 
' Imposta il testo:
  Cairo.Source = Cairo.ColorPattern(Color.Yellow)
  Cairo.MoveTo(50, 100)
  Cairo.Text("Events")
  Cairo.Fill(True)

' Crea il contorno al testo:
  Cairo.Source = Cairo.ColorPattern(Color.Red)
  Cairo.Stroke
 
' Termina il disegno:
  Cairo.End
 
  png.Save("/tmp/file.png")
 
End


« Ultima modifica: 23 Dicembre 2020, 20:58:07 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline kicco

  • Senatore Gambero
  • ******
  • Post: 1.700
  • So dove andare, seguitemi, ci perderemo insieme!
    • Mostra profilo
Re:come fare outline di testo?
« Risposta #4 il: 23 Dicembre 2020, 21:33:50 »
Citazione
Poi arrivò la Befana, e d
Babbo Natale, sono riuscito ad immaginarti, ma Befana...! :P
Chi ha paura muore ogni giorno, chi non ha paura muore una volta sola. (Paolo Borsellino)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.266
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:come fare outline di testo?
« Risposta #5 il: 23 Dicembre 2020, 22:30:36 »
Babbo Natale, sono riuscito ad immaginarti, ma Befana...! :P

Basterebbe continuare ad applicarsi nello studio e sperimentazione del Componente gb.map !!!  :violent:
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
Re:come fare outline di testo?
« Risposta #6 il: 31 Dicembre 2020, 13:09:52 »
wow!
Non avendo avuto modo di provare il codice della guida in tedesco, ma solo leggerle velocemente, pensavo che stroke servisse a "finalizzare" una serie di comandi al componente.

Ho iniziato a lavorare anche in un'altra azienda e due part time > full time => minor tempo per la sperimentazione :-(

Inizio a sperimentare durante le feste :-)

grazie befana e babbo natale :D

buon 2021 a tutti voi
se corri, morirai stanco (motto degli sniper)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.266
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:come fare outline di testo?
« Risposta #7 il: 31 Dicembre 2020, 13:37:57 »
pensavo che stroke servisse a "finalizzare" una serie di comandi al componente.
Lo ".Stroke" della Classe Cairo mi ricorda un po' il Metodo ".Stroke" della Classe Paint.
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »