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