toolbox - preserve the orig. image + use it in menu & color update
In toolbox the images are scaled for HiDPI, which causes various
problems. This change preserves the original image and uses that
when adding images into the menu and also uses that when updating
the color related toolbox-es.
Change-Id: Ib7e7d82ccb1cd774e0e14dd6bab5626eaefea097
diff --git a/include/vcl/toolbox.hxx b/include/vcl/toolbox.hxx
index 44b4b8c..c72c59f 100644
--- a/include/vcl/toolbox.hxx
+++ b/include/vcl/toolbox.hxx
@@ -401,6 +401,7 @@ public:
void* GetItemData( sal_uInt16 nItemId ) const;
void SetItemImage( sal_uInt16 nItemId, const Image& rImage );
Image GetItemImage( sal_uInt16 nItemId ) const;
Image GetItemImageOriginal( sal_uInt16 nItemId ) const;
void SetItemImageAngle( sal_uInt16 nItemId, long nAngle10 );
void SetItemImageMirrorMode( sal_uInt16 nItemId, bool bMirror );
void SetItemText( sal_uInt16 nItemId, const OUString& rText );
diff --git a/svx/source/tbxctrls/tbxcolorupdate.cxx b/svx/source/tbxctrls/tbxcolorupdate.cxx
index 3c9a1ef..27f9de9 100644
--- a/svx/source/tbxctrls/tbxcolorupdate.cxx
+++ b/svx/source/tbxctrls/tbxcolorupdate.cxx
@@ -78,8 +78,9 @@ namespace svx
void ToolboxButtonColorUpdater::Update(const Color& rColor)
{
Image aImage(mpTbx->GetItemImage(mnBtnId));
Size aItemSize(mpTbx->GetItemContentSize(mnBtnId));
Image aImage(mpTbx->GetItemImageOriginal(mnBtnId));
BitmapEx aSource(aImage.GetBitmapEx());
Size aItemSize = aSource.GetSizePixel();
const bool bSizeChanged = (maBmpSize != aItemSize);
const bool bDisplayModeChanged = (mbWasHiContrastMode != mpTbx->GetSettings().GetStyleSettings().GetHighContrastMode());
@@ -99,7 +100,7 @@ namespace svx
// (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());
diff --git a/vcl/inc/toolbox.h b/vcl/inc/toolbox.h
index 2b23c53..935d118 100644
--- a/vcl/inc/toolbox.h
+++ b/vcl/inc/toolbox.h
@@ -40,6 +40,7 @@ struct ImplToolItem
vcl::Window* mpWindow;
void* mpUserData;
Image maImage;
Image maImageOriginal;
long mnImageAngle;
bool mbMirrorMode;
OUString maText;
diff --git a/vcl/source/window/toolbox2.cxx b/vcl/source/window/toolbox2.cxx
index dd675dc..1758850 100644
--- a/vcl/source/window/toolbox2.cxx
+++ b/vcl/source/window/toolbox2.cxx
@@ -1125,7 +1125,12 @@ void ToolBox::SetItemImage( sal_uInt16 nItemId, const Image& rImage )
{
Image aImage(rImage);
if ( GetDPIScaleFactor() > 1)
ImplToolItem* pItem = &mpData->m_aItems[nPos];
Size aOldSize = pItem->maImage.GetSizePixel();
pItem->maImageOriginal = aImage;
if (GetDPIScaleFactor() > 1)
{
BitmapEx aBitmap(aImage.GetBitmapEx());
@@ -1138,19 +1143,16 @@ void ToolBox::SetItemImage( sal_uInt16 nItemId, const Image& rImage )
}
}
ImplToolItem* pItem = &mpData->m_aItems[nPos];
pItem->maImage = aImage;
// only once all is calculated, do extra work
if ( !mbCalc )
if (!mbCalc)
{
Size aOldSize = pItem->maImage.GetSizePixel();
pItem->maImage = aImage;
if ( aOldSize != pItem->maImage.GetSizePixel() )
if (aOldSize != pItem->maImage.GetSizePixel())
ImplInvalidate( true );
else
ImplUpdateItem( nPos );
}
else
pItem->maImage = aImage;
}
}
@@ -1196,14 +1198,15 @@ void ToolBox::SetItemImageAngle( sal_uInt16 nItemId, long nAngle10 )
if( nDeltaAngle && !!pItem->maImage )
{
pItem->maImage = ImplRotImage( pItem->maImage, nDeltaAngle );
pItem->maImageOriginal = ImplRotImage( pItem->maImageOriginal, nDeltaAngle );
}
if ( !mbCalc )
if (!mbCalc)
{
if ( aOldSize != pItem->maImage.GetSizePixel() )
ImplInvalidate( true );
if (aOldSize != pItem->maImage.GetSizePixel())
ImplInvalidate(true);
else
ImplUpdateItem( nPos );
ImplUpdateItem(nPos);
}
}
}
@@ -1226,30 +1229,32 @@ void ToolBox::SetItemImageMirrorMode( sal_uInt16 nItemId, bool bMirror )
{
ImplToolItem* pItem = &mpData->m_aItems[nPos];
if( ( pItem->mbMirrorMode && ! bMirror ) ||
( ! pItem->mbMirrorMode && bMirror )
)
if ((pItem->mbMirrorMode && !bMirror) ||
(!pItem->mbMirrorMode && bMirror))
{
pItem->mbMirrorMode = bMirror;
if( !!pItem->maImage )
if (!!pItem->maImage)
{
pItem->maImage = ImplMirrorImage( pItem->maImage );
pItem->maImage = ImplMirrorImage(pItem->maImage);
pItem->maImageOriginal = ImplMirrorImage(pItem->maImageOriginal);
}
if ( !mbCalc )
ImplUpdateItem( nPos );
if (!mbCalc)
ImplUpdateItem(nPos);
}
}
}
Image ToolBox::GetItemImage( sal_uInt16 nItemId ) const
Image ToolBox::GetItemImage(sal_uInt16 nItemId) const
{
ImplToolItem* pItem = ImplGetItem( nItemId );
ImplToolItem* pItem = ImplGetItem(nItemId);
return pItem ? pItem->maImage : Image();
}
if ( pItem )
return pItem->maImage;
else
return Image();
Image ToolBox::GetItemImageOriginal(sal_uInt16 nItemId) const
{
ImplToolItem* pItem = ImplGetItem(nItemId);
return pItem ? pItem->maImageOriginal : Image();
}
void ToolBox::SetItemText( sal_uInt16 nItemId, const OUString& rText )
@@ -1830,7 +1835,7 @@ void ToolBox::UpdateCustomMenu()
if( it->IsClipped() )
{
sal_uInt16 id = it->mnId + TOOLBOX_MENUITEM_START;
pMenu->InsertItem( id, it->maText, it->maImage, MenuItemBits::NONE, OString());
pMenu->InsertItem( id, it->maText, it->maImageOriginal, MenuItemBits::NONE, OString());
pMenu->EnableItem( id, it->mbEnabled );
pMenu->CheckItem ( id, it->meState == TRISTATE_TRUE );
}
@@ -1846,7 +1851,7 @@ void ToolBox::UpdateCustomMenu()
if( it->IsItemHidden() )
{
sal_uInt16 id = it->mnId + TOOLBOX_MENUITEM_START;
pMenu->InsertItem( id, it->maText, it->maImage, MenuItemBits::NONE, OString() );
pMenu->InsertItem( id, it->maText, it->maImageOriginal, MenuItemBits::NONE, OString() );
pMenu->EnableItem( id, it->mbEnabled );
pMenu->CheckItem( id, it->meState == TRISTATE_TRUE );
}