📄 presentationwidget.cpp.svn-base
字号:
pixmapPainter.setFont( f ); pixmapPainter.setPen( 0xFF ); // use a little offset to prettify output pixmapPainter.drawText( 2, 2, side, side, Qt::AlignCenter, QString::number( m_frameIndex + 1 ) ); // end drawing pixmap and halve image pixmapPainter.end(); QImage image( doublePixmap.toImage().scaled( side / 2, side / 2, Qt::IgnoreAspectRatio, Qt::SmoothTransformation ) ); image = image.convertToFormat( QImage::Format_ARGB32 ); // draw circular shadow using the same technique doublePixmap.fill( Qt::black ); pixmapPainter.begin( &doublePixmap ); pixmapPainter.setPen( 0x40 ); pixmapPainter.setBrush( QColor( 0x80 ) ); pixmapPainter.drawEllipse( 0, 0, side, side ); pixmapPainter.end(); QImage shadow( doublePixmap.toImage().scaled( side / 2, side / 2, Qt::IgnoreAspectRatio, Qt::SmoothTransformation ) ); // generate a 2 colors pixmap using mixing shadow (made with highlight color) // and image (made with highlightedText color) QPalette pal = palette(); QColor color = pal.color( QPalette::Active, QPalette::HighlightedText ); int red = color.red(), green = color.green(), blue = color.blue(); color = pal.color( QPalette::Active, QPalette::Highlight ); int sRed = color.red(), sGreen = color.green(), sBlue = color.blue(); // pointers unsigned int * data = (unsigned int *)image.bits(), * shadowData = (unsigned int *)shadow.bits(), pixels = image.width() * image.height(); // cache data (reduce computation time to 26%!) int c1 = -1, c2 = -1, cR = 0, cG = 0, cB = 0, cA = 0; // foreach pixel for( unsigned int i = 0; i < pixels; ++i ) { // alpha for shadow and image int shadowAlpha = shadowData[i] & 0xFF, srcAlpha = data[i] & 0xFF; // cache values if ( srcAlpha != c1 || shadowAlpha != c2 ) { c1 = srcAlpha; c2 = shadowAlpha; // fuse color components and alpha value of image over shadow data[i] = qRgba( cR = qt_div255( srcAlpha * red + (255 - srcAlpha) * sRed ), cG = qt_div255( srcAlpha * green + (255 - srcAlpha) * sGreen ), cB = qt_div255( srcAlpha * blue + (255 - srcAlpha) * sBlue ), cA = qt_div255( srcAlpha * srcAlpha + (255 - srcAlpha) * shadowAlpha ) ); } else data[i] = qRgba( cR, cG, cB, cA ); } m_lastRenderedOverlay = QPixmap::fromImage( image ); // start the autohide timer repaint( m_overlayGeometry ); // toggle with next line //update( m_overlayGeometry ); m_overlayHideTimer->start( 2500 );#endif}void PresentationWidget::slotNextPage(){ // loop when configured if ( m_frameIndex == (int)m_frames.count() - 1 && KpdfSettings::slidesLoop() ) m_frameIndex = -1; if ( m_frameIndex < (int)m_frames.count() - 1 ) { // go to next page changePage( m_frameIndex + 1 ); // auto advance to the next page if set if ( KpdfSettings::slidesAdvance() ) QTimer::singleShot( KpdfSettings::slidesAdvanceTime() * 1000, this, SLOT( slotNextPage() ) ); } else {#ifdef ENABLE_PROGRESS_OVERLAY if ( KpdfSettings::slidesShowProgress() ) generateOverlay();#endif if ( m_transitionTimer->isActive() ) { m_transitionTimer->stop(); update(); } } // we need the setFocus() call here to let KCursor::autoHide() work correctly setFocus();}void PresentationWidget::slotPrevPage(){ if ( m_frameIndex > 0 ) { // go to previous page changePage( m_frameIndex - 1 ); // auto advance to the next page if set if ( KpdfSettings::slidesAdvance() ) QTimer::singleShot( KpdfSettings::slidesAdvanceTime() * 1000, this, SLOT( slotNextPage() ) ); } else {#ifdef ENABLE_PROGRESS_OVERLAY if ( KpdfSettings::slidesShowProgress() ) generateOverlay();#endif if ( m_transitionTimer->isActive() ) { m_transitionTimer->stop(); update(); } }}void PresentationWidget::slotFirstPage(){ changePage( 0 );}void PresentationWidget::slotLastPage(){ changePage( (int)m_frames.count() - 1 );}void PresentationWidget::slotHideOverlay(){ QRect geom( m_overlayGeometry ); m_overlayGeometry.setCoords( 0, 0, -1, -1 ); update( geom );}void PresentationWidget::slotTransitionStep(){ if ( m_transitionRects.empty() ) { // it's better to fix the transition to cover the whole screen than // enabling the following line that wastes cpu for nothing //update(); return; } for ( int i = 0; i < m_transitionMul && !m_transitionRects.empty(); i++ ) { update( m_transitionRects.first() ); m_transitionRects.pop_front(); } m_transitionTimer->start( m_transitionDelay );}void PresentationWidget::slotDelayedEvents(){ // inform user on how to exit from presentation mode KMessageBox::information( this, i18n("There are two ways of exiting presentation mode, you can press either ESC key or click with the quit button that appears when placing the mouse in the top-right corner. Of course you can cycle windows (Alt+TAB by default)"), QString::null, "presentationInfo" );}void PresentationWidget::slotPageChanged(){ bool ok = true; int p = m_pagesEdit->text().toInt( &ok ); if ( !ok ) return; changePage( p - 1 );}const KPDFPageTransition PresentationWidget::defaultTransition() const{ return defaultTransition( KpdfSettings::slidesTransition() );}const KPDFPageTransition PresentationWidget::defaultTransition( int type ) const{ switch ( type ) { case KpdfSettings::EnumSlidesTransition::BlindsHorizontal: { KPDFPageTransition transition( KPDFPageTransition::Blinds ); transition.setAlignment( KPDFPageTransition::Horizontal ); return transition; break; } case KpdfSettings::EnumSlidesTransition::BlindsVertical: { KPDFPageTransition transition( KPDFPageTransition::Blinds ); transition.setAlignment( KPDFPageTransition::Vertical ); return transition; break; } case KpdfSettings::EnumSlidesTransition::BoxIn: { KPDFPageTransition transition( KPDFPageTransition::Box ); transition.setDirection( KPDFPageTransition::Inward ); return transition; break; } case KpdfSettings::EnumSlidesTransition::BoxOut: { KPDFPageTransition transition( KPDFPageTransition::Box ); transition.setDirection( KPDFPageTransition::Outward ); return transition; break; } case KpdfSettings::EnumSlidesTransition::Dissolve: { return KPDFPageTransition( KPDFPageTransition::Dissolve ); break; } case KpdfSettings::EnumSlidesTransition::GlitterDown: { KPDFPageTransition transition( KPDFPageTransition::Glitter ); transition.setAngle( 270 ); return transition; break; } case KpdfSettings::EnumSlidesTransition::GlitterRight: { KPDFPageTransition transition( KPDFPageTransition::Glitter ); transition.setAngle( 0 ); return transition; break; } case KpdfSettings::EnumSlidesTransition::GlitterRightDown: { KPDFPageTransition transition( KPDFPageTransition::Glitter ); transition.setAngle( 315 ); return transition; break; } case KpdfSettings::EnumSlidesTransition::Random: { return defaultTransition( KRandom::random() % 18 ); break; } case KpdfSettings::EnumSlidesTransition::SplitHorizontalIn: { KPDFPageTransition transition( KPDFPageTransition::Split ); transition.setAlignment( KPDFPageTransition::Horizontal ); transition.setDirection( KPDFPageTransition::Inward ); return transition; break; } case KpdfSettings::EnumSlidesTransition::SplitHorizontalOut: { KPDFPageTransition transition( KPDFPageTransition::Split ); transition.setAlignment( KPDFPageTransition::Horizontal ); transition.setDirection( KPDFPageTransition::Outward ); return transition; break; } case KpdfSettings::EnumSlidesTransition::SplitVerticalIn: { KPDFPageTransition transition( KPDFPageTransition::Split ); transition.setAlignment( KPDFPageTransition::Vertical ); transition.setDirection( KPDFPageTransition::Inward ); return transition; break; } case KpdfSettings::EnumSlidesTransition::SplitVerticalOut: { KPDFPageTransition transition( KPDFPageTransition::Split ); transition.setAlignment( KPDFPageTransition::Vertical ); transition.setDirection( KPDFPageTransition::Outward ); return transition; break; } case KpdfSettings::EnumSlidesTransition::WipeDown: { KPDFPageTransition transition( KPDFPageTransition::Wipe ); transition.setAngle( 270 ); return transition; break; } case KpdfSettings::EnumSlidesTransition::WipeRight: { KPDFPageTransition transition( KPDFPageTransition::Wipe ); transition.setAngle( 0 ); return transition; break; } case KpdfSettings::EnumSlidesTransition::WipeLeft: { KPDFPageTransition transition( KPDFPageTransition::Wipe ); transition.setAngle( 180 ); return transition; break; } case KpdfSettings::EnumSlidesTransition::WipeUp: { KPDFPageTransition transition( KPDFPageTransition::Wipe ); transition.setAngle( 90 ); return transition; break; } case KpdfSettings::EnumSlidesTransition::Replace: default: return KPDFPageTransition( KPDFPageTransition::Replace ); break; } // should not happen, just make gcc happy return KPDFPageTransition();}/** ONLY the TRANSITIONS GENERATION function from here on **/void PresentationWidget::initTransition( const KPDFPageTransition *transition ){ // if it's just a 'replace' transition, repaint the screen if ( transition->type() == KPDFPageTransition::Replace ) { update(); return; } const bool isInward = transition->direction() == KPDFPageTransition::Inward; const bool isHorizontal = transition->alignment() == KPDFPageTransition::Horizontal; const float totalTime = transition->duration(); m_transitionRects.clear(); switch( transition->type() ) { // split: horizontal / vertical and inward / outward case KPDFPageTransition::Split: { const int steps = isHorizontal ? 100 : 75; if ( isHorizontal ) { if ( isInward ) { int xPosition = 0; for ( int i = 0; i < steps; i++ ) { int xNext = ((i + 1) * m_width) / (2 * steps); m_transitionRects.push_back( QRect( xPosition, 0, xNext - xPosition, m_height ) ); m_transitionRects.push_back( QRect( m_width - xNext, 0, xNext - xPosition, m_height ) );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -