diff -Nur original/source/graphic/grfmgr2.cxx modified/source/graphic/grfmgr2.cxx --- original/source/graphic/grfmgr2.cxx 2012-07-27 12:00:30.765625000 -0700 +++ modified/source/graphic/grfmgr2.cxx 2012-07-27 11:41:11.312500000 -0700 @@ -1205,6 +1205,7 @@ } else { + //Some abnormal .svm file may hit this assertion( sample file of Bug 120165 ) DBG_ASSERT( rBmpEx.GetMask().GetSizePixel() == rBmpEx.GetSizePixel(), "GraphicManager::ImplCreateScaled(): mask size inconsistent" ); @@ -1240,17 +1241,28 @@ for( nY = 0UL, nTmpY = nStartY; nY < nDstH; nTmpY++ ) pMapLY[ nY++ ] = FRound( (double) pMapIY[ nTmpY ] + pMapFY[ nTmpY ] / 1048576. ); + //Bug 120165 + //Here pMapLY is calculated from pMapIY&pMapFY, and pMapIY&pMapFY is calculated from the height of rBmpEx.GetSizePixel() In function "GraphicManager::ImplCreateOutput" + //rBmpEx.GetSizePixel() should be equal to rBmpEx.GetMask().GetSizePixel() usually. But in some .svm file, rBmpEx.GetMask() may be smaller than rBmpEx.GetBitmap() + long nDstWV( nDstW ), nDstHV( nDstH ); + + if( rBmpEx.GetMask().GetSizePixel() != rBmpEx.GetSizePixel() ) //abnormal BitmapEx whose mask does not have the same size as its Bitmap + { + for( const unsigned nWMask( pAcc->Width() ); nDstWV > 0 && pMapLX[ nDstWV - 1 ] >= nWMask; nDstWV -- ); + for( const unsigned nHMask( pAcc->Height() ); nDstHV > 0 && pMapLY[ nDstHV - 1 ] >= nHMask; nDstHV -- ); + } + // do normal scaling if( pAcc->GetScanlineFormat() == BMP_FORMAT_1BIT_MSB_PAL && pWAcc->GetScanlineFormat() == BMP_FORMAT_1BIT_MSB_PAL ) { // optimized - for( nY = 0; nY < nDstH; nY++ ) + for( nY = 0; nY < nDstHV; nY++ ) { Scanline pSrc = pAcc->GetScanline( pMapLY[ nY ] ); Scanline pDst = pWAcc->GetScanline( nY ); - for( nX = 0L; nX < nDstW; nX++ ) + for( nX = 0L; nX < nDstWV; nX++ ) { const long nSrcX = pMapLX[ nX ]; @@ -1269,9 +1281,9 @@ if( pAcc->HasPalette() ) { - for( nY = 0L; nY < nDstH; nY++ ) + for( nY = 0L; nY < nDstHV; nY++ ) { - for( nX = 0L; nX < nDstW; nX++ ) + for( nX = 0L; nX < nDstWV; nX++ ) { if( pAcc->GetPaletteColor( (sal_uInt8) pAcc->GetPixel( pMapLY[ nY ], pMapLX[ nX ] ) ) == aB ) pWAcc->SetPixel( nY, nX, aWB ); @@ -1282,9 +1294,9 @@ } else { - for( nY = 0L; nY < nDstH; nY++ ) + for( nY = 0L; nY < nDstHV; nY++ ) { - for( nX = 0L; nX < nDstW; nX++ ) + for( nX = 0L; nX < nDstWV; nX++ ) { if( pAcc->GetPixel( pMapLY[ nY ], pMapLX[ nX ] ) == aB ) pWAcc->SetPixel( nY, nX, aWB );