Kaydet (Commit) a3694b1b authored tarafından Caolán McNamara's avatar Caolán McNamara

move static bitmap into a svapp member

so it won't crash on exit when its dtor uses stuff destroyed by deinitvcl
already.

also fix comparisons, i.e. presumably
aLastColorTopLeft == aLastColorTopLeft etc
should have been aLastColorTopLeft == aColorTopLeft

Change-Id: I1f3dc47504c5add113b3a8bcadf010ca3b9f4c31
üst 104a7bab
...@@ -284,6 +284,26 @@ struct ImplSVNWFData ...@@ -284,6 +284,26 @@ struct ImplSVNWFData
bool mbDDListBoxNoTextArea:1; bool mbDDListBoxNoTextArea:1;
}; };
struct BlendFrameCache
{
Size m_aLastSize;
sal_uInt8 m_nLastAlpha;
Color m_aLastColorTopLeft;
Color m_aLastColorTopRight;
Color m_aLastColorBottomRight;
Color m_aLastColorBottomLeft;
BitmapEx m_aLastResult;
BlendFrameCache()
: m_aLastSize(0, 0)
, m_nLastAlpha(0)
, m_aLastColorTopLeft(COL_BLACK)
, m_aLastColorTopRight(COL_BLACK)
, m_aLastColorBottomRight(COL_BLACK)
, m_aLastColorBottomLeft(COL_BLACK)
{
}
};
struct ImplSVData struct ImplSVData
{ {
...@@ -312,6 +332,7 @@ struct ImplSVData ...@@ -312,6 +332,7 @@ struct ImplSVData
UnoWrapperBase* mpUnoWrapper; UnoWrapperBase* mpUnoWrapper;
Window* mpIntroWindow; // the splash screen Window* mpIntroWindow; // the splash screen
DockingManager* mpDockingManager; DockingManager* mpDockingManager;
BlendFrameCache* mpBlendFrameCache;
sal_Bool mbIsTestTool; sal_Bool mbIsTestTool;
oslThreadIdentifier mnMainThreadId; oslThreadIdentifier mnMainThreadId;
...@@ -330,6 +351,7 @@ Window* ImplGetDefaultWindow(); ...@@ -330,6 +351,7 @@ Window* ImplGetDefaultWindow();
VCL_PLUGIN_PUBLIC ResMgr* ImplGetResMgr(); VCL_PLUGIN_PUBLIC ResMgr* ImplGetResMgr();
VCL_PLUGIN_PUBLIC ResId VclResId( sal_Int32 nId ); // throws std::bad_alloc if no res mgr VCL_PLUGIN_PUBLIC ResId VclResId( sal_Int32 nId ); // throws std::bad_alloc if no res mgr
DockingManager* ImplGetDockingManager(); DockingManager* ImplGetDockingManager();
BlendFrameCache* ImplGetBlendFrameCache();
void ImplWindowAutoMnemonic( Window* pWindow ); void ImplWindowAutoMnemonic( Window* pWindow );
void ImplUpdateSystemProcessWindow(); void ImplUpdateSystemProcessWindow();
......
...@@ -256,6 +256,15 @@ DockingManager* ImplGetDockingManager() ...@@ -256,6 +256,15 @@ DockingManager* ImplGetDockingManager()
return pSVData->mpDockingManager; return pSVData->mpDockingManager;
} }
BlendFrameCache* ImplGetBlendFrameCache()
{
ImplSVData* pSVData = ImplGetSVData();
if ( !pSVData->mpBlendFrameCache)
pSVData->mpBlendFrameCache= new BlendFrameCache();
return pSVData->mpBlendFrameCache;
}
class AccessBridgeCurrentContext: public cppu::WeakImplHelper1< com::sun::star::uno::XCurrentContext > class AccessBridgeCurrentContext: public cppu::WeakImplHelper1< com::sun::star::uno::XCurrentContext >
{ {
public: public:
......
...@@ -540,6 +540,9 @@ void DeInitVCL() ...@@ -540,6 +540,9 @@ void DeInitVCL()
if ( pSVData->maAppData.mpFirstEventHook ) if ( pSVData->maAppData.mpFirstEventHook )
ImplFreeEventHookData(); ImplFreeEventHookData();
if (pSVData->mpBlendFrameCache)
delete pSVData->mpBlendFrameCache, pSVData->mpBlendFrameCache = NULL;
ImplDeletePrnQueueList(); ImplDeletePrnQueueList();
delete pSVData->maGDIData.mpScreenFontList; delete pSVData->maGDIData.mpScreenFontList;
pSVData->maGDIData.mpScreenFontList = NULL; pSVData->maGDIData.mpScreenFontList = NULL;
......
...@@ -1252,31 +1252,25 @@ BitmapEx VCL_DLLPUBLIC createBlendFrame( ...@@ -1252,31 +1252,25 @@ BitmapEx VCL_DLLPUBLIC createBlendFrame(
Color aColorBottomRight, Color aColorBottomRight,
Color aColorBottomLeft) Color aColorBottomLeft)
{ {
static Size aLastSize(0, 0); BlendFrameCache* pBlendFrameCache = ImplGetBlendFrameCache();
static sal_uInt8 nLastAlpha(0);
static Color aLastColorTopLeft(COL_BLACK); if(pBlendFrameCache->m_aLastSize == rSize
static Color aLastColorTopRight(COL_BLACK); && pBlendFrameCache->m_nLastAlpha == nAlpha
static Color aLastColorBottomRight(COL_BLACK); && pBlendFrameCache->m_aLastColorTopLeft == aColorTopLeft
static Color aLastColorBottomLeft(COL_BLACK); && pBlendFrameCache->m_aLastColorTopRight == aColorTopRight
static BitmapEx aLastResult; && pBlendFrameCache->m_aLastColorBottomRight == aColorBottomRight
&& pBlendFrameCache->m_aLastColorBottomLeft == aColorBottomLeft)
if(aLastSize == rSize
&& nLastAlpha == nAlpha
&& aLastColorTopLeft == aLastColorTopLeft
&& aLastColorTopRight == aLastColorTopRight
&& aLastColorBottomRight == aLastColorBottomRight
&& aLastColorBottomLeft == aLastColorBottomLeft)
{ {
return aLastResult; return pBlendFrameCache->m_aLastResult;
} }
aLastSize = rSize; pBlendFrameCache->m_aLastSize = rSize;
nLastAlpha = nAlpha; pBlendFrameCache->m_nLastAlpha = nAlpha;
aLastColorTopLeft = aLastColorTopLeft; pBlendFrameCache->m_aLastColorTopLeft = aColorTopLeft;
aLastColorTopRight = aLastColorTopRight; pBlendFrameCache->m_aLastColorTopRight = aColorTopRight;
aLastColorBottomRight = aLastColorBottomRight; pBlendFrameCache->m_aLastColorBottomRight = aColorBottomRight;
aLastColorBottomLeft = aLastColorBottomLeft; pBlendFrameCache->m_aLastColorBottomLeft = aColorBottomLeft;
aLastResult.Clear(); pBlendFrameCache->m_aLastResult.Clear();
const long nW(rSize.Width()); const long nW(rSize.Width());
const long nH(rSize.Height()); const long nH(rSize.Height());
...@@ -1348,7 +1342,7 @@ BitmapEx VCL_DLLPUBLIC createBlendFrame( ...@@ -1348,7 +1342,7 @@ BitmapEx VCL_DLLPUBLIC createBlendFrame(
aContent.ReleaseAccess(pContent); aContent.ReleaseAccess(pContent);
aAlpha.ReleaseAccess(pAlpha); aAlpha.ReleaseAccess(pAlpha);
aLastResult = BitmapEx(aContent, aAlpha); pBlendFrameCache->m_aLastResult = BitmapEx(aContent, aAlpha);
} }
else else
{ {
...@@ -1364,7 +1358,7 @@ BitmapEx VCL_DLLPUBLIC createBlendFrame( ...@@ -1364,7 +1358,7 @@ BitmapEx VCL_DLLPUBLIC createBlendFrame(
} }
} }
return aLastResult; return pBlendFrameCache->m_aLastResult;
} }
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
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