st-drawing-area: Draw content taking care of the resource_scale

https://bugzilla.gnome.org/show_bug.cgi?id=765011
This commit is contained in:
Marco Trevisan (Treviño) 2017-07-31 14:08:29 +02:00 committed by Jonas Ådahl
parent 9f4ae9618a
commit 03c4628cad

View File

@ -35,6 +35,7 @@
#include "st-drawing-area.h" #include "st-drawing-area.h"
#include <cairo.h> #include <cairo.h>
#include <math.h>
typedef struct _StDrawingAreaPrivate StDrawingAreaPrivate; typedef struct _StDrawingAreaPrivate StDrawingAreaPrivate;
struct _StDrawingAreaPrivate { struct _StDrawingAreaPrivate {
@ -84,12 +85,22 @@ st_drawing_area_allocate (ClutterActor *self,
ClutterContent *content = clutter_actor_get_content (self); ClutterContent *content = clutter_actor_get_content (self);
ClutterActorBox content_box; ClutterActorBox content_box;
int width, height; int width, height;
float resource_scale;
if (!st_widget_get_resource_scale (ST_WIDGET (self), &resource_scale))
{
ClutterActorBox empty = CLUTTER_ACTOR_BOX_INIT_ZERO;
clutter_actor_set_allocation (self, &empty, 0);
return;
}
clutter_actor_set_allocation (self, box, flags); clutter_actor_set_allocation (self, box, flags);
st_theme_node_get_content_box (theme_node, box, &content_box); st_theme_node_get_content_box (theme_node, box, &content_box);
width = (int)(0.5 + content_box.x2 - content_box.x1); width = (int)(0.5 + content_box.x2 - content_box.x1);
height = (int)(0.5 + content_box.y2 - content_box.y1); height = (int)(0.5 + content_box.y2 - content_box.y1);
clutter_canvas_set_scale_factor (CLUTTER_CANVAS (content), resource_scale);
clutter_canvas_set_size (CLUTTER_CANVAS (content), width, height); clutter_canvas_set_size (CLUTTER_CANVAS (content), width, height);
} }
@ -101,6 +112,16 @@ st_drawing_area_style_changed (StWidget *self)
st_drawing_area_queue_repaint (ST_DRAWING_AREA (self)); st_drawing_area_queue_repaint (ST_DRAWING_AREA (self));
} }
static void
st_drawing_area_resource_scale_changed (StWidget *self)
{
float resource_scale;
ClutterContent *content = clutter_actor_get_content (CLUTTER_ACTOR (self));
if (st_widget_get_resource_scale (ST_WIDGET (self), &resource_scale))
clutter_canvas_set_scale_factor (CLUTTER_CANVAS (content), resource_scale);
}
static void static void
st_drawing_area_class_init (StDrawingAreaClass *klass) st_drawing_area_class_init (StDrawingAreaClass *klass)
{ {
@ -109,6 +130,7 @@ st_drawing_area_class_init (StDrawingAreaClass *klass)
actor_class->allocate = st_drawing_area_allocate; actor_class->allocate = st_drawing_area_allocate;
widget_class->style_changed = st_drawing_area_style_changed; widget_class->style_changed = st_drawing_area_style_changed;
widget_class->resource_scale_changed = st_drawing_area_resource_scale_changed;
st_drawing_area_signals[REPAINT] = st_drawing_area_signals[REPAINT] =
g_signal_new ("repaint", g_signal_new ("repaint",
@ -185,7 +207,7 @@ st_drawing_area_get_surface_size (StDrawingArea *area,
{ {
StDrawingAreaPrivate *priv; StDrawingAreaPrivate *priv;
ClutterContent *content; ClutterContent *content;
float w, h; float w, h, resource_scale;
g_return_if_fail (ST_IS_DRAWING_AREA (area)); g_return_if_fail (ST_IS_DRAWING_AREA (area));
@ -195,8 +217,18 @@ st_drawing_area_get_surface_size (StDrawingArea *area,
content = clutter_actor_get_content (CLUTTER_ACTOR (area)); content = clutter_actor_get_content (CLUTTER_ACTOR (area));
clutter_content_get_preferred_size (content, &w, &h); clutter_content_get_preferred_size (content, &w, &h);
if (st_widget_get_resource_scale (ST_WIDGET (area), &resource_scale))
{
w /= resource_scale;
h /= resource_scale;
}
else
{
w = h = 0.0f;
}
if (width) if (width)
*width = (guint)w; *width = ceilf (w);
if (height) if (height)
*height = (guint)h; *height = ceilf (h);
} }