86 lines
2.7 KiB
C
86 lines
2.7 KiB
C
|
|
||
|
#include "config.h"
|
||
|
#include "subsurfaceoverlay.h"
|
||
|
#include "gtkwidgetprivate.h"
|
||
|
#include "gtknative.h"
|
||
|
#include "gdksurfaceprivate.h"
|
||
|
#include "gdksubsurfaceprivate.h"
|
||
|
|
||
|
struct _GtkSubsurfaceOverlay
|
||
|
{
|
||
|
GtkInspectorOverlay parent_instance;
|
||
|
};
|
||
|
|
||
|
struct _GtkSubsurfaceOverlayClass
|
||
|
{
|
||
|
GtkInspectorOverlayClass parent_class;
|
||
|
};
|
||
|
|
||
|
G_DEFINE_TYPE (GtkSubsurfaceOverlay, gtk_subsurface_overlay, GTK_TYPE_INSPECTOR_OVERLAY)
|
||
|
|
||
|
static void
|
||
|
gtk_subsurface_overlay_snapshot (GtkInspectorOverlay *overlay,
|
||
|
GtkSnapshot *snapshot,
|
||
|
GskRenderNode *node,
|
||
|
GtkWidget *widget)
|
||
|
{
|
||
|
GdkSurface *surface = gtk_widget_get_surface (widget);
|
||
|
double native_x, native_y;
|
||
|
|
||
|
gtk_native_get_surface_transform (GTK_NATIVE (widget), &native_x, &native_y);
|
||
|
|
||
|
gtk_snapshot_save (snapshot);
|
||
|
|
||
|
/* Subsurface positions are relative to the surface, so undo the surface
|
||
|
* transform that gtk_inspector_prepare_render does.
|
||
|
*/
|
||
|
gtk_snapshot_translate (snapshot, &(graphene_point_t) { - native_x, - native_y });
|
||
|
|
||
|
for (gsize i = 0; i < gdk_surface_get_n_subsurfaces (surface); i++)
|
||
|
{
|
||
|
GdkSubsurface *subsurface = gdk_surface_get_subsurface (surface, i);
|
||
|
graphene_rect_t rect;
|
||
|
GdkRGBA color;
|
||
|
|
||
|
if (gdk_subsurface_get_texture (subsurface) == NULL)
|
||
|
continue;
|
||
|
|
||
|
if (gdk_subsurface_is_above_parent (subsurface))
|
||
|
gdk_rgba_parse (&color, "goldenrod");
|
||
|
else
|
||
|
gdk_rgba_parse (&color, "magenta");
|
||
|
|
||
|
gdk_subsurface_get_rect (subsurface, &rect);
|
||
|
|
||
|
/* Use 4 color nodes since a border node overlaps and prevents
|
||
|
* the subsurface from being raised.
|
||
|
*/
|
||
|
gtk_snapshot_append_color (snapshot, &color, &GRAPHENE_RECT_INIT (rect.origin.x - 2, rect.origin.y - 2, 2, rect.size.height + 4));
|
||
|
gtk_snapshot_append_color (snapshot, &color, &GRAPHENE_RECT_INIT (rect.origin.x - 2, rect.origin.y - 2, rect.size.width + 4, 2));
|
||
|
gtk_snapshot_append_color (snapshot, &color, &GRAPHENE_RECT_INIT (rect.origin.x - 2, rect.origin.y + rect.size.height, rect.size.width + 4, 2));
|
||
|
gtk_snapshot_append_color (snapshot, &color, &GRAPHENE_RECT_INIT (rect.origin.x + rect.size.width, rect.origin.y - 2, 2, rect.size.height + 4));
|
||
|
}
|
||
|
|
||
|
gtk_snapshot_restore (snapshot);
|
||
|
}
|
||
|
|
||
|
static void
|
||
|
gtk_subsurface_overlay_init (GtkSubsurfaceOverlay *self)
|
||
|
{
|
||
|
|
||
|
}
|
||
|
|
||
|
static void
|
||
|
gtk_subsurface_overlay_class_init (GtkSubsurfaceOverlayClass *klass)
|
||
|
{
|
||
|
GtkInspectorOverlayClass *overlay_class = (GtkInspectorOverlayClass *)klass;
|
||
|
|
||
|
overlay_class->snapshot = gtk_subsurface_overlay_snapshot;
|
||
|
}
|
||
|
|
||
|
GtkInspectorOverlay *
|
||
|
gtk_subsurface_overlay_new (void)
|
||
|
{
|
||
|
return g_object_new (GTK_TYPE_SUBSURFACE_OVERLAY, NULL);
|
||
|
}
|