X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Flayers.cpp;h=b9611570fad3fbbd6d610bc0db798a410de3ae01;hb=2796f54cf0b80ce180542198de2b2465f9d98d95;hp=92c19bf5a2901395d82226a95eaabf64880dfec8;hpb=be9cbe2c4d0bc0f65cbe08de2bad3eb6e7f248c0;p=apps%2Fagl-service-windowmanager.git diff --git a/src/layers.cpp b/src/layers.cpp index 92c19bf..b961157 100644 --- a/src/layers.cpp +++ b/src/layers.cpp @@ -17,6 +17,7 @@ #include #include "layers.hpp" +#include "json_helper.hpp" #include "hmi-debug.h" namespace wm @@ -29,17 +30,6 @@ layer::layer(nlohmann::json const &j) this->role = j["role"]; this->name = j["name"]; this->layer_id = j["layer_id"]; - this->rect = compositor::full_rect; - if (j["area"]["type"] == "rect") - { - auto jr = j["area"]["rect"]; - this->rect = compositor::rect{ - jr["width"], - jr["height"], - jr["x"], - jr["y"], - }; - } // Init flag of normal layout only this->is_normal_layout_only = true; @@ -191,4 +181,233 @@ json layer_map::to_json() const return j; } +compositor::rect layer_map::getAreaSize(const std::string &area) +{ + return area2size[area]; +} + +const compositor::rect layer_map::getScaleDestRect( + int to_w, int to_h, const std::string &aspect_setting) +{ + compositor::rect rct; + rct.x = 0; + rct.y = 0; + rct.w = to_w; + rct.h = to_h; + HMI_NOTICE("wm:lm", + "Scaling:'%s'. Check 'fullscreen' is set.", aspect_setting.c_str()); + // Base is "fullscreen". Crash me if "fullscreen" is not set + compositor::rect base = this->area2size.at("fullscreen"); + HMI_DEBUG("wm:lm", "Output size, width: %d, height: %d / fullscreen width: %d, height: %d", + to_w, to_h, base.w, base.h); + // If full_rct.w or full_rct.h == 0, crash me on purpose + double scale_rate_w = double(to_w) / double(base.w); + double scale_rate_h = double(to_h) / double(base.h); + double scale; + if (scale_rate_h < scale_rate_w) + { + scale = scale_rate_h; + } + else + { + scale = scale_rate_w; + } + HMI_DEBUG("wm", "set scale: %5.2f", scale); + + // Scaling + if (aspect_setting == "aspect_fit") + { + // offset + rct.x = (to_w - scale * base.w) / 2; + rct.y = (to_h - scale * base.h) / 2; + + // scaling + rct.w = base.w * scale; + rct.h = base.h * scale; + } + else if (aspect_setting == "display_fit") + { + // offset is none + // scaling + rct.w = base.w * scale_rate_w; + rct.h = base.h * scale_rate_h; + } + HMI_DEBUG("wm:lm", "offset x: %d, y: %d", rct.x, rct.y); + HMI_DEBUG("wm:lm", "after scaling w: %d, h: %d", rct.w, rct.h); + return rct; +} + +int layer_map::loadAreaDb() +{ + HMI_DEBUG("wm:lm", "Call"); + + // Get afm application installed dir + char const *afm_app_install_dir = getenv("AFM_APP_INSTALL_DIR"); + HMI_DEBUG("wm:lm", "afm_app_install_dir:%s", afm_app_install_dir); + + std::string file_name; + if (!afm_app_install_dir) + { + HMI_ERROR("wm:lm", "AFM_APP_INSTALL_DIR is not defined"); + } + else + { + file_name = std::string(afm_app_install_dir) + std::string("/etc/areas.db"); + } + + // Load area.db + json_object *json_obj; + int ret = jh::inputJsonFilie(file_name.c_str(), &json_obj); + if (0 > ret) + { + HMI_DEBUG("wm:lm", "Could not open area.db, so use default area information"); + json_obj = json_tokener_parse(kDefaultAreaDb); + } + HMI_DEBUG("wm:lm", "json_obj dump:%s", json_object_get_string(json_obj)); + + // Perse areas + HMI_DEBUG("wm:lm", "Perse areas"); + json_object *json_cfg; + if (!json_object_object_get_ex(json_obj, "areas", &json_cfg)) + { + HMI_ERROR("wm:lm", "Parse Error!!"); + return -1; + } + + int len = json_object_array_length(json_cfg); + HMI_DEBUG("wm:lm", "json_cfg len:%d", len); + HMI_DEBUG("wm:lm", "json_cfg dump:%s", json_object_get_string(json_cfg)); + + const char *area; + for (int i = 0; i < len; i++) + { + json_object *json_tmp = json_object_array_get_idx(json_cfg, i); + HMI_DEBUG("wm:lm", "> json_tmp dump:%s", json_object_get_string(json_tmp)); + + area = jh::getStringFromJson(json_tmp, "name"); + if (nullptr == area) + { + HMI_ERROR("wm:lm", "Parse Error!!"); + return -1; + } + HMI_DEBUG("wm:lm", "> area:%s", area); + + json_object *json_rect; + if (!json_object_object_get_ex(json_tmp, "rect", &json_rect)) + { + HMI_ERROR("wm:lm", "Parse Error!!"); + return -1; + } + HMI_DEBUG("wm:lm", "> json_rect dump:%s", json_object_get_string(json_rect)); + + compositor::rect area_size; + area_size.x = jh::getIntFromJson(json_rect, "x"); + area_size.y = jh::getIntFromJson(json_rect, "y"); + area_size.w = jh::getIntFromJson(json_rect, "w"); + area_size.h = jh::getIntFromJson(json_rect, "h"); + + this->area2size[area] = area_size; + } + + // Check + for (auto itr = this->area2size.begin(); + itr != this->area2size.end(); ++itr) + { + HMI_DEBUG("wm:lm", "area:%s x:%d y:%d w:%d h:%d", + itr->first.c_str(), itr->second.x, itr->second.y, + itr->second.w, itr->second.h); + } + + // Release json_object + json_object_put(json_obj); + + return 0; +} + +const char* layer_map::kDefaultAreaDb = "{ \ + \"areas\": [ \ + { \ + \"name\": \"fullscreen\", \ + \"rect\": { \ + \"x\": 0, \ + \"y\": 0, \ + \"w\": 1080, \ + \"h\": 1920 \ + } \ + }, \ + { \ + \"name\": \"normal.full\", \ + \"rect\": { \ + \"x\": 0, \ + \"y\": 218, \ + \"w\": 1080, \ + \"h\": 1488 \ + } \ + }, \ + { \ + \"name\": \"split.main\", \ + \"rect\": { \ + \"x\": 0, \ + \"y\": 218, \ + \"w\": 1080, \ + \"h\": 744 \ + } \ + }, \ + { \ + \"name\": \"split.sub\", \ + \"rect\": { \ + \"x\": 0, \ + \"y\": 962, \ + \"w\": 1080, \ + \"h\": 744 \ + } \ + }, \ + { \ + \"name\": \"software_keyboard\", \ + \"rect\": { \ + \"x\": 0, \ + \"y\": 962, \ + \"w\": 1080, \ + \"h\": 744 \ + } \ + }, \ + { \ + \"name\": \"restriction.normal\", \ + \"rect\": { \ + \"x\": 0, \ + \"y\": 218, \ + \"w\": 1080, \ + \"h\": 1488 \ + } \ + }, \ + { \ + \"name\": \"restriction.split.main\", \ + \"rect\": { \ + \"x\": 0, \ + \"y\": 218, \ + \"w\": 1080, \ + \"h\": 744 \ + } \ + }, \ + { \ + \"name\": \"restriction.split.sub\", \ + \"rect\": { \ + \"x\": 0, \ + \"y\": 962, \ + \"w\": 1080, \ + \"h\": 744 \ + } \ + }, \ + { \ + \"name\": \"on_screen\", \ + \"rect\": { \ + \"x\": 0, \ + \"y\": 218, \ + \"w\": 1080, \ + \"h\": 1488 \ + } \ + } \ + ] \ +}"; + } // namespace wm