Kaydet (Commit) 88ca1a6f authored tarafından Noel Grandin's avatar Noel Grandin

move ToolboxButtonColorUpdater bitmap update to VirtualDevice

to avoid doing a read-modify-write cycle on the item images on the
toolbar, add an overlay image member to Toolbox items.

part of the process of making Bitmap an internal detail of vcl/

Change-Id: Ie4a886c48484a06694fc4c066ee0845b39d27f0b
Reviewed-on: https://gerrit.libreoffice.org/49649Tested-by: 's avatarJenkins <ci@libreoffice.org>
Reviewed-by: 's avatarNoel Grandin <noel.grandin@collabora.co.uk>
üst 74d30155
...@@ -373,6 +373,7 @@ public: ...@@ -373,6 +373,7 @@ public:
void SetItemData( sal_uInt16 nItemId, void* pNewData ); void SetItemData( sal_uInt16 nItemId, void* pNewData );
void* GetItemData( sal_uInt16 nItemId ) const; void* GetItemData( sal_uInt16 nItemId ) const;
void SetItemImage( sal_uInt16 nItemId, const Image& rImage ); void SetItemImage( sal_uInt16 nItemId, const Image& rImage );
void SetItemOverlayImage( sal_uInt16 nItemId, const Image& rImage );
Image GetItemImage( sal_uInt16 nItemId ) const; Image GetItemImage( sal_uInt16 nItemId ) const;
void SetItemImageAngle( sal_uInt16 nItemId, long nAngle10 ); void SetItemImageAngle( sal_uInt16 nItemId, long nAngle10 );
void SetItemImageMirrorMode( sal_uInt16 nItemId, bool bMirror ); void SetItemImageMirrorMode( sal_uInt16 nItemId, bool bMirror );
......
...@@ -23,7 +23,7 @@ ...@@ -23,7 +23,7 @@
#include <svx/xdef.hxx> #include <svx/xdef.hxx>
#include <vcl/toolbox.hxx> #include <vcl/toolbox.hxx>
#include <vcl/bitmapaccess.hxx> #include <vcl/virdev.hxx>
#include <vcl/settings.hxx> #include <vcl/settings.hxx>
#include <tools/debug.hxx> #include <tools/debug.hxx>
...@@ -82,54 +82,21 @@ namespace svx ...@@ -82,54 +82,21 @@ namespace svx
if ((maCurColor == aColor) && !bSizeChanged && !bDisplayModeChanged && !bForceUpdate) if ((maCurColor == aColor) && !bSizeChanged && !bDisplayModeChanged && !bForceUpdate)
return; return;
if (!aItemSize.Width() || !aItemSize.Height())
// create an empty bitmap, and copy the original bitmap inside
// (so that it grows in case the original bitmap was smaller)
sal_uInt8 nAlpha = 255;
BitmapEx aBmpEx(Bitmap(aItemSize, 24), AlphaMask(aItemSize, &nAlpha));
BitmapEx aSource(aImage.GetBitmapEx());
long nWidth = std::min(aItemSize.Width(), aSource.GetSizePixel().Width());
long nHeight = std::min(aItemSize.Height(), aSource.GetSizePixel().Height());
tools::Rectangle aRect(Point(0, 0), Size(nWidth, nHeight));
aBmpEx.CopyPixel( aRect, aRect, &aSource );
Bitmap aBmp( aBmpEx.GetBitmap() );
BitmapWriteAccess* pBmpAcc = aBmp.IsEmpty() ? nullptr : aBmp.AcquireWriteAccess();
maBmpSize = aBmp.GetSizePixel();
if (!pBmpAcc)
return; return;
Bitmap aMsk; ScopedVclPtr<VirtualDevice> pVirDev(VclPtr<VirtualDevice>::Create());
BitmapWriteAccess* pMskAcc; pVirDev->SetOutputSizePixel(aItemSize);
maBmpSize = aItemSize;
if (aBmpEx.IsAlpha())
{
aMsk = aBmpEx.GetAlpha().GetBitmap();
pMskAcc = aMsk.AcquireWriteAccess();
}
else if (aBmpEx.IsTransparent())
{
aMsk = aBmpEx.GetMask();
pMskAcc = aMsk.AcquireWriteAccess();
}
else
{
pMskAcc = nullptr;
}
mbWasHiContrastMode = mpTbx->GetSettings().GetStyleSettings().GetHighContrastMode(); mbWasHiContrastMode = mpTbx->GetSettings().GetStyleSettings().GetHighContrastMode();
if ((COL_TRANSPARENT != aColor.GetColor()) && (maBmpSize.Width() == maBmpSize.Height())) if ((COL_TRANSPARENT != aColor.GetColor()) && (maBmpSize.Width() == maBmpSize.Height()))
pBmpAcc->SetLineColor(aColor); pVirDev->SetLineColor(aColor);
else if( mpTbx->GetBackground().GetColor().IsDark() ) else if( mpTbx->GetBackground().GetColor().IsDark() )
pBmpAcc->SetLineColor(Color(COL_WHITE)); pVirDev->SetLineColor(Color(COL_WHITE));
else else
pBmpAcc->SetLineColor(Color(COL_BLACK)); pVirDev->SetLineColor(Color(COL_BLACK));
// use not only COL_TRANSPARENT for detection of transparence, // use not only COL_TRANSPARENT for detection of transparence,
// but the method/way which is designed to do that // but the method/way which is designed to do that
...@@ -138,11 +105,11 @@ namespace svx ...@@ -138,11 +105,11 @@ namespace svx
if (bIsTransparent) if (bIsTransparent)
{ {
pBmpAcc->SetFillColor(); pVirDev->SetFillColor(Color(255, 0, 0, 0));
} }
else else
{ {
pBmpAcc->SetFillColor(maCurColor); pVirDev->SetFillColor(maCurColor);
} }
if (maBmpSize.Width() == maBmpSize.Height()) if (maBmpSize.Width() == maBmpSize.Height())
...@@ -151,34 +118,9 @@ namespace svx ...@@ -151,34 +118,9 @@ namespace svx
else else
maUpdRect = tools::Rectangle(Point( maBmpSize.Height() + 2, 2), Point(maBmpSize.Width() - 3, maBmpSize.Height() - 3)); maUpdRect = tools::Rectangle(Point( maBmpSize.Height() + 2, 2), Point(maBmpSize.Width() - 3, maBmpSize.Height() - 3));
pBmpAcc->DrawRect(maUpdRect); pVirDev->DrawRect(maUpdRect);
if (pMskAcc)
{
if (bIsTransparent)
{
pMskAcc->SetLineColor(COL_BLACK);
pMskAcc->SetFillColor(COL_WHITE);
}
else
pMskAcc->SetFillColor(COL_BLACK);
pMskAcc->DrawRect(maUpdRect);
}
Bitmap::ReleaseAccess(pBmpAcc);
if (pMskAcc)
Bitmap::ReleaseAccess(pMskAcc);
if (aBmpEx.IsAlpha())
aBmpEx = BitmapEx(aBmp, AlphaMask(aMsk));
else if (aBmpEx.IsTransparent())
aBmpEx = BitmapEx(aBmp, aMsk);
else
aBmpEx = aBmp;
mpTbx->SetItemImage(mnBtnId, Image(aBmpEx)); mpTbx->SetItemOverlayImage(mnBtnId, Image(pVirDev->GetBitmapEx(Point(0,0), aItemSize)));
} }
} }
......
...@@ -37,6 +37,7 @@ struct ImplToolItem ...@@ -37,6 +37,7 @@ struct ImplToolItem
VclPtr<vcl::Window> mpWindow; //don't dispose mpWindow - we get copied around VclPtr<vcl::Window> mpWindow; //don't dispose mpWindow - we get copied around
void* mpUserData; void* mpUserData;
Image maImage; Image maImage;
Image maOverlayImage;
long mnImageAngle; long mnImageAngle;
bool mbMirrorMode; bool mbMirrorMode;
OUString maText; OUString maText;
......
...@@ -2793,6 +2793,7 @@ void ToolBox::ImplDrawItem(vcl::RenderContext& rRenderContext, ImplToolItems::si ...@@ -2793,6 +2793,7 @@ void ToolBox::ImplDrawItem(vcl::RenderContext& rRenderContext, ImplToolItems::si
if ( bImage ) if ( bImage )
{ {
const Image* pImage = &(pItem->maImage); const Image* pImage = &(pItem->maImage);
const Image& rOverlayImage = pItem->maOverlayImage;
aImageSize = pImage->GetSizePixel(); aImageSize = pImage->GetSizePixel();
// determine drawing flags // determine drawing flags
...@@ -2837,6 +2838,8 @@ void ToolBox::ImplDrawItem(vcl::RenderContext& rRenderContext, ImplToolItems::si ...@@ -2837,6 +2838,8 @@ void ToolBox::ImplDrawItem(vcl::RenderContext& rRenderContext, ImplToolItems::si
} }
} }
rRenderContext.DrawImage(Point( nImageOffX, nImageOffY ), *pImage, nImageStyle); rRenderContext.DrawImage(Point( nImageOffX, nImageOffY ), *pImage, nImageStyle);
if (!!rOverlayImage)
rRenderContext.DrawImage(Point( nImageOffX, nImageOffY ), rOverlayImage, nImageStyle);
} }
// draw the text // draw the text
......
...@@ -965,6 +965,28 @@ void ToolBox::SetItemImage( sal_uInt16 nItemId, const Image& rImage ) ...@@ -965,6 +965,28 @@ void ToolBox::SetItemImage( sal_uInt16 nItemId, const Image& rImage )
} }
} }
void ToolBox::SetItemOverlayImage( sal_uInt16 nItemId, const Image& rImage )
{
ImplToolItems::size_type nPos = GetItemPos( nItemId );
if ( nPos != ITEM_NOTFOUND )
{
ImplToolItem* pItem = &mpData->m_aItems[nPos];
Size aOldSize = pItem->maOverlayImage.GetSizePixel();
pItem->maOverlayImage = rImage;
// only once all is calculated, do extra work
if (!mbCalc)
{
if (aOldSize != pItem->maOverlayImage.GetSizePixel())
ImplInvalidate( true );
else
ImplUpdateItem( nPos );
}
}
}
static Image ImplRotImage( const Image& rImage, long nAngle10 ) static Image ImplRotImage( const Image& rImage, long nAngle10 )
{ {
BitmapEx aRotBitmapEx( rImage.GetBitmapEx() ); BitmapEx aRotBitmapEx( rImage.GetBitmapEx() );
......
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