Anonymous
Как установить радиальный градиент (рисунок) CSS на поверхности Каира и сохранить его как png в gtk4?
Сообщение
Anonymous » 02 июл 2024, 11:18
Я пытаюсь нарисовать круг в Gtk4 GtkDrawingarea, используя
CSS . А затем щелкнув по нему, он сохранится в формате PNG. Но не удалось перенести рисунок (градиент) из области рисования на
поверхность cairo (cairo_surface_t).
Можно ли каким-либо образом сохранить рисунок, выполненный через css? Вот мой код,
Код: Выделить всё
#include
//draw function
static void
draw_function (GtkDrawingArea *darea,
cairo_t *cr,
int width,
int height,
gpointer user_data)
{
GdkDisplay *display = gdk_display_get_default ();
GtkCssProvider* provider = gtk_css_provider_new ();
gtk_css_provider_load_from_data (provider,
"#darea { border-radius: 50%;"
" background: radial-gradient(#FFFFFF, #000000); "
"}",-1);
gtk_style_context_add_provider (gtk_widget_get_style_context (GTK_WIDGET (darea)),
GTK_STYLE_PROVIDER (provider),GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
g_object_unref(provider);
}
/*save as png on click*/
void click_event (GtkEventController *gesture,
gdouble x,
gdouble y,
gpointer user_data)
{
//user_data = darea (widget)
int w1 = gtk_widget_get_allocated_width(user_data);
int h1 = gtk_widget_get_allocated_height(user_data);
/*paintable from the darea widget*/
GdkPaintable* paintable = gtk_widget_paintable_new (user_data);
/*take snapshoot*/
GdkSnapshot* snapshot = gtk_snapshot_new();
gdk_paintable_snapshot (paintable, snapshot, w1, h1);
graphene_rect_t *rec = graphene_rect_alloc ();
GskRenderNode* ren = gsk_cairo_node_new (rec);
cairo_t* cr = gtk_snapshot_append_cairo (snapshot, rec);
cairo_surface_t* srf = gsk_cairo_node_get_surface ((GskRenderNode *)ren);
cairo_surface_write_to_png (srf, "blur.png"); //use it -error Segmentation fault
}
static void
activate (GtkApplication* app,
gpointer user_data)
{
GtkWidget *window;
window = gtk_application_window_new (app);
gtk_window_set_title (GTK_WINDOW (window), "Window");
gtk_window_set_default_size (GTK_WINDOW (window), 200, 200);
gtk_window_present (GTK_WINDOW (window));
GtkWidget *darea = gtk_drawing_area_new();
gtk_widget_set_name (darea, "darea");
gtk_drawing_area_set_content_width (GTK_DRAWING_AREA (darea), 350);
gtk_drawing_area_set_content_height (GTK_DRAWING_AREA (darea), 350);
gtk_drawing_area_set_draw_func (GTK_DRAWING_AREA (darea),
draw_function,
NULL, NULL);
gtk_window_set_child (GTK_WINDOW (window), darea);
//create gesture for mouse click event
GtkGesture * = gtk_gesture_click_new();
gtk_gesture_single_set_button(GTK_GESTURE_SINGLE(gesture), 0);
gtk_widget_add_controller(darea,(GTK_EVENT_CONTROLLER(gesture)));
g_signal_connect (gesture, "pressed", G_CALLBACK (click_event), darea);
gtk_window_present (GTK_WINDOW(window));
}
int
main (int argc,
char **argv)
{
GtkApplication *app;
int status;
app = gtk_application_new ("org.gtk.example", G_APPLICATION_DEFAULT_FLAGS);
g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);
status = g_application_run (G_APPLICATION (app), argc, argv);
g_object_unref (app);
return status;
}
Но он не работает, он сломался!
Подробнее здесь:
https://stackoverflow.com/questions/786 ... -as-png-in
1719908314
Anonymous
Я пытаюсь нарисовать круг в Gtk4 GtkDrawingarea, используя [b]CSS[/b]. А затем щелкнув по нему, он сохранится в формате PNG. Но не удалось перенести рисунок (градиент) из области рисования на [b]поверхность cairo[/b] (cairo_surface_t). Можно ли каким-либо образом сохранить рисунок, выполненный через css? Вот мой код, [code]#include //draw function static void draw_function (GtkDrawingArea *darea, cairo_t *cr, int width, int height, gpointer user_data) { GdkDisplay *display = gdk_display_get_default (); GtkCssProvider* provider = gtk_css_provider_new (); gtk_css_provider_load_from_data (provider, "#darea { border-radius: 50%;" " background: radial-gradient(#FFFFFF, #000000); " "}",-1); gtk_style_context_add_provider (gtk_widget_get_style_context (GTK_WIDGET (darea)), GTK_STYLE_PROVIDER (provider),GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); g_object_unref(provider); } /*save as png on click*/ void click_event (GtkEventController *gesture, gdouble x, gdouble y, gpointer user_data) { //user_data = darea (widget) int w1 = gtk_widget_get_allocated_width(user_data); int h1 = gtk_widget_get_allocated_height(user_data); /*paintable from the darea widget*/ GdkPaintable* paintable = gtk_widget_paintable_new (user_data); /*take snapshoot*/ GdkSnapshot* snapshot = gtk_snapshot_new(); gdk_paintable_snapshot (paintable, snapshot, w1, h1); graphene_rect_t *rec = graphene_rect_alloc (); GskRenderNode* ren = gsk_cairo_node_new (rec); cairo_t* cr = gtk_snapshot_append_cairo (snapshot, rec); cairo_surface_t* srf = gsk_cairo_node_get_surface ((GskRenderNode *)ren); cairo_surface_write_to_png (srf, "blur.png"); //use it -error Segmentation fault } static void activate (GtkApplication* app, gpointer user_data) { GtkWidget *window; window = gtk_application_window_new (app); gtk_window_set_title (GTK_WINDOW (window), "Window"); gtk_window_set_default_size (GTK_WINDOW (window), 200, 200); gtk_window_present (GTK_WINDOW (window)); GtkWidget *darea = gtk_drawing_area_new(); gtk_widget_set_name (darea, "darea"); gtk_drawing_area_set_content_width (GTK_DRAWING_AREA (darea), 350); gtk_drawing_area_set_content_height (GTK_DRAWING_AREA (darea), 350); gtk_drawing_area_set_draw_func (GTK_DRAWING_AREA (darea), draw_function, NULL, NULL); gtk_window_set_child (GTK_WINDOW (window), darea); //create gesture for mouse click event GtkGesture * = gtk_gesture_click_new(); gtk_gesture_single_set_button(GTK_GESTURE_SINGLE(gesture), 0); gtk_widget_add_controller(darea,(GTK_EVENT_CONTROLLER(gesture))); g_signal_connect (gesture, "pressed", G_CALLBACK (click_event), darea); gtk_window_present (GTK_WINDOW(window)); } int main (int argc, char **argv) { GtkApplication *app; int status; app = gtk_application_new ("org.gtk.example", G_APPLICATION_DEFAULT_FLAGS); g_signal_connect (app, "activate", G_CALLBACK (activate), NULL); status = g_application_run (G_APPLICATION (app), argc, argv); g_object_unref (app); return status; } [/code] Но он не работает, он сломался! Подробнее здесь: [url]https://stackoverflow.com/questions/78695801/how-to-set-css-radial-gradient-drawing-on-cairo-surface-and-save-it-as-png-in[/url]