📄 renderthemechromiumwin.cpp
字号:
/* * This file is part of the WebKit project. * * Copyright (C) 2006 Apple Computer, Inc. * Copyright (C) 2008, 2009 Google, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public License * along with this library; see the file COPYING.LIB. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. * */#include "config.h"#include "RenderThemeChromiumWin.h"#include <windows.h>#include <uxtheme.h>#include <vssym32.h>#include "ChromiumBridge.h"#include "CSSStyleSheet.h"#include "CSSValueKeywords.h"#include "Document.h"#include "FontSelector.h"#include "FontUtilsChromiumWin.h"#include "GraphicsContext.h"#include "RenderBox.h"#include "ScrollbarTheme.h"#include "SkiaUtils.h"#include "TransparencyWin.h"#include "UserAgentStyleSheets.h"#include "WindowsVersion.h"// FIXME: This dependency should eventually be removed.#include <skia/ext/skia_utils_win.h>#define SIZEOF_STRUCT_WITH_SPECIFIED_LAST_MEMBER(structName, member) \ offsetof(structName, member) + \ (sizeof static_cast<structName*>(0)->member)#define NONCLIENTMETRICS_SIZE_PRE_VISTA \ SIZEOF_STRUCT_WITH_SPECIFIED_LAST_MEMBER(NONCLIENTMETRICS, lfMessageFont)namespace WebCore {namespace {bool canvasHasMultipleLayers(const SkCanvas* canvas){ SkCanvas::LayerIter iter(const_cast<SkCanvas*>(canvas), false); iter.next(); // There is always at least one layer. return !iter.done(); // There is > 1 layer if the the iterator can stil advance.}class ThemePainter : public TransparencyWin {public: ThemePainter(GraphicsContext* context, const IntRect& r) { TransformMode transformMode = getTransformMode(context->getCTM()); init(context, getLayerMode(context, transformMode), transformMode, r); }private: static LayerMode getLayerMode(GraphicsContext* context, TransformMode transformMode) { if (context->platformContext()->isDrawingToImageBuffer()) // Might have transparent background. return WhiteLayer; else if (canvasHasMultipleLayers(context->platformContext()->canvas())) // Needs antialiasing help. return OpaqueCompositeLayer; else // Nothing interesting. return transformMode == KeepTransform ? NoLayer : OpaqueCompositeLayer; } static TransformMode getTransformMode(const TransformationMatrix& matrix) { if (matrix.b() != 0 || matrix.c() != 0) // Skew. return Untransform; else if (matrix.a() != 1.0 || matrix.d() != 1.0) // Scale. return ScaleTransform; else // Nothing interesting. return KeepTransform; }};} // namespacestatic void getNonClientMetrics(NONCLIENTMETRICS* metrics) { static UINT size = WebCore::isVistaOrNewer() ? sizeof(NONCLIENTMETRICS) : NONCLIENTMETRICS_SIZE_PRE_VISTA; metrics->cbSize = size; bool success = !!SystemParametersInfo(SPI_GETNONCLIENTMETRICS, size, metrics, 0); ASSERT(success);}enum PaddingType { TopPadding, RightPadding, BottomPadding, LeftPadding};static const int styledMenuListInternalPadding[4] = { 1, 4, 1, 4 };// The default variable-width font size. We use this as the default font// size for the "system font", and as a base size (which we then shrink) for// form control fonts.static float defaultFontSize = 16.0;static FontDescription smallSystemFont;static FontDescription menuFont;static FontDescription labelFont;bool RenderThemeChromiumWin::m_findInPageMode = false;// Internal static helper functions. We don't put them in an anonymous// namespace so they have easier access to the WebCore namespace.static bool supportsFocus(ControlPart appearance){ switch (appearance) { case PushButtonPart: case ButtonPart: case DefaultButtonPart: case TextFieldPart: case TextAreaPart: return true; } return false;}static void setFixedPadding(RenderStyle* style, const int padding[4]){ style->setPaddingLeft(Length(padding[LeftPadding], Fixed)); style->setPaddingRight(Length(padding[RightPadding], Fixed)); style->setPaddingTop(Length(padding[TopPadding], Fixed)); style->setPaddingBottom(Length(padding[BottomPadding], Fixed));}// Return the height of system font |font| in pixels. We use this size by// default for some non-form-control elements.static float systemFontSize(const LOGFONT& font){ float size = -font.lfHeight; if (size < 0) { HFONT hFont = CreateFontIndirect(&font); if (hFont) { HDC hdc = GetDC(0); // What about printing? Is this the right DC? if (hdc) { HGDIOBJ hObject = SelectObject(hdc, hFont); TEXTMETRIC tm; GetTextMetrics(hdc, &tm); SelectObject(hdc, hObject); ReleaseDC(0, hdc); size = tm.tmAscent; } DeleteObject(hFont); } } // The "codepage 936" bit here is from Gecko; apparently this helps make // fonts more legible in Simplified Chinese where the default font size is // too small. // // FIXME: http://b/1119883 Since this is only used for "small caption", // "menu", and "status bar" objects, I'm not sure how much this even // matters. Plus the Gecko patch went in back in 2002, and maybe this // isn't even relevant anymore. We should investigate whether this should // be removed, or perhaps broadened to be "any CJK locale". // return ((size < 12.0f) && (GetACP() == 936)) ? 12.0f : size;}// We aim to match IE here.// -IE uses a font based on the encoding as the default font for form controls.// -Gecko uses MS Shell Dlg (actually calls GetStockObject(DEFAULT_GUI_FONT),// which returns MS Shell Dlg)// -Safari uses Lucida Grande.//// FIXME: The only case where we know we don't match IE is for ANSI encodings.// IE uses MS Shell Dlg there, which we render incorrectly at certain pixel// sizes (e.g. 15px). So, for now we just use Arial.static wchar_t* defaultGUIFont(Document* document){ UScriptCode dominantScript = document->dominantScript(); const wchar_t* family = NULL; // FIXME: Special-casing of Latin/Greeek/Cyrillic should go away once // GetFontFamilyForScript is enhanced to support GenericFamilyType for // real. For now, we make sure that we use Arial to match IE for those // scripts. if (dominantScript != USCRIPT_LATIN && dominantScript != USCRIPT_CYRILLIC && dominantScript != USCRIPT_GREEK && dominantScript != USCRIPT_INVALID_CODE) { family = getFontFamilyForScript(dominantScript, FontDescription::NoFamily); if (family) return const_cast<wchar_t*>(family); } return L"Arial";}// Converts |points| to pixels. One point is 1/72 of an inch.static float pointsToPixels(float points){ static float pixelsPerInch = 0.0f; if (!pixelsPerInch) { HDC hdc = GetDC(0); // What about printing? Is this the right DC? if (hdc) { // Can this ever actually be NULL? pixelsPerInch = GetDeviceCaps(hdc, LOGPIXELSY); ReleaseDC(0, hdc); } else { pixelsPerInch = 96.0f; } } static const float pointsPerInch = 72.0f; return points / pointsPerInch * pixelsPerInch;}static void setSizeIfAuto(RenderStyle* style, const IntSize& size){ if (style->width().isIntrinsicOrAuto()) style->setWidth(Length(size.width(), Fixed)); if (style->height().isAuto()) style->setHeight(Length(size.height(), Fixed));}static double querySystemBlinkInterval(double defaultInterval){ UINT blinkTime = GetCaretBlinkTime(); if (blinkTime == 0) return defaultInterval; if (blinkTime == INFINITE) return 0; return blinkTime / 1000.0;}// Implement WebCore::theme() for getting the global RenderTheme.RenderTheme* theme(){ static RenderThemeChromiumWin winTheme; return &winTheme;}String RenderThemeChromiumWin::extraDefaultStyleSheet(){ return String(themeWinUserAgentStyleSheet, sizeof(themeWinUserAgentStyleSheet));}String RenderThemeChromiumWin::extraQuirksStyleSheet(){ return String(themeWinQuirksUserAgentStyleSheet, sizeof(themeWinQuirksUserAgentStyleSheet));}bool RenderThemeChromiumWin::supportsFocusRing(const RenderStyle* style) const{ // Let webkit draw one of its halo rings around any focused element, // except push buttons. For buttons we use the windows PBS_DEFAULTED // styling to give it a blue border. return style->appearance() == ButtonPart || style->appearance() == PushButtonPart;}Color RenderThemeChromiumWin::platformActiveSelectionBackgroundColor() const{ if (ChromiumBridge::layoutTestMode()) return Color("#0000FF"); // Royal blue. if (m_findInPageMode) return Color(255, 150, 50, 200); // Orange. COLORREF color = GetSysColor(COLOR_HIGHLIGHT); return Color(GetRValue(color), GetGValue(color), GetBValue(color), 255);}Color RenderThemeChromiumWin::platformInactiveSelectionBackgroundColor() const{ if (ChromiumBridge::layoutTestMode()) return Color("#999999"); // Medium gray. if (m_findInPageMode) return Color(255, 150, 50, 200); // Orange. COLORREF color = GetSysColor(COLOR_GRAYTEXT); return Color(GetRValue(color), GetGValue(color), GetBValue(color), 255);}Color RenderThemeChromiumWin::platformActiveSelectionForegroundColor() const{ if (ChromiumBridge::layoutTestMode()) return Color("#FFFFCC"); // Pale yellow. COLORREF color = GetSysColor(COLOR_HIGHLIGHTTEXT); return Color(GetRValue(color), GetGValue(color), GetBValue(color), 255);}Color RenderThemeChromiumWin::platformInactiveSelectionForegroundColor() const{ return Color::white;}Color RenderThemeChromiumWin::platformTextSearchHighlightColor() const{ return Color(255, 255, 150);}double RenderThemeChromiumWin::caretBlinkInterval() const{ // Disable the blinking caret in layout test mode, as it introduces // a race condition for the pixel tests. http://b/1198440 if (ChromiumBridge::layoutTestMode()) return 0; // This involves a system call, so we cache the result. static double blinkInterval = querySystemBlinkInterval(RenderTheme::caretBlinkInterval()); return blinkInterval;}void RenderThemeChromiumWin::systemFont(int propId, Document* document, FontDescription& fontDescription) const{ // This logic owes much to RenderThemeSafari.cpp. FontDescription* cachedDesc = NULL; wchar_t* faceName = 0; float fontSize = 0; switch (propId) { case CSSValueSmallCaption: cachedDesc = &smallSystemFont; if (!smallSystemFont.isAbsoluteSize()) { NONCLIENTMETRICS metrics; getNonClientMetrics(&metrics); faceName = metrics.lfSmCaptionFont.lfFaceName;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -