xref: /netbsd-src/sys/external/bsd/drm2/dist/include/drm/drm_rect.h (revision cef8759bd76c1b621f8eab8faa6f208faabc2e15)
1 /*	$NetBSD: drm_rect.h,v 1.2 2018/08/27 04:58:38 riastradh Exp $	*/
2 
3 /*
4  * Copyright (C) 2011-2013 Intel Corporation
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining a
7  * copy of this software and associated documentation files (the "Software"),
8  * to deal in the Software without restriction, including without limitation
9  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10  * and/or sell copies of the Software, and to permit persons to whom the
11  * Software is furnished to do so, subject to the following conditions:
12  *
13  * The above copyright notice and this permission notice (including the next
14  * paragraph) shall be included in all copies or substantial portions of the
15  * Software.
16  *
17  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
20  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23  * SOFTWARE.
24  */
25 
26 #ifndef DRM_RECT_H
27 #define DRM_RECT_H
28 
29 /**
30  * DOC: rect utils
31  *
32  * Utility functions to help manage rectangular areas for
33  * clipping, scaling, etc. calculations.
34  */
35 
36 /**
37  * struct drm_rect - two dimensional rectangle
38  * @x1: horizontal starting coordinate (inclusive)
39  * @x2: horizontal ending coordinate (exclusive)
40  * @y1: vertical starting coordinate (inclusive)
41  * @y2: vertical ending coordinate (exclusive)
42  */
43 struct drm_rect {
44 	int x1, y1, x2, y2;
45 };
46 
47 /**
48  * drm_rect_adjust_size - adjust the size of the rectangle
49  * @r: rectangle to be adjusted
50  * @dw: horizontal adjustment
51  * @dh: vertical adjustment
52  *
53  * Change the size of rectangle @r by @dw in the horizontal direction,
54  * and by @dh in the vertical direction, while keeping the center
55  * of @r stationary.
56  *
57  * Positive @dw and @dh increase the size, negative values decrease it.
58  */
59 static inline void drm_rect_adjust_size(struct drm_rect *r, int dw, int dh)
60 {
61 	r->x1 -= dw >> 1;
62 	r->y1 -= dh >> 1;
63 	r->x2 += (dw + 1) >> 1;
64 	r->y2 += (dh + 1) >> 1;
65 }
66 
67 /**
68  * drm_rect_translate - translate the rectangle
69  * @r: rectangle to be tranlated
70  * @dx: horizontal translation
71  * @dy: vertical translation
72  *
73  * Move rectangle @r by @dx in the horizontal direction,
74  * and by @dy in the vertical direction.
75  */
76 static inline void drm_rect_translate(struct drm_rect *r, int dx, int dy)
77 {
78 	r->x1 += dx;
79 	r->y1 += dy;
80 	r->x2 += dx;
81 	r->y2 += dy;
82 }
83 
84 /**
85  * drm_rect_downscale - downscale a rectangle
86  * @r: rectangle to be downscaled
87  * @horz: horizontal downscale factor
88  * @vert: vertical downscale factor
89  *
90  * Divide the coordinates of rectangle @r by @horz and @vert.
91  */
92 static inline void drm_rect_downscale(struct drm_rect *r, int horz, int vert)
93 {
94 	r->x1 /= horz;
95 	r->y1 /= vert;
96 	r->x2 /= horz;
97 	r->y2 /= vert;
98 }
99 
100 /**
101  * drm_rect_width - determine the rectangle width
102  * @r: rectangle whose width is returned
103  *
104  * RETURNS:
105  * The width of the rectangle.
106  */
107 static inline int drm_rect_width(const struct drm_rect *r)
108 {
109 	return r->x2 - r->x1;
110 }
111 
112 /**
113  * drm_rect_height - determine the rectangle height
114  * @r: rectangle whose height is returned
115  *
116  * RETURNS:
117  * The height of the rectangle.
118  */
119 static inline int drm_rect_height(const struct drm_rect *r)
120 {
121 	return r->y2 - r->y1;
122 }
123 
124 /**
125  * drm_rect_visible - determine if the the rectangle is visible
126  * @r: rectangle whose visibility is returned
127  *
128  * RETURNS:
129  * %true if the rectangle is visible, %false otherwise.
130  */
131 static inline bool drm_rect_visible(const struct drm_rect *r)
132 {
133 	return drm_rect_width(r) > 0 && drm_rect_height(r) > 0;
134 }
135 
136 /**
137  * drm_rect_equals - determine if two rectangles are equal
138  * @r1: first rectangle
139  * @r2: second rectangle
140  *
141  * RETURNS:
142  * %true if the rectangles are equal, %false otherwise.
143  */
144 static inline bool drm_rect_equals(const struct drm_rect *r1,
145 				   const struct drm_rect *r2)
146 {
147 	return r1->x1 == r2->x1 && r1->x2 == r2->x2 &&
148 		r1->y1 == r2->y1 && r1->y2 == r2->y2;
149 }
150 
151 bool drm_rect_intersect(struct drm_rect *r, const struct drm_rect *clip);
152 bool drm_rect_clip_scaled(struct drm_rect *src, struct drm_rect *dst,
153 			  const struct drm_rect *clip,
154 			  int hscale, int vscale);
155 int drm_rect_calc_hscale(const struct drm_rect *src,
156 			 const struct drm_rect *dst,
157 			 int min_hscale, int max_hscale);
158 int drm_rect_calc_vscale(const struct drm_rect *src,
159 			 const struct drm_rect *dst,
160 			 int min_vscale, int max_vscale);
161 int drm_rect_calc_hscale_relaxed(struct drm_rect *src,
162 				 struct drm_rect *dst,
163 				 int min_hscale, int max_hscale);
164 int drm_rect_calc_vscale_relaxed(struct drm_rect *src,
165 				 struct drm_rect *dst,
166 				 int min_vscale, int max_vscale);
167 void drm_rect_debug_print(const struct drm_rect *r, bool fixed_point);
168 void drm_rect_rotate(struct drm_rect *r,
169 		     int width, int height,
170 		     unsigned int rotation);
171 void drm_rect_rotate_inv(struct drm_rect *r,
172 			 int width, int height,
173 			 unsigned int rotation);
174 
175 #endif
176