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