parent
f5bff22bb8
commit
fc3810fd7f
3 changed files with 61 additions and 10 deletions
|
@ -152,19 +152,31 @@ QSize Photo::countOptimalSize() {
|
||||||
_parent->skipBlockHeight());
|
_parent->skipBlockHeight());
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto scaled = CountDesiredMediaSize(
|
const auto dimensions = QSize(_data->width(), _data->height());
|
||||||
{ _data->width(), _data->height() });
|
const auto scaled = CountDesiredMediaSize(dimensions);
|
||||||
const auto minWidth = std::clamp(
|
const auto minWidth = std::clamp(
|
||||||
_parent->minWidthForMedia(),
|
_parent->minWidthForMedia(),
|
||||||
(_parent->hasBubble() ? st::historyPhotoBubbleMinWidth : st::minPhotoSize),
|
(_parent->hasBubble()
|
||||||
|
? st::historyPhotoBubbleMinWidth
|
||||||
|
: st::minPhotoSize),
|
||||||
st::maxMediaSize);
|
st::maxMediaSize);
|
||||||
const auto maxActualWidth = qMax(scaled.width(), minWidth);
|
const auto maxActualWidth = qMax(scaled.width(), minWidth);
|
||||||
auto maxWidth = qMax(maxActualWidth, scaled.height());
|
auto maxWidth = qMax(maxActualWidth, scaled.height());
|
||||||
auto minHeight = qMax(scaled.height(), st::minPhotoSize);
|
auto minHeight = qMax(scaled.height(), st::minPhotoSize);
|
||||||
if (_parent->hasBubble() && !_caption.isEmpty()) {
|
if (_parent->hasBubble() && !_caption.isEmpty()) {
|
||||||
maxWidth = qMax(maxWidth, st::msgPadding.left()
|
maxWidth = qMax(
|
||||||
+ _caption.maxWidth()
|
maxWidth,
|
||||||
+ st::msgPadding.right());
|
(st::msgPadding.left()
|
||||||
|
+ _caption.maxWidth()
|
||||||
|
+ st::msgPadding.right()));
|
||||||
|
if (!dimensions.isEmpty()
|
||||||
|
&& ::Media::Streaming::FrameResizeMayExpand(
|
||||||
|
{ maxWidth, minHeight },
|
||||||
|
dimensions)) {
|
||||||
|
minHeight = qMax(
|
||||||
|
minHeight,
|
||||||
|
maxWidth * dimensions.height() / dimensions.width());
|
||||||
|
}
|
||||||
minHeight += st::mediaCaptionSkip + _caption.minHeight();
|
minHeight += st::mediaCaptionSkip + _caption.minHeight();
|
||||||
if (isBubbleBottom()) {
|
if (isBubbleBottom()) {
|
||||||
minHeight += st::msgPadding.bottom();
|
minHeight += st::msgPadding.bottom();
|
||||||
|
@ -180,10 +192,13 @@ QSize Photo::countCurrentSize(int newWidth) {
|
||||||
const auto thumbMaxWidth = qMin(newWidth, st::maxMediaSize);
|
const auto thumbMaxWidth = qMin(newWidth, st::maxMediaSize);
|
||||||
const auto minWidth = std::clamp(
|
const auto minWidth = std::clamp(
|
||||||
_parent->minWidthForMedia(),
|
_parent->minWidthForMedia(),
|
||||||
(_parent->hasBubble() ? st::historyPhotoBubbleMinWidth : st::minPhotoSize),
|
(_parent->hasBubble()
|
||||||
|
? st::historyPhotoBubbleMinWidth
|
||||||
|
: st::minPhotoSize),
|
||||||
thumbMaxWidth);
|
thumbMaxWidth);
|
||||||
|
const auto dimensions = QSize(_data->width(), _data->height());
|
||||||
auto pix = CountPhotoMediaSize(
|
auto pix = CountPhotoMediaSize(
|
||||||
CountDesiredMediaSize({ _data->width(), _data->height() }),
|
CountDesiredMediaSize(dimensions),
|
||||||
newWidth,
|
newWidth,
|
||||||
maxWidth());
|
maxWidth());
|
||||||
newWidth = qMax(pix.width(), minWidth);
|
newWidth = qMax(pix.width(), minWidth);
|
||||||
|
@ -195,6 +210,14 @@ QSize Photo::countCurrentSize(int newWidth) {
|
||||||
+ _caption.maxWidth()
|
+ _caption.maxWidth()
|
||||||
+ st::msgPadding.right()));
|
+ st::msgPadding.right()));
|
||||||
newWidth = qMin(qMax(newWidth, maxWithCaption), thumbMaxWidth);
|
newWidth = qMin(qMax(newWidth, maxWithCaption), thumbMaxWidth);
|
||||||
|
if (!dimensions.isEmpty()
|
||||||
|
&& ::Media::Streaming::FrameResizeMayExpand(
|
||||||
|
{ newWidth, newHeight },
|
||||||
|
dimensions)) {
|
||||||
|
newHeight = qMax(
|
||||||
|
newHeight,
|
||||||
|
newWidth * dimensions.height() / dimensions.width());
|
||||||
|
}
|
||||||
const auto captionw = newWidth
|
const auto captionw = newWidth
|
||||||
- st::msgPadding.left()
|
- st::msgPadding.left()
|
||||||
- st::msgPadding.right();
|
- st::msgPadding.right();
|
||||||
|
|
|
@ -368,8 +368,7 @@ ExpandDecision DecideFrameResize(
|
||||||
return { .result = original, .expanding = true };
|
return { .result = original, .expanding = true };
|
||||||
}
|
}
|
||||||
const auto big = original.scaled(outer, Qt::KeepAspectRatioByExpanding);
|
const auto big = original.scaled(outer, Qt::KeepAspectRatioByExpanding);
|
||||||
if ((big.width() * minVisibleNominator
|
if ((big.width() <= outer.width())
|
||||||
<= outer.width() * minVisibleDenominator)
|
|
||||||
&& (big.height() * minVisibleNominator
|
&& (big.height() * minVisibleNominator
|
||||||
<= outer.height() * minVisibleDenominator)) {
|
<= outer.height() * minVisibleDenominator)) {
|
||||||
return { .result = big, .expanding = true };
|
return { .result = big, .expanding = true };
|
||||||
|
@ -377,6 +376,30 @@ ExpandDecision DecideFrameResize(
|
||||||
return { .result = original.scaled(outer, Qt::KeepAspectRatio) };
|
return { .result = original.scaled(outer, Qt::KeepAspectRatio) };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool FrameResizeMayExpand(
|
||||||
|
QSize outer,
|
||||||
|
QSize original,
|
||||||
|
int minVisibleNominator,
|
||||||
|
int minVisibleDenominator) {
|
||||||
|
const auto min = std::min({
|
||||||
|
outer.width(),
|
||||||
|
outer.height(),
|
||||||
|
original.width(),
|
||||||
|
original.height(),
|
||||||
|
});
|
||||||
|
// Count for: (nominator / denominator) - (1 / min).
|
||||||
|
// In case the result is less than 1 / 2, just return.
|
||||||
|
if (2 * minVisibleNominator * min
|
||||||
|
< 2 * minVisibleDenominator + minVisibleDenominator * min) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return DecideFrameResize(
|
||||||
|
outer,
|
||||||
|
original,
|
||||||
|
minVisibleNominator * min - minVisibleDenominator,
|
||||||
|
minVisibleDenominator * min).expanding;
|
||||||
|
}
|
||||||
|
|
||||||
ExpandDecision DecideVideoFrameResize(QSize outer, QSize original) {
|
ExpandDecision DecideVideoFrameResize(QSize outer, QSize original) {
|
||||||
return DecideFrameResize(outer, original, 1, 2);
|
return DecideFrameResize(outer, original, 1, 2);
|
||||||
}
|
}
|
||||||
|
|
|
@ -75,6 +75,11 @@ struct ExpandDecision {
|
||||||
QSize original,
|
QSize original,
|
||||||
int minVisibleNominator = 3, // If we cut out no more than 0.25 of
|
int minVisibleNominator = 3, // If we cut out no more than 0.25 of
|
||||||
int minVisibleDenominator = 4); // the original, let's expand.
|
int minVisibleDenominator = 4); // the original, let's expand.
|
||||||
|
[[nodiscard]] bool FrameResizeMayExpand(
|
||||||
|
QSize outer,
|
||||||
|
QSize original,
|
||||||
|
int minVisibleNominator = 3,
|
||||||
|
int minVisibleDenominator = 4);
|
||||||
[[nodiscard]] ExpandDecision DecideVideoFrameResize(
|
[[nodiscard]] ExpandDecision DecideVideoFrameResize(
|
||||||
QSize outer,
|
QSize outer,
|
||||||
QSize original);
|
QSize original);
|
||||||
|
|
Loading…
Reference in a new issue