diff --git a/app/configdialog.cpp b/app/configdialog.cpp --- a/app/configdialog.cpp +++ b/app/configdialog.cpp @@ -68,6 +68,7 @@ mAlphaBackgroundModeGroup = new InvisibleButtonGroup(widget); mAlphaBackgroundModeGroup->setObjectName(QLatin1String("kcfg_AlphaBackgroundMode")); + mAlphaBackgroundModeGroup->addButton(mImageViewConfigPage.noBackgroundRadioButton, int(AbstractImageView::AlphaBackgroundNone)); mAlphaBackgroundModeGroup->addButton(mImageViewConfigPage.checkBoardRadioButton, int(AbstractImageView::AlphaBackgroundCheckBoard)); mAlphaBackgroundModeGroup->addButton(mImageViewConfigPage.solidColorRadioButton, int(AbstractImageView::AlphaBackgroundSolid)); diff --git a/app/imageviewconfigpage.ui b/app/imageviewconfigpage.ui --- a/app/imageviewconfigpage.ui +++ b/app/imageviewconfigpage.ui @@ -7,7 +7,7 @@ 0 0 500 - 600 + 650 @@ -25,6 +25,39 @@ + + + 6 + + + 0 + + + + + None + + + true + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + 6 @@ -38,7 +71,7 @@ &Check board - true + false @@ -57,7 +90,7 @@ - + 6 @@ -97,7 +130,7 @@ - + Qt::Vertical @@ -113,7 +146,7 @@ - + Mouse wheel behavior: @@ -126,7 +159,7 @@ - + @@ -153,7 +186,7 @@ - + @@ -177,7 +210,7 @@ - + Qt::Vertical @@ -193,7 +226,7 @@ - + Zoom mode: @@ -206,7 +239,7 @@ - + @@ -233,7 +266,7 @@ - + @@ -257,7 +290,7 @@ - + @@ -281,7 +314,7 @@ - + Qt::Vertical @@ -297,7 +330,7 @@ - + @@ -321,7 +354,7 @@ - + Qt::Vertical @@ -337,7 +370,7 @@ - + Animations: @@ -350,7 +383,7 @@ - + @@ -377,7 +410,7 @@ - + @@ -401,7 +434,7 @@ - + @@ -425,7 +458,7 @@ - + Qt::Vertical @@ -441,14 +474,14 @@ - + <b>Thumbnail Bar</b> - + Qt::Vertical @@ -464,7 +497,7 @@ - + Orientation: @@ -477,7 +510,7 @@ - + @@ -501,7 +534,7 @@ - + @@ -525,7 +558,7 @@ - + Row count: @@ -538,7 +571,7 @@ - + @@ -565,7 +598,7 @@ - + Qt::Vertical diff --git a/lib/documentview/abstractimageview.h b/lib/documentview/abstractimageview.h --- a/lib/documentview/abstractimageview.h +++ b/lib/documentview/abstractimageview.h @@ -45,6 +45,7 @@ ForceUpdate }; enum AlphaBackgroundMode { + AlphaBackgroundNone, AlphaBackgroundCheckBoard, AlphaBackgroundSolid }; diff --git a/lib/documentview/rasterimageview.cpp b/lib/documentview/rasterimageview.cpp --- a/lib/documentview/rasterimageview.cpp +++ b/lib/documentview/rasterimageview.cpp @@ -164,17 +164,26 @@ void drawAlphaBackground(QPainter* painter, const QRect& viewportRect, const QPoint& zoomedImageTopLeft, QPixmap texture) { - if (mAlphaBackgroundMode == AbstractImageView::AlphaBackgroundCheckBoard) { - QPoint textureOffset( - zoomedImageTopLeft.x() % texture.width(), - zoomedImageTopLeft.y() % texture.height() - ); - painter->drawTiledPixmap( - viewportRect, - texture, - textureOffset); - } else { - painter->fillRect(viewportRect, mAlphaBackgroundColor); + switch (mAlphaBackgroundMode) { + case AbstractImageView::AlphaBackgroundNone: + painter->fillRect(viewportRect, Qt::transparent); + break; + case AbstractImageView::AlphaBackgroundCheckBoard: + { + const QPoint textureOffset( + zoomedImageTopLeft.x() % texture.width(), + zoomedImageTopLeft.y() % texture.height()); + painter->drawTiledPixmap( + viewportRect, + texture, + textureOffset); + break; + } + case AbstractImageView::AlphaBackgroundSolid: + painter->fillRect(viewportRect, mAlphaBackgroundColor); + break; + default: + Q_ASSERT(0); } } }; @@ -188,7 +197,7 @@ d->mApplyDisplayTransform = true; d->mDisplayTransform = 0; - d->mAlphaBackgroundMode = AlphaBackgroundCheckBoard; + d->mAlphaBackgroundMode = AlphaBackgroundNone; d->mAlphaBackgroundColor = Qt::black; d->mRenderingIntent = INTENT_PERCEPTUAL; d->mEnlargeSmallerImages = false; @@ -332,14 +341,15 @@ d->mBufferIsEmpty = false; { QPainter painter(&d->mCurrentBuffer); + painter.setCompositionMode(QPainter::CompositionMode_Source); if (document()->hasAlphaChannel()) { d->drawAlphaBackground( &painter, QRect(viewportLeft, viewportTop, image.width(), image.height()), QPoint(zoomedImageLeft, zoomedImageTop), alphaBackgroundTexture() ); - } else { - painter.setCompositionMode(QPainter::CompositionMode_Source); + // This is required so transparent pixels don't replace our background + painter.setCompositionMode(QPainter::CompositionMode_SourceOver); } painter.drawImage(viewportLeft, viewportTop, image); } @@ -379,6 +389,7 @@ if (d->mAlternateBuffer.size() != d->mCurrentBuffer.size()) { d->mAlternateBuffer = QPixmap(d->mCurrentBuffer.size()); } + d->mAlternateBuffer.fill(Qt::transparent); QPainter painter(&d->mAlternateBuffer); painter.drawPixmap(-delta, d->mCurrentBuffer); } diff --git a/lib/documentview/svgviewadapter.cpp b/lib/documentview/svgviewadapter.cpp --- a/lib/documentview/svgviewadapter.cpp +++ b/lib/documentview/svgviewadapter.cpp @@ -121,6 +121,10 @@ const QRectF imageRect = QRectF(imageOffset(), visibleImageSize()); switch (mAlphaBackgroundMode) { + case AbstractImageView::AlphaBackgroundNone: + // Unlike RasterImageView, SVGs are rendered directly on the image view, + // therefore we can simply not draw a background + break; case AbstractImageView::AlphaBackgroundCheckBoard: painter->drawTiledPixmap(imageRect, alphaBackgroundTexture(), scrollPos()); break; diff --git a/lib/gwenviewconfig.kcfg b/lib/gwenviewconfig.kcfg --- a/lib/gwenviewconfig.kcfg +++ b/lib/gwenviewconfig.kcfg @@ -119,10 +119,11 @@ + - AbstractImageView::AlphaBackgroundCheckBoard + AbstractImageView::AlphaBackgroundNone #ffffff