Kaydet (Commit) 9536e3cb authored tarafından Armin Le Grand's avatar Armin Le Grand Kaydeden (comit) Caolán McNamara

Resolves: #i121233# some slight corrections/enhancements

(cherry picked from commit db00dfd9)

Conflicts:
	vcl/inc/vcl/bitmap.hxx
	vcl/source/gdi/bitmap3.cxx

Change-Id: I1a7817a94232b3d7f1c095dd27025e4cccea348c
üst a8551357
...@@ -110,78 +110,14 @@ namespace drawinglayer ...@@ -110,78 +110,14 @@ namespace drawinglayer
} }
} }
void impSmoothIndex(BitmapColor& rValue, const basegfx::B2DPoint& rSource, sal_Int32 nIntX, sal_Int32 nIntY, BitmapReadAccess& rRead) Bitmap impTransformBitmap(
const Bitmap& rSource,
const Size aDestinationSize,
const basegfx::B2DHomMatrix& rTransform,
bool bSmooth)
{ {
double fDeltaX(rSource.getX() - nIntX); Bitmap aDestination(aDestinationSize, 24);
double fDeltaY(rSource.getY() - nIntY); BitmapWriteAccess* pWrite = aDestination.AcquireWriteAccess();
sal_Int32 nIndX(0L);
sal_Int32 nIndY(0L);
if(fDeltaX > 0.0 && nIntX + 1L < rRead.Width())
{
nIndX++;
}
else if(fDeltaX < 0.0 && nIntX >= 1L)
{
fDeltaX = -fDeltaX;
nIndX--;
}
if(fDeltaY > 0.0 && nIntY + 1L < rRead.Height())
{
nIndY++;
}
else if(fDeltaY < 0.0 && nIntY >= 1L)
{
fDeltaY = -fDeltaY;
nIndY--;
}
if(nIndX || nIndY)
{
const double fColorToReal(1.0 / 255.0);
double fVal(rValue.GetIndex() * fColorToReal);
double fValBottom(0.0);
if(nIndX)
{
const double fMulA(fDeltaX * fColorToReal);
double fMulB(1.0 - fDeltaX);
const BitmapColor aTopPartner(rRead.GetPixel(nIntY, nIntX + nIndX));
fVal = (fVal * fMulB) + (aTopPartner.GetIndex() * fMulA);
if(nIndY)
{
fMulB *= fColorToReal;
const BitmapColor aBottom(rRead.GetPixel(nIntY + nIndY, nIntX));
const BitmapColor aBottomPartner(rRead.GetPixel(nIntY + nIndY, nIntX + nIndX));
fValBottom = (aBottom.GetIndex() * fMulB) + (aBottomPartner.GetIndex() * fMulA);
}
}
if(nIndY)
{
if(!nIndX)
{
const BitmapColor aBottom(rRead.GetPixel(nIntY + nIndY, nIntX));
fValBottom = aBottom.GetIndex() * fColorToReal;
}
const double fMulB(1.0 - fDeltaY);
fVal = (fVal * fMulB) + (fValBottom * fDeltaY);
}
rValue.SetIndex((sal_uInt8)(fVal * 255.0));
}
}
void impTransformBitmap(const Bitmap& rSource, Bitmap& rDestination, const basegfx::B2DHomMatrix& rTransform, bool bSmooth)
{
BitmapWriteAccess* pWrite = rDestination.AcquireWriteAccess();
if(pWrite) if(pWrite)
{ {
...@@ -190,9 +126,9 @@ namespace drawinglayer ...@@ -190,9 +126,9 @@ namespace drawinglayer
if(pRead) if(pRead)
{ {
const Size aDestinationSizePixel(rDestination.GetSizePixel()); const Size aDestinationSizePixel(aDestination.GetSizePixel());
bool bWorkWithIndex(rDestination.GetBitCount() <= 8); bool bWorkWithIndex(rSource.GetBitCount() <= 8);
BitmapColor aOutside(pRead->GetBestMatchingColor(BitmapColor(0xff, 0xff, 0xff))); BitmapColor aOutside(BitmapColor(0xff, 0xff, 0xff));
for(sal_Int32 y(0L); y < aDestinationSizePixel.getHeight(); y++) for(sal_Int32 y(0L); y < aDestinationSizePixel.getHeight(); y++)
{ {
...@@ -207,29 +143,24 @@ namespace drawinglayer ...@@ -207,29 +143,24 @@ namespace drawinglayer
if(nIntY >= 0L && nIntY < aContentSizePixel.getHeight()) if(nIntY >= 0L && nIntY < aContentSizePixel.getHeight())
{ {
// inside pixel
BitmapColor aValue;
if(bWorkWithIndex) if(bWorkWithIndex)
{ {
BitmapColor aValue(pRead->GetPixel(nIntY, nIntX)); aValue = pRead->GetPaletteColor(pRead->GetPixelIndex(nIntY, nIntX));
if(bSmooth)
{
impSmoothIndex(aValue, aSourceCoor, nIntX, nIntY, *pRead);
}
pWrite->SetPixel(y, x, aValue);
} }
else else
{ {
BitmapColor aValue(pRead->GetColor(nIntY, nIntX)); aValue = pRead->GetPixel(nIntY, nIntX);
}
if(bSmooth)
{
impSmoothPoint(aValue, aSourceCoor, nIntX, nIntY, *pRead);
}
pWrite->SetPixel(y, x, aValue.IsIndex() ? aValue : pWrite->GetBestMatchingColor(aValue)); if(bSmooth)
{
impSmoothPoint(aValue, aSourceCoor, nIntX, nIntY, *pRead);
} }
pWrite->SetPixel(y, x, aValue);
continue; continue;
} }
} }
...@@ -247,29 +178,10 @@ namespace drawinglayer ...@@ -247,29 +178,10 @@ namespace drawinglayer
delete pWrite; delete pWrite;
} }
}
Bitmap impCreateEmptyBitmapWithPattern(const Bitmap& rSource, const Size& aTargetSizePixel)
{
Bitmap aRetval;
BitmapReadAccess* pReadAccess = (const_cast< Bitmap& >(rSource)).AcquireReadAccess();
if(pReadAccess) rSource.AdaptBitCount(aDestination);
{
if(rSource.GetBitCount() <= 8)
{
BitmapPalette aPalette(pReadAccess->GetPalette());
aRetval = Bitmap(aTargetSizePixel, rSource.GetBitCount(), &aPalette);
}
else
{
aRetval = Bitmap(aTargetSizePixel, rSource.GetBitCount());
}
delete pReadAccess;
}
return aRetval; return aDestination;
} }
} // end of anonymous namespace } // end of anonymous namespace
} // end of namespace drawinglayer } // end of namespace drawinglayer
...@@ -283,23 +195,20 @@ namespace drawinglayer ...@@ -283,23 +195,20 @@ namespace drawinglayer
{ {
// force destination to 24 bit, we want to smooth output // force destination to 24 bit, we want to smooth output
const Size aDestinationSize(rCroppedRectPixel.GetSize()); const Size aDestinationSize(rCroppedRectPixel.GetSize());
Bitmap aDestination(impCreateEmptyBitmapWithPattern(rSource.GetBitmap(), aDestinationSize));
static bool bDoSmoothAtAll(true); static bool bDoSmoothAtAll(true);
impTransformBitmap(rSource.GetBitmap(), aDestination, rTransform, bDoSmoothAtAll); const Bitmap aDestination(impTransformBitmap(rSource.GetBitmap(), aDestinationSize, rTransform, bDoSmoothAtAll));
// create mask // create mask
if(rSource.IsTransparent()) if(rSource.IsTransparent())
{ {
if(rSource.IsAlpha()) if(rSource.IsAlpha())
{ {
Bitmap aAlpha(impCreateEmptyBitmapWithPattern(rSource.GetAlpha().GetBitmap(), aDestinationSize)); const Bitmap aAlpha(impTransformBitmap(rSource.GetAlpha().GetBitmap(), aDestinationSize, rTransform, bDoSmoothAtAll));
impTransformBitmap(rSource.GetAlpha().GetBitmap(), aAlpha, rTransform, bDoSmoothAtAll);
return BitmapEx(aDestination, AlphaMask(aAlpha)); return BitmapEx(aDestination, AlphaMask(aAlpha));
} }
else else
{ {
Bitmap aMask(impCreateEmptyBitmapWithPattern(rSource.GetMask(), aDestinationSize)); const Bitmap aMask(impTransformBitmap(rSource.GetMask(), aDestinationSize, rTransform, false));
impTransformBitmap(rSource.GetMask(), aMask, rTransform, false);
return BitmapEx(aDestination, aMask); return BitmapEx(aDestination, aMask);
} }
} }
......
...@@ -342,7 +342,7 @@ public: ...@@ -342,7 +342,7 @@ public:
BitmapWriteAccess& rAcc, sal_Bool bRLE4 ); BitmapWriteAccess& rAcc, sal_Bool bRLE4 );
SAL_DLLPRIVATE static sal_Bool ImplWriteRLE( SvStream& rOStm, BitmapReadAccess& rAcc, sal_Bool bRLE4 ); SAL_DLLPRIVATE static sal_Bool ImplWriteRLE( SvStream& rOStm, BitmapReadAccess& rAcc, sal_Bool bRLE4 );
SAL_DLLPRIVATE void ImplAdaptBitCount(Bitmap& rNew); SAL_DLLPRIVATE void ImplAdaptBitCount(Bitmap& rNew) const;
SAL_DLLPRIVATE sal_Bool ImplScaleFast( const double& rScaleX, const double& rScaleY ); SAL_DLLPRIVATE sal_Bool ImplScaleFast( const double& rScaleX, const double& rScaleY );
SAL_DLLPRIVATE sal_Bool ImplScaleInterpolate( const double& rScaleX, const double& rScaleY ); SAL_DLLPRIVATE sal_Bool ImplScaleInterpolate( const double& rScaleX, const double& rScaleY );
SAL_DLLPRIVATE sal_Bool ImplScaleSuper( const double& rScaleX, const double& rScaleY ); SAL_DLLPRIVATE sal_Bool ImplScaleSuper( const double& rScaleX, const double& rScaleY );
...@@ -616,6 +616,10 @@ public: ...@@ -616,6 +616,10 @@ public:
*/ */
sal_Bool Scale( const double& rScaleX, const double& rScaleY, sal_uInt32 nScaleFlag = BMP_SCALE_DEFAULT ); sal_Bool Scale( const double& rScaleX, const double& rScaleY, sal_uInt32 nScaleFlag = BMP_SCALE_DEFAULT );
// Adapt the BitCount of rNew to BitCount of lolal, including grey or color paltette
// Can be used to create alpha/mask bitmaps after their processing in 24bit
void AdaptBitCount(Bitmap& rNew) const;
/** Rotate bitmap by the specified angle /** Rotate bitmap by the specified angle
@param nAngle10 @param nAngle10
......
This diff is collapsed.
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