/* This file is part of Telegram Desktop, the official desktop application for the Telegram messaging service. For license and copyright information please follow this link: https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL */ #include "editor/photo_editor_content.h" #include "editor/editor_crop.h" #include "media/view/media_view_pip.h" namespace Editor { using Media::View::FlipSizeByRotation; using Media::View::RotatedRect; PhotoEditorContent::PhotoEditorContent( not_null parent, std::shared_ptr photo, PhotoModifications modifications) : RpWidget(parent) , _crop(base::make_unique_q(this, modifications, photo->size())) , _photo(photo) , _modifications(modifications) { rpl::combine( _modifications.value(), sizeValue() ) | rpl::start_with_next([=]( const PhotoModifications &mods, const QSize &size) { if (size.isEmpty()) { return; } const auto imageSize = [&] { const auto rotatedSize = FlipSizeByRotation(size, mods.angle); const auto m = _crop->cropMargins(); const auto sizeForCrop = rotatedSize - QSize(m.left() + m.right(), m.top() + m.bottom()); const auto originalSize = photo->size(); if ((originalSize.width() > sizeForCrop.width()) || (originalSize.height() > sizeForCrop.height())) { return originalSize.scaled( sizeForCrop, Qt::KeepAspectRatio); } return originalSize; }(); _imageRect = QRect( QPoint(-imageSize.width() / 2, -imageSize.height() / 2), imageSize); _imageMatrix.reset(); _imageMatrix.translate(size.width() / 2, size.height() / 2); if (mods.flipped) { _imageMatrix.scale(-1, 1); } _imageMatrix.rotate(mods.angle); _crop->applyTransform( _imageMatrix.mapRect(_imageRect) + _crop->cropMargins(), mods.angle, mods.flipped); }, lifetime()); paintRequest( ) | rpl::start_with_next([=](const QRect &clip) { Painter p(this); p.fillRect(clip, Qt::transparent); p.setMatrix(_imageMatrix); p.drawPixmap(_imageRect, *photo); }, lifetime()); } void PhotoEditorContent::applyModifications( PhotoModifications modifications) { _modifications = std::move(modifications); update(); } QRect PhotoEditorContent::cropRect() const { return _crop->saveCropRect(_imageRect, _photo->rect()); } } // namespace Editor