summaryrefslogtreecommitdiffstats
path: root/src/util.cpp
diff options
context:
space:
mode:
authorTadao Tanikawa <tanikawa.tadao@jp.panasonic.com>2018-08-01 06:43:02 +0000
committerTadao Tanikawa <tanikawa.tadao@jp.panasonic.com>2018-08-02 07:24:34 +0000
commit8a791cb2ab7c159aac440cd97fbf2ae75d79b31f (patch)
tree5528fd61337a87cee81a9359b8803795c97df21c /src/util.cpp
parent6bc7a273350721be300423b1509527f336dce50e (diff)
Improve output of multiple screen resolution
To improve output on various monitor with various resolution, the following items are introduced. * Abandon scaling by Weston/IVI-SHELL This is cause of huge memory consumption on AGL CES2018 Demo because all contents are designed and rendered with FullHD resolution. * Add parameter of 'scale' to WM API (getDisplayInfo) WM calculate scale factor from screen resolution from wayland compositor and parameter of layout from WM's configuration, area.db. Bug-AGL: SPEC-1568, SPEC-1569, SPEC-1611 Change-Id: I5eac2da0106228c296550135c5200b2653864fdf Signed-off-by: Tadao Tanikawa <tanikawa.tadao@jp.panasonic.com>
Diffstat (limited to 'src/util.cpp')
-rw-r--r--src/util.cpp53
1 files changed, 53 insertions, 0 deletions
diff --git a/src/util.cpp b/src/util.cpp
index 19d590e..672b089 100644
--- a/src/util.cpp
+++ b/src/util.cpp
@@ -40,3 +40,56 @@ unique_fd::~unique_fd()
close(this->fd);
}
}
+
+void rectangle::fit(unsigned long to_width, unsigned long to_height)
+{
+ // fit rect within (to_width x to_height)
+
+ if (to_width <= width()) {
+ // scale to fit with
+ set_bottom(top() + (static_cast<long>(to_width) * height() / width()) - 1);
+ set_right(left() + to_width - 1);
+ } else {
+ // scale to fit height
+ set_right(left() + (static_cast<long>(to_height) * width () / height()) - 1);
+ set_bottom(top() + to_height - 1);
+ }
+}
+
+void rectangle::center(unsigned long outer_w, unsigned long outer_h)
+{
+ long inner_w = width();
+ long inner_h = height();
+
+ set_left((outer_w - inner_w) / 2);
+ set_right(left() + inner_w - 1);
+ set_top((outer_h - inner_h) / 2);
+ set_bottom(top() + inner_h - 1);
+}
+
+void rectangle::set_aspect(double ratio)
+{
+ // aspect ratio is width:height (= width/height)
+ // e.g. Landscape of HD's ratio is 16:9 (= 1.777...)
+ // Portrait of HD's ratio is 9:16 (= 0.5625)
+ //
+ // width / height = ratio
+ // width * height = area
+ //
+ // width = sqrt(ratio * area)
+ // height = width / ratio
+
+ long orig_w = width();
+ long orig_h = height();
+
+ if (ratio >= 1) {
+ // width >= height
+ // try to keep width
+ set_right(left() + orig_w - 1);
+ set_bottom(top() + static_cast<long>(orig_w / ratio + 0.5) - 1);
+ } else {
+ set_bottom(top() + orig_h - 1);
+ set_right(left() + static_cast<long>(orig_h * ratio + 0.5) - 1);
+ }
+}
+