File indexing completed on 2025-02-02 04:11:05

0001 /*
0002  * SPDX-FileCopyrightText: 2019-2023 Mattia Basaglia <dev@dragon.best>
0003  *
0004  * SPDX-License-Identifier: GPL-3.0-or-later
0005  */
0006 
0007 #include "image.hpp"
0008 #include "model/document.hpp"
0009 #include "model/assets/assets.hpp"
0010 
0011 GLAXNIMATE_OBJECT_IMPL(glaxnimate::model::Image)
0012 
0013 
0014 glaxnimate::model::Image::Image(glaxnimate::model::Document* doc)
0015     : ShapeElement(doc)
0016 {
0017     connect(transform.get(), &Object::property_changed, this, &Image::on_transform_matrix_changed);
0018 }
0019 
0020 
0021 bool glaxnimate::model::Image::is_valid_image(glaxnimate::model::DocumentNode* node) const
0022 {
0023     return document()->assets()->images->values.is_valid_reference_value(node, false);
0024 }
0025 
0026 std::vector<glaxnimate::model::DocumentNode *> glaxnimate::model::Image::valid_images() const
0027 {
0028     return document()->assets()->images->values.valid_reference_values(false);
0029 }
0030 
0031 QRectF glaxnimate::model::Image::local_bounding_rect(glaxnimate::model::FrameTime) const
0032 {
0033     if ( !image.get() )
0034         return {};
0035     return QRectF(0, 0, image->width.get(), image->height.get());
0036 }
0037 
0038 void glaxnimate::model::Image::on_paint(QPainter* p, glaxnimate::model::FrameTime, glaxnimate::model::VisualNode::PaintMode, glaxnimate::model::Modifier*) const
0039 {
0040     if ( image.get() )
0041         image->paint(p);
0042 }
0043 
0044 void glaxnimate::model::Image::on_image_changed(glaxnimate::model::Bitmap* new_use, glaxnimate::model::Bitmap* old_use)
0045 {
0046     if ( old_use )
0047     {
0048         disconnect(old_use, &Bitmap::loaded, this, &Image::on_update_image);
0049     }
0050 
0051     if ( new_use )
0052     {
0053         connect(new_use, &Bitmap::loaded, this, &Image::on_update_image);
0054     }
0055 }
0056 
0057 void glaxnimate::model::Image::on_update_image()
0058 {
0059     Q_EMIT property_changed(&image, {});
0060 }
0061 
0062 QTransform glaxnimate::model::Image::local_transform_matrix(glaxnimate::model::FrameTime t) const
0063 {
0064     return transform->transform_matrix(t);
0065 }
0066 
0067 void glaxnimate::model::Image::on_transform_matrix_changed()
0068 {
0069     propagate_bounding_rect_changed();
0070     Q_EMIT local_transform_matrix_changed(transform->transform_matrix(time()));
0071     Q_EMIT transform_matrix_changed(transform_matrix(time()));
0072 }
0073 
0074 void glaxnimate::model::Image::add_shapes(FrameTime, math::bezier::MultiBezier&, const QTransform&) const
0075 {
0076 }
0077 
0078 QIcon glaxnimate::model::Image::tree_icon() const
0079 {
0080     return QIcon::fromTheme("x-shape-image");
0081 }
0082 
0083 QString glaxnimate::model::Image::type_name_human() const
0084 {
0085     return i18n("Image");
0086 }
0087 
0088 QPainterPath glaxnimate::model::Image::to_painter_path_impl(FrameTime time) const
0089 {
0090     auto trans = transform.get()->transform_matrix(time);
0091     QPainterPath p;
0092     p.addPolygon(trans.map(QRectF(QPointF(0, 0), image.get() ? image->pixmap().size() : QSize(0, 0))));
0093     return p;
0094 }