[gtk/baselineoverlay: 1/3] inspector: Draw baselines as an overlay



commit ac9b7bb2fa0c5973df999abf5a233d2db8bcb028
Author: Matthias Clasen <mclasen redhat com>
Date:   Mon May 13 17:36:46 2019 +0000

    inspector: Draw baselines as an overlay

 gtk/inspector/baselineoverlay.c | 97 +++++++++++++++++++++++++++++++++++++++++
 gtk/inspector/baselineoverlay.h | 17 ++++++++
 gtk/inspector/meson.build       |  1 +
 gtk/inspector/visual.c          | 35 ++++++++++++---
 4 files changed, 143 insertions(+), 7 deletions(-)
---
diff --git a/gtk/inspector/baselineoverlay.c b/gtk/inspector/baselineoverlay.c
new file mode 100644
index 0000000000..8bd9e643b5
--- /dev/null
+++ b/gtk/inspector/baselineoverlay.c
@@ -0,0 +1,97 @@
+
+#include "config.h"
+#include "baselineoverlay.h"
+#include "gtkwidgetprivate.h"
+#include "gtkcssstyleprivate.h"
+#include "gtkcssnodeprivate.h"
+#include "gtkcssnumbervalueprivate.h"
+
+struct _GtkBaselineOverlay
+{
+  GtkInspectorOverlay parent_instance;
+};
+
+struct _GtkBaselineOverlayClass
+{
+  GtkInspectorOverlayClass parent_class;
+};
+
+G_DEFINE_TYPE (GtkBaselineOverlay, gtk_baseline_overlay, GTK_TYPE_INSPECTOR_OVERLAY)
+
+static void
+recurse_child_widgets (GtkWidget   *widget,
+                       GtkSnapshot *snapshot)
+{
+  int baseline;
+  GtkWidget *child;
+  GtkAllocation allocation;
+
+  if (!gtk_widget_get_mapped (widget))
+    return;
+
+  baseline = gtk_widget_get_allocated_baseline (widget);
+
+  if (baseline != -1)
+    {
+      GdkRGBA red = {1, 0, 0, 1};
+      graphene_rect_t bounds;
+      int width;
+
+      width = gtk_widget_get_width (widget);
+
+      /* Now do all the stuff */
+      gtk_snapshot_push_debug (snapshot, "Widget baseline debugging");
+
+      graphene_rect_init (&bounds,
+                          0, baseline,
+                          width, 1);
+      gtk_snapshot_append_color (snapshot, &red, &bounds);
+
+      gtk_snapshot_pop (snapshot);
+    }
+
+  /* Recurse into child widgets */
+  for (child = gtk_widget_get_first_child (widget);
+       child != NULL;
+       child = gtk_widget_get_next_sibling (child))
+    {
+      graphene_matrix_t matrix;
+
+      gtk_widget_compute_transform (child, widget, &matrix);
+
+      gtk_snapshot_save (snapshot);
+      gtk_snapshot_transform_matrix (snapshot, &matrix);
+
+      recurse_child_widgets (child, snapshot);
+
+      gtk_snapshot_restore (snapshot);
+    }
+}
+
+static void
+gtk_baseline_overlay_snapshot (GtkInspectorOverlay *overlay,
+                               GtkSnapshot         *snapshot,
+                               GskRenderNode       *node,
+                               GtkWidget           *widget)
+{
+  recurse_child_widgets (widget, snapshot);
+}
+
+static void
+gtk_baseline_overlay_init (GtkBaselineOverlay *self)
+{
+}
+
+static void
+gtk_baseline_overlay_class_init (GtkBaselineOverlayClass *klass)
+{
+  GtkInspectorOverlayClass *overlay_class = (GtkInspectorOverlayClass *)klass;
+
+  overlay_class->snapshot = gtk_baseline_overlay_snapshot;
+}
+
+GtkInspectorOverlay *
+gtk_baseline_overlay_new (void)
+{
+  return g_object_new (GTK_TYPE_BASELINE_OVERLAY, NULL);
+}
diff --git a/gtk/inspector/baselineoverlay.h b/gtk/inspector/baselineoverlay.h
new file mode 100644
index 0000000000..5901940101
--- /dev/null
+++ b/gtk/inspector/baselineoverlay.h
@@ -0,0 +1,17 @@
+#ifndef __GTK_BASELINE_OVERLAY_H__
+#define __GTK_BASELINE_OVERLAY_H__
+
+#include "inspectoroverlay.h"
+
+G_BEGIN_DECLS
+
+#define GTK_TYPE_BASELINE_OVERLAY             (gtk_baseline_overlay_get_type ())
+G_DECLARE_FINAL_TYPE (GtkBaselineOverlay, gtk_baseline_overlay, GTK, BASELINE_OVERLAY, GtkInspectorOverlay)
+
+GtkInspectorOverlay *   gtk_baseline_overlay_new                 (void);
+
+G_END_DECLS
+
+
+
+#endif
diff --git a/gtk/inspector/meson.build b/gtk/inspector/meson.build
index a26d67ed87..9bba978a9b 100644
--- a/gtk/inspector/meson.build
+++ b/gtk/inspector/meson.build
@@ -1,6 +1,7 @@
 inspector_sources = files(
   'action-editor.c',
   'actions.c',
+  'baselineoverlay.c',
   'cellrenderergraph.c',
   'controllers.c',
   'css-editor.c',
diff --git a/gtk/inspector/visual.c b/gtk/inspector/visual.c
index ce8f1dbe73..aed3daf8be 100644
--- a/gtk/inspector/visual.c
+++ b/gtk/inspector/visual.c
@@ -23,6 +23,7 @@
 #include "fpsoverlay.h"
 #include "updatesoverlay.h"
 #include "layoutoverlay.h"
+#include "baselineoverlay.h"
 #include "window.h"
 
 #include "gtkadjustment.h"
@@ -85,6 +86,7 @@ struct _GtkInspectorVisualPrivate
   GtkInspectorOverlay *fps_overlay;
   GtkInspectorOverlay *updates_overlay;
   GtkInspectorOverlay *layout_overlay;
+  GtkInspectorOverlay *baseline_overlay;
 };
 
 G_DEFINE_TYPE_WITH_PRIVATE (GtkInspectorVisual, gtk_inspector_visual, GTK_TYPE_SCROLLED_WINDOW)
