13512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä/* 23512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä * Copyright (C) 2011-2013 Intel Corporation 33512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä * 43512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä * Permission is hereby granted, free of charge, to any person obtaining a 53512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä * copy of this software and associated documentation files (the "Software"), 63512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä * to deal in the Software without restriction, including without limitation 73512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä * the rights to use, copy, modify, merge, publish, distribute, sublicense, 83512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä * and/or sell copies of the Software, and to permit persons to whom the 93512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä * Software is furnished to do so, subject to the following conditions: 103512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä * 113512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä * The above copyright notice and this permission notice (including the next 123512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä * paragraph) shall be included in all copies or substantial portions of the 133512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä * Software. 143512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä * 153512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 163512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 173512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 183512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 193512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 203512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 213512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä * SOFTWARE. 223512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä */ 233512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä 243512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä#ifndef DRM_RECT_H 253512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä#define DRM_RECT_H 263512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä 273512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä/** 28039735369c8fb105d0a090c949b7f894425121d8Ville Syrjälä * DOC: rect utils 29039735369c8fb105d0a090c949b7f894425121d8Ville Syrjälä * 30039735369c8fb105d0a090c949b7f894425121d8Ville Syrjälä * Utility functions to help manage rectangular areas for 31039735369c8fb105d0a090c949b7f894425121d8Ville Syrjälä * clipping, scaling, etc. calculations. 32039735369c8fb105d0a090c949b7f894425121d8Ville Syrjälä */ 33039735369c8fb105d0a090c949b7f894425121d8Ville Syrjälä 34039735369c8fb105d0a090c949b7f894425121d8Ville Syrjälä/** 35039735369c8fb105d0a090c949b7f894425121d8Ville Syrjälä * struct drm_rect - two dimensional rectangle 363512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä * @x1: horizontal starting coordinate (inclusive) 373512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä * @x2: horizontal ending coordinate (exclusive) 383512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä * @y1: vertical starting coordinate (inclusive) 393512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä * @y2: vertical ending coordinate (exclusive) 403512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä */ 413512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälästruct drm_rect { 423512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä int x1, y1, x2, y2; 433512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä}; 443512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä 453512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä/** 463512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä * drm_rect_adjust_size - adjust the size of the rectangle 473512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä * @r: rectangle to be adjusted 483512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä * @dw: horizontal adjustment 493512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä * @dh: vertical adjustment 503512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä * 513512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä * Change the size of rectangle @r by @dw in the horizontal direction, 523512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä * and by @dh in the vertical direction, while keeping the center 533512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä * of @r stationary. 543512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä * 553512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä * Positive @dw and @dh increase the size, negative values decrease it. 563512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä */ 573512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälästatic inline void drm_rect_adjust_size(struct drm_rect *r, int dw, int dh) 583512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä{ 593512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä r->x1 -= dw >> 1; 603512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä r->y1 -= dh >> 1; 613512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä r->x2 += (dw + 1) >> 1; 623512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä r->y2 += (dh + 1) >> 1; 633512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä} 643512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä 653512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä/** 663512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä * drm_rect_translate - translate the rectangle 673512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä * @r: rectangle to be tranlated 683512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä * @dx: horizontal translation 693512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä * @dy: vertical translation 703512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä * 713512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä * Move rectangle @r by @dx in the horizontal direction, 723512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä * and by @dy in the vertical direction. 733512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä */ 743512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälästatic inline void drm_rect_translate(struct drm_rect *r, int dx, int dy) 753512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä{ 763512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä r->x1 += dx; 773512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä r->y1 += dy; 783512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä r->x2 += dx; 793512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä r->y2 += dy; 803512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä} 813512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä 823512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä/** 833512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä * drm_rect_downscale - downscale a rectangle 843512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä * @r: rectangle to be downscaled 853512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä * @horz: horizontal downscale factor 863512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä * @vert: vertical downscale factor 873512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä * 883512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä * Divide the coordinates of rectangle @r by @horz and @vert. 893512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä */ 903512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälästatic inline void drm_rect_downscale(struct drm_rect *r, int horz, int vert) 913512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä{ 923512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä r->x1 /= horz; 933512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä r->y1 /= vert; 943512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä r->x2 /= horz; 953512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä r->y2 /= vert; 963512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä} 973512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä 983512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä/** 993512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä * drm_rect_width - determine the rectangle width 1003512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä * @r: rectangle whose width is returned 1013512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä * 1023512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä * RETURNS: 1033512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä * The width of the rectangle. 1043512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä */ 1053512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälästatic inline int drm_rect_width(const struct drm_rect *r) 1063512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä{ 1073512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä return r->x2 - r->x1; 1083512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä} 1093512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä 1103512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä/** 1113512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä * drm_rect_height - determine the rectangle height 1123512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä * @r: rectangle whose height is returned 1133512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä * 1143512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä * RETURNS: 1153512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä * The height of the rectangle. 1163512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä */ 1173512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälästatic inline int drm_rect_height(const struct drm_rect *r) 1183512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä{ 1193512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä return r->y2 - r->y1; 1203512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä} 1213512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä 1223512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä/** 1233512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä * drm_rect_visible - determine if the the rectangle is visible 1243512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä * @r: rectangle whose visibility is returned 1253512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä * 1263512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä * RETURNS: 1273512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä * %true if the rectangle is visible, %false otherwise. 1283512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä */ 1293512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälästatic inline bool drm_rect_visible(const struct drm_rect *r) 1303512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä{ 1313512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä return drm_rect_width(r) > 0 && drm_rect_height(r) > 0; 1323512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä} 1333512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä 1340894c96bff762d0474a8722bba3d420f643db359Ville Syrjälä/** 1350894c96bff762d0474a8722bba3d420f643db359Ville Syrjälä * drm_rect_equals - determine if two rectangles are equal 1360894c96bff762d0474a8722bba3d420f643db359Ville Syrjälä * @r1: first rectangle 1370894c96bff762d0474a8722bba3d420f643db359Ville Syrjälä * @r2: second rectangle 1380894c96bff762d0474a8722bba3d420f643db359Ville Syrjälä * 1390894c96bff762d0474a8722bba3d420f643db359Ville Syrjälä * RETURNS: 1400894c96bff762d0474a8722bba3d420f643db359Ville Syrjälä * %true if the rectangles are equal, %false otherwise. 1410894c96bff762d0474a8722bba3d420f643db359Ville Syrjälä */ 1420894c96bff762d0474a8722bba3d420f643db359Ville Syrjälästatic inline bool drm_rect_equals(const struct drm_rect *r1, 1430894c96bff762d0474a8722bba3d420f643db359Ville Syrjälä const struct drm_rect *r2) 1440894c96bff762d0474a8722bba3d420f643db359Ville Syrjälä{ 1450894c96bff762d0474a8722bba3d420f643db359Ville Syrjälä return r1->x1 == r2->x1 && r1->x2 == r2->x2 && 1460894c96bff762d0474a8722bba3d420f643db359Ville Syrjälä r1->y1 == r2->y1 && r1->y2 == r2->y2; 1470894c96bff762d0474a8722bba3d420f643db359Ville Syrjälä} 1480894c96bff762d0474a8722bba3d420f643db359Ville Syrjälä 1493512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjäläbool drm_rect_intersect(struct drm_rect *r, const struct drm_rect *clip); 1503512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjäläbool drm_rect_clip_scaled(struct drm_rect *src, struct drm_rect *dst, 1513512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä const struct drm_rect *clip, 1523512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä int hscale, int vscale); 1534954c4282f6b945f1dd5716f92b594a07fa4ffe3Ville Syrjäläint drm_rect_calc_hscale(const struct drm_rect *src, 1544954c4282f6b945f1dd5716f92b594a07fa4ffe3Ville Syrjälä const struct drm_rect *dst, 1554954c4282f6b945f1dd5716f92b594a07fa4ffe3Ville Syrjälä int min_hscale, int max_hscale); 1564954c4282f6b945f1dd5716f92b594a07fa4ffe3Ville Syrjäläint drm_rect_calc_vscale(const struct drm_rect *src, 1574954c4282f6b945f1dd5716f92b594a07fa4ffe3Ville Syrjälä const struct drm_rect *dst, 1584954c4282f6b945f1dd5716f92b594a07fa4ffe3Ville Syrjälä int min_vscale, int max_vscale); 1594954c4282f6b945f1dd5716f92b594a07fa4ffe3Ville Syrjäläint drm_rect_calc_hscale_relaxed(struct drm_rect *src, 1604954c4282f6b945f1dd5716f92b594a07fa4ffe3Ville Syrjälä struct drm_rect *dst, 1614954c4282f6b945f1dd5716f92b594a07fa4ffe3Ville Syrjälä int min_hscale, int max_hscale); 1624954c4282f6b945f1dd5716f92b594a07fa4ffe3Ville Syrjäläint drm_rect_calc_vscale_relaxed(struct drm_rect *src, 1634954c4282f6b945f1dd5716f92b594a07fa4ffe3Ville Syrjälä struct drm_rect *dst, 1644954c4282f6b945f1dd5716f92b594a07fa4ffe3Ville Syrjälä int min_vscale, int max_vscale); 165e7272df342ba337e87e210470bb93d97d192f2e0Ville Syrjälävoid drm_rect_debug_print(const struct drm_rect *r, bool fixed_point); 16607074006cd951f7a952512c57d60788ee7ea18dbVille Syrjälävoid drm_rect_rotate(struct drm_rect *r, 16707074006cd951f7a952512c57d60788ee7ea18dbVille Syrjälä int width, int height, 16807074006cd951f7a952512c57d60788ee7ea18dbVille Syrjälä unsigned int rotation); 16907074006cd951f7a952512c57d60788ee7ea18dbVille Syrjälävoid drm_rect_rotate_inv(struct drm_rect *r, 17007074006cd951f7a952512c57d60788ee7ea18dbVille Syrjälä int width, int height, 17107074006cd951f7a952512c57d60788ee7ea18dbVille Syrjälä unsigned int rotation); 1723512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä 1733512f976d252bd5d07d04e9e157f0cd210c959a0Ville Syrjälä#endif 174