Author: gadamopoulos Date: Fri May 19 10:01:50 2017 New Revision: 74592 URL: http://svn.reactos.org/svn/reactos?rev=74592&view=rev Log: [UXTHEME] Greatly reduce the number of times we open the theme data for the non client area. - Implement OTD_NONCLIENT for OpenThemeDataEx and OpenThemeDataFromFile. - Open the WINDOW or the SCROLLBAR theme classes only when needed. Use OpenThemeDataEx instead of the internal MSSTYLES_OpenThemeClass. Cache the open theme in the WND_DATA for later use.
Modified: trunk/reactos/dll/win32/uxtheme/nonclient.c trunk/reactos/dll/win32/uxtheme/system.c trunk/reactos/dll/win32/uxtheme/themehooks.c trunk/reactos/dll/win32/uxtheme/uxthemep.h Modified: trunk/reactos/dll/win32/uxtheme/nonclient.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/uxtheme/nonclient.c?rev=74592&r1=74591&r2=74592&view=diff ============================================================================== --- trunk/reactos/dll/win32/uxtheme/nonclient.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/uxtheme/nonclient.c [iso-8859-1] Fri May 19 10:01:50 2017 @@ -173,8 +173,8 @@ GetWindowInfo(hWnd, &pcontext->wi); pcontext->hWnd = hWnd; pcontext->Active = IsWindowActive(hWnd, pcontext->wi.dwExStyle); - pcontext->theme = MSSTYLES_OpenThemeClass(ActiveThemeFile, NULL, L"WINDOW"); - pcontext->scrolltheme = MSSTYLES_OpenThemeClass(ActiveThemeFile, NULL, L"SCROLLBAR"); + pcontext->theme = GetNCCaptionTheme(hWnd, pcontext->wi.dwStyle); + pcontext->scrolltheme = GetNCScrollbarTheme(hWnd, pcontext->wi.dwStyle); pcontext->CaptionHeight = pcontext->wi.cyWindowBorders; pcontext->CaptionHeight += GetSystemMetrics(pcontext->wi.dwExStyle & WS_EX_TOOLWINDOW ? SM_CYSMCAPTION : SM_CYCAPTION ); @@ -192,9 +192,6 @@ ThemeCleanupDrawContext(PDRAW_CONTEXT pcontext) { ReleaseDC(pcontext->hWnd ,pcontext->hDC); - - CloseThemeData (pcontext->theme); - CloseThemeData (pcontext->scrolltheme); if(pcontext->hRgn != NULL) { @@ -1115,7 +1112,10 @@ /* Paint the window on the preview hDC */ rcCurrent = context.wi.rcWindow; ThemePaintWindow(&context, &rcCurrent, FALSE); + context.hDC = NULL; + CloseThemeData (context.theme); + CloseThemeData (context.scrolltheme); ThemeCleanupDrawContext(&context); /* Cleanup */ Modified: trunk/reactos/dll/win32/uxtheme/system.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/uxtheme/system.c?rev=74592&r1=74591&r2=74592&view=diff ============================================================================== --- trunk/reactos/dll/win32/uxtheme/system.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/uxtheme/system.c [iso-8859-1] Fri May 19 10:01:50 2017 @@ -724,9 +724,6 @@ return NULL; } - if(flags) - FIXME("unhandled flags: %x\n", flags); - if (ThemeFile) { pszAppName = UXTHEME_GetWindowProperty(hwnd, atSubAppName, szAppBuff, sizeof(szAppBuff)/sizeof(szAppBuff[0])); @@ -745,7 +742,10 @@ if(IsWindow(hwnd)) { - SetPropW(hwnd, (LPCWSTR)MAKEINTATOM(atWindowTheme), hTheme); + if ((flags & OTD_NONCLIENT) == 0) + { + SetPropW(hwnd, (LPCWSTR)MAKEINTATOM(atWindowTheme), hTheme); + } } else { Modified: trunk/reactos/dll/win32/uxtheme/themehooks.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/uxtheme/themehooks.c?rev=74592&r1=74591&r2=74592&view=diff ============================================================================== --- trunk/reactos/dll/win32/uxtheme/themehooks.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/uxtheme/themehooks.c [iso-8859-1] Fri May 19 10:01:50 2017 @@ -63,18 +63,66 @@ CloseThemeData(GetWindowTheme(hWnd)); DeleteObject(pwndData->hTabBackgroundBrush); - pwndData->hTabBackgroundBrush = NULL; } if (pwndData->hTabBackgroundBmp != NULL) { DeleteObject(pwndData->hTabBackgroundBmp); - pwndData->hTabBackgroundBmp = NULL; + } + + if (pwndData->hthemeWindow) + { + CloseThemeData(pwndData->hthemeWindow); + } + + if (pwndData->hthemeScrollbar) + { + CloseThemeData(pwndData->hthemeScrollbar); } HeapFree(GetProcessHeap(), 0, pwndData); SetPropW( hWnd, (LPCWSTR)MAKEINTATOM(atWndContext), NULL); +} + +HTHEME GetNCCaptionTheme(HWND hWnd, DWORD style) +{ + PWND_DATA pwndData; + + /* We only get the theme for the window class if the window has a caption */ + if((style & WS_CAPTION) != WS_CAPTION) + return NULL; + + /* Get theme data for this window */ + pwndData = ThemeGetWndData(hWnd); + if (pwndData == NULL) + return NULL; + + /* If the theme data was not cached, open it now */ + if (!pwndData->hthemeWindow) + pwndData->hthemeWindow = OpenThemeDataEx(hWnd, L"WINDOW", OTD_NONCLIENT); + + return pwndData->hthemeWindow; +} + +HTHEME GetNCScrollbarTheme(HWND hWnd, DWORD style) +{ + PWND_DATA pwndData; + + /* We only get the theme for the scrollbar class if the window has a scrollbar */ + if((style & (WS_HSCROLL|WS_VSCROLL)) == 0) + return NULL; + + /* Get theme data for this window */ + pwndData = ThemeGetWndData(hWnd); + if (pwndData == NULL) + return NULL; + + /* If the theme data was not cached, open it now */ + if (!pwndData->hthemeScrollbar) + pwndData->hthemeScrollbar = OpenThemeDataEx(hWnd, L"SCROLLBAR", OTD_NONCLIENT); + + return pwndData->hthemeScrollbar; } static BOOL CALLBACK ThemeCleanupChildWndContext (HWND hWnd, LPARAM msg) @@ -130,9 +178,8 @@ rcWindow.top = 0; rcWindow.left = 0; - hTheme = MSSTYLES_OpenThemeClass(ActiveThemeFile, NULL, L"WINDOW"); + hTheme = GetNCCaptionTheme(hWnd, wi.dwStyle); GetThemeBackgroundRegion(hTheme, 0, iPart, FS_ACTIVE, &rcWindow, &hrgn); - CloseThemeData(hTheme); GetWindowRect(hWnd, &rcWindow); rcWindow.right -= rcWindow.left; @@ -259,6 +306,18 @@ { DeleteObject(pwndData->hTabBackgroundBmp); pwndData->hTabBackgroundBmp = NULL; + } + + if (pwndData->hthemeWindow) + { + CloseThemeData(pwndData->hthemeWindow); + pwndData->hthemeWindow = NULL; + } + + if (pwndData->hthemeScrollbar) + { + CloseThemeData(pwndData->hthemeScrollbar); + pwndData->hthemeScrollbar = NULL; } } case WM_NCCREATE: @@ -306,8 +365,12 @@ HBITMAP hbmp; RECT dummy, bmpRect; BOOL hasImageAlpha; - - UXTHEME_LoadImage(theme, 0, TABP_BODY, 0, &dummy, FALSE, &hbmp, &bmpRect, &hasImageAlpha); + HRESULT hr; + + hr = UXTHEME_LoadImage(theme, 0, TABP_BODY, 0, &dummy, FALSE, &hbmp, &bmpRect, &hasImageAlpha); + if (FAILED(hr)) + return hr; + if (changeOrigin) { /* Unfortunately SetBrushOrgEx doesn't work at all */ Modified: trunk/reactos/dll/win32/uxtheme/uxthemep.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/uxtheme/uxthemep.h?rev=74592&r1=74591&r2=74592&view=diff ============================================================================== --- trunk/reactos/dll/win32/uxtheme/uxthemep.h [iso-8859-1] (original) +++ trunk/reactos/dll/win32/uxtheme/uxthemep.h [iso-8859-1] Fri May 19 10:01:50 2017 @@ -136,6 +136,9 @@ /* The window context stores data for the window needed through the life of the window */ typedef struct _WND_DATA { + HTHEME hthemeWindow; + HTHEME hthemeScrollbar; + UINT lastHitTest; BOOL HasAppDefinedRgn; BOOL HasThemeRgn; @@ -229,6 +232,8 @@ void ThemeInitDrawContext(PDRAW_CONTEXT pcontext, HWND hWnd, HRGN hRgn); void ThemeCleanupDrawContext(PDRAW_CONTEXT pcontext); PWND_DATA ThemeGetWndData(HWND hWnd); +HTHEME GetNCCaptionTheme(HWND hWnd, DWORD style); +HTHEME GetNCScrollbarTheme(HWND hWnd, DWORD style); extern HINSTANCE hDllInst; extern ATOM atWindowTheme;