@@ -301,18 +303,37 @@ updates_activate (GtkSwitch          *sw,
 }
 
 static void
-baselines_activate (GtkSwitch *sw)
+baselines_activate (GtkSwitch          *sw,
+                    GParamSpec         *pspec,
+                    GtkInspectorVisual *vis)
 {
-  guint flags;
+  GtkInspectorVisualPrivate *priv = vis->priv;
+  GtkInspectorWindow *iw;
+  gboolean baselines;
 
-  flags = gtk_get_debug_flags ();
+  baselines = gtk_switch_get_active (sw);
+  iw = GTK_INSPECTOR_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (vis)));
+  if (iw == NULL)
+    return;
 
-  if (gtk_switch_get_active (sw))
-    flags |= GTK_DEBUG_BASELINES;
+  if (baselines)
+    {
+      if (priv->baseline_overlay == NULL)
+        {
+          priv->baseline_overlay = gtk_baseline_overlay_new ();
+          gtk_inspector_window_add_overlay (iw, priv->baseline_overlay);
+          g_object_unref (priv->baseline_overlay);
+        }
+    }
   else
-    flags &= ~GTK_DEBUG_BASELINES;
+    {
+      if (priv->baseline_overlay != NULL)
+        {
+          gtk_inspector_window_remove_overlay (iw, priv->baseline_overlay);
+          priv->baseline_overlay = NULL;
+        }
+    }
 
-  gtk_set_debug_flags (flags);
   redraw_everything ();
 }
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]