Linux (GTK) 및 OSX에서 투명한 창 (알파 채널 포함)을 그려야합니다. 거기에 할 수있는 API가 있습니까? 전역 투명도를 설정하지 않으려는 경우 픽셀 당 알파 수준을 설정해야합니다.GTK 및 OSX에서 픽셀 별 알파 블렌드를 수행하는 API가 있습니까?
이 예제에서와 같이 Windows에서 UpdateLayeredWindow 함수와 동일한 종류의 API를 찾고 있습니다 : Per Pixel Alpha Blend.
Linux (GTK) 및 OSX에서 투명한 창 (알파 채널 포함)을 그려야합니다. 거기에 할 수있는 API가 있습니까? 전역 투명도를 설정하지 않으려는 경우 픽셀 당 알파 수준을 설정해야합니다.GTK 및 OSX에서 픽셀 별 알파 블렌드를 수행하는 API가 있습니까?
이 예제에서와 같이 Windows에서 UpdateLayeredWindow 함수와 동일한 종류의 API를 찾고 있습니다 : Per Pixel Alpha Blend.
Mac OS X의 경우 RoundTransparentWindow 샘플 코드를 참조하십시오. 그것은 완전히 투명 한 커스텀 윈도우를 사용하고 그 안에 도형을 그려서 작동합니다. 이 예제에서는 단단한 가장자리 + 전체 알파가있는 모양 만 사용하지만 임의의 알파를 사용할 수 있습니다.
이 예제에서는 사용자 지정 창을 사용하지만 setOpaque:NO
을 호출하여 동일한 기술을 사용하여 일반 창에서 구멍을 펀칭 할 수 있습니다. Hacky example :
@implementation ClearView
- (void)drawRect:(NSRect)rect
{
if (mask == nil) mask = [[NSImage imageNamed:@"mask"] retain];
[self.window setOpaque:NO];
[mask drawInRect:self.bounds
fromRect:(NSRect){{0, 0},mask.size}
operation:NSCompositeCopy
fraction:1.0];
}
@end
이 기술의 주요 한계는 표준 드롭 섀도우가 알파 블렌딩 된 가장자리와 아주 잘 상호 작용하지 않는다는 것입니다.
올해 초 실험 폴더에이 코드가 있습니다. 나는이 책을 얼마나 많이 쓰고 얼마나 많은 정보를 인터넷의 다른 곳에서 얻었는지를 기억하지 못한다.
이 예제는 완전히 불투명 한 GTK + 버튼이 중앙에있는 부분적으로 투명한 청색 윈도우를 표시합니다. 예를 들어, 창 안의 알파 블렌딩 된 PNG를 그리면 올바르게 합성됩니다. 바라기를 이것은 당신을 바른 길로 인도 할 것입니다.
다음으로 컴파일 :
$ gcc `pkg-config --cflags --libs gtk+-2.0` -o per-pixel-opacity per-pixel-opacity.c
를 이제 코드 :
#include <gtk/gtk.h>
static gboolean on_window_expose_event(GtkWidget *widget, GdkEventExpose *event, gpointer data)
{
cairo_t *cr;
cr = gdk_cairo_create(widget->window); // create cairo context
cairo_set_source_rgba(cr, 0.0, 0.0, 1.0, 0.2);
cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE); // set drawing compositing operator
// SOURCE -> replace destination
cairo_paint(cr); // paint source
cairo_destroy(cr);
return FALSE;
}
gint main(gint argc, gchar **argv)
{
GtkWidget *window, *button, *vbox;
GdkScreen *screen;
GdkColormap *colormap;
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
g_signal_connect(G_OBJECT(window), "delete-event", gtk_main_quit, NULL);
g_signal_connect(G_OBJECT(window), "expose-event", G_CALLBACK(on_window_expose_event), NULL);
gtk_window_set_decorated(GTK_WINDOW(window), FALSE);
gtk_container_set_border_width(GTK_CONTAINER(window), 20);
gtk_widget_set_app_paintable(window, TRUE);
screen = gtk_widget_get_screen(window);
colormap = gdk_screen_get_rgba_colormap(screen);
gtk_widget_set_colormap(window, colormap);
button = gtk_button_new();
gtk_button_set_label(GTK_BUTTON(button), "Don't Press!");
gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(button));
gtk_widget_show_all(window);
gtk_main();
return 0;
}