2017-04-08 17 views
0

Ich bin neu in Kairo, versuche Text mit transparenten Farben und Strichen zu erstellen.
Strichfarbe Transparenz funktioniert, aber Text Füllfarbe Transparenz transparency_value funktioniert nicht. Wenn i transparency_value reduzieren, Textfarbe wird nur dunkler (schwarz) und zunehmende transparency_value Textfarbe heller (grün in meinem Fall)Kairo mit Transparenz füllen

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); 

Antwort

1

Könnte es macht sein, dass Sie Ihren Text außerhalb der Oberfläche zeichnen? Im folgenden Beispiel habe ich einen Anruf zu cairo_move_to(cr, 200, 200) hinzugefügt und jetzt bekomme ich das folgende Ergebnis. (Dies ist in Lua geschrieben und verwendet https://github.com/pavouk/lgi in kairo zu nennen, Kommentare Dinge zeigen, dass ich auf Ihre Version verglichen geändert)

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: Und das ist das Ergebnis, wenn ich transparency_value-,1 ändern . Natürlich ist das Ergebnis anders und die Transparenz funktioniert korrekt (beim Vergrößern sehen Sie immer noch ein schwaches Grün in der Mitte).

enter image description here

+2

Vielen Dank für Ihre Antwort. Ich hatte 'cairo_move_to' verwendet, sonst würde ich keine Ausgabe sehen. Um den Code kurz zu machen, habe ich 'cairo_move_to' übersprungen. Ich habe den Code aktualisiert. mache ich einen Fehler in der Reihenfolge der Funktionsaufrufe? und haben Sie versucht, 'transparency_value' in Ihrem Code zu ändern? –

+0

Siehe meine Bearbeitung. Ich fügte ein weiteres Bild hinzu, das das Ergebnis mit 'transparency_value = 0.1' zeigt. Das Ergebnis sieht immer noch wie erwartet aus und ich kann das Schwarz, das Sie sehen, nicht reproduzieren. Was mache ich falsch"? –

+0

hmm! ist das ein Fehler in C++ oder ist es möglich, dass ich Cairo mit der FreeType-Bibliothek nicht richtig erstellt habe - also falsche Ausgabe bekommen? –