gsk: Fold gsk_renderer_begin_draw_frame() into renderer
authorBenjamin Otte <otte@redhat.com>
Tue, 27 Mar 2018 23:29:39 +0000 (01:29 +0200)
committerBenjamin Otte <otte@redhat.com>
Thu, 5 Apr 2018 12:56:38 +0000 (14:56 +0200)
It doesn't need to be exported anymore.

As a side effect, the inspector no longer has any information about the
render region, so remove the code that was taking care of that.

12 files changed:
docs/reference/gsk/gsk4-sections.txt
gsk/gskrenderer.c
gsk/gskrenderer.h
gtk/gtkwidget.c
gtk/inspector/recorder.c
gtk/inspector/recorder.h
gtk/inspector/rendernodeview.c
gtk/inspector/rendernodeview.h
gtk/inspector/renderrecording.c
gtk/inspector/renderrecording.h
gtk/inspector/window.c
gtk/inspector/window.h

index 0d4a80c55f63a28c25044c11806baf93a56e5e7a..25fc3cdfd57e3d668b6891abe8e851817270b45a 100644 (file)
@@ -5,8 +5,6 @@ gsk_renderer_get_surface
 gsk_renderer_get_display
 gsk_renderer_realize
 gsk_renderer_unrealize
-gsk_renderer_begin_draw_frame
-gsk_renderer_end_draw_frame
 gsk_renderer_render
 gsk_renderer_render_texture
 <SUBSECTION Standard>
index 44b7bbef0e2fbdf96f89623c9eef3fe49e5d7e03..9a1e568fa85a7b40f5de0abac443c2a20881dcc8 100644 (file)
@@ -24,9 +24,8 @@
  * #GskRenderer is a class that renders a scene graph defined via a
  * tree of #GskRenderNode instances.
  *
- * Typically you will use a #GskRenderer instance with a #GdkDrawingContext
- * associated to a #GdkSurface, and call gsk_renderer_render() with the
- * drawing context and the scene to be rendered.
+ * Typically you will use a #GskRenderer instance to repeatedly call
+ * gsk_renderer_render() to update the contents of its associated #GdkSurface.
  *
  * It is necessary to realize a #GskRenderer instance using gsk_renderer_realize()
  * before calling gsk_renderer_render(), in order to create the appropriate
