/*! \internal * Registers a custom interpolator \a func for the specific \a interpolationType. * The interpolator has to be registered before the animation is constructed. * To unregister (and use the default interpolator) set \a func to 0. */ void QVariantAnimation::registerInterpolator(QVariantAnimation::Interpolator func, int interpolationType) { // will override any existing interpolators QInterpolatorVector *interpolators = registeredInterpolators(); #ifndef QT_NO_THREAD QMutexLocker locker(QMutexPool::globalInstanceGet(interpolators)); #endif if (int(interpolationType) >= interpolators->count()) interpolators->resize(int(interpolationType) + 1); interpolators->replace(interpolationType, func); }
/*! * \internal * Registers a custom interpolator \a func for the specific \a interpolationType. * The interpolator has to be registered before the animation is constructed. * To unregister (and use the default interpolator) set \a func to 0. */ void QVariantAnimation::registerInterpolator(QVariantAnimation::Interpolator func, int interpolationType) { // will override any existing interpolators QInterpolatorVector *interpolators = registeredInterpolators(); // When built on solaris with GCC, the destructors can be called // in such an order that we get here with interpolators == NULL, // to continue causes the app to crash on exit with a SEGV if (interpolators) { QMutexLocker locker(®isteredInterpolatorsMutex); if (int(interpolationType) >= interpolators->count()) interpolators->resize(int(interpolationType) + 1); interpolators->replace(interpolationType, func); } }
QVariantAnimation::Interpolator QVariantAnimationPrivate::getInterpolator(int interpolationType) { QInterpolatorVector *interpolators = registeredInterpolators(); QMutexLocker locker(QMutexPool::globalInstanceGet(interpolators)); QVariantAnimation::Interpolator ret = 0; if (interpolationType < interpolators->count()) { ret = interpolators->at(interpolationType); if (ret) return ret; } switch(interpolationType) { case QMetaType::Int: return castToInterpolator(_q_interpolateVariant<int>); case QMetaType::UInt: return castToInterpolator(_q_interpolateVariant<uint>); case QMetaType::Double: return castToInterpolator(_q_interpolateVariant<double>); case QMetaType::Float: return castToInterpolator(_q_interpolateVariant<float>); case QMetaType::QLine: return castToInterpolator(_q_interpolateVariant<QLine>); case QMetaType::QLineF: return castToInterpolator(_q_interpolateVariant<QLineF>); case QMetaType::QPoint: return castToInterpolator(_q_interpolateVariant<QPoint>); case QMetaType::QPointF: return castToInterpolator(_q_interpolateVariant<QPointF>); case QMetaType::QSize: return castToInterpolator(_q_interpolateVariant<QSize>); case QMetaType::QSizeF: return castToInterpolator(_q_interpolateVariant<QSizeF>); case QMetaType::QRect: return castToInterpolator(_q_interpolateVariant<QRect>); case QMetaType::QRectF: return castToInterpolator(_q_interpolateVariant<QRectF>); default: return 0; //this type is not handled } }