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