2017-04-08 4 views
0

Je suis nouveau au Caire, en essayant de créer du texte avec des couleurs transparentes et un trait.
La transparence de la couleur de trait fonctionne mais la couleur de remplissage du texte n'est pas transparente transparency_value ne fonctionne pas. Si je réduis transparency_value, la couleur du texte devient juste plus sombre (noir) et de plus en plus transparency_value fait (dans mon cas vert) plus lumineux de couleur du texteCairo Fill with Transparency

cairo_surface_t* surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, 640, 480); 
cairo_t* cairo = cairo_create(surface); 
cairo_set_font_face(cairo, myfont_face); 
cairo_set_font_size(cairo, 25); 
cairo_text_extents_t extents; 
cairo_text_extents(cairo, "Hello World", &extents); 
cairo_move_to(cairo, 200, 200);   
cairo_text_path(cairo, "Hello World"); 
double transparency_value = 0.5; 
cairo_set_source_rgba(cairo, 0,1,0,transparency_value); //transparency doesn't work 
//cairo_fill(cairo); //this didn't make a difference 
cairo_fill_preserve(cairo); 
cairo_set_source_rgba(cairo, 0.56, 0.76, 0.96, 0.5); //transparency works 
cairo_set_line_width(cairo, 1.5); 
cairo_stroke(cairo); 

Répondre

1

pourrait-il que vous dessinez votre texte à l'extérieur de la surface? Dans l'exemple suivant, j'ai ajouté un appel à cairo_move_to(cr, 200, 200) et maintenant j'obtiens le résultat suivant. (Ceci est écrit en Lua et utilise https://github.com/pavouk/lgi pour remettre en caire, les commentaires indiquent les choses que je changé par rapport à votre version)

local cairo = require("lgi").cairo 
local surface = cairo.ImageSurface.create(cairo.Format.ARGB32, 640, 480) 
local cr = cairo.Context(surface) 
local myfont_face = cr:get_font_face() -- I have to get this from somewhere 
cr:move_to(200, 200) -- I added this line to make something appear 
cr:set_font_face(myfont_face) 
cr:set_font_size(25) 
cr:text_path("Hello World") 
local transparency_value = 0.5 
cr:set_source_rgba(0, 1, 0, transparency_value) 
-- cr:fill() 
cr:fill_preserve() 
cr:set_source_rgba(0.65, 0.76, 0.96, 0.5) 
cr:set_line_width(5) -- changed from 1.5 to 5 to make it more prominent 
cr:stroke() 
surface:write_to_png("/tmp/out.png") 

enter image description here

Edit: Et voici le résultat quand je change transparency_value à 0,1 . De toute évidence, le résultat est différent et la transparence fonctionne correctement (lorsque vous effectuez un zoom avant, vous voyez toujours un léger vert au milieu).

enter image description here

+2

Merci pour votre réponse. J'avais utilisé 'cairo_move_to', sinon je ne verrais pas de sortie. pour faire du code court, j'avais sauté 'cairo_move_to'. J'ai mis à jour le code. Est-ce que je fais une erreur dans l'ordre des appels de fonction? et avez-vous essayé de changer 'transparency_value' dans votre code? –

+0

Voir ma modification. J'ai ajouté une autre image montrant le résultat avec 'transparency_value = 0.1'. Le résultat semble toujours comme prévu et je ne peux pas reproduire le noir que vous voyez. Qu'est-ce que je fais mal"? –

+0

hmm! est-ce un bug en C++ ou est-il possible que je n'ai pas construit cairo avec la librairie freeType correctement - donc obtenir une mauvaise sortie? –