Kaydet (Commit) 1d4bbe7b authored tarafından Michael Meeks's avatar Michael Meeks

vcl: attempt to fix high quality scaling to get aspect ratio right.

Change-Id: Ic62c6a16c39dd4e4e19bf9a96503ecf6ac50f292
üst d97732f6
...@@ -38,8 +38,12 @@ public: ...@@ -38,8 +38,12 @@ public:
*/ */
void testCVEs(); void testCVEs();
/// test scaling
void testScaling();
CPPUNIT_TEST_SUITE(VclFiltersTest); CPPUNIT_TEST_SUITE(VclFiltersTest);
CPPUNIT_TEST(testCVEs); CPPUNIT_TEST(testCVEs);
CPPUNIT_TEST(testScaling);
CPPUNIT_TEST_SUITE_END(); CPPUNIT_TEST_SUITE_END();
}; };
...@@ -53,6 +57,22 @@ bool VclFiltersTest::load(const OUString &, ...@@ -53,6 +57,22 @@ bool VclFiltersTest::load(const OUString &,
return aGraphicFilter.ImportGraphic(aGraphic, rURL, aFileStream) == 0; return aGraphicFilter.ImportGraphic(aGraphic, rURL, aFileStream) == 0;
} }
void VclFiltersTest::testScaling()
{
for (unsigned int i = BMP_SCALE_FAST; i <= BMP_SCALE_BOX; i++)
{
Bitmap aBitmap( Size( 413, 409 ), 24 );
BitmapEx aBitmapEx( aBitmap );
fprintf( stderr, "scale with type %d\n", i );
CPPUNIT_ASSERT( aBitmapEx.Scale( 0.1937046, 0.193154, i ) );
Size aAfter( aBitmapEx.GetSizePixel() );
fprintf( stderr, "size %ld, %ld\n", (long)aAfter.Width(),
aAfter.Height() );
CPPUNIT_ASSERT( labs (aAfter.Height() - aAfter.Width()) <= 1 );
}
}
void VclFiltersTest::testCVEs() void VclFiltersTest::testCVEs()
{ {
#ifndef DISABLE_CVE_TESTS #ifndef DISABLE_CVE_TESTS
......
...@@ -2368,7 +2368,7 @@ namespace ...@@ -2368,7 +2368,7 @@ namespace
} }
// #i121233# Added BMP_SCALE_LANCZOS, BMP_SCALE_BICUBIC, BMP_SCALE_BILINEAR and // #i121233# Added BMP_SCALE_LANCZOS, BMP_SCALE_BICUBIC, BMP_SCALE_BILINEAR and
// BMP_SCALE_BOX derived from the original commit from Toma Vajngerl (see // BMP_SCALE_BOX derived from the original commit from Tomas Vajngerl (see
// bugzilla task for deitails) Thanks! // bugzilla task for deitails) Thanks!
sal_Bool Bitmap::ImplScaleConvolution( sal_Bool Bitmap::ImplScaleConvolution(
const double& rScaleX, const double& rScaleX,
...@@ -2426,29 +2426,38 @@ sal_Bool Bitmap::ImplScaleConvolution( ...@@ -2426,29 +2426,38 @@ sal_Bool Bitmap::ImplScaleConvolution(
const sal_uInt32 nInBetweenSizeHorFirst(nHeight * nNewWidth); const sal_uInt32 nInBetweenSizeHorFirst(nHeight * nNewWidth);
const sal_uInt32 nInBetweenSizeVerFirst(nNewHeight * nWidth); const sal_uInt32 nInBetweenSizeVerFirst(nNewHeight * nWidth);
Bitmap aInterm;
if(nInBetweenSizeHorFirst < nInBetweenSizeVerFirst) if(nInBetweenSizeHorFirst < nInBetweenSizeVerFirst)
{ {
if(bScaleHor) if(bScaleHor)
{ {
bResult = ImplScaleConvolutionHor(*this, aResult, fScaleX, aKernel); bResult = ImplScaleConvolutionHor(*this, aInterm, fScaleX, aKernel);
} }
else
aInterm = *this;
if(bResult && bScaleVer) if(bResult && bScaleVer)
{ {
bResult = ImplScaleConvolutionVer(*this, aResult, fScaleY, aKernel); bResult = ImplScaleConvolutionVer(aInterm, aResult, fScaleY, aKernel);
} }
else
aResult = aInterm;
} }
else else
{ {
if(bScaleVer) if(bScaleVer)
{ {
bResult = ImplScaleConvolutionVer(*this, aResult, fScaleY, aKernel); bResult = ImplScaleConvolutionVer(*this, aInterm, fScaleY, aKernel);
} }
else
aInterm = *this;
if(bResult && bScaleHor) if(bResult && bScaleHor)
{ {
bResult = ImplScaleConvolutionHor(*this, aResult, fScaleX, aKernel); bResult = ImplScaleConvolutionHor(aInterm, aResult, fScaleX, aKernel);
} }
else
aResult = aInterm;
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment