Merge branch 'matthiasc/for-main' into 'main'
testdmabuf: Be more dynamic See merge request GNOME/gtk!6865
This commit is contained in:
@@ -452,7 +452,8 @@ static GdkTexture *
|
|||||||
make_dmabuf_texture (const char *filename,
|
make_dmabuf_texture (const char *filename,
|
||||||
guint32 format,
|
guint32 format,
|
||||||
gboolean disjoint,
|
gboolean disjoint,
|
||||||
gboolean premultiplied)
|
gboolean premultiplied,
|
||||||
|
gboolean flip)
|
||||||
{
|
{
|
||||||
GdkTexture *texture;
|
GdkTexture *texture;
|
||||||
GdkTextureDownloader *downloader;
|
GdkTextureDownloader *downloader;
|
||||||
@@ -491,6 +492,20 @@ make_dmabuf_texture (const char *filename,
|
|||||||
|
|
||||||
g_object_unref (texture);
|
g_object_unref (texture);
|
||||||
|
|
||||||
|
if (flip)
|
||||||
|
{
|
||||||
|
for (int y = 0; y < height; y++)
|
||||||
|
{
|
||||||
|
guint32 *row = (guint32 *) (rgb_data + y * rgb_stride);
|
||||||
|
for (int x = 0; x < width / 2; x++)
|
||||||
|
{
|
||||||
|
guint32 p = row[x];
|
||||||
|
row[x] = row[width - 1 - x];
|
||||||
|
row[width - 1 - x] = p;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
builder = gdk_dmabuf_texture_builder_new ();
|
builder = gdk_dmabuf_texture_builder_new ();
|
||||||
|
|
||||||
gdk_dmabuf_texture_builder_set_display (builder, gdk_display_get_default ());
|
gdk_dmabuf_texture_builder_set_display (builder, gdk_display_get_default ());
|
||||||
@@ -648,11 +663,66 @@ parse_format (const char *a)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
toggle_fullscreen (GtkWidget *widget,
|
||||||
|
GVariant *args,
|
||||||
|
gpointer data)
|
||||||
|
{
|
||||||
|
GtkWindow *window = GTK_WINDOW (widget);
|
||||||
|
|
||||||
|
if (gtk_window_is_fullscreen (window))
|
||||||
|
gtk_window_unfullscreen (window);
|
||||||
|
else
|
||||||
|
gtk_window_fullscreen (window);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
toggle_overlay (GtkWidget *widget,
|
||||||
|
GVariant *args,
|
||||||
|
gpointer data)
|
||||||
|
{
|
||||||
|
static GtkWidget *child = NULL;
|
||||||
|
GtkOverlay *overlay = data;
|
||||||
|
|
||||||
|
if (child)
|
||||||
|
{
|
||||||
|
gtk_overlay_remove_overlay (overlay, child);
|
||||||
|
child = NULL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
child = gtk_image_new_from_icon_name ("media-playback-start-symbolic");
|
||||||
|
gtk_image_set_icon_size (GTK_IMAGE (child), GTK_ICON_SIZE_LARGE);
|
||||||
|
gtk_overlay_add_overlay (overlay, child);
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static GdkTexture *texture;
|
||||||
|
static GdkTexture *texture_flipped;
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
toggle_flip (GtkWidget *widget,
|
||||||
|
GVariant *args,
|
||||||
|
gpointer data)
|
||||||
|
{
|
||||||
|
GtkPicture *picture = data;
|
||||||
|
|
||||||
|
if (gtk_picture_get_paintable (picture) == GDK_PAINTABLE (texture))
|
||||||
|
gtk_picture_set_paintable (picture, GDK_PAINTABLE (texture_flipped));
|
||||||
|
else
|
||||||
|
gtk_picture_set_paintable (picture, GDK_PAINTABLE (texture));
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
main (int argc, char *argv[])
|
main (int argc, char *argv[])
|
||||||
{
|
{
|
||||||
GdkTexture *texture;
|
GtkWidget *window, *offload, *picture, *overlay;
|
||||||
GtkWidget *window, *offload, *picture;
|
|
||||||
char *filename;
|
char *filename;
|
||||||
guint32 format;
|
guint32 format;
|
||||||
gboolean disjoint = FALSE;
|
gboolean disjoint = FALSE;
|
||||||
@@ -661,6 +731,10 @@ main (int argc, char *argv[])
|
|||||||
gboolean fullscreen = FALSE;
|
gboolean fullscreen = FALSE;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
const char *save_filename = NULL;
|
const char *save_filename = NULL;
|
||||||
|
GtkEventController *controller;
|
||||||
|
GtkShortcutTrigger *trigger;
|
||||||
|
GtkShortcutAction *action;
|
||||||
|
GtkShortcut *shortcut;
|
||||||
|
|
||||||
for (i = 1; i < argc; i++)
|
for (i = 1; i < argc; i++)
|
||||||
{
|
{
|
||||||
@@ -698,7 +772,8 @@ main (int argc, char *argv[])
|
|||||||
/* Get the list of supported formats with GDK_DEBUG=opengl */
|
/* Get the list of supported formats with GDK_DEBUG=opengl */
|
||||||
gdk_display_get_dmabuf_formats (gdk_display_get_default ());
|
gdk_display_get_dmabuf_formats (gdk_display_get_default ());
|
||||||
|
|
||||||
texture = make_dmabuf_texture (filename, format, disjoint, premultiplied);
|
texture = make_dmabuf_texture (filename, format, disjoint, premultiplied, FALSE);
|
||||||
|
texture_flipped = make_dmabuf_texture (filename, format, disjoint, premultiplied, TRUE);
|
||||||
|
|
||||||
if (save_filename)
|
if (save_filename)
|
||||||
gdk_texture_save_to_png (texture, save_filename);
|
gdk_texture_save_to_png (texture, save_filename);
|
||||||
@@ -709,10 +784,30 @@ main (int argc, char *argv[])
|
|||||||
gtk_window_fullscreen (GTK_WINDOW (window));
|
gtk_window_fullscreen (GTK_WINDOW (window));
|
||||||
|
|
||||||
picture = gtk_picture_new_for_paintable (GDK_PAINTABLE (texture));
|
picture = gtk_picture_new_for_paintable (GDK_PAINTABLE (texture));
|
||||||
|
|
||||||
offload = gtk_graphics_offload_new (picture);
|
offload = gtk_graphics_offload_new (picture);
|
||||||
|
overlay = gtk_overlay_new ();
|
||||||
|
|
||||||
gtk_window_set_child (GTK_WINDOW (window), offload);
|
gtk_overlay_set_child (GTK_OVERLAY (overlay), offload);
|
||||||
|
gtk_window_set_child (GTK_WINDOW (window), overlay);
|
||||||
|
|
||||||
|
controller = gtk_shortcut_controller_new ();
|
||||||
|
|
||||||
|
trigger = gtk_keyval_trigger_new (GDK_KEY_F11, GDK_NO_MODIFIER_MASK);
|
||||||
|
action = gtk_callback_action_new (toggle_fullscreen, NULL, NULL);
|
||||||
|
shortcut = gtk_shortcut_new (trigger, action);
|
||||||
|
gtk_shortcut_controller_add_shortcut (GTK_SHORTCUT_CONTROLLER (controller), shortcut);
|
||||||
|
|
||||||
|
trigger = gtk_keyval_trigger_new (GDK_KEY_O, GDK_CONTROL_MASK);
|
||||||
|
action = gtk_callback_action_new (toggle_overlay, overlay, NULL);
|
||||||
|
shortcut = gtk_shortcut_new (trigger, action);
|
||||||
|
gtk_shortcut_controller_add_shortcut (GTK_SHORTCUT_CONTROLLER (controller), shortcut);
|
||||||
|
|
||||||
|
trigger = gtk_keyval_trigger_new (GDK_KEY_F, GDK_CONTROL_MASK);
|
||||||
|
action = gtk_callback_action_new (toggle_flip, picture, NULL);
|
||||||
|
shortcut = gtk_shortcut_new (trigger, action);
|
||||||
|
gtk_shortcut_controller_add_shortcut (GTK_SHORTCUT_CONTROLLER (controller), shortcut);
|
||||||
|
|
||||||
|
gtk_widget_add_controller (window, controller);
|
||||||
|
|
||||||
gtk_window_present (GTK_WINDOW (window));
|
gtk_window_present (GTK_WINDOW (window));
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user