У меня проблема с отображением альфа-прозрачности с использованием GTK и Каира. Я пытаюсь показать это изображение 1Альфа прозрачность в Каире
Если я делаю альфа-смешение себя, все работает.
Если я передать значения альфа непосредственно в Каир, тень, кажется, делают хорошо, но эффект свечения поврежден.
Является ли это ошибка в Каире 1.14.2, или я что-то отсутствует?
//Need deprecated API to get background color
GdkColor color = gtk_widget_get_style(widget)->bg[GTK_STATE_NORMAL];
Pixel color_blend
{
uint8_t(255*color.red/65535.0f)
,uint8_t(255*color.green/65535.0f)
,uint8_t(255*color.blue/65535.0f)
,255
};
while(ptr!=ptr_end)
{
// TODO: Interpolate
auto row_src=size_t(row*factor);
auto col_src=size_t(col*factor);
auto alpha=ptr_src[row_src*width_in + col_src].v3/255.0f;
*ptr=
{
// Using manual alpha blend works
uint8_t(alpha*ptr_src[row_src*width_in + col_src].v2 + (1-alpha)*color_blend.v2)
,uint8_t(alpha*ptr_src[row_src*width_in + col_src].v1 + (1-alpha)*color_blend.v1)
,uint8_t(alpha*ptr_src[row_src*width_in + col_src].v0 + (1-alpha)*color_blend.v0)
,255
/* This appears to be broken
ptr_src[row_src*width_in + col_src].v2
,ptr_src[row_src*width_in + col_src].v1
,ptr_src[row_src*width_in + col_src].v0
,ptr_src[row_src*width_in + col_src].v3*/
};
++col;
if(col==width_out)
{
col=0;
++row;
}
++ptr;
}
Я толкаю пиксели с помощью
auto surface=cairo_image_surface_create_for_data((uint8_t*)pixels.begin(),CAIRO_FORMAT_ARGB32,width_out,height_out,width_out*sizeof(Pixel));
cairo_set_source_surface(cr, surface, 0.5*(width-width_out), 0.0);
cairo_paint(cr);
cairo_surface_destroy(surface);
Явной установки оператору CAIRO_OPERATOR_OVER не помогает, результат все тот же.
Вы используете правильный оператор, т. Е. CAIRO_OPERATOR_OVER вместо CAIRO_OPERATOR_SOURCE? –
@ H. Guijt CAIRO_OPERATOR_OVER по умолчанию, и указание его явно дает тот же результат. Однако изменение в CAIRO_OPERATOR_SOURCE имеет правильное поведение, то есть я получаю полупрозрачное окно. – user877329
Это не имеет никакого смысла ... Uhm, как насчет формата поверхности адресата: это RGB или ARGB? –