~elementary-os/ubuntu-package-imports/mutter-bionic

« back to all changes in this revision

Viewing changes to src/backends/meta-renderer-view.c

  • Committer: RabbitBot
  • Date: 2018-04-11 14:49:36 UTC
  • Revision ID: rabbitbot@elementary.io-20180411144936-hgymqa9d8d1xfpbh
Initial import, version 3.28.0-2

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * Copyright (C) 2016 Red Hat Inc.
 
3
 *
 
4
 * This library is free software; you can redistribute it and/or
 
5
 * modify it under the terms of the GNU Lesser General Public
 
6
 * License as published by the Free Software Foundation; either
 
7
 * version 2 of the License, or (at your option) any later version.
 
8
 *
 
9
 * This library is distributed in the hope that it will be useful,
 
10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 
11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 
12
 * Lesser General Public License for more details.
 
13
 *
 
14
 * You should have received a copy of the GNU Lesser General Public
 
15
 * License along with this library. If not, see <http://www.gnu.org/licenses/>.
 
16
 */
 
17
 
 
18
#include "config.h"
 
19
 
 
20
#include "backends/meta-renderer-view.h"
 
21
 
 
22
#include "backends/meta-renderer.h"
 
23
#include "clutter/clutter-mutter.h"
 
24
 
 
25
enum
 
26
{
 
27
  PROP_0,
 
28
 
 
29
  PROP_MONITOR_INFO,
 
30
  PROP_TRANSFORM,
 
31
 
 
32
  PROP_LAST
 
33
};
 
34
 
 
35
static GParamSpec *obj_props[PROP_LAST];
 
36
 
 
37
struct _MetaRendererView
 
38
{
 
39
  ClutterStageViewCogl parent;
 
40
 
 
41
  MetaMonitorTransform transform;
 
42
  MetaLogicalMonitor *logical_monitor;
 
43
};
 
44
 
 
45
G_DEFINE_TYPE (MetaRendererView, meta_renderer_view,
 
46
               CLUTTER_TYPE_STAGE_VIEW_COGL)
 
47
 
 
48
MetaLogicalMonitor *
 
49
meta_renderer_view_get_logical_monitor (MetaRendererView *view)
 
50
{
 
51
  return view->logical_monitor;
 
52
}
 
53
 
 
54
MetaMonitorTransform
 
55
meta_renderer_view_get_transform (MetaRendererView *view)
 
56
{
 
57
  return view->transform;
 
58
}
 
59
 
 
60
static void
 
61
meta_renderer_view_get_offscreen_transformation_matrix (ClutterStageView *view,
 
62
                                                        CoglMatrix       *matrix)
 
63
{
 
64
  MetaRendererView *renderer_view = META_RENDERER_VIEW (view);
 
65
 
 
66
  cogl_matrix_init_identity (matrix);
 
67
 
 
68
  switch (renderer_view->transform)
 
69
    {
 
70
    case META_MONITOR_TRANSFORM_NORMAL:
 
71
      break;
 
72
    case META_MONITOR_TRANSFORM_90:
 
73
      cogl_matrix_rotate (matrix, 90, 0, 0, 1);
 
74
      cogl_matrix_translate (matrix, 0, -1, 0);
 
75
      break;
 
76
    case META_MONITOR_TRANSFORM_180:
 
77
      cogl_matrix_rotate (matrix, 180, 0, 0, 1);
 
78
      cogl_matrix_translate (matrix, -1, -1, 0);
 
79
      break;
 
80
    case META_MONITOR_TRANSFORM_270:
 
81
      cogl_matrix_rotate (matrix, 270, 0, 0, 1);
 
82
      cogl_matrix_translate (matrix, -1, 0, 0);
 
83
      break;
 
84
    case META_MONITOR_TRANSFORM_FLIPPED:
 
85
      cogl_matrix_scale (matrix, -1, 1, 1);
 
86
      cogl_matrix_translate (matrix, -1, 0, 0);
 
87
      break;
 
88
    case META_MONITOR_TRANSFORM_FLIPPED_90:
 
89
      cogl_matrix_scale (matrix, -1, 1, 1);
 
90
      cogl_matrix_rotate (matrix, 90, 0, 0, 1);
 
91
      break;
 
92
    case META_MONITOR_TRANSFORM_FLIPPED_180:
 
93
      cogl_matrix_scale (matrix, -1, 1, 1);
 
94
      cogl_matrix_rotate (matrix, 180, 0, 0, 1);
 
95
      cogl_matrix_translate (matrix, 0, -1, 0);
 
96
      break;
 
97
    case META_MONITOR_TRANSFORM_FLIPPED_270:
 
98
      cogl_matrix_scale (matrix, -1, 1, 1);
 
99
      cogl_matrix_rotate (matrix, 270, 0, 0, 1);
 
100
      cogl_matrix_translate (matrix, -1, -1, 0);
 
101
      break;
 
102
    }
 
103
}
 
