Hi Tomaz, On 2012-06-03 at 20:46 +0200, Quikee wrote:
I implemented Lanczos resampling for bug fdo#46378. Lanczos resampling is a lot better than currently available resampling methods (FAST and INTERPOLATE). Currently the lanczos resampling is only enabled for PDF export.
Great stuff, thank you so much! I've pushed that to master http://cgit.freedesktop.org/libreoffice/core/commit/?id=47e0df5cebc05576e55210c5dd408a6f3eb91700 with some minor modifications: - changed sal_Bool -> bool (we prefer the native bool in the new code) - modified one method to be void (it always returned true) - added your real name as the author (please set your git config \ --global user.name) - and reverted the _LANCZOS use for the PDF export for now - sorry for that; but I am afraid there must be a small glitch somewhere :-( How did I find out; I told myself "let's be bold, and default to Lanczos" ;-) - and tried with the attached 2 patches, but from some reason the start screen looks like the attached "start.png" then - can you please have a look? Thank you so much for your work - if you can fix that, and ideally add a unit test, or few, I am all for enabling it for 3.6 even a bit later as a late feature; hopefully we might find 2 more approvals for that :-) All the best, Kendy
From acf4bad74a885c05bea074a641bad96da5b7dc89 Mon Sep 17 00:00:00 2001
From: Jan Holesovsky <kendy@suse.cz>
Date: Mon, 4 Jun 2012 14:47:18 +0200
Subject: [PATCH 2/3] Use BMP_SCALE_LANCZOS instead of BMP_SCALE_INTERPOLATE.
Where we explicitly ask for better quality, use BMP_SCALE_LANCZOS, instead of
BMP_SCALE_INTERPOLATE.
Change-Id: I28ddf3290204532a8660e09ee9ab0949b6ce1c73
---
canvas/source/vcl/canvasbitmaphelper.cxx | 2 +-
canvas/source/vcl/canvashelper.cxx | 2 +-
cui/source/dialogs/cuigrfflt.cxx | 2 +-
filter/source/graphicfilter/eps/eps.cxx | 2 +-
framework/source/fwe/classes/addonsoptions.cxx | 4 ++--
.../uielement/imagebuttontoolbarcontroller.cxx | 2 +-
sd/source/ui/dlg/dlgass.cxx | 2 +-
sd/source/ui/presenter/SlideRenderer.cxx | 2 +-
.../ui/slidesorter/cache/SlsBitmapFactory.cxx | 2 +-
.../view/SlsInsertionIndicatorOverlay.cxx | 2 +-
sd/source/ui/tools/PreviewRenderer.cxx | 2 +-
sfx2/source/toolbox/tbxitem.cxx | 2 +-
svx/source/gallery2/galobj.cxx | 2 +-
toolkit/source/awt/vclxmenu.cxx | 2 +-
vcl/source/gdi/bitmapex.cxx | 2 +-
vcl/source/helper/canvasbitmap.cxx | 2 +-
16 files changed, 17 insertions(+), 17 deletions(-)
diff --git a/canvas/source/vcl/canvasbitmaphelper.cxx b/canvas/source/vcl/canvasbitmaphelper.cxx
index 3032c18..cceaf7b 100644
--- a/canvas/source/vcl/canvasbitmaphelper.cxx
+++ b/canvas/source/vcl/canvasbitmaphelper.cxx
@@ -129,7 +129,7 @@ namespace vclcanvas
BitmapEx aRes( mpBackBuffer->getBitmapReference() );
aRes.Scale( ::vcl::unotools::sizeFromRealSize2D(newSize),
- beFast ? BMP_SCALE_FAST : BMP_SCALE_INTERPOLATE );
+ beFast ? BMP_SCALE_FAST : BMP_SCALE_LANCZOS );
return uno::Reference< rendering::XBitmap >(
new CanvasBitmap( aRes, *mpDevice, mpOutDevReference ) );
diff --git a/canvas/source/vcl/canvashelper.cxx b/canvas/source/vcl/canvashelper.cxx
index 83f3ccf..ba36f40 100644
--- a/canvas/source/vcl/canvashelper.cxx
+++ b/canvas/source/vcl/canvashelper.cxx
@@ -927,7 +927,7 @@ namespace vclcanvas
Bitmap aBitmap( rOutDev.GetBitmap(aEmptyPoint, aBmpSize) );
aBitmap.Scale( ::vcl::unotools::sizeFromRealSize2D(newSize),
- beFast ? BMP_SCALE_FAST : BMP_SCALE_INTERPOLATE );
+ beFast ? BMP_SCALE_FAST : BMP_SCALE_LANCZOS );
return uno::Reference< rendering::XBitmap >(
new CanvasBitmap( aBitmap, *mpDevice, mpOutDev ) );
diff --git a/cui/source/dialogs/cuigrfflt.cxx b/cui/source/dialogs/cuigrfflt.cxx
index 21ccf63..c1b3ad4 100644
--- a/cui/source/dialogs/cuigrfflt.cxx
+++ b/cui/source/dialogs/cuigrfflt.cxx
@@ -126,7 +126,7 @@ GraphicFilterDialog::GraphicFilterDialog( Window* pParent, const ResId& rResId,
{
BitmapEx aBmpEx( rGraphic.GetBitmapEx() );
- if( aBmpEx.Scale( aGrfSize, BMP_SCALE_INTERPOLATE ) )
+ if( aBmpEx.Scale( aGrfSize, BMP_SCALE_LANCZOS ) )
maGraphic = aBmpEx;
}
}
diff --git a/filter/source/graphicfilter/eps/eps.cxx b/filter/source/graphicfilter/eps/eps.cxx
index 8a1410f..9350687 100644
--- a/filter/source/graphicfilter/eps/eps.cxx
+++ b/filter/source/graphicfilter/eps/eps.cxx
@@ -499,7 +499,7 @@ void PSWriter::ImplWriteProlog( const Graphic* pPreview )
{
Size aSizeBitmap( ( aSizePoint.Width() + 7 ) & ~7, aSizePoint.Height() );
Bitmap aTmpBitmap( pPreview->GetBitmap() );
- aTmpBitmap.Scale( aSizeBitmap, BMP_SCALE_INTERPOLATE );
+ aTmpBitmap.Scale( aSizeBitmap, BMP_SCALE_LANCZOS );
aTmpBitmap.Convert( BMP_CONVERSION_1BIT_THRESHOLD );
BitmapReadAccess* pAcc = aTmpBitmap.AcquireReadAccess();
if ( pAcc )
diff --git a/framework/source/fwe/classes/addonsoptions.cxx
b/framework/source/fwe/classes/addonsoptions.cxx
index d1e488f..a6a29b5 100644
--- a/framework/source/fwe/classes/addonsoptions.cxx
+++ b/framework/source/fwe/classes/addonsoptions.cxx
@@ -1358,13 +1358,13 @@ void AddonsOptions_Impl::ReadImageFromURL( ImageSize nImageSize, const
::rtl::OU
if ( aBmpSize != aNoScaleSize )
{
BitmapEx aNoScaleBmp( aBitmapEx );
- aNoScaleBmp.Scale( aNoScaleSize, BMP_SCALE_INTERPOLATE );
+ aNoScaleBmp.Scale( aNoScaleSize, BMP_SCALE_LANCZOS );
}
else
aImageNoScale = Image( aBitmapEx );
if ( aBmpSize != aSize )
- aBitmapEx.Scale( aSize, BMP_SCALE_INTERPOLATE );
+ aBitmapEx.Scale( aSize, BMP_SCALE_LANCZOS );
aImage = Image( aBitmapEx );
}
diff --git a/framework/source/uielement/imagebuttontoolbarcontroller.cxx
b/framework/source/uielement/imagebuttontoolbarcontroller.cxx
index 55f82dc..a1a494a 100644
--- a/framework/source/uielement/imagebuttontoolbarcontroller.cxx
+++ b/framework/source/uielement/imagebuttontoolbarcontroller.cxx
@@ -214,7 +214,7 @@ sal_Bool ImageButtonToolbarController::ReadImageFromURL( sal_Bool bBigImage, con
{
::Size aNoScaleSize( aBmpSize.Width(), aSize.Height() );
if ( aBmpSize != aNoScaleSize )
- aBitmapEx.Scale( aNoScaleSize, BMP_SCALE_INTERPOLATE );
+ aBitmapEx.Scale( aNoScaleSize, BMP_SCALE_LANCZOS );
aImage = Image( aBitmapEx );
return sal_True;
}
diff --git a/sd/source/ui/dlg/dlgass.cxx b/sd/source/ui/dlg/dlgass.cxx
index cd61216..8d0009c 100644
--- a/sd/source/ui/dlg/dlgass.cxx
+++ b/sd/source/ui/dlg/dlgass.cxx
@@ -92,7 +92,7 @@ void InterpolateFixedBitmap( FixedBitmap * pBitmap )
{
Bitmap aBmp( pBitmap->GetBitmap() );
Size aSize = pBitmap->GetSizePixel();
- aBmp.Scale( aSize, BMP_SCALE_INTERPOLATE );
+ aBmp.Scale( aSize, BMP_SCALE_LANCZOS );
pBitmap->SetBitmap( aBmp );
}
diff --git a/sd/source/ui/presenter/SlideRenderer.cxx b/sd/source/ui/presenter/SlideRenderer.cxx
index b7ce080..5c3b4ba 100644
--- a/sd/source/ui/presenter/SlideRenderer.cxx
+++ b/sd/source/ui/presenter/SlideRenderer.cxx
@@ -233,7 +233,7 @@ BitmapEx SlideRenderer::CreatePreview (
BitmapEx aScaledPreview = aPreview.GetBitmapEx();
aScaledPreview.Scale(
Size(aPreviewSize.Width,aPreviewSize.Height),
- BMP_SCALE_INTERPOLATE);
+ BMP_SCALE_LANCZOS);
return aScaledPreview;
}
}
diff --git a/sd/source/ui/slidesorter/cache/SlsBitmapFactory.cxx
b/sd/source/ui/slidesorter/cache/SlsBitmapFactory.cxx
index 871713c..503498c 100644
--- a/sd/source/ui/slidesorter/cache/SlsBitmapFactory.cxx
+++ b/sd/source/ui/slidesorter/cache/SlsBitmapFactory.cxx
@@ -87,7 +87,7 @@ Bitmap BitmapFactory::CreateBitmap (
false).GetBitmapEx().GetBitmap());
if (bDoSuperSampling && gbAllowSuperSampling)
{
- aPreview.Scale(rPixelSize, BMP_SCALE_INTERPOLATE);
+ aPreview.Scale(rPixelSize, BMP_SCALE_LANCZOS);
}
return aPreview;
diff --git a/sd/source/ui/slidesorter/view/SlsInsertionIndicatorOverlay.cxx
b/sd/source/ui/slidesorter/view/SlsInsertionIndicatorOverlay.cxx
index 6bde0447..464f5cd 100644
--- a/sd/source/ui/slidesorter/view/SlsInsertionIndicatorOverlay.cxx
+++ b/sd/source/ui/slidesorter/view/SlsInsertionIndicatorOverlay.cxx
@@ -216,7 +216,7 @@ Point InsertionIndicatorOverlay::PaintRepresentatives (
const Size aSuperSampleSize(
aPreviewSize.Width()*gnSuperScaleFactor,
aPreviewSize.Height()*gnSuperScaleFactor);
- aPreview.Scale(aPreviewSize, BMP_SCALE_INTERPOLATE);
+ aPreview.Scale(aPreviewSize, BMP_SCALE_LANCZOS);
rContent.DrawBitmapEx(aPageOffset, aPreview);
// When the page is marked as excluded from the slide show then
diff --git a/sd/source/ui/tools/PreviewRenderer.cxx b/sd/source/ui/tools/PreviewRenderer.cxx
index fb81193..4b831c2 100644
--- a/sd/source/ui/tools/PreviewRenderer.cxx
+++ b/sd/source/ui/tools/PreviewRenderer.cxx
@@ -512,7 +512,7 @@ Image PreviewRenderer::ScaleBitmap (
// Paint the bitmap scaled to the desired width.
BitmapEx aScaledBitmap (rBitmapEx.GetBitmap());
- aScaledBitmap.Scale (aPreviewSize, BMP_SCALE_INTERPOLATE);
+ aScaledBitmap.Scale (aPreviewSize, BMP_SCALE_LANCZOS);
mpPreviewDevice->DrawBitmap (
Point(1,1),
aPreviewSize,
diff --git a/sfx2/source/toolbox/tbxitem.cxx b/sfx2/source/toolbox/tbxitem.cxx
index d288eef..d220e71 100644
--- a/sfx2/source/toolbox/tbxitem.cxx
+++ b/sfx2/source/toolbox/tbxitem.cxx
@@ -1550,7 +1550,7 @@ void SfxAppToolBoxControl_Impl::SetImage( const String &rURL )
if ( bBig && aImage.GetSizePixel() != aBigSize )
{
BitmapEx aScaleBmpEx( aImage.GetBitmapEx() );
- aScaleBmpEx.Scale( aBigSize, BMP_SCALE_INTERPOLATE );
+ aScaleBmpEx.Scale( aBigSize, BMP_SCALE_LANCZOS );
GetToolBox().SetItemImage( GetId(), Image( aScaleBmpEx ) );
}
else
diff --git a/svx/source/gallery2/galobj.cxx b/svx/source/gallery2/galobj.cxx
index b2ca476..a05616f 100644
--- a/svx/source/gallery2/galobj.cxx
+++ b/svx/source/gallery2/galobj.cxx
@@ -111,7 +111,7 @@ sal_Bool SgaObject::CreateThumb( const Graphic& rGraphic )
Max( (long) (fFactor < 1. ? S_THUMB : S_THUMB / fFactor), 8L
) );
if( aThumbBmp.Scale( (double) aNewSize.Width() / aBmpSize.Width(),
- (double) aNewSize.Height() / aBmpSize.Height(),
BMP_SCALE_INTERPOLATE ) )
+ (double) aNewSize.Height() / aBmpSize.Height(),
BMP_SCALE_LANCZOS ) )
{
aThumbBmp.Convert( BMP_CONVERSION_8BIT_COLORS );
bRet = sal_True;
diff --git a/toolkit/source/awt/vclxmenu.cxx b/toolkit/source/awt/vclxmenu.cxx
index d45d5dc..c629d67 100644
--- a/toolkit/source/awt/vclxmenu.cxx
+++ b/toolkit/source/awt/vclxmenu.cxx
@@ -680,7 +680,7 @@ namespace
sal_Bool bModified( sal_False );
BitmapEx aBitmapEx = aImage.GetBitmapEx();
- bModified = aBitmapEx.Scale( aNewSize, BMP_SCALE_INTERPOLATE );
+ bModified = aBitmapEx.Scale( aNewSize, BMP_SCALE_LANCZOS );
if ( bModified )
aImage = Image( aBitmapEx );
diff --git a/vcl/source/gdi/bitmapex.cxx b/vcl/source/gdi/bitmapex.cxx
index f4e8e5b..72c91e4 100644
--- a/vcl/source/gdi/bitmapex.cxx
+++ b/vcl/source/gdi/bitmapex.cxx
@@ -754,7 +754,7 @@ BitmapEx BitmapEx:: AutoScaleBitmap(BitmapEx & aBitmap, const long aStandardSize
}
aScaledSize = Size( imgNewWidth, imgNewHeight );
- aRet.Scale( aScaledSize, BMP_SCALE_INTERPOLATE );
+ aRet.Scale( aScaledSize, BMP_SCALE_LANCZOS );
}
else
{
diff --git a/vcl/source/helper/canvasbitmap.cxx b/vcl/source/helper/canvasbitmap.cxx
index a7aebc2..854dea4 100644
--- a/vcl/source/helper/canvasbitmap.cxx
+++ b/vcl/source/helper/canvasbitmap.cxx
@@ -460,7 +460,7 @@ uno::Reference< rendering::XBitmap > SAL_CALL VclCanvasBitmap::getScaledBitmap(
SolarMutexGuard aGuard;
BitmapEx aNewBmp( m_aBitmap );
- aNewBmp.Scale( sizeFromRealSize2D( newSize ), beFast ? BMP_SCALE_FAST : BMP_SCALE_INTERPOLATE
);
+ aNewBmp.Scale( sizeFromRealSize2D( newSize ), beFast ? BMP_SCALE_FAST : BMP_SCALE_LANCZOS );
return uno::Reference<rendering::XBitmap>( new VclCanvasBitmap( aNewBmp ) );
}
--
1.7.8.3
From 0b1509fea0591cda70d64e6761373283b0574c7c Mon Sep 17 00:00:00 2001
From: Jan Holesovsky <kendy@suse.cz>
Date: Mon, 4 Jun 2012 15:02:45 +0200
Subject: [PATCH 3/3] Let's be bold, and default to the nice method when
scaling.
[ie. use BMP_SCALE_FAST only where explicitly asked for.]
Change-Id: Ia5eccc786262216a803b989b073ffd9c1ed78377
---
vcl/inc/vcl/bitmap.hxx | 4 ++--
vcl/inc/vcl/bitmapex.hxx | 4 ++--
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/vcl/inc/vcl/bitmap.hxx b/vcl/inc/vcl/bitmap.hxx
index 14aae27..8b11318 100644
--- a/vcl/inc/vcl/bitmap.hxx
+++ b/vcl/inc/vcl/bitmap.hxx
@@ -538,7 +538,7 @@ public:
@return sal_True, if the operation was completed successfully.
*/
sal_Bool Scale( const Size& rNewSize,
- sal_uLong nScaleFlag = BMP_SCALE_FAST );
+ sal_uLong nScaleFlag = BMP_SCALE_LANCZOS );
/** Scale the bitmap
@@ -551,7 +551,7 @@ public:
@return sal_True, if the operation was completed successfully.
*/
sal_Bool Scale( const double& rScaleX, const double& rScaleY,
- sal_uLong nScaleFlag = BMP_SCALE_FAST );
+ sal_uLong nScaleFlag = BMP_SCALE_LANCZOS );
/** Rotate bitmap by the specified angle
diff --git a/vcl/inc/vcl/bitmapex.hxx b/vcl/inc/vcl/bitmapex.hxx
index c9e4627..f1f46d3 100644
--- a/vcl/inc/vcl/bitmapex.hxx
+++ b/vcl/inc/vcl/bitmapex.hxx
@@ -254,7 +254,7 @@ public:
@return sal_True, if the operation was completed successfully.
*/
- sal_Bool Scale( const Size& rNewSize, sal_uLong nScaleFlag = BMP_SCALE_FAST );
+ sal_Bool Scale( const Size& rNewSize, sal_uLong nScaleFlag = BMP_SCALE_LANCZOS
);
/** Scale the bitmap
@@ -266,7 +266,7 @@ public:
@return sal_True, if the operation was completed successfully.
*/
- sal_Bool Scale( const double& rScaleX, const double& rScaleY, sal_uLong
nScaleFlag = BMP_SCALE_FAST );
+ sal_Bool Scale( const double& rScaleX, const double& rScaleY, sal_uLong
nScaleFlag = BMP_SCALE_LANCZOS );
/** Rotate bitmap by the specified angle
--
1.7.8.3
Attachment:
start.png
Description: PNG image