Move Image and derived to ui/image.

This commit is contained in:
John Preston 2018-10-11 18:54:57 +03:00
parent d56a3d015b
commit 113f665295
48 changed files with 1917 additions and 1776 deletions

View File

@ -7,10 +7,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
*/
#include "app.h"
#ifdef OS_MAC_OLD
#include <libexif/exif-data.h>
#endif // OS_MAC_OLD
#include "styles/style_overview.h"
#include "styles/style_mediaview.h"
#include "styles/style_chat_helpers.h"
@ -27,6 +23,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "history/history_item_components.h"
#include "history/view/history_view_service_message.h"
#include "media/media_audio.h"
#include "ui/image.h"
#include "inline_bots/inline_bot_layout_item.h"
#include "messenger.h"
#include "application.h"
@ -46,14 +43,15 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "window/notifications_manager.h"
#include "platform/platform_notifications_manager.h"
#ifdef OS_MAC_OLD
#include <libexif/exif-data.h>
#endif // OS_MAC_OLD
namespace {
App::LaunchState _launchState = App::Launched;
std::unordered_map<PeerId, std::unique_ptr<PeerData>> peersData;
using LocationsData = QHash<LocationCoords, LocationData*>;
LocationsData locationsData;
using DependentItemsSet = OrderedSet<HistoryItem*>;
using DependentItems = QMap<HistoryItem*, DependentItemsSet>;
DependentItems dependentItems;
@ -1155,20 +1153,6 @@ namespace App {
return nullptr;
}
LocationData *location(const LocationCoords &coords) {
auto i = locationsData.constFind(coords);
if (i == locationsData.cend()) {
i = locationsData.insert(coords, new LocationData(coords));
}
return i.value();
}
void forgetMedia() {
for_const (auto location, ::locationsData) {
location->thumb->forget();
}
}
QString peerName(const PeerData *peer, bool forDialogs) {
return peer ? ((forDialogs && peer->isUser() && !peer->asUser()->nameOrPhone.isEmpty()) ? peer->asUser()->nameOrPhone : peer->name) : lang(lng_deleted);
}
@ -1260,9 +1244,6 @@ namespace App {
delete item;
}
}
for (const auto data : base::take(::locationsData)) {
delete data;
}
clearMousedItems();
}
@ -1470,10 +1451,8 @@ namespace App {
histories().clear();
clearStorageImages();
Images::ClearRemote();
cSetServerBackgrounds(WallPapers());
serviceImageCacheSize = imageCacheSize();
}
void deinitMedia() {
@ -1481,7 +1460,7 @@ namespace App {
Data::clearGlobalStructures();
clearAllImages();
Images::ClearAll();
}
void hoveredItem(HistoryView::Element *item) {
@ -1536,15 +1515,6 @@ namespace App {
return ::monofont;
}
void checkImageCacheSize() {
int64 nowImageCacheSize = imageCacheSize();
if (nowImageCacheSize > serviceImageCacheSize + MemoryForImageCache) {
App::forgetMedia();
Auth().data().forgetMedia();
serviceImageCacheSize = imageCacheSize();
}
}
void quit() {
if (quitting()) {
return;

View File

@ -14,8 +14,6 @@ enum NewMessageType : char;
class Messenger;
class MainWindow;
class MainWidget;
class LocationCoords;
struct LocationData;
class HistoryItem;
class History;
class Histories;
@ -138,9 +136,6 @@ namespace App {
PeerData *peerByName(const QString &username);
QString peerName(const PeerData *peer, bool forDialogs = false);
LocationData *location(const LocationCoords &coords);
void forgetMedia();
Histories &histories();
not_null<History*> history(const PeerId &peer);
History *historyLoaded(const PeerId &peer);
@ -192,8 +187,6 @@ namespace App {
void initMedia();
void deinitMedia();
void checkImageCacheSize();
enum LaunchState {
Launched = 0,
QuitRequested = 1,

View File

@ -14,6 +14,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "styles/style_overview.h"
#include "styles/style_boxes.h"
#include "ui/effects/round_checkbox.h"
#include "ui/image.h"
#include "auth_session.h"
class BackgroundBox::Inner : public TWidget, public RPCSender, private base::Subscriber {

View File

@ -20,6 +20,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "ui/widgets/labels.h"
#include "ui/toast/toast.h"
#include "ui/empty_userpic.h"
#include "ui/image.h"
#include "core/click_handler_types.h"
#include "storage/localstorage.h"
#include "data/data_session.h"

View File

@ -9,6 +9,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "ui/widgets/input_fields.h"
#include "ui/text_options.h"
#include "ui/image.h"
#include "media/media_clip_reader.h"
#include "history/history.h"
#include "history/history_item.h"

View File

@ -22,6 +22,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "ui/widgets/buttons.h"
#include "ui/widgets/scroll_area.h"
#include "ui/emoji_config.h"
#include "ui/image.h"
#include "auth_session.h"
#include "messenger.h"

View File

@ -27,6 +27,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "ui/effects/slide_animation.h"
#include "ui/widgets/discrete_sliders.h"
#include "ui/widgets/input_fields.h"
#include "ui/image.h"
#include "auth_session.h"
#include "messenger.h"

View File

@ -19,6 +19,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "ui/wrap/fade_wrap.h"
#include "ui/empty_userpic.h"
#include "ui/emoji_config.h"
#include "ui/image.h"
#include "messenger.h"
#include "mainwindow.h"
#include "lang/lang_keys.h"

View File

@ -13,6 +13,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "apiwrap.h"
#include "storage/localstorage.h"
#include "ui/widgets/scroll_area.h"
#include "ui/image.h"
#include "styles/style_history.h"
#include "styles/style_widgets.h"
#include "styles/style_chat_helpers.h"

View File

@ -14,6 +14,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "ui/widgets/buttons.h"
#include "ui/widgets/input_fields.h"
#include "ui/effects/ripple_animation.h"
#include "ui/image.h"
#include "boxes/stickers_box.h"
#include "inline_bots/inline_bot_result.h"
#include "chat_helpers/stickers.h"

View File

@ -11,6 +11,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "data/data_session.h"
#include "ui/widgets/buttons.h"
#include "ui/effects/ripple_animation.h"
#include "ui/image.h"
#include "boxes/stickers_box.h"
#include "inline_bots/inline_bot_result.h"
#include "chat_helpers/stickers.h"

View File

@ -318,29 +318,6 @@ inline T snap(const T &v, const T &_min, const T &_max) {
return (v < _min) ? _min : ((v > _max) ? _max : v);
}
template <typename T>
class ManagedPtr {
public:
ManagedPtr() = default;
ManagedPtr(T *p) : _data(p) {
}
T *operator->() const {
return _data;
}
T *v() const {
return _data;
}
explicit operator bool() const {
return _data != nullptr;
}
protected:
using Parent = ManagedPtr<T>;
T *_data = nullptr;
};
QString translitRusEng(const QString &rus);
QString rusKeyboardLayoutSwitch(const QString &from);

View File

@ -21,6 +21,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "history/history_media_types.h"
#include "window/window_controller.h"
#include "storage/cache/storage_cache_database.h"
#include "ui/image.h"
#include "auth_session.h"
#include "mainwindow.h"
#include "messenger.h"

View File

@ -13,6 +13,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "history/view/history_view_element.h"
#include "ui/text_options.h"
#include "ui/emoji_config.h"
#include "ui/image.h"
#include "storage/storage_shared_media.h"
#include "storage/localstorage.h"
#include "data/data_session.h"
@ -765,7 +766,7 @@ MediaLocation::MediaLocation(
const QString &title,
const QString &description)
: Media(parent)
, _location(App::location(coords))
, _location(Auth().data().location(coords))
, _title(title)
, _description(description) {
}

View File

@ -9,6 +9,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
class HistoryItem;
class HistoryMedia;
class LocationCoords;
struct LocationData;
namespace base {
template <typename Enum>

View File

@ -28,6 +28,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "storage/localstorage.h"
#include "ui/empty_userpic.h"
#include "ui/text_options.h"
#include "ui/image.h"
namespace {
@ -221,6 +222,20 @@ void PeerData::paintUserpicSquare(Painter &p, int x, int y, int size) const {
}
}
void PeerData::loadUserpic(bool loadFirst, bool prior) {
_userpic->load(userpicPhotoOrigin(), loadFirst, prior);
}
bool PeerData::userpicLoaded() const {
return _userpic->loaded();
}
bool PeerData::useEmptyUserpic() const {
return _userpicLocation.isNull()
|| !_userpic
|| !_userpic->loaded();
}
StorageKey PeerData::userpicUniqueKey() const {
if (useEmptyUserpic()) {
return _userpicEmpty->uniqueKey();
@ -296,7 +311,7 @@ void PeerData::setUserpicChecked(
const StorageImageLocation &location,
ImagePtr userpic) {
if (_userpicPhotoId != photoId
|| _userpic.v() != userpic.v()
|| _userpic.get() != userpic.get()
|| _userpicLocation != location) {
setUserpic(photoId, location, userpic);
Notify::peerUpdatedDelayed(this, UpdateFlag::PhotoChanged);

View File

@ -165,17 +165,9 @@ public:
int x,
int y,
int size) const;
void loadUserpic(bool loadFirst = false, bool prior = true) {
_userpic->load(userpicPhotoOrigin(), loadFirst, prior);
}
bool userpicLoaded() const {
return _userpic->loaded();
}
bool useEmptyUserpic() const {
return _userpicLocation.isNull()
|| !_userpic
|| !_userpic->loaded();
}
void loadUserpic(bool loadFirst = false, bool prior = true);
bool userpicLoaded() const;
bool useEmptyUserpic() const;
StorageKey userpicUniqueKey() const;
void saveUserpic(const QString &path, int size) const;
void saveUserpicRounded(const QString &path, int size) const;

View File

@ -8,6 +8,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "data/data_photo.h"
#include "data/data_session.h"
#include "ui/image.h"
#include "mainwidget.h"
#include "history/history_media_types.h"
#include "auth_session.h"

View File

@ -11,6 +11,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "auth_session.h"
#include "apiwrap.h"
#include "messenger.h"
#include "ui/image.h"
#include "export/export_controller.h"
#include "export/view/export_view_panel_controller.h"
#include "window/notifications_manager.h"
@ -1478,6 +1479,16 @@ void Session::gameApplyFields(
notifyGameUpdateDelayed(game);
}
not_null<LocationData*> Session::location(const LocationCoords &coords) {
auto i = _locations.find(coords);
if (i == _locations.cend()) {
i = _locations.emplace(
coords,
std::make_unique<LocationData>(coords)).first;
}
return i->second.get();
}
void Session::registerPhotoItem(
not_null<const PhotoData*> photo,
not_null<HistoryItem*> item) {
@ -2000,6 +2011,9 @@ void Session::forgetMedia() {
for (const auto &[id, document] : _documents) {
document->forget();
}
for (const auto &[coords, location] : _locations) {
location->thumb->forget();
}
}
void Session::setMimeForwardIds(MessageIdsList &&list) {

View File

@ -11,6 +11,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "chat_helpers/stickers.h"
#include "dialogs/dialogs_key.h"
#include "data/data_groups.h"
#include "history/history_location_manager.h"
#include "base/timer.h"
class HistoryItem;
@ -323,6 +324,8 @@ public:
not_null<GameData*> original,
const MTPGame &data);
not_null<LocationData*> location(const LocationCoords &coords);
void registerPhotoItem(
not_null<const PhotoData*> photo,
not_null<HistoryItem*> item);
@ -593,6 +596,9 @@ private:
std::unordered_map<
WebPageId,
std::unique_ptr<WebPageData>> _webpages;
std::unordered_map<
LocationCoords,
std::unique_ptr<LocationData>> _locations;
std::map<
not_null<const WebPageData*>,
base::flat_set<not_null<HistoryItem*>>> _webpageItems;

View File

@ -27,6 +27,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "window/window_controller.h"
#include "auth_session.h"
#include "ui/widgets/popup_menu.h"
#include "ui/image.h"
#include "core/file_utilities.h"
#include "core/tl_help.h"
#include "base/overload.h"

View File

@ -33,6 +33,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "data/data_channel_admins.h"
#include "data/data_feed.h"
#include "ui/text_options.h"
#include "ui/image.h"
#include "core/crash_reports.h"
namespace {
@ -1261,7 +1262,7 @@ void History::mainViewRemoved(
}
void History::newItemAdded(not_null<HistoryItem*> item) {
App::checkImageCacheSize();
Images::CheckCacheSize();
item->indexAsNewItem();
if (const auto from = item->from() ? item->from()->asUser() : nullptr) {
if (from == item->author()) {

View File

@ -19,8 +19,9 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "history/view/history_view_message.h"
#include "history/view/history_view_service_message.h"
#include "history/view/history_view_cursor_state.h"
#include "ui/text_options.h"
#include "ui/widgets/popup_menu.h"
#include "ui/text_options.h"
#include "ui/image.h"
#include "window/window_controller.h"
#include "window/window_peer_menu.h"
#include "boxes/confirm_box.h"

View File

@ -10,6 +10,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "lang/lang_keys.h"
#include "ui/effects/ripple_animation.h"
#include "ui/text_options.h"
#include "ui/image.h"
#include "history/history_message.h"
#include "history/history_media.h"
#include "history/history_media_types.h"

View File

@ -9,6 +9,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "mainwidget.h"
#include "lang/lang_keys.h"
#include "ui/image.h"
#include "platform/platform_specific.h"
namespace {

View File

@ -39,6 +39,18 @@ public:
return _access;
}
inline size_t hash() const {
#ifndef OS_MAC_OLD
return QtPrivate::QHashCombine().operator()(
std::hash<float64>()(_lat),
_lon);
#else // OS_MAC_OLD
const auto h1 = std::hash<float64>()(_lat);
const auto h2 = std::hash<float64>()(_lon);
return ((h1 << 16) | (h1 >> 16)) ^ h2;
#endif // OS_MAC_OLD
}
private:
static QString asString(float64 value) {
constexpr auto kPrecision = 6;
@ -53,22 +65,23 @@ private:
return (a._lat < b._lat) || ((a._lat == b._lat) && (a._lon < b._lon));
}
friend inline uint qHash(const LocationCoords &t, uint seed = 0) {
#ifndef OS_MAC_OLD
return qHash(QtPrivate::QHashCombine().operator()(qHash(t._lat), t._lon), seed);
#else // OS_MAC_OLD
uint h1 = qHash(t._lat, seed);
uint h2 = qHash(t._lon, seed);
return ((h1 << 16) | (h1 >> 16)) ^ h2 ^ seed;
#endif // OS_MAC_OLD
}
float64 _lat = 0;
float64 _lon = 0;
uint64 _access = 0;
};
namespace std {
template <>
struct hash<LocationCoords> {
size_t operator()(const LocationCoords &value) const {
return value.hash();
}
};
} // namespace std
struct LocationData {
LocationData(const LocationCoords &coords);

View File

@ -35,6 +35,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "ui/grouped_layout.h"
#include "ui/text_options.h"
#include "ui/emoji_config.h"
#include "ui/image.h"
#include "data/data_session.h"
#include "data/data_media_types.h"

View File

@ -21,6 +21,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "ui/widgets/labels.h"
#include "ui/widgets/shadow.h"
#include "ui/effects/ripple_animation.h"
#include "ui/special_buttons.h"
#include "ui/image.h"
#include "inline_bots/inline_bot_result.h"
#include "data/data_drafts.h"
#include "data/data_session.h"
@ -1920,9 +1922,7 @@ void HistoryWidget::showHistory(const PeerId &peerId, MsgId showAtMsgId, bool re
_nonEmptySelection = false;
if (_peer) {
App::forgetMedia();
Auth().data().forgetMedia();
_serviceImageCacheSize = imageCacheSize();
Auth().downloader().clearPriorities();
_history = App::history(_peer);
@ -2856,7 +2856,7 @@ void HistoryWidget::delayedShowAt(MsgId showAtMsgId) {
}
void HistoryWidget::onScroll() {
App::checkImageCacheSize();
Images::CheckCacheSize();
preloadHistoryIfNeeded();
visibleAreaUpdated();
if (!_synteticScrollEvent) {

View File

@ -867,7 +867,6 @@ private:
TextUpdateEvents _textUpdateEvents = (TextUpdateEvents() | TextUpdateEvent::SaveDraft | TextUpdateEvent::SendTyping);
int64 _serviceImageCacheSize = 0;
QString _confirmSource;
Animation _a_show;

View File

@ -15,6 +15,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "history/history_item_text.h"
#include "history/history_media_types.h"
#include "ui/widgets/popup_menu.h"
#include "ui/image.h"
#include "chat_helpers/message_field.h"
#include "boxes/confirm_box.h"
#include "data/data_photo.h"

View File

@ -21,6 +21,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "history/history_location_manager.h"
#include "history/view/history_view_cursor_state.h"
#include "storage/localstorage.h"
#include "ui/image.h"
#include "auth_session.h"
#include "apiwrap.h"
#include "lang/lang_keys.h"

View File

@ -15,6 +15,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "storage/localstorage.h"
#include "mainwidget.h"
#include "ui/empty_userpic.h"
#include "ui/image.h"
namespace InlineBots {
namespace Layout {

View File

@ -15,6 +15,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "storage/file_download.h"
#include "core/file_utilities.h"
#include "core/mime_type.h"
#include "ui/image.h"
#include "mainwidget.h"
#include "auth_session.h"

View File

@ -8,6 +8,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#pragma once
class FileLoader;
class LocationCoords;
namespace InlineBots {

View File

@ -25,12 +25,13 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "window/section_memento.h"
#include "window/section_widget.h"
#include "window/window_connecting_widget.h"
#include "ui/toast/toast.h"
#include "ui/widgets/dropdown_menu.h"
#include "ui/focus_persister.h"
#include "ui/resize_area.h"
#include "ui/text_options.h"
#include "ui/emoji_config.h"
#include "ui/toast/toast.h"
#include "ui/image.h"
#include "chat_helpers/message_field.h"
#include "chat_helpers/stickers.h"
#include "info/info_memento.h"

View File

@ -15,6 +15,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "data/data_session.h"
#include "history/history.h"
#include "history/history_media.h"
#include "ui/image.h"
#include "auth_session.h"
#include "styles/style_mediaview.h"

View File

@ -16,6 +16,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "ui/widgets/popup_menu.h"
#include "ui/widgets/buttons.h"
#include "ui/text_options.h"
#include "ui/image.h"
#include "media/media_clip_reader.h"
#include "media/view/media_clip_controller.h"
#include "media/view/media_view_group_thumbs.h"

View File

@ -44,6 +44,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "ui/widgets/tooltip.h"
#include "ui/text_options.h"
#include "ui/emoji_config.h"
#include "ui/image.h"
#include "storage/serialize_common.h"
#include "window/window_controller.h"
#include "base/qthelp_regex.h"
@ -1123,7 +1124,7 @@ void Messenger::loggedOut() {
Local::reset();
cSetOtherOnline(0);
clearStorageImages();
Images::ClearRemote();
}
QPoint Messenger::getPointForCallPanelCenter() const {

View File

@ -29,6 +29,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "history/view/history_view_cursor_state.h"
#include "ui/effects/round_checkbox.h"
#include "ui/text_options.h"
#include "ui/image.h"
namespace Overview {
namespace Layout {

View File

@ -9,6 +9,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include <windows.h>
class LocationCoords;
namespace Platform {
inline void SetWatchingMediaKeys(bool watching) {

View File

@ -20,6 +20,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "ui/widgets/labels.h"
#include "ui/effects/radial_animation.h"
#include "ui/toast/toast.h"
#include "ui/image.h"
#include "lang/lang_keys.h"
#include "window/themes/window_theme_editor.h"
#include "window/themes/window_theme.h"

View File

@ -10,6 +10,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "storage/serialize_common.h"
#include "chat_helpers/stickers.h"
#include "data/data_session.h"
#include "ui/image.h"
#include "auth_session.h"
namespace {

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,441 @@
/*
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
*/
#pragma once
namespace Images {
void ClearRemote();
void ClearAll();
void CheckCacheSize();
} // namespace Images
class DelayedStorageImage;
class HistoryItem;
class Image {
public:
Image(const QString &file, QByteArray format = QByteArray());
Image(const QByteArray &filecontent, QByteArray format = QByteArray());
Image(const QPixmap &pixmap, QByteArray format = QByteArray());
Image(const QByteArray &filecontent, QByteArray format, const QPixmap &pixmap);
static Image *Blank();
virtual void automaticLoad(
Data::FileOrigin origin,
const HistoryItem *item) {
}
virtual void automaticLoadSettingsChanged() {
}
virtual bool loaded() const {
return true;
}
virtual bool loading() const {
return false;
}
virtual bool displayLoading() const {
return false;
}
virtual void cancel() {
}
virtual float64 progress() const {
return 1;
}
virtual int32 loadOffset() const {
return 0;
}
const QPixmap &pix(
Data::FileOrigin origin,
int32 w = 0,
int32 h = 0) const;
const QPixmap &pixRounded(
Data::FileOrigin origin,
int32 w = 0,
int32 h = 0,
ImageRoundRadius radius = ImageRoundRadius::None,
RectParts corners = RectPart::AllCorners) const;
const QPixmap &pixBlurred(
Data::FileOrigin origin,
int32 w = 0,
int32 h = 0) const;
const QPixmap &pixColored(
Data::FileOrigin origin,
style::color add,
int32 w = 0,
int32 h = 0) const;
const QPixmap &pixBlurredColored(
Data::FileOrigin origin,
style::color add,
int32 w = 0,
int32 h = 0) const;
const QPixmap &pixSingle(
Data::FileOrigin origin,
int32 w,
int32 h,
int32 outerw,
int32 outerh,
ImageRoundRadius radius,
RectParts corners = RectPart::AllCorners,
const style::color *colored = nullptr) const;
const QPixmap &pixBlurredSingle(
Data::FileOrigin origin,
int32 w,
int32 h,
int32 outerw,
int32 outerh,
ImageRoundRadius radius,
RectParts corners = RectPart::AllCorners) const;
const QPixmap &pixCircled(
Data::FileOrigin origin,
int32 w = 0,
int32 h = 0) const;
const QPixmap &pixBlurredCircled(
Data::FileOrigin origin,
int32 w = 0,
int32 h = 0) const;
QPixmap pixNoCache(
Data::FileOrigin origin,
int w = 0,
int h = 0,
Images::Options options = 0,
int outerw = -1,
int outerh = -1,
const style::color *colored = nullptr) const;
QPixmap pixColoredNoCache(
Data::FileOrigin origin,
style::color add,
int32 w = 0,
int32 h = 0,
bool smooth = false) const;
QPixmap pixBlurredColoredNoCache(
Data::FileOrigin origin,
style::color add,
int32 w,
int32 h = 0) const;
int32 width() const {
return qMax(countWidth(), 1);
}
int32 height() const {
return qMax(countHeight(), 1);
}
virtual void load(
Data::FileOrigin origin,
bool loadFirst = false,
bool prior = true) {
}
virtual void loadEvenCancelled(
Data::FileOrigin origin,
bool loadFirst = false,
bool prior = true) {
}
virtual const StorageImageLocation &location() const {
return StorageImageLocation::Null;
}
virtual std::optional<Storage::Cache::Key> cacheKey() const;
bool isNull() const;
void forget() const;
QByteArray savedFormat() const {
return _format;
}
QByteArray savedData() const {
return _saved;
}
virtual DelayedStorageImage *toDelayedStorageImage() {
return 0;
}
virtual const DelayedStorageImage *toDelayedStorageImage() const {
return 0;
}
virtual ~Image();
protected:
Image(QByteArray format = "PNG") : _format(format) {
}
void restore() const;
virtual void checkload() const {
}
void invalidateSizeCache() const;
virtual int32 countWidth() const {
restore();
return _data.width();
}
virtual int32 countHeight() const {
restore();
return _data.height();
}
mutable QByteArray _saved, _format;
mutable bool _forgot = false;
mutable QPixmap _data;
private:
using Sizes = QMap<uint64, QPixmap>;
mutable Sizes _sizesCache;
};
class RemoteImage : public Image {
public:
void automaticLoad(
Data::FileOrigin origin,
const HistoryItem *item) override; // auto load photo
void automaticLoadSettingsChanged() override;
bool loaded() const override;
bool loading() const override {
return amLoading();
}
bool displayLoading() const override;
void cancel() override;
float64 progress() const override;
int32 loadOffset() const override;
void setImageBytes(
const QByteArray &bytes,
const QByteArray &format = QByteArray());
void load(
Data::FileOrigin origin,
bool loadFirst = false,
bool prior = true) override;
void loadEvenCancelled(
Data::FileOrigin origin,
bool loadFirst = false,
bool prior = true) override;
~RemoteImage();
protected:
// If after loading the image we need to shrink it to fit into a
// specific size, you can return this size here.
virtual QSize shrinkBox() const {
return QSize();
}
virtual void setInformation(int32 size, int32 width, int32 height) = 0;
virtual FileLoader *createLoader(
Data::FileOrigin origin,
LoadFromCloudSetting fromCloud,
bool autoLoading) = 0;
void checkload() const override {
doCheckload();
}
void loadLocal();
private:
mutable FileLoader *_loader = nullptr;
bool amLoading() const;
void doCheckload() const;
void destroyLoaderDelayed(FileLoader *newValue = nullptr) const;
};
class StorageImage : public RemoteImage {
public:
explicit StorageImage(const StorageImageLocation &location, int32 size = 0);
StorageImage(const StorageImageLocation &location, const QByteArray &bytes);
const StorageImageLocation &location() const override {
return _location;
}
std::optional<Storage::Cache::Key> cacheKey() const override;
void refreshFileReference(const QByteArray &data) {
_location.refreshFileReference(data);
}
protected:
void setInformation(int32 size, int32 width, int32 height) override;
FileLoader *createLoader(
Data::FileOrigin origin,
LoadFromCloudSetting fromCloud,
bool autoLoading) override;
int32 countWidth() const override;
int32 countHeight() const override;
StorageImageLocation _location;
int32 _size;
};
class WebFileImage : public RemoteImage {
public:
WebFileImage(const WebFileLocation &location, QSize box, int size = 0);
WebFileImage(
const WebFileLocation &location,
int width,
int height,
int size = 0);
std::optional<Storage::Cache::Key> cacheKey() const override;
protected:
void setInformation(int size, int width, int height) override;
FileLoader *createLoader(
Data::FileOrigin origin,
LoadFromCloudSetting fromCloud,
bool autoLoading) override;
QSize shrinkBox() const override {
return _box;
}
int countWidth() const override;
int countHeight() const override;
WebFileLocation _location;
QSize _box;
int _width = 0;
int _height = 0;
int _size = 0;
};
class GeoPointImage : public RemoteImage {
public:
GeoPointImage(const GeoPointLocation &location);
std::optional<Storage::Cache::Key> cacheKey() const override;
protected:
void setInformation(int size, int width, int height) override;
FileLoader *createLoader(
Data::FileOrigin origin,
LoadFromCloudSetting fromCloud,
bool autoLoading) override;
int countWidth() const override;
int countHeight() const override;
GeoPointLocation _location;
int _size = 0;
};
class DelayedStorageImage : public StorageImage {
public:
DelayedStorageImage();
DelayedStorageImage(int32 w, int32 h);
//DelayedStorageImage(QByteArray &bytes);
void setStorageLocation(
Data::FileOrigin origin,
const StorageImageLocation location);
virtual DelayedStorageImage *toDelayedStorageImage() override {
return this;
}
virtual const DelayedStorageImage *toDelayedStorageImage() const override {
return this;
}
void automaticLoad(
Data::FileOrigin origin,
const HistoryItem *item) override; // auto load photo
void automaticLoadSettingsChanged() override;
bool loading() const override {
return _location.isNull() ? _loadRequested : StorageImage::loading();
}
bool displayLoading() const override;
void cancel() override;
void load(
Data::FileOrigin origin,
bool loadFirst = false,
bool prior = true) override;
void loadEvenCancelled(
Data::FileOrigin origin,
bool loadFirst = false,
bool prior = true) override;
private:
bool _loadRequested, _loadCancelled, _loadFromCloud;
};
class WebImage : public RemoteImage {
public:
// If !box.isEmpty() then resize the image to fit in this box.
WebImage(const QString &url, QSize box = QSize());
WebImage(const QString &url, int width, int height);
void setSize(int width, int height);
std::optional<Storage::Cache::Key> cacheKey() const override;
protected:
QSize shrinkBox() const override {
return _box;
}
void setInformation(int32 size, int32 width, int32 height) override;
FileLoader *createLoader(
Data::FileOrigin origin,
LoadFromCloudSetting fromCloud,
bool autoLoading) override;
int32 countWidth() const override;
int32 countHeight() const override;
private:
QString _url;
QSize _box;
int32 _size, _width, _height;
};
namespace Images {
namespace details {
Image *Create(const QString &file, QByteArray format);
Image *Create(const QString &url, QSize box);
Image *Create(const QString &url, int width, int height);
Image *Create(const QByteArray &filecontent, QByteArray format);
Image *Create(const QPixmap &pixmap, QByteArray format);
Image *Create(
const QByteArray &filecontent,
QByteArray format,
const QPixmap &pixmap);
Image *Create(int32 width, int32 height);
StorageImage *Create(const StorageImageLocation &location, int size = 0);
StorageImage *Create( // photoCachedSize
const StorageImageLocation &location,
const QByteArray &bytes);
Image *Create(const MTPWebDocument &location);
Image *Create(const MTPWebDocument &location, QSize box);
WebFileImage *Create(
const WebFileLocation &location,
int width,
int height,
int size = 0);
WebFileImage *Create(
const WebFileLocation &location,
QSize box,
int size = 0);
GeoPointImage *Create(
const GeoPointLocation &location);
} // namespace details
} // namespace Images

File diff suppressed because it is too large Load Diff

View File

@ -279,181 +279,33 @@ inline bool operator!=(
return !(a == b);
}
class DelayedStorageImage;
class HistoryItem;
class Image {
class Image;
class ImagePtr {
public:
Image(const QString &file, QByteArray format = QByteArray());
Image(const QByteArray &filecontent, QByteArray format = QByteArray());
Image(const QPixmap &pixmap, QByteArray format = QByteArray());
Image(const QByteArray &filecontent, QByteArray format, const QPixmap &pixmap);
ImagePtr();
ImagePtr(const QString &file, QByteArray format = QByteArray());
ImagePtr(const QString &url, QSize box);
ImagePtr(const QString &url, int width, int height);
ImagePtr(const QByteArray &filecontent, QByteArray format = QByteArray());
ImagePtr(const QByteArray &filecontent, QByteArray format, const QPixmap &pixmap);
ImagePtr(const QPixmap &pixmap, QByteArray format);
ImagePtr(const StorageImageLocation &location, int32 size = 0);
ImagePtr(const StorageImageLocation &location, const QByteArray &bytes);
ImagePtr(const MTPWebDocument &location);
ImagePtr(const MTPWebDocument &location, QSize box);
ImagePtr(const WebFileLocation &location, int width, int height, int size = 0);
ImagePtr(const WebFileLocation &location, QSize box, int size = 0);
ImagePtr(const GeoPointLocation &location);
ImagePtr(int32 width, int32 height, const MTPFileLocation &location, ImagePtr def = ImagePtr());
ImagePtr(int32 width, int32 height);
virtual void automaticLoad(
Data::FileOrigin origin,
const HistoryItem *item) {
}
virtual void automaticLoadSettingsChanged() {
}
Image *operator->() const;
Image *get() const;
virtual bool loaded() const {
return true;
}
virtual bool loading() const {
return false;
}
virtual bool displayLoading() const {
return false;
}
virtual void cancel() {
}
virtual float64 progress() const {
return 1;
}
virtual int32 loadOffset() const {
return 0;
}
const QPixmap &pix(
Data::FileOrigin origin,
int32 w = 0,
int32 h = 0) const;
const QPixmap &pixRounded(
Data::FileOrigin origin,
int32 w = 0,
int32 h = 0,
ImageRoundRadius radius = ImageRoundRadius::None,
RectParts corners = RectPart::AllCorners) const;
const QPixmap &pixBlurred(
Data::FileOrigin origin,
int32 w = 0,
int32 h = 0) const;
const QPixmap &pixColored(
Data::FileOrigin origin,
style::color add,
int32 w = 0,
int32 h = 0) const;
const QPixmap &pixBlurredColored(
Data::FileOrigin origin,
style::color add,
int32 w = 0,
int32 h = 0) const;
const QPixmap &pixSingle(
Data::FileOrigin origin,
int32 w,
int32 h,
int32 outerw,
int32 outerh,
ImageRoundRadius radius,
RectParts corners = RectPart::AllCorners,
const style::color *colored = nullptr) const;
const QPixmap &pixBlurredSingle(
Data::FileOrigin origin,
int32 w,
int32 h,
int32 outerw,
int32 outerh,
ImageRoundRadius radius,
RectParts corners = RectPart::AllCorners) const;
const QPixmap &pixCircled(
Data::FileOrigin origin,
int32 w = 0,
int32 h = 0) const;
const QPixmap &pixBlurredCircled(
Data::FileOrigin origin,
int32 w = 0,
int32 h = 0) const;
QPixmap pixNoCache(
Data::FileOrigin origin,
int w = 0,
int h = 0,
Images::Options options = 0,
int outerw = -1,
int outerh = -1,
const style::color *colored = nullptr) const;
QPixmap pixColoredNoCache(
Data::FileOrigin origin,
style::color add,
int32 w = 0,
int32 h = 0,
bool smooth = false) const;
QPixmap pixBlurredColoredNoCache(
Data::FileOrigin origin,
style::color add,
int32 w,
int32 h = 0) const;
int32 width() const {
return qMax(countWidth(), 1);
}
int32 height() const {
return qMax(countHeight(), 1);
}
virtual void load(
Data::FileOrigin origin,
bool loadFirst = false,
bool prior = true) {
}
virtual void loadEvenCancelled(
Data::FileOrigin origin,
bool loadFirst = false,
bool prior = true) {
}
virtual const StorageImageLocation &location() const {
return StorageImageLocation::Null;
}
virtual std::optional<Storage::Cache::Key> cacheKey() const;
bool isNull() const;
void forget() const;
QByteArray savedFormat() const {
return _format;
}
QByteArray savedData() const {
return _saved;
}
virtual DelayedStorageImage *toDelayedStorageImage() {
return 0;
}
virtual const DelayedStorageImage *toDelayedStorageImage() const {
return 0;
}
virtual ~Image();
protected:
Image(QByteArray format = "PNG") : _format(format) {
}
void restore() const;
virtual void checkload() const {
}
void invalidateSizeCache() const;
virtual int32 countWidth() const {
restore();
return _data.width();
}
virtual int32 countHeight() const {
restore();
return _data.height();
}
mutable QByteArray _saved, _format;
mutable bool _forgot = false;
mutable QPixmap _data;
explicit operator bool() const;
private:
using Sizes = QMap<uint64, QPixmap>;
mutable Sizes _sizesCache;
not_null<Image*> _data;
};
@ -485,291 +337,6 @@ inline StorageKey storageKey(const GeoPointLocation &location) {
(uint64(location.width) << 32) | uint64(location.height));
}
class RemoteImage : public Image {
public:
void automaticLoad(
Data::FileOrigin origin,
const HistoryItem *item) override; // auto load photo
void automaticLoadSettingsChanged() override;
bool loaded() const override;
bool loading() const override {
return amLoading();
}
bool displayLoading() const override;
void cancel() override;
float64 progress() const override;
int32 loadOffset() const override;
void setImageBytes(
const QByteArray &bytes,
const QByteArray &format = QByteArray());
void load(
Data::FileOrigin origin,
bool loadFirst = false,
bool prior = true) override;
void loadEvenCancelled(
Data::FileOrigin origin,
bool loadFirst = false,
bool prior = true) override;
~RemoteImage();
protected:
// If after loading the image we need to shrink it to fit into a
// specific size, you can return this size here.
virtual QSize shrinkBox() const {
return QSize();
}
virtual void setInformation(int32 size, int32 width, int32 height) = 0;
virtual FileLoader *createLoader(
Data::FileOrigin origin,
LoadFromCloudSetting fromCloud,
bool autoLoading) = 0;
void checkload() const override {
doCheckload();
}
void loadLocal();
private:
mutable FileLoader *_loader = nullptr;
bool amLoading() const;
void doCheckload() const;
void destroyLoaderDelayed(FileLoader *newValue = nullptr) const;
};
class StorageImage : public RemoteImage {
public:
explicit StorageImage(const StorageImageLocation &location, int32 size = 0);
StorageImage(const StorageImageLocation &location, const QByteArray &bytes);
const StorageImageLocation &location() const override {
return _location;
}
std::optional<Storage::Cache::Key> cacheKey() const override;
void refreshFileReference(const QByteArray &data) {
_location.refreshFileReference(data);
}
protected:
void setInformation(int32 size, int32 width, int32 height) override;
FileLoader *createLoader(
Data::FileOrigin origin,
LoadFromCloudSetting fromCloud,
bool autoLoading) override;
int32 countWidth() const override;
int32 countHeight() const override;
StorageImageLocation _location;
int32 _size;
};
class WebFileImage : public RemoteImage {
public:
WebFileImage(const WebFileLocation &location, QSize box, int size = 0);
WebFileImage(
const WebFileLocation &location,
int width,
int height,
int size = 0);
std::optional<Storage::Cache::Key> cacheKey() const override;
protected:
void setInformation(int size, int width, int height) override;
FileLoader *createLoader(
Data::FileOrigin origin,
LoadFromCloudSetting fromCloud,
bool autoLoading) override;
QSize shrinkBox() const override {
return _box;
}
int countWidth() const override;
int countHeight() const override;
WebFileLocation _location;
QSize _box;
int _width = 0;
int _height = 0;
int _size = 0;
};
class GeoPointImage : public RemoteImage {
public:
GeoPointImage(const GeoPointLocation &location);
std::optional<Storage::Cache::Key> cacheKey() const override;
protected:
void setInformation(int size, int width, int height) override;
FileLoader *createLoader(
Data::FileOrigin origin,
LoadFromCloudSetting fromCloud,
bool autoLoading) override;
int countWidth() const override;
int countHeight() const override;
GeoPointLocation _location;
int _size = 0;
};
class DelayedStorageImage : public StorageImage {
public:
DelayedStorageImage();
DelayedStorageImage(int32 w, int32 h);
//DelayedStorageImage(QByteArray &bytes);
void setStorageLocation(
Data::FileOrigin origin,
const StorageImageLocation location);
virtual DelayedStorageImage *toDelayedStorageImage() override {
return this;
}
virtual const DelayedStorageImage *toDelayedStorageImage() const override {
return this;
}
void automaticLoad(
Data::FileOrigin origin,
const HistoryItem *item) override; // auto load photo
void automaticLoadSettingsChanged() override;
bool loading() const override {
return _location.isNull() ? _loadRequested : StorageImage::loading();
}
bool displayLoading() const override;
void cancel() override;
void load(
Data::FileOrigin origin,
bool loadFirst = false,
bool prior = true) override;
void loadEvenCancelled(
Data::FileOrigin origin,
bool loadFirst = false,
bool prior = true) override;
private:
bool _loadRequested, _loadCancelled, _loadFromCloud;
};
class WebImage : public RemoteImage {
public:
// If !box.isEmpty() then resize the image to fit in this box.
WebImage(const QString &url, QSize box = QSize());
WebImage(const QString &url, int width, int height);
void setSize(int width, int height);
std::optional<Storage::Cache::Key> cacheKey() const override;
protected:
QSize shrinkBox() const override {
return _box;
}
void setInformation(int32 size, int32 width, int32 height) override;
FileLoader *createLoader(
Data::FileOrigin origin,
LoadFromCloudSetting fromCloud,
bool autoLoading) override;
int32 countWidth() const override;
int32 countHeight() const override;
private:
QString _url;
QSize _box;
int32 _size, _width, _height;
};
namespace internal {
Image *getImage(const QString &file, QByteArray format);
Image *getImage(const QString &url, QSize box);
Image *getImage(const QString &url, int width, int height);
Image *getImage(const QByteArray &filecontent, QByteArray format);
Image *getImage(const QPixmap &pixmap, QByteArray format);
Image *getImage(
const QByteArray &filecontent,
QByteArray format,
const QPixmap &pixmap);
Image *getImage(int32 width, int32 height);
StorageImage *getImage(const StorageImageLocation &location, int size = 0);
StorageImage *getImage( // photoCachedSize
const StorageImageLocation &location,
const QByteArray &bytes);
Image *getImage(const MTPWebDocument &location);
Image *getImage(const MTPWebDocument &location, QSize box);
WebFileImage *getImage(
const WebFileLocation &location,
int width,
int height,
int size = 0);
WebFileImage *getImage(
const WebFileLocation &location,
QSize box,
int size = 0);
GeoPointImage *getImage(
const GeoPointLocation &location);
} // namespace internal
class ImagePtr : public ManagedPtr<Image> {
public:
ImagePtr();
ImagePtr(const QString &file, QByteArray format = QByteArray()) : Parent(internal::getImage(file, format)) {
}
ImagePtr(const QString &url, QSize box) : Parent(internal::getImage(url, box)) {
}
ImagePtr(const QString &url, int width, int height) : Parent(internal::getImage(url, width, height)) {
}
ImagePtr(const QByteArray &filecontent, QByteArray format = QByteArray()) : Parent(internal::getImage(filecontent, format)) {
}
ImagePtr(const QByteArray &filecontent, QByteArray format, const QPixmap &pixmap) : Parent(internal::getImage(filecontent, format, pixmap)) {
}
ImagePtr(const QPixmap &pixmap, QByteArray format) : Parent(internal::getImage(pixmap, format)) {
}
ImagePtr(const StorageImageLocation &location, int32 size = 0) : Parent(internal::getImage(location, size)) {
}
ImagePtr(const StorageImageLocation &location, const QByteArray &bytes) : Parent(internal::getImage(location, bytes)) {
}
ImagePtr(const MTPWebDocument &location) : Parent(internal::getImage(location)) {
}
ImagePtr(const MTPWebDocument &location, QSize box) : Parent(internal::getImage(location, box)) {
}
ImagePtr(const WebFileLocation &location, int width, int height, int size = 0)
: Parent(internal::getImage(location, width, height, size)) {
}
ImagePtr(const WebFileLocation &location, QSize box, int size = 0)
: Parent(internal::getImage(location, box, size)) {
}
ImagePtr(const GeoPointLocation &location)
: Parent(internal::getImage(location)) {
}
ImagePtr(int32 width, int32 height, const MTPFileLocation &location, ImagePtr def = ImagePtr());
ImagePtr(int32 width, int32 height) : Parent(internal::getImage(width, height)) {
}
explicit operator bool() const {
return (_data != nullptr) && !_data->isNull();
}
};
inline QSize shrinkToKeepAspect(int32 width, int32 height, int32 towidth, int32 toheight) {
int32 w = qMax(width, 1), h = qMax(height, 1);
if (w * toheight > h * towidth) {
@ -782,10 +349,6 @@ inline QSize shrinkToKeepAspect(int32 width, int32 height, int32 towidth, int32
return QSize(qMax(w, 1), qMax(h, 1));
}
void clearStorageImages();
void clearAllImages();
int64 imageCacheSize();
class PsFileBookmark;
class ReadAccessEnabler {
public:

View File

@ -21,6 +21,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "styles/style_chat_helpers.h"
#include "ui/widgets/shadow.h"
#include "ui/emoji_config.h"
#include "ui/image.h"
#include "window/window_main_menu.h"
#include "auth_session.h"
#include "chat_helpers/stickers.h"

View File

@ -672,6 +672,8 @@
<(src_loc)/ui/focus_persister.h
<(src_loc)/ui/grouped_layout.cpp
<(src_loc)/ui/grouped_layout.h
<(src_loc)/ui/image.cpp
<(src_loc)/ui/image.h
<(src_loc)/ui/images.cpp
<(src_loc)/ui/images.h
<(src_loc)/ui/resize_area.h