12ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel/* 22ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. 32ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* 42ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* Redistribution and use in source and binary forms, with or without 52ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* modification, are permitted provided that the following conditions are 62ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* met: 72ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* * Redistributions of source code must retain the above copyright 82ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* notice, this list of conditions and the following disclaimer. 92ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* * Redistributions in binary form must reproduce the above 102ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* copyright notice, this list of conditions and the following 112ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* disclaimer in the documentation and/or other materials provided 122ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* with the distribution. 132ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* * Neither the name of The Linux Foundation nor the names of its 142ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* contributors may be used to endorse or promote products derived 152ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* from this software without specific prior written permission. 162ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* 172ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 182ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 192ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 202ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 212ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 222ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 232ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 242ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 252ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 262ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 272ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 282ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel*/ 292ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 302ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#include <math.h> 312ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#include <utils/rect.h> 322ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#include <utils/constants.h> 332ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#include <algorithm> 342ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 352ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#define __CLASS__ "RectUtils" 362ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 372ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelnamespace sdm { 382ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 392ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelbool IsValid(const LayerRect &rect) { 402ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel return ((rect.bottom > rect.top) && (rect.right > rect.left)); 412ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel} 422ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 432ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelbool IsCongruent(const LayerRect &rect1, const LayerRect &rect2) { 442ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel return ((rect1.left == rect2.left) && 452ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel (rect1.top == rect2.top) && 462ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel (rect1.right == rect2.right) && 472ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel (rect1.bottom == rect2.bottom)); 482ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel} 492ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 502ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelvoid Log(DebugTag debug_tag, const char *prefix, const LayerRect &roi) { 512ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel DLOGV_IF(debug_tag, "%s: left = %.0f, top = %.0f, right = %.0f, bottom = %.0f", 522ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel prefix, roi.left, roi.top, roi.right, roi.bottom); 532ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel} 542ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 552ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelvoid Normalize(const uint32_t &align_x, const uint32_t &align_y, LayerRect *rect) { 562ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel rect->left = ROUND_UP_ALIGN_UP(rect->left, align_x); 572ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel rect->right = ROUND_UP_ALIGN_DOWN(rect->right, align_x); 582ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel rect->top = ROUND_UP_ALIGN_UP(rect->top, align_y); 592ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel rect->bottom = ROUND_UP_ALIGN_DOWN(rect->bottom, align_y); 602ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel} 612ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 622ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry StrudelLayerRect Intersection(const LayerRect &rect1, const LayerRect &rect2) { 632ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel LayerRect res; 642ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 652ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if (!IsValid(rect1) || !IsValid(rect2)) { 662ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel return LayerRect(); 672ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 682ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 692ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel res.left = std::max(rect1.left, rect2.left); 702ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel res.top = std::max(rect1.top, rect2.top); 712ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel res.right = std::min(rect1.right, rect2.right); 722ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel res.bottom = std::min(rect1.bottom, rect2.bottom); 732ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 742ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if (!IsValid(res)) { 752ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel return LayerRect(); 762ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 772ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 782ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel return res; 792ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel} 802ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 812ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry StrudelLayerRect Reposition(const LayerRect &rect, const int &x_offset, const int &y_offset) { 822ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel LayerRect res; 832ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 842ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if (!IsValid(rect)) { 852ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel return LayerRect(); 862ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 872ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 882ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel res.left = rect.left + FLOAT(x_offset); 892ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel res.top = rect.top + FLOAT(y_offset); 902ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel res.right = rect.right + FLOAT(x_offset); 912ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel res.bottom = rect.bottom + FLOAT(y_offset); 922ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 932ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel return res; 942ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel} 952ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 962ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel// Not a geometrical rect deduction. Deducts rect2 from rect1 only if it results a single rect 972ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry StrudelLayerRect Subtract(const LayerRect &rect1, const LayerRect &rect2) { 982ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel LayerRect res; 992ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 1002ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel res = rect1; 1012ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 1022ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if ((rect1.left == rect2.left) && (rect1.right == rect2.right)) { 1032ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if ((rect1.top == rect2.top) && (rect2.bottom <= rect1.bottom)) { 1042ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel res.top = rect2.bottom; 1052ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } else if ((rect1.bottom == rect2.bottom) && (rect2.top >= rect1.top)) { 1062ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel res.bottom = rect2.top; 1072ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 1082ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } else if ((rect1.top == rect2.top) && (rect1.bottom == rect2.bottom)) { 1092ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if ((rect1.left == rect2.left) && (rect2.right <= rect1.right)) { 1102ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel res.left = rect2.right; 1112ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } else if ((rect1.right == rect2.right) && (rect2.left >= rect1.left)) { 1122ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel res.right = rect2.left; 1132ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 1142ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 1152ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 1162ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel return res; 1172ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel} 1182ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 1192ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry StrudelLayerRect Union(const LayerRect &rect1, const LayerRect &rect2) { 1202ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel LayerRect res; 1212ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 1222ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if (!IsValid(rect1) && !IsValid(rect2)) { 1232ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel return LayerRect(); 1242ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 1252ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 1262ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if (!IsValid(rect1)) { 1272ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel return rect2; 1282ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 1292ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 1302ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if (!IsValid(rect2)) { 1312ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel return rect1; 1322ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 1332ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 1342ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel res.left = std::min(rect1.left, rect2.left); 1352ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel res.top = std::min(rect1.top, rect2.top); 1362ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel res.right = std::max(rect1.right, rect2.right); 1372ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel res.bottom = std::max(rect1.bottom, rect2.bottom); 1382ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 1392ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel return res; 1402ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel} 1412ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 1422ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelvoid SplitLeftRight(const LayerRect &in_rect, uint32_t split_count, uint32_t align_x, 1432ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel bool flip_horizontal, LayerRect *out_rects) { 1442ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel LayerRect rect_temp = in_rect; 1452ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 1462ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel uint32_t split_width = UINT32(rect_temp.right - rect_temp.left) / split_count; 1472ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel float aligned_width = FLOAT(CeilToMultipleOf(split_width, align_x)); 1482ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 1492ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel for (uint32_t count = 0; count < split_count; count++) { 1502ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel float aligned_right = rect_temp.left + aligned_width; 1512ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel out_rects[count].left = rect_temp.left; 1522ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel out_rects[count].right = std::min(rect_temp.right, aligned_right); 1532ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel out_rects[count].top = rect_temp.top; 1542ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel out_rects[count].bottom = rect_temp.bottom; 1552ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 1562ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel rect_temp.left = out_rects[count].right; 1572ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 1582ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel Log(kTagRotator, "SplitLeftRight", out_rects[count]); 1592ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 1602ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 1612ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel // If we have a horizontal flip, then we should be splitting the source from right to left 1622ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel // to ensure that the right split will have an aligned width that matches the alignment on the 1632ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel // destination. 1642ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if (flip_horizontal && split_count > 1) { 1652ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel out_rects[0].right = out_rects[0].left + (out_rects[1].right - out_rects[1].left); 1662ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel out_rects[1].left = out_rects[0].right; 1672ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel Log(kTagRotator, "Adjusted Left", out_rects[0]); 1682ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel Log(kTagRotator, "Adjusted Right", out_rects[1]); 1692ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 1702ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel} 1712ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 1722ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelvoid SplitTopBottom(const LayerRect &in_rect, uint32_t split_count, uint32_t align_y, 1732ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel bool flip_horizontal, LayerRect *out_rects) { 1742ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel LayerRect rect_temp = in_rect; 1752ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 1762ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel uint32_t split_height = UINT32(rect_temp.bottom - rect_temp.top) / split_count; 1772ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel float aligned_height = FLOAT(CeilToMultipleOf(split_height, align_y)); 1782ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 1792ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel for (uint32_t count = 0; count < split_count; count++) { 1802ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel float aligned_bottom = rect_temp.top + aligned_height; 1812ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel out_rects[count].top = rect_temp.top; 1822ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel out_rects[count].bottom = std::min(rect_temp.bottom, aligned_bottom); 1832ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel out_rects[count].left = rect_temp.left; 1842ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel out_rects[count].right = rect_temp.right; 1852ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 1862ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel rect_temp.top = out_rects[count].bottom; 1872ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 1882ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel Log(kTagRotator, "SplitTopBottom", out_rects[count]); 1892ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 1902ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 1912ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel // If we have a horizontal flip, then we should be splitting the destination from bottom to top 1922ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel // to ensure that the bottom split's y-offset is aligned correctly after we swap the destinations 1932ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel // while accounting for the flip. 1942ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if (flip_horizontal && split_count > 1) { 1952ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel out_rects[0].bottom = out_rects[0].top + (out_rects[1].bottom - out_rects[1].top); 1962ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel out_rects[1].top = out_rects[0].bottom; 1972ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel Log(kTagRotator, "Adjusted Top", out_rects[0]); 1982ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel Log(kTagRotator, "Adjusted Bottom", out_rects[1]); 1992ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 2002ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel} 2012ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 2023d2d9c4a5c7de4febeaf0055d9d19b26f17898c8Thierry Strudelvoid MapRect(const LayerRect &src_domain, const LayerRect &dst_domain, const LayerRect &in_rect, 2033d2d9c4a5c7de4febeaf0055d9d19b26f17898c8Thierry Strudel LayerRect *out_rect) { 2042ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if (!IsValid(src_domain) || !IsValid(dst_domain) || !IsValid(in_rect)) { 2052ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel return; 2062ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 2072ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 208d62c8a289ff6b4838e543e82b655dc436f387574Thierry Strudel int x_offset = INT(src_domain.left); 209d62c8a289ff6b4838e543e82b655dc436f387574Thierry Strudel int y_offset = INT(src_domain.top); 210d62c8a289ff6b4838e543e82b655dc436f387574Thierry Strudel 211d62c8a289ff6b4838e543e82b655dc436f387574Thierry Strudel LayerRect modified_in_rect = Reposition(in_rect, -x_offset, -y_offset); 2122ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel float src_domain_width = src_domain.right - src_domain.left; 2132ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel float src_domain_height = src_domain.bottom - src_domain.top; 2142ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel float dst_domain_width = dst_domain.right - dst_domain.left; 2152ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel float dst_domain_height = dst_domain.bottom - dst_domain.top; 2162ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 2172ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel float width_ratio = dst_domain_width / src_domain_width; 2182ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel float height_ratio = dst_domain_height / src_domain_height; 2192ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 220d62c8a289ff6b4838e543e82b655dc436f387574Thierry Strudel out_rect->left = dst_domain.left + (width_ratio * modified_in_rect.left); 221d62c8a289ff6b4838e543e82b655dc436f387574Thierry Strudel out_rect->top = dst_domain.top + (height_ratio * modified_in_rect.top); 222d62c8a289ff6b4838e543e82b655dc436f387574Thierry Strudel out_rect->right = dst_domain.left + (width_ratio * modified_in_rect.right); 223d62c8a289ff6b4838e543e82b655dc436f387574Thierry Strudel out_rect->bottom = dst_domain.top + (height_ratio * modified_in_rect.bottom); 2242ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel} 2252ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 2262ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry StrudelRectOrientation GetOrientation(const LayerRect &in_rect) { 2272ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if (!IsValid(in_rect)) { 2282ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel return kOrientationUnknown; 2292ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 2302ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 2312ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel float input_width = in_rect.right - in_rect.left; 2322ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel float input_height = in_rect.bottom - in_rect.top; 2332ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 2342ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if (input_width < input_height) { 2352ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel return kOrientationPortrait; 2362ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 2372ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 2382ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel return kOrientationLandscape; 2392ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel} 2402ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 2412ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel} // namespace sdm 2422ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 243