diff --git a/CMakeLists.txt b/CMakeLists.txt index 4ac63e67e..2104d8b4f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -453,6 +453,7 @@ set(TDLIB_SOURCE td/telegram/SponsoredMessageManager.cpp td/telegram/StateManager.cpp td/telegram/StickerFormat.cpp + td/telegram/StickerMaskPosition.cpp td/telegram/StickerPhotoSize.cpp td/telegram/StickersManager.cpp td/telegram/StickerType.cpp @@ -727,6 +728,7 @@ set(TDLIB_SOURCE td/telegram/SponsoredMessageManager.h td/telegram/StateManager.h td/telegram/StickerFormat.h + td/telegram/StickerMaskPosition.h td/telegram/StickerPhotoSize.h td/telegram/StickerSetId.h td/telegram/StickersManager.h @@ -798,6 +800,7 @@ set(TDLIB_SOURCE td/telegram/ScopeNotificationSettings.hpp td/telegram/SecureValue.hpp td/telegram/SendCodeHelper.hpp + td/telegram/StickerMaskPosition.hpp td/telegram/StickerPhotoSize.hpp td/telegram/StickerSetId.hpp td/telegram/StickersManager.hpp diff --git a/td/telegram/StickerMaskPosition.cpp b/td/telegram/StickerMaskPosition.cpp new file mode 100644 index 000000000..86b298a88 --- /dev/null +++ b/td/telegram/StickerMaskPosition.cpp @@ -0,0 +1,97 @@ +// +// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2023 +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// +#include "td/telegram/StickerMaskPosition.h" + +#include "td/utils/logging.h" + +namespace td { + +static td_api::object_ptr get_mask_point_object(int32 point) { + switch (point) { + case 0: + return td_api::make_object(); + case 1: + return td_api::make_object(); + case 2: + return td_api::make_object(); + case 3: + return td_api::make_object(); + default: + UNREACHABLE(); + return nullptr; + } +} + +StickerMaskPosition::StickerMaskPosition(const telegram_api::object_ptr &mask_coords) { + if (mask_coords == nullptr) { + return; + } + int32 point = mask_coords->n_; + if (point < 0 || point > 3) { + return; + } + point_ = mask_coords->n_; + x_shift_ = mask_coords->x_; + y_shift_ = mask_coords->y_; + scale_ = mask_coords->zoom_; +} + +StickerMaskPosition::StickerMaskPosition(const td_api::object_ptr &mask_position) { + if (mask_position == nullptr || mask_position->point_ == nullptr) { + return; + } + point_ = [mask_point_id = mask_position->point_->get_id()] { + switch (mask_point_id) { + case td_api::maskPointForehead::ID: + return 0; + case td_api::maskPointEyes::ID: + return 1; + case td_api::maskPointMouth::ID: + return 2; + case td_api::maskPointChin::ID: + return 3; + default: + UNREACHABLE(); + return -1; + } + }(); + x_shift_ = mask_position->x_shift_; + y_shift_ = mask_position->y_shift_, scale_ = mask_position->scale_; +} + +telegram_api::object_ptr StickerMaskPosition::get_input_mask_coords_object() const { + if (point_ < 0) { + return nullptr; + } + return telegram_api::make_object(point_, x_shift_, y_shift_, scale_); +} + +td_api::object_ptr StickerMaskPosition::get_mask_position_object() const { + if (point_ < 0) { + return nullptr; + } + return td_api::make_object(get_mask_point_object(point_), x_shift_, y_shift_, scale_); +} + +bool operator==(const StickerMaskPosition &lhs, const StickerMaskPosition &rhs) { + return lhs.point_ == rhs.point_ && lhs.x_shift_ == rhs.x_shift_ && lhs.y_shift_ == rhs.y_shift_ && + lhs.scale_ == rhs.scale_; +} + +bool operator!=(const StickerMaskPosition &lhs, const StickerMaskPosition &rhs) { + return !(lhs == rhs); +} + +StringBuilder &operator<<(StringBuilder &string_builder, const StickerMaskPosition &sticker_mask_position) { + if (sticker_mask_position.point_ < 0) { + return string_builder << "MaskPosition[]"; + } + return string_builder << "MaskPosition[" << sticker_mask_position.point_ << ' ' << sticker_mask_position.x_shift_ + << ' ' << sticker_mask_position.y_shift_ << ' ' << sticker_mask_position.scale_; +} + +} // namespace td diff --git a/td/telegram/StickerMaskPosition.h b/td/telegram/StickerMaskPosition.h new file mode 100644 index 000000000..fbfa81d32 --- /dev/null +++ b/td/telegram/StickerMaskPosition.h @@ -0,0 +1,51 @@ +// +// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2023 +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// +#pragma once + +#include "td/telegram/td_api.h" +#include "td/telegram/telegram_api.h" + +#include "td/utils/common.h" +#include "td/utils/Status.h" +#include "td/utils/StringBuilder.h" + +namespace td { + +class StickerMaskPosition { + int32 point_ = -1; + double x_shift_ = 0; + double y_shift_ = 0; + double scale_ = 0; + + friend bool operator==(const StickerMaskPosition &lhs, const StickerMaskPosition &rhs); + + friend StringBuilder &operator<<(StringBuilder &string_builder, const StickerMaskPosition &sticker_mask_position); + + public: + StickerMaskPosition() = default; + + explicit StickerMaskPosition(const td_api::object_ptr &mask_position); + + explicit StickerMaskPosition(const telegram_api::object_ptr &mask_coords); + + telegram_api::object_ptr get_input_mask_coords_object() const; + + td_api::object_ptr get_mask_position_object() const; + + template + void store(StorerT &storer) const; + + template + void parse(ParserT &parser); +}; + +bool operator==(const StickerMaskPosition &lhs, const StickerMaskPosition &rhs); +bool operator!=(const StickerMaskPosition &lhs, const StickerMaskPosition &rhs); + +StringBuilder &operator<<(StringBuilder &string_builder, const StickerMaskPosition &sticker_mask_position); + +} // namespace td diff --git a/td/telegram/StickerMaskPosition.hpp b/td/telegram/StickerMaskPosition.hpp new file mode 100644 index 000000000..1a4e2a695 --- /dev/null +++ b/td/telegram/StickerMaskPosition.hpp @@ -0,0 +1,32 @@ +// +// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2023 +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// +#pragma once + +#include "td/telegram/StickerMaskPosition.h" +#include "td/telegram/StickerSetId.hpp" + +#include "td/utils/tl_helpers.h" + +namespace td { + +template +void StickerMaskPosition::store(StorerT &storer) const { + td::store(point_, storer); + td::store(x_shift_, storer); + td::store(y_shift_, storer); + td::store(scale_, storer); +} + +template +void StickerMaskPosition::parse(ParserT &parser) { + td::parse(point_, parser); + td::parse(x_shift_, parser); + td::parse(y_shift_, parser); + td::parse(scale_, parser); +} + +} // namespace td diff --git a/td/telegram/StickersManager.cpp b/td/telegram/StickersManager.cpp index 38d58c699..4dcef5d8a 100644 --- a/td/telegram/StickersManager.cpp +++ b/td/telegram/StickersManager.cpp @@ -1985,22 +1985,6 @@ void StickersManager::tear_down() { parent_.reset(); } -tl_object_ptr StickersManager::get_mask_point_object(int32 point) { - switch (point) { - case 0: - return td_api::make_object(); - case 1: - return td_api::make_object(); - case 2: - return td_api::make_object(); - case 3: - return td_api::make_object(); - default: - UNREACHABLE(); - return nullptr; - } -} - StickerType StickersManager::get_sticker_type(FileId file_id) const { const auto *sticker = get_sticker(file_id); CHECK(sticker != nullptr); @@ -2339,14 +2323,8 @@ tl_object_ptr StickersManager::get_sticker_object(FileId file_i : nullptr; return td_api::make_object(std::move(premium_animation_object)); } - case StickerType::Mask: { - td_api::object_ptr mask_position; - if (sticker->point_ >= 0) { - mask_position = td_api::make_object( - get_mask_point_object(sticker->point_), sticker->x_shift_, sticker->y_shift_, sticker->scale_); - } - return td_api::make_object(std::move(mask_position)); - } + case StickerType::Mask: + return td_api::make_object(sticker->mask_position_.get_mask_position_object()); case StickerType::CustomEmoji: return td_api::make_object(get_custom_emoji_id(sticker->file_id_).get(), sticker->has_text_color_); @@ -2893,11 +2871,8 @@ FileId StickersManager::on_get_sticker(unique_ptr new_sticker, bool rep s->type_ = new_sticker->type_; is_changed = true; } - if (s->point_ != new_sticker->point_ && new_sticker->point_ != -1) { - s->point_ = new_sticker->point_; - s->x_shift_ = new_sticker->x_shift_; - s->y_shift_ = new_sticker->y_shift_; - s->scale_ = new_sticker->scale_; + if (s->mask_position_ != new_sticker->mask_position_) { + s->mask_position_ = new_sticker->mask_position_; is_changed = true; } if (s->emoji_receive_date_ < new_sticker->emoji_receive_date_) { @@ -3399,16 +3374,7 @@ void StickersManager::create_sticker(FileId file_id, FileId premium_animation_fi if ((sticker->flags_ & telegram_api::documentAttributeSticker::MASK_MASK) != 0) { s->type_ = StickerType::Mask; } - if ((sticker->flags_ & telegram_api::documentAttributeSticker::MASK_COORDS_MASK) != 0) { - CHECK(sticker->mask_coords_ != nullptr); - int32 point = sticker->mask_coords_->n_; - if (0 <= point && point <= 3) { - s->point_ = sticker->mask_coords_->n_; - s->x_shift_ = sticker->mask_coords_->x_; - s->y_shift_ = sticker->mask_coords_->y_; - s->scale_ = sticker->mask_coords_->zoom_; - } - } + s->mask_position_ = StickerMaskPosition(sticker->mask_coords_); } else if (custom_emoji != nullptr) { s->set_id_ = on_get_input_sticker_set(file_id, std::move(custom_emoji->stickerset_), load_data_multipromise_ptr); s->alt_ = std::move(custom_emoji->alt_); @@ -7984,29 +7950,9 @@ tl_object_ptr StickersManager::get_input_stic CHECK(file_view.has_remote_location()); auto input_document = file_view.main_remote_location().as_input_document(); - tl_object_ptr mask_coords; - auto mask_position = sticker->mask_position_.get(); - if (mask_position != nullptr && mask_position->point_ != nullptr) { - auto point = [mask_point_id = mask_position->point_->get_id()] { - switch (mask_point_id) { - case td_api::maskPointForehead::ID: - return 0; - case td_api::maskPointEyes::ID: - return 1; - case td_api::maskPointMouth::ID: - return 2; - case td_api::maskPointChin::ID: - return 3; - default: - UNREACHABLE(); - return -1; - } - }(); - mask_coords = make_tl_object(point, mask_position->x_shift_, mask_position->y_shift_, - mask_position->scale_); - } - int32 flags = 0; + + auto mask_coords = StickerMaskPosition(sticker->mask_position_).get_input_mask_coords_object(); if (mask_coords != nullptr) { flags |= telegram_api::inputStickerSetItem::MASK_COORDS_MASK; } diff --git a/td/telegram/StickersManager.h b/td/telegram/StickersManager.h index 390fe2dee..3cf8c4edc 100644 --- a/td/telegram/StickersManager.h +++ b/td/telegram/StickersManager.h @@ -19,6 +19,7 @@ #include "td/telegram/SecretInputMedia.h" #include "td/telegram/SpecialStickerSetType.h" #include "td/telegram/StickerFormat.h" +#include "td/telegram/StickerMaskPosition.h" #include "td/telegram/StickerSetId.h" #include "td/telegram/StickerType.h" #include "td/telegram/td_api.h" @@ -452,10 +453,7 @@ class StickersManager final : public Actor { bool has_text_color_ = false; bool is_from_database_ = false; bool is_being_reloaded_ = false; - int32 point_ = -1; - double x_shift_ = 0; - double y_shift_ = 0; - double scale_ = 0; + StickerMaskPosition mask_position_; int32 emoji_receive_date_ = 0; }; @@ -628,8 +626,6 @@ class StickersManager final : public Actor { static double get_sticker_set_minithumbnail_zoom(const StickerSet *sticker_set); - static tl_object_ptr get_mask_point_object(int32 point); - td_api::object_ptr get_sticker_set_thumbnail_object(const StickerSet *sticker_set) const; tl_object_ptr get_sticker_set_info_object(StickerSetId sticker_set_id, size_t covers_limit, diff --git a/td/telegram/StickersManager.hpp b/td/telegram/StickersManager.hpp index ba7aa3347..5a973fc56 100644 --- a/td/telegram/StickersManager.hpp +++ b/td/telegram/StickersManager.hpp @@ -12,6 +12,7 @@ #include "td/telegram/misc.h" #include "td/telegram/PhotoSize.hpp" #include "td/telegram/StickerFormat.h" +#include "td/telegram/StickerMaskPosition.hpp" #include "td/telegram/StickersManager.h" #include "td/telegram/Td.h" @@ -63,10 +64,7 @@ void StickersManager::store_sticker(FileId file_id, bool in_sticker_set, StorerT store(sticker->m_thumbnail_, storer); store(file_id, storer); if (is_mask) { - store(sticker->point_, storer); - store(sticker->x_shift_, storer); - store(sticker->y_shift_, storer); - store(sticker->scale_, storer); + store(sticker->mask_position_, storer); } if (has_minithumbnail) { store(sticker->minithumbnail_, storer); @@ -149,10 +147,7 @@ FileId StickersManager::parse_sticker(bool in_sticker_set, ParserT &parser) { add_sticker_thumbnail(sticker.get(), thumbnail); parse(sticker->file_id_, parser); if (is_mask) { - parse(sticker->point_, parser); - parse(sticker->x_shift_, parser); - parse(sticker->y_shift_, parser); - parse(sticker->scale_, parser); + parse(sticker->mask_position_, parser); } if (has_minithumbnail) { parse(sticker->minithumbnail_, parser);