54 float available_width,
int source_width,
int source_height,
56 float min_scale = 0.35f,
float max_scale = 4.0f,
57 float horizontal_chrome = 24.0f) {
58 min_scale = std::max(0.01f, min_scale);
59 max_scale = std::max(min_scale, max_scale);
60 const float usable_width =
61 std::max(1.0f, available_width - std::max(0.0f, horizontal_chrome));
65 scale = source_width > 0 ? usable_width /
static_cast<float>(source_width)
68 scale = std::clamp(scale, min_scale, max_scale);
71 .display_scale = scale,
73 source_width > 0 ?
static_cast<float>(source_width) * scale : 0.0f,
75 source_height > 0 ?
static_cast<float>(source_height) * scale : 0.0f,
76 .usable_width = usable_width,
91 float available_width,
int source_item_width,
int source_item_height,
92 int item_count,
int preferred_columns = 2,
94 float min_scale = 0.35f,
float max_scale = 4.0f,
float gap = 4.0f,
95 float horizontal_chrome = 24.0f) {
96 if (source_item_width <= 0 || source_item_height <= 0 || item_count <= 0) {
100 min_scale = std::max(0.01f, min_scale);
101 max_scale = std::max(min_scale, max_scale);
102 gap = std::max(0.0f, gap);
104 std::max(1.0f, available_width - std::max(0.0f, horizontal_chrome));
105 int columns = std::clamp(preferred_columns, 1, item_count);
107 auto fit_scale = [&](
int candidate_columns) {
108 const float gaps = gap *
static_cast<float>(candidate_columns - 1);
109 return std::max(0.01f,
110 (usable - gaps) / (
static_cast<float>(source_item_width) *
111 static_cast<float>(candidate_columns)));
116 while (columns > 1 && fit_scale(columns) < min_scale) {
119 while (columns < item_count) {
120 const int next_columns = columns + 1;
121 const float next_width =
122 static_cast<float>(next_columns * source_item_width) * max_scale +
123 gap *
static_cast<float>(next_columns - 1);
124 if (next_width > usable) {
127 columns = next_columns;
129 scale = std::clamp(fit_scale(columns), min_scale, max_scale);
131 scale = std::clamp(scale, min_scale, max_scale);
132 columns = std::clamp(
134 std::floor((usable + gap) / (source_item_width * scale + gap))),
138 const int rows = (item_count + columns - 1) / columns;
139 const float item_width = source_item_width * scale;
140 const float item_height = source_item_height * scale;
142 .display_scale = scale,
145 .item_width = item_width,
146 .item_height = item_height,
148 item_width * columns + gap *
static_cast<float>(columns - 1),
150 item_height * rows + gap *
static_cast<float>(std::max(0, rows - 1)),
AdaptiveSheetLayout ResolveAdaptiveSheetLayout(float available_width, int source_width, int source_height, AdaptiveSheetScaleMode mode=AdaptiveSheetScaleMode::kFit, float min_scale=0.35f, float max_scale=4.0f, float horizontal_chrome=24.0f)
AdaptiveSheetGridLayout ResolveAdaptiveSheetGridLayout(float available_width, int source_item_width, int source_item_height, int item_count, int preferred_columns=2, AdaptiveSheetScaleMode mode=AdaptiveSheetScaleMode::kFit, float min_scale=0.35f, float max_scale=4.0f, float gap=4.0f, float horizontal_chrome=24.0f)