@@ -505,18 +504,24 @@ gsk_renderer_render_texture (GskRenderer           *renderer,
  * gsk_renderer_render:
  * @renderer: a #GskRenderer
  * @root: a #GskRenderNode
- * @context: The drawing context created via gsk_renderer_begin_draw_frame()
+ * @region: the #cairo_region_t that must be redrawn or %NULL for the whole
+ *     window
  *
  * Renders the scene graph, described by a tree of #GskRenderNode instances,
- * using the given #GdkDrawingContext.
+ * ensuring that the given @region gets redrawn.
+ *
+ * Renderers must ensure that changes of the contents given by the @root
+ * node as well as the area given by @region are redrawn. They are however
+ * free to not redraw any pixel outside of @region if they can guarantee that
+ * it didn't change.
  *
  * The @renderer will acquire a reference on the #GskRenderNode tree while
  * the rendering is in progress.
  */
 void
-gsk_renderer_render (GskRenderer       *renderer,
-                     GskRenderNode     *root,
-                     GdkDrawingContext *context)
+gsk_renderer_render (GskRenderer          *renderer,
+                     GskRenderNode        *root,
+                     const cairo_region_t *region)
 {
   GskRendererPrivate *priv = gsk_renderer_get_instance_private (renderer);
 
@@ -524,11 +529,26 @@ gsk_renderer_render (GskRenderer       *renderer,
   g_return_if_fail (priv->is_realized);
   g_return_if_fail (GSK_IS_RENDER_NODE (root));
   g_return_if_fail (priv->root_node == NULL);
-  g_return_if_fail (GDK_IS_DRAWING_CONTEXT (context));
-  g_return_if_fail (context == priv->drawing_context);
 
   priv->root_node = gsk_render_node_ref (root);
 
+  if (region == NULL || GSK_RENDERER_DEBUG_CHECK (renderer, FULL_REDRAW))
+    {
+      cairo_region_t *full_surface;
+
+      full_surface = cairo_region_create_rectangle (&(GdkRectangle) {
+                                                       0, 0,
+                                                       gdk_surface_get_width (priv->surface),
+                                                       gdk_surface_get_height (priv->surface)
+                                                   });
+
+      priv->drawing_context = GSK_RENDERER_GET_CLASS (renderer)->begin_draw_frame (renderer, full_surface);
+
+      cairo_region_destroy (full_surface);
+    }
+  else
+    priv->drawing_context = GSK_RENDERER_GET_CLASS (renderer)->begin_draw_frame (renderer, region);
+
   GSK_RENDERER_GET_CLASS (renderer)->render (renderer, root);
 
 #ifdef G_ENABLE_DEBUG
@@ -548,6 +568,9 @@ gsk_renderer_render (GskRenderer       *renderer,
     }
 #endif
 
+  GSK_RENDERER_GET_CLASS (renderer)->end_draw_frame (renderer, priv->drawing_context);
+
+  priv->drawing_context = NULL;
   g_clear_pointer (&priv->root_node, gsk_render_node_unref);
 }
 
@@ -722,75 +745,6 @@ gsk_renderer_new_for_surface (GdkSurface *surface)
   return NULL;
 }
 
-/**
- * gsk_renderer_begin_draw_frame:
- * @renderer: a #GskRenderer
- * @region: the #cairo_region_t that you wish to draw
- *
- * Indicates that you are beginning the process of redrawing @region using
- * @renderer, and provides you with a #GdkDrawingContext to use for this.
- *
- * Returns: (transfer none): a #GdkDrawingContext context that should be used to
- * draw the contents of the @renderer. This context is owned by GDK.
- */
-GdkDrawingContext *
-gsk_renderer_begin_draw_frame (GskRenderer          *renderer,
-                               const cairo_region_t *region)
-{
-  GskRendererPrivate *priv = gsk_renderer_get_instance_private (renderer);
-
-  g_return_val_if_fail (GSK_IS_RENDERER (renderer), NULL);
-  g_return_val_if_fail (region != NULL, NULL);
-  g_return_val_if_fail (priv->drawing_context == NULL, NULL);
-
-#ifdef G_ENABLE_DEBUG
-  if (GSK_RENDERER_DEBUG_CHECK (renderer, FULL_REDRAW))
-    {
-      cairo_region_t *full_surface;
-
-      full_surface = cairo_region_create_rectangle (&(GdkRectangle) {
-                                                       0, 0,
-                                                       gdk_surface_get_width (priv->surface),
-                                                       gdk_surface_get_height (priv->surface)
-                                                   });
-
-      priv->drawing_context = GSK_RENDERER_GET_CLASS (renderer)->begin_draw_frame (renderer, full_surface);
-
-      cairo_region_destroy (full_surface);
-    }
-  else
-#endif
-  priv->drawing_context = GSK_RENDERER_GET_CLASS (renderer)->begin_draw_frame (renderer, region);
-
-  return priv->drawing_context;
-}
-
-/**
- * gsk_renderer_end_draw_frame:
- * @renderer: a #GskRenderer
- * @context: the drawing context returned by the matching call to
- *     gsk_renderer_begin_draw_frame()
- *
- * Release the drawning context returned by gsk_renderer_begin_draw_frame().
- *
- * Calls to gsk_renderer_begin_draw_frame() and gsk_renderer_end_draw_frame()
- * must be paired.
- */
-void
-gsk_renderer_end_draw_frame (GskRenderer       *renderer,
-                             GdkDrawingContext *context)
-{
-  GskRendererPrivate *priv = gsk_renderer_get_instance_private (renderer);
-
-  g_return_if_fail (GSK_IS_RENDERER (renderer));
-  g_return_if_fail (GDK_IS_DRAWING_CONTEXT (context));
-  g_return_if_fail (priv->drawing_context == context);
-
-  priv->drawing_context = NULL;
-
-  GSK_RENDERER_GET_CLASS (renderer)->end_draw_frame (renderer, context);
-}
-
 GskDebugFlags
 gsk_renderer_get_debug_flags (GskRenderer *renderer)
 {
index 1809afce2018088aea8759ccfccdf36b92b98b04..55b32b6c6ad2c06765aefe1823db08270da36191 100644 (file)
@@ -60,15 +60,9 @@ GdkTexture *            gsk_renderer_render_texture             (GskRenderer
                                                                  const graphene_rect_t   *viewport);
 
 GDK_AVAILABLE_IN_ALL
-GdkDrawingContext *     gsk_renderer_begin_draw_frame           (GskRenderer             *renderer,
-                                                                 const cairo_region_t    *region);
-GDK_AVAILABLE_IN_ALL
 void                    gsk_renderer_render                     (GskRenderer             *renderer,
                                                                  GskRenderNode           *root,
-                                                                 GdkDrawingContext       *context);
-GDK_AVAILABLE_IN_ALL
-void                    gsk_renderer_end_draw_frame             (GskRenderer             *renderer,
-                                                                 GdkDrawingContext       *context);
+                                                                 const cairo_region_t    *region);
 
 G_END_DECLS
 
index d6b91417e33df4821ed62de167c222b05421ba6a..34fa7bd9b847c0195a3f757fa7936ba046f50642 100644 (file)
@@ -14046,7 +14046,6 @@ gtk_widget_render (GtkWidget            *widget,
                    GdkSurface            *surface,
                    const cairo_region_t *region)
 {
-  GdkDrawingContext *context;
   GtkSnapshot *snapshot;
   GskRenderer *renderer;
   GskRenderNode *root;
@@ -14067,19 +14066,15 @@ gtk_widget_render (GtkWidget            *widget,
 
   if (root != NULL)
     {
-      context = gsk_renderer_begin_draw_frame (renderer, region);
-
       gtk_inspector_record_render (widget,
                                    renderer,
                                    surface,
                                    region,
-                                   context,
                                    root);
 
-      gsk_renderer_render (renderer, root, context);
-      gsk_render_node_unref (root);
+      gsk_renderer_render (renderer, root, region);
 
-      gsk_renderer_end_draw_frame (renderer, context);
+      gsk_render_node_unref (root);
     }
 }
 
index c42acff512097fcc866efcf15ac07cb442aa4ed0..67cdb49b36f371ada0d27acdea9b0ae3d11d2069 100644 (file)
@@ -105,8 +105,6 @@ recordings_list_row_selected (GtkListBox           *box,
                                             gtk_inspector_render_recording_get_node (GTK_INSPECTOR_RENDER_RECORDING (recording)));
       gtk_render_node_view_set_clip_region (GTK_RENDER_NODE_VIEW (priv->render_node_view),
                                             gtk_inspector_render_recording_get_clip_region (GTK_INSPECTOR_RENDER_RECORDING (recording)));
-      gtk_render_node_view_set_render_region (GTK_RENDER_NODE_VIEW (priv->render_node_view),
-                                              gtk_inspector_render_recording_get_render_region (GTK_INSPECTOR_RENDER_RECORDING (recording)));
       gtk_render_node_view_set_viewport (GTK_RENDER_NODE_VIEW (priv->render_node_view),
                                          gtk_inspector_render_recording_get_area (GTK_INSPECTOR_RENDER_RECORDING (recording)));
       gtk_tree_model_render_node_set_root_node (GTK_TREE_MODEL_RENDER_NODE (priv->render_node_model),
@@ -1075,18 +1073,15 @@ gtk_inspector_recorder_record_render (GtkInspectorRecorder *recorder,
                                       GskRenderer          *renderer,
                                       GdkSurface           *surface,
                                       const cairo_region_t *region,
-                                      GdkDrawingContext    *context,
                                       GskRenderNode        *node)
 {
   GtkInspectorRecording *recording;
   GdkFrameClock *frame_clock;
-  cairo_region_t *clip;
 
   if (!gtk_inspector_recorder_is_recording (recorder))
     return;
 
   frame_clock = gtk_widget_get_frame_clock (widget);
-  clip = gdk_drawing_context_get_clip (context);
 
   recording = gtk_inspector_render_recording_new (gdk_frame_clock_get_frame_time (frame_clock),
                                                   gsk_renderer_get_profiler (renderer),
@@ -1094,11 +1089,9 @@ gtk_inspector_recorder_record_render (GtkInspectorRecorder *recorder,
                                                     gdk_surface_get_width (surface),
                                                     gdk_surface_get_height (surface) },
                                                   region,
-                                                  clip,
                                                   node);
   gtk_inspector_recorder_add_recording (recorder, recording);
   g_object_unref (recording);
-  cairo_region_destroy (clip);
 }
 
 void
index 03adf058a338f50b2e95110b50d7cf56717ef949..945a198fe26d950c8d21f93e301c480f8237f75c 100644 (file)
@@ -56,7 +56,6 @@ void            gtk_inspector_recorder_record_render            (GtkInspectorRec
                                                                  GskRenderer            *renderer,
                                                                  GdkSurface             *surface,
                                                                  const cairo_region_t   *region,
-                                                                 GdkDrawingContext      *context,
                                                                  GskRenderNode          *node);
 
 G_END_DECLS
index cbd5d2ec3fd65cdf8e751e916ec01f154aef57c8..d98f86037bcb828839572e3e47831c5530fd8f7c 100644 (file)
@@ -34,7 +34,6 @@ struct _GtkRenderNodeViewPrivate
 {
   GdkRectangle viewport;
   GskRenderNode *render_node;
-  cairo_region_t *render_region;
   cairo_region_t *clip_region;
 };
 
@@ -43,7 +42,6 @@ enum
   PROP_0,
   PROP_VIEWPORT,
   PROP_RENDER_NODE,
-  PROP_RENDER_REGION,
   PROP_CLIP_REGION,
   LAST_PROP
 };
@@ -110,10 +108,6 @@ gtk_render_node_view_get_property (GObject    *object,
       g_value_set_pointer (value, priv->render_node);
       break;
 
-    case PROP_RENDER_REGION:
-      g_value_set_boxed (value, priv->render_region);
-      break;
-
     case PROP_CLIP_REGION:
       g_value_set_boxed (value, priv->clip_region);
       break;
@@ -142,10 +136,6 @@ gtk_render_node_view_set_property (GObject      *object,
       gtk_render_node_view_set_render_node (view, g_value_get_pointer (value));
       break;
 
-    case PROP_RENDER_REGION:
-      gtk_render_node_view_set_render_region (view, g_value_get_boxed (value));
-      break;
-
     case PROP_CLIP_REGION:
       gtk_render_node_view_set_clip_region (view, g_value_get_boxed (value));
       break;
@@ -163,7 +153,6 @@ gtk_render_node_view_dispose (GObject *object)
   GtkRenderNodeViewPrivate *priv = gtk_render_node_view_get_instance_private (view);
 
   g_clear_pointer (&priv->render_node, gsk_render_node_unref);
-  g_clear_pointer (&priv->render_region, cairo_region_destroy);
   g_clear_pointer (&priv->clip_region, cairo_region_destroy);
 
   G_OBJECT_CLASS (gtk_render_node_view_parent_class)->dispose (object);
@@ -250,29 +239,6 @@ gtk_render_node_view_snapshot (GtkWidget   *widget,
 
   gsk_render_node_draw (priv->render_node, cr);
 
-  if (priv->render_region)
-    {
-      cairo_region_t *draw;
-      cairo_pattern_t *linear;
-
-      linear = cairo_pattern_create_linear (0, 0, 10, 10);
-      cairo_pattern_set_extend (linear, CAIRO_EXTEND_REPEAT);
-      cairo_pattern_add_color_stop_rgba (linear, 0.4, 0, 0, 0, 0);
-      cairo_pattern_add_color_stop_rgba (linear, 0.45, 0, 0, 0, 0.5);
-      cairo_pattern_add_color_stop_rgba (linear, 0.55, 0, 0, 0, 0.5);
-      cairo_pattern_add_color_stop_rgba (linear, 0.6, 0, 0, 0, 0);
-      
-      draw = cairo_region_create_rectangle (&viewport);
-      cairo_region_subtract (draw, priv->render_region);
-
-      cairo_set_source (cr, linear);
-      gdk_cairo_region (cr, draw);
-      cairo_fill (cr);
-
-      cairo_region_destroy (draw);
-      cairo_pattern_destroy (linear);
-    }
-
   if (priv->clip_region)
     {
       cairo_region_t *draw;
@@ -317,13 +283,6 @@ gtk_render_node_view_class_init (GtkRenderNodeViewClass *klass)
                           /* GSK_TYPE_RENDER_NODE, */
                           G_PARAM_READWRITE);
 
-  props[PROP_RENDER_REGION] =
-    g_param_spec_boxed ("render-region",
-                        "Render region",
-                        "Actually rendered region",
-                        CAIRO_GOBJECT_TYPE_REGION,
-                        G_PARAM_READWRITE);
-
   props[PROP_CLIP_REGION] =
     g_param_spec_boxed ("clip-region",
                         "Clip region",
@@ -427,28 +386,5 @@ gtk_render_node_view_get_clip_region (GtkRenderNodeView *view)
   return priv->clip_region;
 }
 
-void
-gtk_render_node_view_set_render_region (GtkRenderNodeView    *view,
-                                        const cairo_region_t *region)
-{
-  GtkRenderNodeViewPrivate *priv = gtk_render_node_view_get_instance_private (view);
-
-  if (priv->render_region)
-    cairo_region_destroy (priv->render_region);
-  priv->render_region = cairo_region_copy (region);
-
-  gtk_widget_queue_draw (GTK_WIDGET (view));
-
-  g_object_notify_by_pspec (G_OBJECT (view), props[PROP_RENDER_REGION]);
-}
-
-const cairo_region_t*
-gtk_render_node_view_get_render_region (GtkRenderNodeView *view)
-{
-  GtkRenderNodeViewPrivate *priv = gtk_render_node_view_get_instance_private (view);
-
-  return priv->render_region;
-}
-
 
 // vim: set et sw=2 ts=2:
index 59a64cf944f03f0d7ee3065d55bbead48e8f3869..ef4afe84f20e1d0546a4884d453b1c12af985ba3 100644 (file)
@@ -55,10 +55,6 @@ void            gtk_render_node_view_set_clip_region    (GtkRenderNodeView
                                                          const cairo_region_t   *clip);
 const cairo_region_t*
                 gtk_render_node_view_get_clip_region    (GtkRenderNodeView      *view);
-void            gtk_render_node_view_set_render_region  (GtkRenderNodeView      *view,
-                                                         const cairo_region_t   *region);
-const cairo_region_t*
-                gtk_render_node_view_get_render_region  (GtkRenderNodeView      *view);
 
 
 G_END_DECLS
index 48fd34184b4912884afc472fb73b6049255bd4ef..4dd9eb7232747625b56f30bc4dd21f61ba139f60 100644 (file)
@@ -28,7 +28,6 @@ gtk_inspector_render_recording_finalize (GObject *object)
   GtkInspectorRenderRecording *recording = GTK_INSPECTOR_RENDER_RECORDING (object);
 
   g_clear_pointer (&recording->clip_region, cairo_region_destroy);
-  g_clear_pointer (&recording->render_region, cairo_region_destroy);
   g_clear_pointer (&recording->node, gsk_render_node_unref);
   g_clear_pointer (&recording->profiler_info, g_free);
 
@@ -65,7 +64,6 @@ gtk_inspector_render_recording_new (gint64                timestamp,
                                     GskProfiler          *profiler,
                                     const GdkRectangle   *area,
                                     const cairo_region_t *clip_region,
-                                    const cairo_region_t *render_region,
                                     GskRenderNode        *node)
 {
   GtkInspectorRenderRecording *recording;
@@ -77,7 +75,6 @@ gtk_inspector_render_recording_new (gint64                timestamp,
   collect_profiler_info (recording, profiler);
   recording->area = *area;
   recording->clip_region = cairo_region_copy (clip_region);
-  recording->render_region = cairo_region_copy (render_region);
   recording->node = gsk_render_node_ref (node);
 
   return GTK_INSPECTOR_RECORDING (recording);
@@ -95,12 +92,6 @@ gtk_inspector_render_recording_get_clip_region (GtkInspectorRenderRecording *rec
   return recording->clip_region;
 }
 
-const cairo_region_t *
-gtk_inspector_render_recording_get_render_region (GtkInspectorRenderRecording *recording)
-{
-  return recording->render_region;
-}
-
 const cairo_rectangle_int_t *
 gtk_inspector_render_recording_get_area (GtkInspectorRenderRecording *recording)
 {
index e17ae9dea1a2e8febc578aaa06b0e9c80638c4e9..97727078b283401abeac37b029d938a1f32dad56 100644 (file)
@@ -42,7 +42,6 @@ typedef struct _GtkInspectorRenderRecording
 
   GdkRectangle area;
   cairo_region_t *clip_region;
-  cairo_region_t *render_region;
   GskRenderNode *node;
   char *profiler_info;
 } GtkInspectorRenderRecording;
@@ -59,14 +58,11 @@ GtkInspectorRecording *
                                                               GskProfiler                       *profiler,
                                                               const GdkRectangle                *area,
                                                               const cairo_region_t              *clip_region,
-                                                              const cairo_region_t              *render_region,
                                                               GskRenderNode                     *node);
 
 GskRenderNode * gtk_inspector_render_recording_get_node      (GtkInspectorRenderRecording       *recording);
 const cairo_region_t *
                 gtk_inspector_render_recording_get_clip_region (GtkInspectorRenderRecording     *recording);
-const cairo_region_t *
-                gtk_inspector_render_recording_get_render_region (GtkInspectorRenderRecording     *recording);
 const cairo_rectangle_int_t *
                 gtk_inspector_render_recording_get_area      (GtkInspectorRenderRecording       *recording);
 const char *    gtk_inspector_render_recording_get_profiler_info
index 8ebcd6f31c104031dfb98a1233e241b25e42342e..35bbf7f82879aceb4e8ad55fb4ecf355d7ad3bb0 100644 (file)
@@ -374,7 +374,6 @@ gtk_inspector_record_render (GtkWidget            *widget,
                              GskRenderer          *renderer,
                              GdkSurface           *surface,
                              const cairo_region_t *region,
-                             GdkDrawingContext    *context,
                              GskRenderNode        *node)
 {
   GtkInspectorWindow *iw;
@@ -392,7 +391,6 @@ gtk_inspector_record_render (GtkWidget            *widget,
                                         renderer,
                                         surface,
                                         region,
-                                        context,
                                         node);
 }
 
index 812ec0634042afba640658bc97486dfbf3ae8c54..2966054e95a3549afe6ee1a71472be8ad987fe2f 100644 (file)
@@ -111,7 +111,6 @@ void       gtk_inspector_record_render     (GtkWidget          *widget,
                                             GskRenderer        *renderer,
                                             GdkSurface         *surface,
                                             const cairo_region_t *region,
-                                            GdkDrawingContext  *context,
                                             GskRenderNode      *node);
 
 G_END_DECLS