Esempio n. 1
0
void ImageDocument::setContents(const ImageContents &contents)
{
    Q_D(ImageDocument);

    if (contents.isNull()) {
        clear();
        return;
    }

    const auto header = contents.header();
    d->type = header.type();
    d->size = header.size();
    d->imageFormat = header.imageFormat();
    d->imageCount = header.imageCount();
    d->mipmapCount = header.mipmapCount();
    d->frameDelay = header.frameDelay();
    d->loopCount = header.loopCount();
    for (int index = 0; index < d->imageCount; ++index) {
        for (int level = 0; level < d->mipmapCount; ++level) {
            auto image = contents.image(index, level);
            std::unique_ptr<ImageDocumentItem> item(new ImageDocumentItem(this));
            item->setSize(image.size());
            item->setImage(image);
            d->items[ImageDocumentPrivate::ImageIndex(index, level)] = std::move(item);
        }
    }

    emit contentsChanged();
}
Esempio n. 2
0
 bool jumpToImage( int index ) override {
     if( index < imageCount() ) {
         frame = index;
         return true;
     }
     return false;
 }
Esempio n. 3
0
bool FlifHandler::read( QImage *img_pointer ) {
    //Read data on first frame
    if( !loaded() ) {
        auto data = device()->readAll();
        if( !decoder.decodeMemory( data.constData(), data.size() ) )
            return false;
    }

    frame++;
    if( imageCount() <= frame )
        return false;

    auto img = decoder.getImage( frame );
    QImage out( img.getWidth(), img.getHeight(), QImage::Format_ARGB32 );

    auto buffer = std::make_unique<uint8_t[]>( out.width() * 4 );
    for( int iy=0; iy<out.height(); iy++ ) {
        img.readRowRgba8( iy, buffer.get(), out.width() * 4 );
        auto line = (QRgb*)out.scanLine( iy );

        for( int ix=0; ix<out.width(); ix++ )
            line[ix] = qRgba( buffer[ix*4+0], buffer[ix*4+1], buffer[ix*4+2], buffer[ix*4+3] );
    }

    lastImageDelay = img.getFrameDelay();
    *img_pointer = out;
    return true;
}
Esempio n. 4
0
    void timerEvent(QTimerEvent*)
    {
        QImage img = read();
        int delay = 0;

        if ( img.isNull() ) {
            setFileName(fileName()); // XXX restart
        } else {
            QRegion r(0,0,qt_screen->width(),qt_screen->height());
            qt_screen->blit(img,QPoint(0,0),r);
            qt_screen->exposeRegion(r,1);
            if ( imageCount() == 1 )
                return;
            struct timeval now;
            gettimeofday(&now,0);
            int period = nextImageDelay();
            delay = period -
                ((now.tv_sec-last.tv_sec)*1000+(now.tv_usec-last.tv_usec)/1000);
            last.tv_sec += period/1000;
            last.tv_usec += (period%1000)*1000;
            if ( delay < 0 )
                delay = 0;
        }

        timer.start(delay,this);
    }
Esempio n. 5
0
QImage ImageContents::image(int index, int level) const
{
    if (index < 0 || index >= imageCount())
        return QImage();
    if (level < 0 || level >= mipmapCount())
        return QImage();
    return d->images.value(ImageContentsData::ImageIndex(index, level));
}
Esempio n. 6
0
void TargetButton::updateButtonText() {
	setText(QString("%1 (%2)").arg(name()).arg(imageCount()));
}