8#include <QtQuick/private/qsgcontext_p.h>
9#include <QtQuick/private/qquickitem_p.h>
10#include <private/qsgadaptationlayer_p.h>
11#include <private/qqmlglobal_p.h>
12#include <QtQuick/qsgnode.h>
13#include <QtQuick/qsgtexturematerial.h>
14#include <QtQuick/qsgtexture.h>
15#include <QtQuick/qquickwindow.h>
16#include <QtQml/qqmlinfo.h>
280 return d->m_interpolate;
286 return d->m_sprite->source();
292 return d->m_sprite->reverse();
298 return d->m_sprite->frameSync();
304 return d->m_sprite->frames();
310 return d->m_sprite->frameHeight();
316 return d->m_sprite->frameWidth();
322 return d->m_sprite->frameX();
328 return d->m_sprite->frameY();
334 return d->m_sprite->frameRate();
340 return d->m_sprite->frameDuration();
358 return d->m_curFrame;
364 return d->m_finishBehavior;
367bool QQuickAnimatedSprite::isCurrentFrameChangedConnected()
372void QQuickAnimatedSprite::reloadImage()
385 d->m_running =
false;
409 d->m_timestamp.start();
410 if (
d->m_spriteEngine) {
411 d->m_spriteEngine->stop(0);
412 d->m_spriteEngine->updateSprites(0);
413 d->m_spriteEngine->start(0);
434 d->m_running =
false;
437 d->m_pauseOffset = 0;
453 d->m_curFrame += frames;
454 while (
d->m_curFrame < 0)
455 d->m_curFrame +=
d->m_spriteEngine->maxFrames();
456 d->m_curFrame =
d->m_curFrame %
d->m_spriteEngine->maxFrames();
461void QQuickAnimatedSprite::maybeUpdate()
464 const auto &extraData =
priv->extra;
465 if ((extraData.isAllocated() && extraData->effectRefCount > 0) ||
priv->effectiveVisible)
491 d->m_pauseOffset =
d->m_timestamp.elapsed();
511 d->m_pauseOffset =
d->m_pauseOffset -
d->m_timestamp.elapsed();
521 if (
d->m_running !=
arg) {
533 if (
d->m_paused !=
arg) {
545 if (
d->m_interpolate !=
arg) {
546 d->m_interpolate =
arg;
555 if (
d->m_sprite->m_source !=
arg) {
556 const qreal targetDevicePixelRatio = (
window() ?
window()->effectiveDevicePixelRatio() :
qApp->devicePixelRatio());
557 d->m_sprite->setDevicePixelRatio(targetDevicePixelRatio);
558 d->m_sprite->setSource(
arg);
568 if (
d->m_sprite->m_reverse !=
arg) {
569 d->m_sprite->setReverse(
arg);
578 if (
d->m_sprite->m_frameSync !=
arg) {
579 d->m_sprite->setFrameSync(
arg);
590 if (
d->m_sprite->m_frames !=
arg) {
591 d->m_sprite->setFrameCount(
arg);
601 if (
d->m_sprite->m_frameHeight !=
arg) {
602 d->m_sprite->setFrameHeight(
arg);
613 if (
d->m_sprite->m_frameWidth !=
arg) {
614 d->m_sprite->setFrameWidth(
arg);
625 if (
d->m_sprite->m_frameX !=
arg) {
626 d->m_sprite->setFrameX(
arg);
636 if (
d->m_sprite->m_frameY !=
arg) {
637 d->m_sprite->setFrameY(
arg);
647 if (
d->m_sprite->m_frameRate !=
arg) {
648 d->m_sprite->setFrameRate(
arg);
659 if (
d->m_sprite->m_frameDuration !=
arg) {
660 d->m_sprite->setFrameDuration(
arg);
681 if (
d->m_loops !=
arg) {
691 if (
d->m_curFrame !=
arg) {
702 if (
d->m_finishBehavior !=
arg) {
703 d->m_finishBehavior =
arg;
708void QQuickAnimatedSprite::createEngine()
712 if (
d->m_spriteEngine)
713 delete d->m_spriteEngine;
715 spriteList <<
d->m_sprite;
717 d->m_spriteEngine->startAssemblingImage();
721QSGSpriteNode* QQuickAnimatedSprite::initNode()
725 if (!
d->m_spriteEngine) {
729 d->m_spriteEngine->startAssemblingImage();
737 QImage image =
d->m_spriteEngine->assembledImage(
d->sceneGraphRenderContext()->maxTextureSize());
752 QSGSpriteNode *node =
d->sceneGraphContext()->createSpriteNode();
755 node->setTexture(
window()->createTextureFromImage(
image));
756 d->m_spriteEngine->start(0);
758 node->setSourceA(
QPoint(
d->m_spriteEngine->spriteX(),
d->m_spriteEngine->spriteY()));
759 node->setSourceB(
QPoint(
d->m_spriteEngine->spriteX(),
d->m_spriteEngine->spriteY()));
760 node->setSpriteSize(
QSize(
d->m_spriteEngine->spriteWidth(),
d->m_spriteEngine->spriteHeight()));
761 node->setSheetSize(
d->m_sheetSize);
769 d->m_pleaseReset =
true;
777 if (
d->m_pleaseReset) {
781 d->m_pleaseReset =
false;
784 QSGSpriteNode *node =
static_cast<QSGSpriteNode *
>(oldNode);
789 prepareNextFrame(node);
791 if (
d->m_running && !
d->m_paused)
797void QQuickAnimatedSprite::prepareNextFrame(QSGSpriteNode *node)
801 int timeInt =
d->m_timestamp.elapsed() +
d->m_pauseOffset;
805 qreal progress = 0.0;
806 int lastFrame =
d->m_curFrame;
807 if (
d->m_running && !
d->m_paused) {
808 const int nColumns =
d->m_sheetSize.width() /
d->m_spriteEngine->spriteWidth();
810 d->m_spriteEngine->updateSprites(timeInt);
813 qreal animT =
d->m_spriteEngine->spriteStart()/1000.0;
814 const int frameCountInRow =
d->m_spriteEngine->spriteFrames();
818 bool lastLoop =
d->m_loops > 0 &&
d->m_curLoop ==
d->m_loops-1;
820 const int max = lastLoop ? frameCountInRow - 1 : frameCountInRow;
823 progress = std::modf(
frame,&intpart);
824 frameAt = (int)intpart;
825 const int rowIndex =
d->m_spriteEngine->spriteY()/
frameHeight();
826 const int newFrame = rowIndex * nColumns + frameAt;
827 if (
d->m_curFrame > newFrame)
829 d->m_curFrame = newFrame;
832 if (
d->m_curFrame >=
d->m_spriteEngine->maxFrames()) {
836 frameAt =
d->m_curFrame % nColumns;
838 d->m_spriteEngine->advance();
841 if (
d->m_loops > 0 &&
d->m_curLoop >=
d->m_loops) {
846 d->m_curFrame = frameAt;
847 d->m_running =
false;
853 frameAt =
d->m_curFrame;
855 if (
d->m_curFrame != lastFrame) {
856 if (isCurrentFrameChangedConnected())
861 int frameCount =
d->m_spriteEngine->spriteFrames();
862 bool reverse =
d->m_spriteEngine->sprite()->reverse();
866 int w =
d->m_spriteEngine->spriteWidth();
867 int h =
d->m_spriteEngine->spriteHeight();
871 int spriteY =
d->m_spriteEngine->spriteY();
873 int rows =
d->m_spriteEngine->maxFrames() *
d->m_spriteEngine->spriteWidth() /
d->m_sheetSize.width();
874 spriteY -= rows *
d->m_spriteEngine->spriteHeight();
878 int position = frameAt *
d->m_spriteEngine->spriteWidth() +
d->m_spriteEngine->spriteX();
882 y1 = (
row *
d->m_spriteEngine->spriteHeight() + spriteY);
884 x1 =
d->m_spriteEngine->spriteX() + frameAt *
w;
885 y1 =
d->m_spriteEngine->spriteY();
898 x2 =
d->m_sheetSize.width() -
w;
902 int maxRowFrames =
d->m_sheetSize.width() /
d->m_spriteEngine->spriteWidth();
903 if (
d->m_spriteEngine->maxFrames() % maxRowFrames)
904 x2 = ((
d->m_spriteEngine->maxFrames() % maxRowFrames) - 1) *
w;
906 y2 =
d->m_sheetSize.height() -
h;
916 if (
y2 >=
d->m_sheetSize.height())
923 node->setSpriteSize(
QSize(
w,
h));
924 node->setTime(
d->m_interpolate ? progress : 0.0);
932#include "moc_qquickanimatedsprite_p.cpp"
static QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *member, Qt::ConnectionType=Qt::AutoConnection)
\threadsafe
\inmodule QtCore\reentrant
void setCurrentFrame(int arg)
void setFrameRate(qreal arg)
void start()
\qmlmethod QtQuick::AnimatedSprite::start()
void setFrameWidth(int arg)
void interpolateChanged(bool arg)
void setFrameCount(int arg)
QSGNode * updatePaintNode(QSGNode *, UpdatePaintNodeData *) override
Called on the render thread when it is time to sync the state of the item with the scene graph.
void setReverse(bool arg)
void frameWidthChanged(int arg)
void componentComplete() override
Invoked after the root component that caused this instantiation has completed construction.
void loopsChanged(int arg)
void advance(int frames=1)
\qmlmethod int QtQuick::AnimatedSprite::advance()
void sourceChanged(const QUrl &arg)
void setInterpolate(bool arg)
void setFrameDuration(int arg)
void resume()
\qmlmethod int QtQuick::AnimatedSprite::resume()
void pausedChanged(bool arg)
void setFrameHeight(int arg)
void frameSyncChanged(bool arg)
void setSource(const QUrl &arg)
FinishBehavior finishBehavior
void setFrameSync(bool arg)
QQuickAnimatedSprite(QQuickItem *parent=nullptr)
\qmltype AnimatedSprite \instantiates QQuickAnimatedSprite \inqmlmodule QtQuick \inherits Item
void pause()
\qmlmethod int QtQuick::AnimatedSprite::pause()
void frameXChanged(int arg)
void frameDurationChanged(int arg)
void setFinishBehavior(FinishBehavior arg)
void setRunning(bool arg)
void reverseChanged(bool arg)
void itemChange(ItemChange, const ItemChangeData &) override
Called when change occurs for this item.
void frameHeightChanged(int arg)
void runningChanged(bool arg)
void stop()
\qmlmethod QtQuick::AnimatedSprite::stop()
void frameRateChanged(qreal arg)
void frameCountChanged(int arg)
void currentFrameChanged(int arg)
void resetFrameDuration()
void frameYChanged(int arg)
static QQuickItemPrivate * get(QQuickItem *item)
The QQuickItem class provides the most basic of all visual items in \l {Qt Quick}.
void setFlag(Flag flag, bool enabled=true)
Enables the specified flag for this item if enabled is true; if enabled is false, the flag is disable...
void componentComplete() override
\reimp Derived classes should call the base class method before adding their own actions to perform a...
QQuickWindow * window() const
Returns the window in which this item is rendered.
qreal width
This property holds the width of this item.
virtual void itemChange(ItemChange, const ItemChangeData &)
Called when change occurs for this item.
bool isComponentComplete() const
Returns true if construction of the QML component is complete; otherwise returns false.
void setImplicitHeight(qreal)
bool smooth
\qmlproperty bool QtQuick::Item::smooth
qreal height
This property holds the height of this item.
ItemChange
Used in conjunction with QQuickItem::itemChange() to notify the item about certain types of changes.
void setImplicitWidth(qreal)
void update()
Schedules a call to updatePaintNode() for this item.
\group qtquick-scenegraph-nodes \title Qt Quick Scene Graph Node classes
Combined button and popup list for selecting options.
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
constexpr const T & qBound(const T &min, const T &val, const T &max)
GLfloat GLfloat GLfloat w
[0]
GLuint GLfloat GLfloat GLfloat GLfloat y1
GLuint GLfloat GLfloat GLfloat x1
GLfloat GLfloat GLfloat GLfloat h
GLfixed GLfixed GLfixed y2
GLenum GLenum GLsizei void * row
#define IS_SIGNAL_CONNECTED(Sender, SenderType, Name, Arguments)
Q_QML_EXPORT QQmlInfo qmlWarning(const QObject *me)
IUIAutomationTreeWalker __RPC__deref_out_opt IUIAutomationElement ** parent