[mutter] clutter/canvas: Implement clutter_canvas_{get, set}_scale_factor
- From: Jonas Ådahl <jadahl src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter] clutter/canvas: Implement clutter_canvas_{get, set}_scale_factor
- Date: Fri, 1 Mar 2019 18:07:11 +0000 (UTC)
commit 02813d74e118c767362f7afc0ee08ae6c564317e
Author: Marco Trevisan (Treviño) <mail 3v1n0 net>
Date: Mon Jul 31 14:21:05 2017 +0200
clutter/canvas: Implement clutter_canvas_{get,set}_scale_factor
https://bugzilla.gnome.org/show_bug.cgi?id=765011
https://gitlab.gnome.org/GNOME/mutter/merge_requests/3
clutter/clutter/clutter-canvas.c | 91 ++++++++++++++++++++++++++++++++++++++--
clutter/clutter/clutter-canvas.h | 4 +-
2 files changed, 89 insertions(+), 6 deletions(-)
---
diff --git a/clutter/clutter/clutter-canvas.c b/clutter/clutter/clutter-canvas.c
index 9f29f18ad..f49442b16 100644
--- a/clutter/clutter/clutter-canvas.c
+++ b/clutter/clutter/clutter-canvas.c
@@ -44,6 +44,7 @@
#include "clutter-build-config.h"
+#include <math.h>
#include <cogl/cogl.h>
#include <cairo-gobject.h>
@@ -69,6 +70,7 @@ struct _ClutterCanvasPrivate
int width;
int height;
+ float scale_factor;
CoglTexture *texture;
gboolean dirty;
@@ -82,6 +84,7 @@ enum
PROP_WIDTH,
PROP_HEIGHT,
+ PROP_SCALE_FACTOR,
LAST_PROP
};
@@ -178,6 +181,19 @@ clutter_canvas_set_property (GObject *gobject,
}
break;
+ case PROP_SCALE_FACTOR:
+ {
+ gfloat new_scale_factor = g_value_get_float (value);
+
+ if (priv->scale_factor != new_scale_factor)
+ {
+ priv->scale_factor = new_scale_factor;
+
+ clutter_content_invalidate (CLUTTER_CONTENT (gobject));
+ }
+ }
+ break;
+
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
break;
@@ -202,6 +218,10 @@ clutter_canvas_get_property (GObject *gobject,
g_value_set_int (value, priv->height);
break;
+ case PROP_SCALE_FACTOR:
+ g_value_set_float (value, priv->scale_factor);
+ break;
+
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
break;
@@ -245,6 +265,19 @@ clutter_canvas_class_init (ClutterCanvasClass *klass)
G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS);
+ /**
+ * ClutterCanvas:scale-factor:
+ *
+ * The height of the canvas.
+ */
+ obj_props[PROP_SCALE_FACTOR] =
+ g_param_spec_float ("scale-factor",
+ P_("Scale Factor"),
+ P_("The Scale factor of the canvas"),
+ 0.01f, G_MAXFLOAT,
+ 1.0f,
+ G_PARAM_READWRITE |
+ G_PARAM_STATIC_STRINGS);
/**
* ClutterCanvas::draw:
@@ -291,6 +324,7 @@ clutter_canvas_init (ClutterCanvas *self)
self->priv->width = -1;
self->priv->height = -1;
+ self->priv->scale_factor = 1.0f;
}
static void
@@ -340,8 +374,8 @@ clutter_canvas_emit_draw (ClutterCanvas *self)
priv->dirty = TRUE;
- real_width = priv->width;
- real_height = priv->height;
+ real_width = ceilf (priv->width * priv->scale_factor);
+ real_height = ceilf (priv->height * priv->scale_factor);
CLUTTER_NOTE (MISC, "Creating Cairo surface with size %d x %d",
priv->width, priv->height);
@@ -387,6 +421,10 @@ clutter_canvas_emit_draw (ClutterCanvas *self)
mapped_buffer = FALSE;
}
+ cairo_surface_set_device_scale (surface,
+ priv->scale_factor,
+ priv->scale_factor);
+
self->priv->cr = cr = cairo_create (surface);
g_signal_emit (self, canvas_signals[DRAW], 0,
@@ -448,10 +486,10 @@ clutter_canvas_get_preferred_size (ClutterContent *content,
return FALSE;
if (width != NULL)
- *width = priv->width;
+ *width = ceilf (priv->width * priv->scale_factor);
if (height != NULL)
- *height = priv->height;
+ *height = ceilf (priv->height * priv->scale_factor);
return TRUE;
}
@@ -560,3 +598,48 @@ clutter_canvas_set_size (ClutterCanvas *canvas,
return clutter_canvas_invalidate_internal (canvas, width, height);
}
+
+/**
+ * clutter_canvas_set_scale_factor:
+ * @canvas: a #ClutterCanvas
+ * @scale: the integer scaling factor of the canvas
+ *
+ * Sets the scaling factor of the @canvas, and invalidates the content.
+ *
+ * This function will cause the @canvas to be invalidated only
+ * if the scale factor of the canvas surface has changed.
+ */
+void
+clutter_canvas_set_scale_factor (ClutterCanvas *canvas,
+ float scale)
+{
+ g_return_if_fail (CLUTTER_IS_CANVAS (canvas));
+ g_return_if_fail (scale >= 1.0f);
+
+ if (canvas->priv->scale_factor != scale)
+ {
+ canvas->priv->scale_factor = scale;
+
+ g_object_freeze_notify (G_OBJECT (canvas));
+ clutter_content_invalidate (CLUTTER_CONTENT (canvas));
+ g_object_thaw_notify (G_OBJECT (canvas));
+
+ g_object_notify_by_pspec (G_OBJECT (canvas), obj_props[PROP_SCALE_FACTOR]);
+ }
+}
+
+/**
+ * clutter_canvas_get_scale_factor:
+ * @canvas: a #ClutterCanvas
+ *
+ * Gets the scale factor of the @canvas.
+ *
+ * Return value: the current @canvas scale factor or -1 if invalid
+ */
+float
+clutter_canvas_get_scale_factor (ClutterCanvas *canvas)
+{
+ g_return_val_if_fail (CLUTTER_IS_CANVAS (canvas), -1.0f);
+
+ return canvas->priv->scale_factor;
+}
diff --git a/clutter/clutter/clutter-canvas.h b/clutter/clutter/clutter-canvas.h
index 92ddd352c..ed13f49e3 100644
--- a/clutter/clutter/clutter-canvas.h
+++ b/clutter/clutter/clutter-canvas.h
@@ -97,9 +97,9 @@ gboolean clutter_canvas_set_size (ClutterCanvas *
CLUTTER_EXPORT
void clutter_canvas_set_scale_factor (ClutterCanvas *canvas,
- int scale);
+ float scale);
CLUTTER_EXPORT
-int clutter_canvas_get_scale_factor (ClutterCanvas *canvas);
+float clutter_canvas_get_scale_factor (ClutterCanvas *canvas);
G_END_DECLS
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]