[clutter/clutter-1.18] canvas: Add scale-factor property



commit 857f53f42d4a7a14f7035c7055b532e3d6d4f64d
Author: Emmanuele Bassi <ebassi gnome org>
Date:   Fri Jan 17 11:03:15 2014 +0000

    canvas: Add scale-factor property
    
    We need to provide an escape hatch to ClutterCanvas so that it's
    possible to override the window-scaling-factor ClutterSetting. This is
    going to be useful in the future in case the user has better knowledge
    of the window scaling factor that is going to be used with a specific
    set of ClutterCanvas contents (e.g. on different outputs or stages).
    
    https://bugzilla.gnome.org/show_bug.cgi?id=705915

 clutter/clutter-canvas.c                   |  151 +++++++++++++++++++++++++++-
 clutter/clutter-canvas.h                   |    5 +
 clutter/clutter.symbols                    |    2 +
 doc/reference/clutter/clutter-sections.txt |    2 +
 4 files changed, 157 insertions(+), 3 deletions(-)
---
diff --git a/clutter/clutter-canvas.c b/clutter/clutter-canvas.c
index 071d1d8..eb9eeb8 100644
--- a/clutter/clutter-canvas.c
+++ b/clutter/clutter-canvas.c
@@ -77,6 +77,9 @@ struct _ClutterCanvasPrivate
   int height;
 
   CoglBitmap *buffer;
+
+  int scale_factor;
+  guint scale_factor_set : 1;
 };
 
 enum
@@ -85,6 +88,8 @@ enum
 
   PROP_WIDTH,
   PROP_HEIGHT,
+  PROP_SCALE_FACTOR,
+  PROP_SCALE_FACTOR_SET,
 
   LAST_PROP
 };
@@ -179,6 +184,11 @@ clutter_canvas_set_property (GObject      *gobject,
       }
       break;
 
+    case PROP_SCALE_FACTOR:
+      clutter_canvas_set_scale_factor (CLUTTER_CANVAS (gobject),
+                                       g_value_get_int (value));
+      break;
+
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
       break;
