Implement system fonts FontDescription caching at RenderTheme level
[WebKit-https.git] / Source / WebCore / rendering / RenderThemeWin.cpp
index 959ea3e..0e43cfc 100644 (file)
@@ -329,22 +329,8 @@ static void fillFontDescription(FontDescription& fontDescription, LOGFONT& logFo
     fontDescription.setIsItalic(logFont.lfItalic);
 }
 
-static void fillFontDescription(FontDescription& fontDescription, LOGFONT& logFont)
-{   
-    fillFontDescription(fontDescription, logFont, abs(logFont.lfHeight));
-}
-
-void RenderThemeWin::systemFont(CSSValueID valueID, FontDescription& fontDescription) const
+void RenderThemeWin::updateCachedSystemFontDescription(CSSValueID valueID, FontDescription& fontDescription) const
 {
-    static FontDescription captionFont;
-    static FontDescription controlFont;
-    static FontDescription smallCaptionFont;
-    static FontDescription menuFont;
-    static FontDescription iconFont;
-    static FontDescription messageBoxFont;
-    static FontDescription statusBarFont;
-    static FontDescription systemFont;
-    
     static bool initialized;
     static NONCLIENTMETRICS ncm;
 
@@ -354,66 +340,41 @@ void RenderThemeWin::systemFont(CSSValueID valueID, FontDescription& fontDescrip
         ::SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(ncm), &ncm, 0);
     }
  
+    LOGFONT logFont;
+    bool shouldUseDefaultControlFontPixelSize = false;
     switch (valueID) {
-    case CSSValueIcon: {
-        if (!iconFont.isAbsoluteSize()) {
-            LOGFONT logFont;
-            ::SystemParametersInfo(SPI_GETICONTITLELOGFONT, sizeof(logFont), &logFont, 0);
-            fillFontDescription(iconFont, logFont);
-        }
-        fontDescription = iconFont;
+    case CSSValueIcon:
+        ::SystemParametersInfo(SPI_GETICONTITLELOGFONT, sizeof(logFont), &logFont, 0);
         break;
-    }
     case CSSValueMenu:
-        if (!menuFont.isAbsoluteSize())
-            fillFontDescription(menuFont, ncm.lfMenuFont);
-        fontDescription = menuFont;
+        logFont = ncm.lfMenuFont;
         break;
     case CSSValueMessageBox:
-        if (!messageBoxFont.isAbsoluteSize())
-            fillFontDescription(messageBoxFont, ncm.lfMessageFont);
-        fontDescription = messageBoxFont;
+        logFont = ncm.lfMessageFont;
         break;
     case CSSValueStatusBar:
-        if (!statusBarFont.isAbsoluteSize())
-            fillFontDescription(statusBarFont, ncm.lfStatusFont);
-        fontDescription = statusBarFont;
+        logFont = ncm.lfStatusFont;
         break;
     case CSSValueCaption:
-        if (!captionFont.isAbsoluteSize())
-            fillFontDescription(captionFont, ncm.lfCaptionFont);
-        fontDescription = captionFont;
+        logFont = ncm.lfCaptionFont;
         break;
     case CSSValueSmallCaption:
-        if (!smallCaptionFont.isAbsoluteSize())
-            fillFontDescription(smallCaptionFont, ncm.lfSmCaptionFont);
-        fontDescription = smallCaptionFont;
+        logFont = ncm.lfSmCaptionFont;
         break;
     case CSSValueWebkitSmallControl:
     case CSSValueWebkitMiniControl: // Just map to small.
     case CSSValueWebkitControl: // Just map to small.
-        if (!controlFont.isAbsoluteSize()) {
-            HGDIOBJ hGDI = ::GetStockObject(DEFAULT_GUI_FONT);
-            if (hGDI) {
-                LOGFONT logFont;
-                if (::GetObject(hGDI, sizeof(logFont), &logFont) > 0)
-                    fillFontDescription(controlFont, logFont, defaultControlFontPixelSize);
-            }
-        }
-        fontDescription = controlFont;
-        break;
+        shouldUseDefaultControlFontPixelSize = true;
+        FALLTHROUGH;
     default: { // Everything else uses the stock GUI font.
-        if (!systemFont.isAbsoluteSize()) {
-            HGDIOBJ hGDI = ::GetStockObject(DEFAULT_GUI_FONT);
-            if (hGDI) {
-                LOGFONT logFont;
-                if (::GetObject(hGDI, sizeof(logFont), &logFont) > 0)
-                    fillFontDescription(systemFont, logFont);
-            }
-        }
-        fontDescription = systemFont;
+        HGDIOBJ hGDI = ::GetStockObject(DEFAULT_GUI_FONT);
+        if (!hGDI)
+            return;
+        if (::GetObject(hGDI, sizeof(logFont), &logFont) <= 0)
+            return;
     }
     }
+    fillFontDescription(fontDescription, logFont, shouldUseDefaultControlFontPixelSize ? defaultControlFontPixelSize : abs(logFont.lfHeight));
 }
 
 bool RenderThemeWin::supportsFocus(ControlPart appearance) const