1 /*
2  * Copyright (C) 2018 Robert Mader
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License as
6  * published by the Free Software Foundation; either version 2 of the
7  * License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful, but
10  * WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, see <http://www.gnu.org/licenses/>.
16  */
17 
18 #include "config.h"
19 
20 #include "backends/meta-monitor-transform.h"
21 
22 MetaMonitorTransform
meta_monitor_transform_from_orientation(MetaOrientation orientation)23 meta_monitor_transform_from_orientation (MetaOrientation orientation)
24 {
25   switch (orientation)
26     {
27     case META_ORIENTATION_BOTTOM_UP:
28       return META_MONITOR_TRANSFORM_180;
29     case META_ORIENTATION_LEFT_UP:
30       return META_MONITOR_TRANSFORM_90;
31     case META_ORIENTATION_RIGHT_UP:
32       return META_MONITOR_TRANSFORM_270;
33     case META_ORIENTATION_UNDEFINED:
34     case META_ORIENTATION_NORMAL:
35     default:
36       return META_MONITOR_TRANSFORM_NORMAL;
37     }
38 }
39 
40 MetaMonitorTransform
meta_monitor_transform_invert(MetaMonitorTransform transform)41 meta_monitor_transform_invert (MetaMonitorTransform transform)
42 {
43   switch (transform)
44     {
45     case META_MONITOR_TRANSFORM_90:
46       return META_MONITOR_TRANSFORM_270;
47     case META_MONITOR_TRANSFORM_270:
48       return META_MONITOR_TRANSFORM_90;
49     case META_MONITOR_TRANSFORM_NORMAL:
50     case META_MONITOR_TRANSFORM_180:
51     case META_MONITOR_TRANSFORM_FLIPPED:
52     case META_MONITOR_TRANSFORM_FLIPPED_90:
53     case META_MONITOR_TRANSFORM_FLIPPED_180:
54     case META_MONITOR_TRANSFORM_FLIPPED_270:
55       return transform;
56     }
57   g_assert_not_reached ();
58   return 0;
59 }
60 
61 MetaMonitorTransform
meta_monitor_transform_transform(MetaMonitorTransform transform,MetaMonitorTransform other)62 meta_monitor_transform_transform (MetaMonitorTransform transform,
63                                   MetaMonitorTransform other)
64 {
65   MetaMonitorTransform new_transform;
66 
67   new_transform = (transform + other) % META_MONITOR_TRANSFORM_FLIPPED;
68   if (meta_monitor_transform_is_flipped (transform) !=
69       meta_monitor_transform_is_flipped (other))
70     new_transform += META_MONITOR_TRANSFORM_FLIPPED;
71 
72   return new_transform;
73 }
74 
75 /**
76  * meta_monitor_transform_relative_transform:
77  * @transform: The transform to start from
78  * @other: The transform to go to
79  *
80  * Return value: a transform to get from @transform to @other
81  */
82 MetaMonitorTransform
meta_monitor_transform_relative_transform(MetaMonitorTransform transform,MetaMonitorTransform other)83 meta_monitor_transform_relative_transform (MetaMonitorTransform transform,
84                                            MetaMonitorTransform other)
85 {
86   MetaMonitorTransform relative_transform;
87 
88   relative_transform = ((other % META_MONITOR_TRANSFORM_FLIPPED -
89                          transform % META_MONITOR_TRANSFORM_FLIPPED) %
90                         META_MONITOR_TRANSFORM_FLIPPED);
91 
92   if (meta_monitor_transform_is_flipped (transform) !=
93       meta_monitor_transform_is_flipped (other))
94     {
95       relative_transform = (meta_monitor_transform_invert (relative_transform) +
96                             META_MONITOR_TRANSFORM_FLIPPED);
97     }
98 
99   return relative_transform;
100 }
101 
102 void
meta_monitor_transform_transform_point(MetaMonitorTransform transform,int area_width,int area_height,int x,int y,int * out_x,int * out_y)103 meta_monitor_transform_transform_point (MetaMonitorTransform  transform,
104                                         int                   area_width,
105                                         int                   area_height,
106                                         int                   x,
107                                         int                   y,
108                                         int                  *out_x,
109                                         int                  *out_y)
110 {
111   switch (transform)
112     {
113     case META_MONITOR_TRANSFORM_NORMAL:
114       *out_x = x;
115       *out_y = y;
116       break;
117     case META_MONITOR_TRANSFORM_90:
118       *out_x = area_width - y;
119       *out_y = x;
120       break;
121     case META_MONITOR_TRANSFORM_180:
122       *out_x = area_width - x;
123       *out_y = area_height - y;
124       break;
125     case META_MONITOR_TRANSFORM_270:
126       *out_x = y,
127       *out_y = area_height - x;
128       break;
129     case META_MONITOR_TRANSFORM_FLIPPED:
130       *out_x = area_width - x;
131       *out_y = y;
132       break;
133     case META_MONITOR_TRANSFORM_FLIPPED_90:
134       *out_x = area_width - y;
135       *out_y = area_height - x;
136       break;
137     case META_MONITOR_TRANSFORM_FLIPPED_180:
138       *out_x = x;
139       *out_y = area_height - y;
140       break;
141     case META_MONITOR_TRANSFORM_FLIPPED_270:
142       *out_x = y;
143       *out_y = x;
144       break;
145     }
146 }
147