sculpt_manager: consider rotation in panorama

config

Issue #5508
This commit is contained in:
Alexander Boettcher 2025-04-16 11:40:09 +02:00 committed by Norman Feske
parent 0f0f8a5be5
commit ea0c77b647
2 changed files with 19 additions and 10 deletions

View File

@ -387,15 +387,16 @@ struct Sculpt::Fb_config
});
}
struct Merge_info { Entry::Name name; Area px; };
struct Merge_info { Entry::Name name; Area px; Entry::Orientation orientation; };
void with_merge_info(auto const &fn) const
{
/* merged screen size and name corresponds to first enabled connector */
for (unsigned i = 0; i < _num_merged; i++) {
if (_entries[i].present && _entries[i].mode_attr.px.valid()) {
fn({ .name = _entries[i].name,
.px = _entries[i].mode_attr.px });
fn({ .name = _entries[i].name,
.px = _entries[i].mode_attr.px,
.orientation = _entries[i].orientation });
return;
}
}
@ -403,11 +404,13 @@ struct Sculpt::Fb_config
/* if all merged connectors are switched off, use name of first present one */
for (unsigned i = 0; i < _num_merged; i++) {
if (_entries[i].present) {
fn({ .name = _entries[i].name, .px = { }});
fn({ .name = _entries[i].name,
.px = { },
.orientation = { }});
return;
}
}
};
}
void _gen_merge_node(Xml_generator &xml) const
{

View File

@ -58,24 +58,30 @@ struct Sculpt::Panorama_config
{
int xpos = 0;
auto append = [&] (auto const &name, auto const area)
auto append = [&] (auto const &name, auto const area, auto const orientation)
{
if (_num_entries == MAX_ENTRIES)
return;
Area area_rotate = area;
if (orientation.rotate == Fb_connectors::Orientation::Rotate::R90 ||
orientation.rotate == Fb_connectors::Orientation::Rotate::R270)
area_rotate = { area.h, area.w };
_entries[_num_entries] = Entry {
.name = name,
.rect = { .at = { .x = xpos, .y = 0 }, .area = area } };
.rect = { .at = { .x = xpos, .y = 0 }, .area = area_rotate } };
_num_entries++;
xpos += area.w;
xpos += area_rotate.w;
};
fb_config.with_merge_info([&] (Fb_config::Merge_info const &info) {
append(info.name, info.px); });
append(info.name, info.px, info.orientation); });
fb_config.for_each_discrete_entry([&] (Fb_config::Entry const &entry) {
append(entry.name, entry.mode_attr.px); });
append(entry.name, entry.mode_attr.px, entry.orientation); });
}
void gen_policy_entries(Xml_generator &xml) const