⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 renderthemechromiumwin.cpp

📁 linux下开源浏览器WebKit的源码,市面上的很多商用浏览器都是移植自WebKit
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/* * 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 + -