@@ -203,6 +213,17 @@ clutter_canvas_get_property (GObject    *gobject,
       g_value_set_int (value, priv->height);
       break;
 
+    case PROP_SCALE_FACTOR:
+      if (priv->scale_factor_set)
+        g_value_set_int (value, priv->scale_factor);
+      else
+        g_value_set_int (value, -1);
+      break;
+
+    case PROP_SCALE_FACTOR_SET:
+      g_value_set_boolean (value, priv->scale_factor_set);
+      break;
+
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
       break;
@@ -247,6 +268,47 @@ clutter_canvas_class_init (ClutterCanvasClass *klass)
                       G_PARAM_STATIC_STRINGS);
 
   /**
+   * ClutterCanvas:scale-factor-set:
+   *
+   * Whether the #ClutterCanvas:scale-factor property is set.
+   *
+   * If the #ClutterCanvas:scale-factor-set property is %FALSE
+   * then #ClutterCanvas will use the #ClutterSettings:window-scaling-factor
+   * property.
+   *
+   * Since: 1.18
+   */
+  obj_props[PROP_SCALE_FACTOR_SET] =
+    g_param_spec_boolean ("scale-factor-set",
+                          P_("Scale Factor Set"),
+                          P_("Whether the scale-factor property is set"),
+                          FALSE,
+                          G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
+
+  /**
+   * ClutterCanvas:scale-factor:
+   *
+   * The scaling factor to be applied to the Cairo surface used for
+   * drawing.
+   *
+   * If #ClutterCanvas:scale-factor is set to a negative value, the
+   * value of the #ClutterSettings:window-scaling-factor property is
+   * used instead.
+   *
+   * Use #ClutterCanvas:scale-factor-set to check if the scale factor
+   * is set.
+   *
+   * Since: 1.18
+   */
+  obj_props[PROP_SCALE_FACTOR] =
+    g_param_spec_int ("scale-factor",
+                      P_("Scale Factor"),
+                      P_("The scaling factor for the surface"),
+                      -1, 1000,
+                      -1,
+                      G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
+
+  /**
    * ClutterCanvas::draw:
    * @canvas: the #ClutterCanvas that emitted the signal
    * @cr: the Cairo context used to draw
@@ -288,8 +350,10 @@ static void
 clutter_canvas_init (ClutterCanvas *self)
 {
   self->priv = clutter_canvas_get_instance_private (self);
+
   self->priv->width = -1;
   self->priv->height = -1;
+  self->priv->scale_factor = -1;
 }
 
 static void
@@ -366,9 +430,12 @@ clutter_canvas_emit_draw (ClutterCanvas *self)
 
   g_assert (priv->width > 0 && priv->width > 0);
 
-  g_object_get (clutter_settings_get_default (),
-                "window-scaling-factor", &window_scale,
-                NULL);
+  if (priv->scale_factor_set)
+    window_scale = priv->scale_factor;
+  else
+    g_object_get (clutter_settings_get_default (),
+                  "window-scaling-factor", &window_scale,
+                  NULL);
 
   real_width = priv->width * window_scale;
   real_height = priv->height * window_scale;
@@ -596,3 +663,81 @@ clutter_canvas_set_size (ClutterCanvas *canvas,
 
   return clutter_canvas_invalidate_internal (canvas, width, height);
 }
+
+/**
+ * clutter_canvas_set_scale_factor:
+ * @canvas: a #ClutterCanvas
+ * @scale: the scale factor, or -1 for the default
+ *
+ * Sets the scaling factor for the Cairo surface used by @canvas.
+ *
+ * This function should rarely be used.
+ *
+ * The default scaling factor of a #ClutterCanvas content uses the
+ * #ClutterSettings:window-scaling-factor property, which is set by
+ * the windowing system. By using this function it is possible to
+ * override that setting.
+ *
+ * Changing the scale factor will invalidate the @canvas.
+ *
+ * Since: 1.18
+ */
+void
+clutter_canvas_set_scale_factor (ClutterCanvas *canvas,
+                                 int            scale)
+{
+  ClutterCanvasPrivate *priv;
+  GObject *obj;
+
+  g_return_if_fail (CLUTTER_IS_CANVAS (canvas));
+  g_return_if_fail (scale != 0);
+
+  priv = canvas->priv;
+
+  if (scale < 0)
+    {
+      if (!priv->scale_factor_set)
+        return;
+
+      priv->scale_factor_set = FALSE;
+      priv->scale_factor = -1;
+    }
+  else
+    {
+      if (priv->scale_factor_set && priv->scale_factor == scale)
+        return;
+
+      priv->scale_factor_set = TRUE;
+      priv->scale_factor = scale;
+    }
+
+  clutter_content_invalidate (CLUTTER_CONTENT (canvas));
+
+  obj = G_OBJECT (canvas);
+
+  g_object_notify_by_pspec (obj, obj_props[PROP_SCALE_FACTOR]);
+  g_object_notify_by_pspec (obj, obj_props[PROP_SCALE_FACTOR_SET]);
+}
+
+/**
+ * clutter_canvas_get_scale_factor:
+ * @canvas: a #ClutterCanvas
+ *
+ * Retrieves the scaling factor of @canvas, as set using
+ * clutter_canvas_set_scale_factor().
+ *
+ * Return value: the scaling factor, or -1 if the @canvas
+ *   uses the default from #ClutterSettings
+ *
+ * Since: 1.18
+ */
+int
+clutter_canvas_get_scale_factor (ClutterCanvas *canvas)
+{
+  g_return_val_if_fail (CLUTTER_IS_CANVAS (canvas), -1);
+
+  if (!canvas->priv->scale_factor_set)
+    return -1;
+
+  return canvas->priv->scale_factor;
+}
diff --git a/clutter/clutter-canvas.h b/clutter/clutter-canvas.h
index 2ab4a48..4e8f2ae 100644
--- a/clutter/clutter-canvas.h
+++ b/clutter/clutter-canvas.h
@@ -95,6 +95,11 @@ gboolean                clutter_canvas_set_size                 (ClutterCanvas *
                                                                  int            width,
                                                                  int            height);
 
+CLUTTER_AVAILABLE_IN_1_18
+void                    clutter_canvas_set_scale_factor         (ClutterCanvas *canvas,
+                                                                 int            scale);
+CLUTTER_AVAILABLE_IN_1_18
+int                     clutter_canvas_get_scale_factor         (ClutterCanvas *canvas);
 
 G_END_DECLS
 
diff --git a/clutter/clutter.symbols b/clutter/clutter.symbols
index d34c94e..dd3bc10 100644
--- a/clutter/clutter.symbols
+++ b/clutter/clutter.symbols
@@ -521,6 +521,8 @@ clutter_brightness_contrast_effect_set_contrast_full
 clutter_brightness_contrast_effect_set_contrast
 clutter_canvas_get_type
 clutter_canvas_new
+clutter_canvas_get_scale_factor
+clutter_canvas_set_scale_factor
 clutter_canvas_set_size
 clutter_cairo_clear
 clutter_cairo_set_source_color
diff --git a/doc/reference/clutter/clutter-sections.txt b/doc/reference/clutter/clutter-sections.txt
index 8550d34..019fa06 100644
--- a/doc/reference/clutter/clutter-sections.txt
+++ b/doc/reference/clutter/clutter-sections.txt
@@ -3225,6 +3225,8 @@ ClutterCanvas
 ClutterCanvasClass
 clutter_canvas_new
 clutter_canvas_set_size
+clutter_canvas_set_scale_factor
+clutter_canvas_get_scale_factor
 <SUBSECTION Standard>
 CLUTTER_TYPE_CANVAS
 CLUTTER_CANVAS


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