diff --git a/src/backends/meta-renderer-view.c b/src/backends/meta-renderer-view.c index 367715e69..a379a898e 100644 --- a/src/backends/meta-renderer-view.c +++ b/src/backends/meta-renderer-view.c @@ -27,6 +27,7 @@ enum PROP_0, PROP_MONITOR_INFO, + PROP_TRANSFORM, PROP_LAST }; @@ -37,6 +38,7 @@ struct _MetaRendererView { ClutterStageViewCogl parent; + MetaMonitorTransform transform; MetaMonitorInfo *monitor_info; }; @@ -49,6 +51,72 @@ meta_renderer_view_get_monitor_info (MetaRendererView *view) return view->monitor_info; } +static void +meta_renderer_view_get_offscreen_transformation_matrix (ClutterStageView *view, + CoglMatrix *matrix) +{ + MetaRendererView *renderer_view = META_RENDERER_VIEW (view); + + cogl_matrix_init_identity (matrix); + + switch (renderer_view->transform) + { + case META_MONITOR_TRANSFORM_NORMAL: + break; + case META_MONITOR_TRANSFORM_90: + cogl_matrix_rotate (matrix, 90, 0, 0, 1); + cogl_matrix_translate (matrix, 0, -1, 0); + break; + case META_MONITOR_TRANSFORM_180: + cogl_matrix_rotate (matrix, 180, 0, 0, 1); + cogl_matrix_translate (matrix, -1, -1, 0); + break; + case META_MONITOR_TRANSFORM_270: + cogl_matrix_rotate (matrix, 270, 0, 0, 1); + cogl_matrix_translate (matrix, -1, 0, 0); + break; + case META_MONITOR_TRANSFORM_FLIPPED: + cogl_matrix_scale (matrix, -1, 1, 1); + cogl_matrix_translate (matrix, -1, 0, 0); + break; + case META_MONITOR_TRANSFORM_FLIPPED_90: + cogl_matrix_scale (matrix, -1, 1, 1); + cogl_matrix_rotate (matrix, 90, 0, 0, 1); + break; + case META_MONITOR_TRANSFORM_FLIPPED_180: + cogl_matrix_scale (matrix, -1, 1, 1); + cogl_matrix_rotate (matrix, 180, 0, 0, 1); + cogl_matrix_translate (matrix, 0, -1, 0); + break; + case META_MONITOR_TRANSFORM_FLIPPED_270: + cogl_matrix_scale (matrix, -1, 1, 1); + cogl_matrix_rotate (matrix, 270, 0, 0, 1); + cogl_matrix_translate (matrix, -1, -1, 0); + break; + } +} + +static void +meta_renderer_view_setup_offscreen_blit_pipeline (ClutterStageView *view, + CoglPipeline *pipeline) +{ + CoglMatrix matrix; + + meta_renderer_view_get_offscreen_transformation_matrix (view, &matrix); + cogl_pipeline_set_layer_matrix (pipeline, 0, &matrix); +} + +static void +meta_renderer_view_set_transform (MetaRendererView *view, + MetaMonitorTransform transform) +{ + if (view->transform == transform) + return; + + view->transform = transform; + clutter_stage_view_invalidate_offscreen_blit_pipeline (CLUTTER_STAGE_VIEW (view)); +} + static void meta_renderer_view_get_property (GObject *object, guint prop_id, @@ -62,6 +130,9 @@ meta_renderer_view_get_property (GObject *object, case PROP_MONITOR_INFO: g_value_set_pointer (value, view->monitor_info); break; + case PROP_TRANSFORM: + g_value_set_uint (value, view->transform); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -81,6 +152,9 @@ meta_renderer_view_set_property (GObject *object, case PROP_MONITOR_INFO: view->monitor_info = g_value_get_pointer (value); break; + case PROP_TRANSFORM: + meta_renderer_view_set_transform (view, g_value_get_uint (value)); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -96,6 +170,12 @@ static void meta_renderer_view_class_init (MetaRendererViewClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); + ClutterStageViewClass *view_class = CLUTTER_STAGE_VIEW_CLASS (klass); + + view_class->setup_offscreen_blit_pipeline = + meta_renderer_view_setup_offscreen_blit_pipeline; + view_class->get_offscreen_transformation_matrix = + meta_renderer_view_get_offscreen_transformation_matrix; object_class->get_property = meta_renderer_view_get_property; object_class->set_property = meta_renderer_view_set_property; @@ -107,6 +187,16 @@ meta_renderer_view_class_init (MetaRendererViewClass *klass) G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT_ONLY); + obj_props[PROP_TRANSFORM] = + g_param_spec_uint ("transform", + "Transform", + "Transform to apply to the view", + META_MONITOR_TRANSFORM_NORMAL, + META_MONITOR_TRANSFORM_FLIPPED_270, + META_MONITOR_TRANSFORM_NORMAL, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS); g_object_class_install_properties (object_class, PROP_LAST, obj_props); }