Пример #1
0
void KBImageLoader::run()
{
    QMutexLocker locker(&d->condLock);

    // we enter the loop with d->needImage==true, so we will immediately
    // try to load an image

    while (true)
    {
        if (d->quitRequested)
            break;

        if (d->needImage)
        {
            if ( d->fileIndex == (int)d->fileList.count() )
            {
                if ( d->loop )
                {
                    d->fileIndex = 0;
                }
                else
                {
                    d->needImage = false;
                    emit(signalEndOfShow());
                    continue;
                }
            }

            d->needImage = false;
            d->condLock.unlock();
            bool ok;

            do
            {
                ok = loadImage();

                if ( !ok)
                    invalidateCurrentImageName();
            }
            while ( !ok && d->fileIndex < (int)d->fileList.count());

            if ( d->fileIndex == (int)d->fileList.count() )
            {

                emit(signalEndOfShow());
                d->condLock.lock();
                continue;
            }

            if ( !ok)
            {
                // generate a black dummy image
                d->texture = QImage(128, 128, QImage::Format_ARGB32);
                d->texture.fill(Qt::black);
            }

            d->condLock.lock();

            d->fileIndex++;

            if ( !d->initialized)
            {
                d->haveImages  = ok;
                d->initialized = true;
            }
        }
        else
        {
            // wait for new requests from the consumer
            d->imageRequest.wait(&d->condLock);
        }
    }
}
Пример #2
0
PresentationKB::PresentationKB(PresentationContainer* const sharedData)
    : QGLWidget(),
      d(new Private)
{
    setAttribute(Qt::WA_DeleteOnClose);
    setWindowFlags(Qt::X11BypassWindowManagerHint | Qt::WindowStaysOnTopHint | Qt::Popup);

    QRect deskRect = QApplication::desktop()->screenGeometry( QApplication::activeWindow() );
    d->deskX        = deskRect.x();
    d->deskY        = deskRect.y();
    d->deskWidth    = deskRect.width();
    d->deskHeight   = deskRect.height();

    move(d->deskX, d->deskY);
    resize(d->deskWidth, d->deskHeight);

    d->sharedData   = sharedData;

    srand(QTime::currentTime().msec());
    readSettings();

    unsigned frameRate;

    if (d->forceFrameRate == 0)
    {
        int rate = 25;

        QWindow* const handle = windowHandle();

        if (handle)
        {
            QScreen* const screen = handle->screen();

            if (screen)
            {
                rate = (int)screen->refreshRate();
            }
        }

        frameRate = rate * 2;
    }
    else
    {
        frameRate = d->forceFrameRate;
    }

    qCDebug(DIGIKAM_GENERAL_LOG) << "Frame Rate : " << frameRate;

    d->image[0]        = new KBImage(0);
    d->image[1]        = new KBImage(0);
    d->step            = 1.0 / ((float) (d->delay * frameRate));
    d->imageLoadThread = new KBImageLoader(d->sharedData, width(), height());
    d->timer           = new QTimer;

    connect(d->timer, SIGNAL(timeout()),
            this, SLOT(moveSlot()));

    connect(d->imageLoadThread, SIGNAL(signalEndOfShow()),
            this, SLOT(slotEndOfShow()));

    // -- hide cursor when not moved --------------------

    d->mouseMoveTimer = new QTimer;

    connect(d->mouseMoveTimer, SIGNAL(timeout()),
            this, SLOT(slotMouseMoveTimeOut()));

    setMouseTracking(true);

    slotMouseMoveTimeOut();

    // -- playback widget -------------------------------

#ifdef HAVE_MEDIAPLAYER

    d->playbackWidget = new PresentationAudioWidget(this, d->sharedData->soundtrackUrls, d->sharedData);
    d->playbackWidget->hide();
    d->playbackWidget->move(d->deskX, d->deskY);

#endif

    // -- load image and let's start

    d->imageLoadThread->start();
    d->timer->start(1000 / frameRate);
}