diff options
author | Ben Murdoch <benm@google.com> | 2010-07-22 15:37:06 +0100 |
---|---|---|
committer | Ben Murdoch <benm@google.com> | 2010-07-27 10:20:25 +0100 |
commit | 967717af5423377c967781471ee106e2bb4e11c8 (patch) | |
tree | 1e701dc0a12f7f07cce1df4a7681717de77a211b /WebCore/rendering/RenderThemeChromiumWin.cpp | |
parent | dcc30a9fca45f634b1d3a12b276d3a0ccce99fc3 (diff) | |
download | external_webkit-967717af5423377c967781471ee106e2bb4e11c8.zip external_webkit-967717af5423377c967781471ee106e2bb4e11c8.tar.gz external_webkit-967717af5423377c967781471ee106e2bb4e11c8.tar.bz2 |
Merge WebKit at r63859 : Initial merge by git.
Change-Id: Ie8096c63ec7c991c9a9cba8bdd9c3b74a3b8ed62
Diffstat (limited to 'WebCore/rendering/RenderThemeChromiumWin.cpp')
-rw-r--r-- | WebCore/rendering/RenderThemeChromiumWin.cpp | 150 |
1 files changed, 103 insertions, 47 deletions
diff --git a/WebCore/rendering/RenderThemeChromiumWin.cpp b/WebCore/rendering/RenderThemeChromiumWin.cpp index 1172f96..3023798 100644 --- a/WebCore/rendering/RenderThemeChromiumWin.cpp +++ b/WebCore/rendering/RenderThemeChromiumWin.cpp @@ -29,8 +29,8 @@ #include <uxtheme.h> #include <vssym32.h> -#include "ChromiumBridge.h" #include "CSSValueKeywords.h" +#include "ChromiumBridge.h" #include "CurrentTime.h" #include "FontSelector.h" #include "FontUtilsChromiumWin.h" @@ -57,53 +57,71 @@ namespace WebCore { namespace { -class ThemePainter : public TransparencyWin { +class ThemePainter { public: ThemePainter(GraphicsContext* context, const IntRect& r) { - TransformMode transformMode = getTransformMode(context->getCTM()); - init(context, getLayerMode(context, transformMode), transformMode, r); + TransparencyWin::TransformMode transformMode = getTransformMode(context->getCTM()); + m_helper.init(context, getLayerMode(context, transformMode), transformMode, r); + + if (!m_helper.context()) { + // TransparencyWin doesn't have well-defined copy-ctor nor op=() + // so we re-initialize it instead of assigning a fresh istance. + // On the reinitialization, we fallback to use NoLayer mode. + // Note that the original initialization failure can be caused by + // a failure of an internal buffer allocation and NoLayer mode + // does not have such buffer allocations. + m_helper.~TransparencyWin(); + new (&m_helper) TransparencyWin(); + m_helper.init(context, TransparencyWin::NoLayer, transformMode, r); + } } ~ThemePainter() { - composite(); + m_helper.composite(); } + GraphicsContext* context() { return m_helper.context(); } + const IntRect& drawRect() { return m_helper.drawRect(); } + private: + static 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. + iter.next(); // There is always at least one layer. + return !iter.done(); // There is > 1 layer if the the iterator can stil advance. } - static LayerMode getLayerMode(GraphicsContext* context, TransformMode transformMode) + static TransparencyWin::LayerMode getLayerMode(GraphicsContext* context, TransparencyWin::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; + if (context->platformContext()->isDrawingToImageBuffer()) // Might have transparent background. + return TransparencyWin::WhiteLayer; + if (canvasHasMultipleLayers(context->platformContext()->canvas())) // Needs antialiasing help. + return TransparencyWin::OpaqueCompositeLayer; + // Nothing interesting. + return transformMode == TransparencyWin::KeepTransform ? TransparencyWin::NoLayer : TransparencyWin::OpaqueCompositeLayer; } - static TransformMode getTransformMode(const AffineTransform& matrix) + static TransparencyWin::TransformMode getTransformMode(const AffineTransform& 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; + if (matrix.b() || matrix.c()) // Skew. + return TransparencyWin::Untransform; + if (matrix.a() != 1.0 || matrix.d() != 1.0) // Scale. + return TransparencyWin::ScaleTransform; + // Nothing interesting. + return TransparencyWin::KeepTransform; } + + TransparencyWin m_helper; }; -} // namespace +} // namespace static void getNonClientMetrics(NONCLIENTMETRICS* metrics) { - static UINT size = WebCore::isVistaOrNewer() ? + static UINT size = isVistaOrNewer() ? sizeof(NONCLIENTMETRICS) : NONCLIENTMETRICS_SIZE_PRE_VISTA; metrics->cbSize = size; bool success = !!SystemParametersInfo(SPI_GETNONCLIENTMETRICS, size, metrics, 0); @@ -139,7 +157,7 @@ static float systemFontSize(const LOGFONT& font) if (size < 0) { HFONT hFont = CreateFontIndirect(&font); if (hFont) { - HDC hdc = GetDC(0); // What about printing? Is this the right DC? + HDC hdc = GetDC(0); // What about printing? Is this the right DC? if (hdc) { HGDIOBJ hObject = SelectObject(hdc, hFont); TEXTMETRIC tm; @@ -170,8 +188,8 @@ 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? + 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 { @@ -186,7 +204,7 @@ static float pointsToPixels(float points) static double querySystemBlinkInterval(double defaultInterval) { UINT blinkTime = GetCaretBlinkTime(); - if (blinkTime == 0) + if (!blinkTime) return defaultInterval; if (blinkTime == INFINITE) return 0; @@ -216,7 +234,7 @@ bool RenderThemeChromiumWin::supportsFocusRing(const RenderStyle* style) const Color RenderThemeChromiumWin::platformActiveSelectionBackgroundColor() const { if (ChromiumBridge::layoutTestMode()) - return Color(0x00, 0x00, 0xff); // Royal blue. + return Color(0x00, 0x00, 0xff); // Royal blue. COLORREF color = GetSysColor(COLOR_HIGHLIGHT); return Color(GetRValue(color), GetGValue(color), GetBValue(color), 0xff); } @@ -224,7 +242,7 @@ Color RenderThemeChromiumWin::platformActiveSelectionBackgroundColor() const Color RenderThemeChromiumWin::platformInactiveSelectionBackgroundColor() const { if (ChromiumBridge::layoutTestMode()) - return Color(0x99, 0x99, 0x99); // Medium gray. + return Color(0x99, 0x99, 0x99); // Medium gray. COLORREF color = GetSysColor(COLOR_GRAYTEXT); return Color(GetRValue(color), GetGValue(color), GetBValue(color), 0xff); } @@ -232,7 +250,7 @@ Color RenderThemeChromiumWin::platformInactiveSelectionBackgroundColor() const Color RenderThemeChromiumWin::platformActiveSelectionForegroundColor() const { if (ChromiumBridge::layoutTestMode()) - return Color(0xff, 0xff, 0xcc); // Pale yellow. + return Color(0xff, 0xff, 0xcc); // Pale yellow. COLORREF color = GetSysColor(COLOR_HIGHLIGHTTEXT); return Color(GetRValue(color), GetGValue(color), GetBValue(color), 0xff); } @@ -244,7 +262,7 @@ Color RenderThemeChromiumWin::platformInactiveSelectionForegroundColor() const Color RenderThemeChromiumWin::platformActiveTextSearchHighlightColor() const { - return Color(0xff, 0x96, 0x32); // Orange. + return Color(0xff, 0x96, 0x32); // Orange. } Color RenderThemeChromiumWin::platformInactiveTextSearchHighlightColor() const @@ -387,7 +405,7 @@ bool RenderThemeChromiumWin::paintButton(RenderObject* o, const PaintInfo& i, co { const ThemeData& themeData = getThemeData(o); - WebCore::ThemePainter painter(i.context, r); + ThemePainter painter(i.context, r); ChromiumBridge::paintButton(painter.context(), themeData.m_part, themeData.m_state, @@ -405,7 +423,7 @@ bool RenderThemeChromiumWin::paintSliderTrack(RenderObject* o, const PaintInfo& { const ThemeData& themeData = getThemeData(o); - WebCore::ThemePainter painter(i.context, r); + ThemePainter painter(i.context, r); ChromiumBridge::paintTrackbar(painter.context(), themeData.m_part, themeData.m_state, @@ -436,7 +454,7 @@ bool RenderThemeChromiumWin::paintMenuList(RenderObject* o, const PaintInfo& i, // draw individual borders and then pass that to skia so we can avoid // drawing any borders that are set to 0. For non-zero borders, we draw the // border, but webkit just draws over it. - bool drawEdges = !(borderRight == 0 && borderLeft == 0 && borderTop == 0 && borderBottom == 0); + bool drawEdges = !(!borderRight && !borderLeft && !borderTop && !borderBottom); paintTextFieldInternal(o, i, r, drawEdges); @@ -462,7 +480,7 @@ bool RenderThemeChromiumWin::paintMenuList(RenderObject* o, const PaintInfo& i, r.height() - (spacingTop + spacingBottom)); // Get the correct theme data for a textfield and paint the menu. - WebCore::ThemePainter painter(i.context, rect); + ThemePainter painter(i.context, rect); ChromiumBridge::paintMenuList(painter.context(), CP_DROPDOWNBUTTON, determineState(o), @@ -487,19 +505,20 @@ double RenderThemeChromiumWin::caretBlinkIntervalInternal() const return blinkInterval; } -unsigned RenderThemeChromiumWin::determineState(RenderObject* o) +unsigned RenderThemeChromiumWin::determineState(RenderObject* o, ControlSubPart subPart) { unsigned result = TS_NORMAL; ControlPart appearance = o->style()->appearance(); if (!isEnabled(o)) result = TS_DISABLED; - else if (isReadOnlyControl(o) && (TextFieldPart == appearance || TextAreaPart == appearance || SearchFieldPart == appearance)) - result = ETS_READONLY; // Readonly is supported on textfields. - else if (isPressed(o)) // Active overrides hover and focused. + else if (isReadOnlyControl(o)) + result = (appearance == TextFieldPart || appearance == TextAreaPart || appearance == SearchFieldPart) ? ETS_READONLY : TS_DISABLED; + // Active overrides hover and focused. + else if (isPressed(o) && (subPart == SpinButtonUp) == isSpinUpButtonPartPressed(o)) result = TS_PRESSED; else if (supportsFocus(appearance) && isFocused(o)) result = ETS_FOCUSED; - else if (isHovered(o)) + else if (isHovered(o) && (subPart == SpinButtonUp) == isSpinUpButtonPartHovered(o)) result = TS_HOT; // CBS_UNCHECKED*: 1-4 @@ -526,7 +545,7 @@ unsigned RenderThemeChromiumWin::determineSliderThumbState(RenderObject* o) return result; } -unsigned RenderThemeChromiumWin::determineClassicState(RenderObject* o) +unsigned RenderThemeChromiumWin::determineClassicState(RenderObject* o, ControlSubPart subPart) { unsigned result = 0; @@ -548,13 +567,14 @@ unsigned RenderThemeChromiumWin::determineClassicState(RenderObject* o) else if (isHovered(o)) result = DFCS_HOT; } else { - if (!isEnabled(o)) + if (!isEnabled(o) || isReadOnlyControl(o)) result = DFCS_INACTIVE; - else if (isPressed(o)) // Active supersedes hover + // Active supersedes hover + else if (isPressed(o) && (subPart == SpinButtonUp) == isSpinUpButtonPartPressed(o)) result = DFCS_PUSHED; else if (supportsFocus(part) && isFocused(o)) // So does focused result = 0; - else if (isHovered(o)) + else if (isHovered(o) && (subPart == SpinButtonUp) == isSpinUpButtonPartHovered(o)) result = DFCS_HOT; // Classic theme can't represent indeterminate states. Use unchecked appearance. if (isChecked(o) && !isIndeterminate(o)) @@ -563,7 +583,7 @@ unsigned RenderThemeChromiumWin::determineClassicState(RenderObject* o) return result; } -ThemeData RenderThemeChromiumWin::getThemeData(RenderObject* o) +ThemeData RenderThemeChromiumWin::getThemeData(RenderObject* o, ControlSubPart subPart) { ThemeData result; switch (o->style()->appearance()) { @@ -608,9 +628,14 @@ ThemeData RenderThemeChromiumWin::getThemeData(RenderObject* o) result.m_part = EP_EDITTEXT; result.m_state = determineState(o); break; + case InnerSpinButtonPart: + result.m_part = subPart == SpinButtonUp ? SPNP_UP : SPNP_DOWN; + result.m_state = determineState(o, subPart); + result.m_classicState = subPart == SpinButtonUp ? DFCS_SCROLLUP : DFCS_SCROLLDOWN; + break; } - result.m_classicState |= determineClassicState(o); + result.m_classicState |= determineClassicState(o, subPart); return result; } @@ -646,7 +671,7 @@ bool RenderThemeChromiumWin::paintTextFieldInternal(RenderObject* o, } { const ThemeData& themeData = getThemeData(o); - WebCore::ThemePainter painter(i.context, r); + ThemePainter painter(i.context, r); ChromiumBridge::paintTextField(painter.context(), themeData.m_part, themeData.m_state, @@ -662,6 +687,37 @@ bool RenderThemeChromiumWin::paintTextFieldInternal(RenderObject* o, return false; } +void RenderThemeChromiumWin::adjustInnerSpinButtonStyle(CSSStyleSelector*, RenderStyle* style, Element*) const +{ + int width = ScrollbarTheme::nativeTheme()->scrollbarThickness(); + style->setWidth(Length(width, Fixed)); + style->setMinWidth(Length(width, Fixed)); +} + +bool RenderThemeChromiumWin::paintInnerSpinButton(RenderObject* object, const PaintInfo& info, const IntRect& rect) +{ + IntRect half = rect; + + half.setHeight(rect.height() / 2); + const ThemeData& upThemeData = getThemeData(object, SpinButtonUp); + ThemePainter upPainter(info.context, half); + ChromiumBridge::paintSpinButton(upPainter.context(), + upThemeData.m_part, + upThemeData.m_state, + upThemeData.m_classicState, + upPainter.drawRect()); + + half.setY(rect.y() + rect.height() / 2); + const ThemeData& downThemeData = getThemeData(object, SpinButtonDown); + ThemePainter downPainter(info.context, half); + ChromiumBridge::paintSpinButton(downPainter.context(), + downThemeData.m_part, + downThemeData.m_state, + downThemeData.m_classicState, + downPainter.drawRect()); + return false; +} + #if ENABLE(PROGRESS_TAG) // MSDN says that update intervals for the bar is 30ms. |