Каир наполняется прозрачностью

Я новичок в Каире, пытаюсь создать текст с прозрачным цветом и обводкой.
прозрачность цвета обводки работает, но прозрачность цвета заливки текста transparency_value не работает. Если я уменьшу transparency_value , цвет текста станет темнее (черный), а увеличение transparency_value сделает цвет текста ярче (зеленый в моем случае)

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

person Prakash M    schedule 08.04.2017    source источник


Ответы (1)


Может быть, вы рисуете текст за пределами поверхности? В следующем примере я добавил вызов cairo_move_to(cr, 200, 200) и теперь получаю следующий результат. (Это написано на Lua и использует https://github.com/pavouk/lgi для вызова cairo; комментарии указывают на то, что я изменил по сравнению с вашей версией)

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

введите здесь описание изображения

Изменить: и это результат, когда я меняю transparency_value на 0,1. Понятно, что результат другой и прозрачность работает корректно (при увеличении вы все равно видите какой-то бледно-зеленый в середине).

введите здесь описание изображения

person Uli Schlachter    schedule 12.04.2017
comment
Спасибо за ваш ответ. Я использовал cairo_move_to, иначе я бы не увидел вывод. чтобы сделать код короче, я пропустил cairo_move_to. Я обновил код. я делаю какую-либо ошибку в порядке вызовов функций? а вы пытались изменить transparency_value в своем коде? - person Prakash M; 13.04.2017
comment
Смотрите мою правку. Я добавил еще одно изображение, показывающее результат с transparency_value = 0.1. Результат по-прежнему выглядит так, как ожидалось, и я не могу воспроизвести черный цвет, который вы видите. Что я делаю не так? - person Uli Schlachter; 13.04.2017
comment
хм! это ошибка в C ++ или возможно, что я неправильно собрал cairo с библиотекой freeType, поэтому получаю неправильный вывод? - person Prakash M; 13.04.2017
comment
Ошибка в C++? Как в стандарте ISO? Почему? И Freetype здесь прозрачностью не занимается. Итак, что именно вы видите на своем конце? Можете ли вы создать минимальный пример воспроизведения, который я мог бы запустить здесь? - person Uli Schlachter; 14.04.2017