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(); }
bool jumpToImage( int index ) override { if( index < imageCount() ) { frame = index; return true; } return false; }
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; }
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); }
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)); }
void TargetButton::updateButtonText() { setText(QString("%1 (%2)").arg(name()).arg(imageCount())); }