From 02d0fa16dbf42ce21d88ba85133c641c65bd2870 Mon Sep 17 00:00:00 2001 From: Anthony Petrov Date: Thu, 27 Aug 2009 16:42:55 +0400 Subject: [PATCH] 6780496: Javaw process taking up 80-90 percent of CPU time! The transparency effects get enabled on showing, and disabled on hiding a window Reviewed-by: art, dcherepanov --- .../windows/native/sun/windows/awt_Dialog.cpp | 1 + .../windows/native/sun/windows/awt_Frame.cpp | 2 + .../windows/native/sun/windows/awt_Window.cpp | 85 ++++++++++++++----- .../windows/native/sun/windows/awt_Window.h | 13 ++- 4 files changed, 74 insertions(+), 27 deletions(-) diff --git a/jdk/src/windows/native/sun/windows/awt_Dialog.cpp b/jdk/src/windows/native/sun/windows/awt_Dialog.cpp index 147bcf711eb..c0637237da4 100644 --- a/jdk/src/windows/native/sun/windows/awt_Dialog.cpp +++ b/jdk/src/windows/native/sun/windows/awt_Dialog.cpp @@ -364,6 +364,7 @@ void AwtDialog::Show() if (locationByPlatform) { moveToDefaultLocation(); } + EnableTranslucency(TRUE); if (IsFocusableWindow() && (IsAutoRequestFocus() || IsFocusedWindowModalBlocker())) { ::ShowWindow(GetHWnd(), SW_SHOW); } else { diff --git a/jdk/src/windows/native/sun/windows/awt_Frame.cpp b/jdk/src/windows/native/sun/windows/awt_Frame.cpp index 6e2ec9c0ff7..7d48921bab8 100644 --- a/jdk/src/windows/native/sun/windows/awt_Frame.cpp +++ b/jdk/src/windows/native/sun/windows/awt_Frame.cpp @@ -690,6 +690,8 @@ AwtFrame::Show() if (locationByPlatform) { moveToDefaultLocation(); } + EnableTranslucency(TRUE); + BOOL autoRequestFocus = IsAutoRequestFocus(); if (m_iconic) { diff --git a/jdk/src/windows/native/sun/windows/awt_Window.cpp b/jdk/src/windows/native/sun/windows/awt_Window.cpp index f10c9055d15..4c902c3fb47 100644 --- a/jdk/src/windows/native/sun/windows/awt_Window.cpp +++ b/jdk/src/windows/native/sun/windows/awt_Window.cpp @@ -218,12 +218,7 @@ AwtWindow::~AwtWindow() if (warningString != NULL) { delete [] warningString; } - ::EnterCriticalSection(&contentBitmapCS); - if (hContentBitmap != NULL) { - ::DeleteObject(hContentBitmap); - hContentBitmap = NULL; - } - ::LeaveCriticalSection(&contentBitmapCS); + DeleteContentBitmap(); ::DeleteCriticalSection(&contentBitmapCS); } @@ -372,6 +367,10 @@ MsgRouting AwtWindow::WmWindowPosChanged(LPARAM windowPos) { } } + if (wp->flags & SWP_HIDEWINDOW) { + EnableTranslucency(FALSE); + } + return mrDoDefault; } @@ -1130,6 +1129,8 @@ void AwtWindow::Show() moveToDefaultLocation(); } + EnableTranslucency(TRUE); + // The following block exists to support Menu/Tooltip animation for // Swing programs in a way which avoids introducing any new public api into // AWT or Swing. @@ -2494,27 +2495,73 @@ void AwtWindow::RedrawWindow() } } -void AwtWindow::SetTranslucency(BYTE opacity, BOOL opaque) +// Deletes the hContentBitmap if it is non-null +void AwtWindow::DeleteContentBitmap() { - BYTE old_opacity = getOpacity(); - BOOL old_opaque = isOpaque(); + ::EnterCriticalSection(&contentBitmapCS); + if (hContentBitmap != NULL) { + ::DeleteObject(hContentBitmap); + hContentBitmap = NULL; + } + ::LeaveCriticalSection(&contentBitmapCS); +} + +// The effects are enabled only upon showing the window. +// See 6780496 for details. +void AwtWindow::EnableTranslucency(BOOL enable) +{ + if (enable) { + SetTranslucency(getOpacity(), isOpaque(), FALSE, TRUE); + } else { + SetTranslucency(0xFF, TRUE, FALSE); + } +} + +/** + * Sets the translucency effects. + * + * This method is used to: + * + * 1. Apply the translucency effects upon showing the window + * (setValues == FALSE, useDefaultForOldValues == TRUE); + * 2. Turn off the effects upon hiding the window + * (setValues == FALSE, useDefaultForOldValues == FALSE); + * 3. Set the effects per user's request + * (setValues == TRUE, useDefaultForOldValues == FALSE); + * + * In case #3 the effects may or may not be applied immediately depending on + * the current visibility status of the window. + * + * The setValues argument indicates if we need to preserve the passed values + * in local fields for further use. + * The useDefaultForOldValues argument indicates whether we should consider + * the window as if it has not any effects applied at the moment. + */ +void AwtWindow::SetTranslucency(BYTE opacity, BOOL opaque, BOOL setValues, + BOOL useDefaultForOldValues) +{ + BYTE old_opacity = useDefaultForOldValues ? 0xFF : getOpacity(); + BOOL old_opaque = useDefaultForOldValues ? TRUE : isOpaque(); if (opacity == old_opacity && opaque == old_opaque) { return; } - setOpacity(opacity); - setOpaque(opaque); + if (setValues) { + m_opacity = opacity; + m_opaque = opaque; + } + + // If we're invisible and are storing the values, return + // Otherwise, apply the effects immediately + if (!IsVisible() && setValues) { + return; + } HWND hwnd = GetHWnd(); if (opaque != old_opaque) { - ::EnterCriticalSection(&contentBitmapCS); - if (hContentBitmap != NULL) { - ::DeleteObject(hContentBitmap); - hContentBitmap = NULL; - } - ::LeaveCriticalSection(&contentBitmapCS); + DeleteContentBitmap(); } if (opaque && opacity == 0xff) { @@ -2634,9 +2681,7 @@ void AwtWindow::UpdateWindow(JNIEnv* env, jintArray data, int width, int height, } ::EnterCriticalSection(&contentBitmapCS); - if (hContentBitmap != NULL) { - ::DeleteObject(hContentBitmap); - } + DeleteContentBitmap(); hContentBitmap = hBitmap; contentWidth = width; contentHeight = height; diff --git a/jdk/src/windows/native/sun/windows/awt_Window.h b/jdk/src/windows/native/sun/windows/awt_Window.h index 3edd39ed030..1d238b44dac 100644 --- a/jdk/src/windows/native/sun/windows/awt_Window.h +++ b/jdk/src/windows/native/sun/windows/awt_Window.h @@ -262,32 +262,29 @@ private: // from its hierarchy when shown. Currently applied to instances of // javax/swing/Popup$HeavyWeightWindow class. + // SetTranslucency() is the setter for the following two fields BYTE m_opacity; // The opacity level. == 0xff by default (when opacity mode is disabled) BOOL m_opaque; // Whether the window uses the perpixel translucency (false), or not (true). inline BYTE getOpacity() { return m_opacity; } - inline void setOpacity(BYTE opacity) { - m_opacity = opacity; - } inline BOOL isOpaque() { return m_opaque; } - inline void setOpaque(BOOL opaque) { - m_opaque = opaque; - } CRITICAL_SECTION contentBitmapCS; HBITMAP hContentBitmap; UINT contentWidth; UINT contentHeight; - void SetTranslucency(BYTE opacity, BOOL opaque); + void SetTranslucency(BYTE opacity, BOOL opaque, BOOL setValues = TRUE, + BOOL useDefaultForOldValues = FALSE); void UpdateWindow(int width, int height, HBITMAP hBitmap); void UpdateWindowImpl(int width, int height, HBITMAP hBitmap); void RedrawWindow(); + void DeleteContentBitmap(); static UINT untrustedWindowsCounter; @@ -352,6 +349,8 @@ protected: UINT currentWmSizeState; + void EnableTranslucency(BOOL enable); + private: int m_screenNum;