@@ -1041,6 +1041,60 @@ namespace rsx
10411041 return result;
10421042 }
10431043
1044+ void image_view::adjust_padding ()
1045+ {
1046+ overlay_element::set_padding (m_original_padding_left, m_original_padding_right, m_original_padding_top, m_original_padding_bottom);
1047+
1048+ if (!m_keep_aspect_ratio || !external_ref || external_ref->w <= 0 || external_ref->h <= 0 )
1049+ {
1050+ return ;
1051+ }
1052+
1053+ // Adjust padding so that the image keeps its aspect ratio
1054+
1055+ const u16 p_left = m_original_padding_left;
1056+ const u16 p_right = m_original_padding_right;
1057+ const u16 p_top = m_original_padding_top;
1058+ const u16 p_bottom = m_original_padding_bottom;
1059+
1060+ const u16 target_width = w - (p_left + p_right);
1061+ const u16 target_height = h - (p_top + p_bottom);
1062+ const f32 target_ratio = target_width / static_cast <f32 >(target_height);
1063+ const f32 image_ratio = external_ref->w / static_cast <f32 >(external_ref->h );
1064+ const f32 convert_ratio = image_ratio / target_ratio;
1065+
1066+ if (convert_ratio > 1 .0f )
1067+ {
1068+ const u16 new_padding = static_cast <u16 >(target_height - target_height / convert_ratio) / 2 ;
1069+ overlay_element::set_padding (p_left, p_right, new_padding + p_top, new_padding + p_bottom);
1070+ }
1071+ else if (convert_ratio < 1 .0f )
1072+ {
1073+ const u16 new_padding = static_cast <u16 >(target_width - target_width * convert_ratio) / 2 ;
1074+ overlay_element::set_padding (p_left + new_padding, p_right + new_padding, p_top, p_bottom);
1075+ }
1076+ }
1077+
1078+ void image_view::set_padding (u16 left, u16 right, u16 top, u16 bottom)
1079+ {
1080+ m_original_padding_left = left;
1081+ m_original_padding_right = right;
1082+ m_original_padding_top = top;
1083+ m_original_padding_bottom = bottom;
1084+
1085+ adjust_padding ();
1086+ }
1087+
1088+ void image_view::set_padding (u16 padding)
1089+ {
1090+ m_original_padding_left = padding;
1091+ m_original_padding_right = padding;
1092+ m_original_padding_top = padding;
1093+ m_original_padding_bottom = padding;
1094+
1095+ adjust_padding ();
1096+ }
1097+
10441098 compiled_resource& image_view::get_compiled ()
10451099 {
10461100 if (is_compiled ())
@@ -1086,6 +1140,8 @@ namespace rsx
10861140 {
10871141 image_resource_ref = image_resource_id::raw_image;
10881142 external_ref = raw_image;
1143+
1144+ adjust_padding ();
10891145 }
10901146
10911147 void image_view::clear_image ()
@@ -1099,6 +1155,15 @@ namespace rsx
10991155 blur_strength = strength;
11001156 }
11011157
1158+ void image_view::set_keep_aspect_ratio (bool enabled)
1159+ {
1160+ if (m_keep_aspect_ratio != enabled)
1161+ {
1162+ m_keep_aspect_ratio = enabled;
1163+ adjust_padding ();
1164+ }
1165+ }
1166+
11021167 image_button::image_button ()
11031168 {
11041169 // Do not clip text to region extents
0 commit comments