104
 
 
105
static void
 
106
meta_renderer_view_setup_offscreen_blit_pipeline (ClutterStageView *view,
 
107
                                                  CoglPipeline     *pipeline)
 
108
{
 
109
  CoglMatrix matrix;
 
110
 
 
111
  meta_renderer_view_get_offscreen_transformation_matrix (view, &matrix);
 
112
  cogl_pipeline_set_layer_matrix (pipeline, 0, &matrix);
 
113
}
 
114
 
 
115
static void
 
116
meta_renderer_view_set_transform (MetaRendererView     *view,
 
117
                                  MetaMonitorTransform  transform)
 
118
{
 
119
  if (view->transform == transform)
 
120
    return;
 
121
 
 
122
  view->transform = transform;
 
123
  clutter_stage_view_invalidate_offscreen_blit_pipeline (CLUTTER_STAGE_VIEW (view));
 
124
}
 
125
 
 
126
static void
 
127
meta_renderer_view_get_property (GObject    *object,
 
128
                                 guint       prop_id,
 
129
                                 GValue     *value,
 
130
                                 GParamSpec *pspec)
 
131
{
 
132
  MetaRendererView *view = META_RENDERER_VIEW (object);
 
133
 
 
134
  switch (prop_id)
 
135
    {
 
136
    case PROP_MONITOR_INFO:
 
137
      g_value_set_pointer (value, view->logical_monitor);
 
138
      break;
 
139
    case PROP_TRANSFORM:
 
140
      g_value_set_uint (value, view->transform);
 
141
      break;
 
142
    default:
 
143
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 
144
      break;
 
145
    }
 
146
}
 
147
 
 
148
static void
 
149
meta_renderer_view_set_property (GObject      *object,
 
150
                                 guint         prop_id,
 
151
                                 const GValue *value,
 
152
                                 GParamSpec   *pspec)
 
153
{
 
154
  MetaRendererView *view = META_RENDERER_VIEW (object);
 
155
 
 
156
  switch (prop_id)
 
157
    {
 
158
    case PROP_MONITOR_INFO:
 
159
      view->logical_monitor = g_value_get_pointer (value);
 
160
      break;
 
161
    case PROP_TRANSFORM:
 
162
      meta_renderer_view_set_transform (view, g_value_get_uint (value));
 
163
      break;
 
164
    default:
 
165
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 
166
      break;
 
167
    }
 
168
}
 
169
 
 
170
static void
 
171
meta_renderer_view_init (MetaRendererView *view)
 
172
{
 
173
}
 
174
 
 
175
static void
 
176
meta_renderer_view_class_init (MetaRendererViewClass *klass)
 
177
{
 
178
  GObjectClass *object_class = G_OBJECT_CLASS (klass);
 
179
  ClutterStageViewClass *view_class = CLUTTER_STAGE_VIEW_CLASS (klass);
 
180
 
 
181
  view_class->setup_offscreen_blit_pipeline =
 
182
    meta_renderer_view_setup_offscreen_blit_pipeline;
 
183
  view_class->get_offscreen_transformation_matrix =
 
184
    meta_renderer_view_get_offscreen_transformation_matrix;
 
185
 
 
186
  object_class->get_property = meta_renderer_view_get_property;
 
187
  object_class->set_property = meta_renderer_view_set_property;
 
188
 
 
189
  obj_props[PROP_MONITOR_INFO] =
 
190
    g_param_spec_pointer ("logical-monitor",
 
191
                          "MetaLogicalMonitor",
 
192
                          "The logical monitor of the view",
 
193
                          G_PARAM_READWRITE |
 
194
                          G_PARAM_STATIC_STRINGS |
 
195
                          G_PARAM_CONSTRUCT_ONLY);
 
196
  obj_props[PROP_TRANSFORM] =
 
197
    g_param_spec_uint ("transform",
 
198
                       "Transform",
 
199
                       "Transform to apply to the view",
 
200
                       META_MONITOR_TRANSFORM_NORMAL,
 
201
                       META_MONITOR_TRANSFORM_FLIPPED_270,
 
202
                       META_MONITOR_TRANSFORM_NORMAL,
 
203
                       G_PARAM_READWRITE |
 
204
                       G_PARAM_CONSTRUCT_ONLY |
 
205
                       G_PARAM_STATIC_STRINGS);
 
206
 
 
207
  g_object_class_install_properties (object_class, PROP_LAST, obj_props);
 
208
}