Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1247)

Unified Diff: Source/core/rendering/RenderTheme.cpp

Issue 14866009: Enable proper zooming of checkbox and radio button on Win and Mac. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 7 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/core/rendering/RenderTheme.h ('k') | Source/core/rendering/RenderThemeChromiumMac.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/core/rendering/RenderTheme.cpp
diff --git a/Source/core/rendering/RenderTheme.cpp b/Source/core/rendering/RenderTheme.cpp
index ac6c59d609f1fc7d6b0fee750d45207c2c2fe832..ea5d3389a21eb85b43fb581e9b02d9874ec34a74 100644
--- a/Source/core/rendering/RenderTheme.cpp
+++ b/Source/core/rendering/RenderTheme.cpp
@@ -53,6 +53,9 @@
#include "core/rendering/RenderMeter.h"
#include "core/rendering/RenderView.h"
#include "core/rendering/style/RenderStyle.h"
+#include <public/Platform.h>
+#include <public/WebFallbackThemeEngine.h>
+#include <public/WebRect.h>
#if ENABLE(INPUT_SPEECH)
#include "core/rendering/RenderInputSpeech.h"
@@ -70,6 +73,18 @@ static Color& customFocusRingColor()
return color;
}
+static WebKit::WebFallbackThemeEngine::State getWebFallbackThemeState(const RenderTheme* theme, const RenderObject* o)
+{
+ if (!theme->isEnabled(o))
+ return WebKit::WebFallbackThemeEngine::StateDisabled;
+ if (theme->isPressed(o))
+ return WebKit::WebFallbackThemeEngine::StatePressed;
+ if (theme->isHovered(o))
+ return WebKit::WebFallbackThemeEngine::StateHover;
+
+ return WebKit::WebFallbackThemeEngine::StateNormal;
+}
+
RenderTheme::RenderTheme()
#if USE(NEW_THEME)
: m_theme(platformTheme())
@@ -100,6 +115,11 @@ void RenderTheme::adjustStyle(StyleResolver* styleResolver, RenderStyle* style,
if (!style->hasAppearance())
return;
+ if (shouldUseFallbackTheme(style)) {
+ adjustStyleUsingFallbackTheme(styleResolver, style, e);
+ return;
+ }
+
#if USE(NEW_THEME)
switch (part) {
case CheckboxPart:
@@ -258,6 +278,9 @@ bool RenderTheme::paint(RenderObject* o, const PaintInfo& paintInfo, const IntRe
ControlPart part = o->style()->appearance();
+ if (shouldUseFallbackTheme(o->style()))
+ return paintUsingFallbackTheme(o, paintInfo, r);
+
#if USE(NEW_THEME)
switch (part) {
case CheckboxPart:
@@ -1238,4 +1261,129 @@ bool RenderTheme::supportsCalendarPicker(const AtomicString& type) const
}
#endif
+bool RenderTheme::shouldUseFallbackTheme(RenderStyle*) const
+{
+ return false;
+}
+
+void RenderTheme::adjustStyleUsingFallbackTheme(StyleResolver* styleResolver, RenderStyle* style, Element* e)
+{
+ ControlPart part = style->appearance();
+ switch (part) {
+ case CheckboxPart:
+ return adjustCheckboxStyleUsingFallbackTheme(styleResolver, style, e);
+ case RadioPart:
+ return adjustRadioStyleUsingFallbackTheme(styleResolver, style, e);
+ default:
+ break;
+ }
+}
+
+bool RenderTheme::paintUsingFallbackTheme(RenderObject* o, const PaintInfo& i, const IntRect& r)
+{
+ ControlPart part = o->style()->appearance();
+ switch (part) {
+ case CheckboxPart:
+ return paintCheckboxUsingFallbackTheme(o, i, r);
+ case RadioPart:
+ return paintRadioUsingFallbackTheme(o, i, r);
+ default:
+ break;
+ }
+ return true;
+}
+
+// static
+void RenderTheme::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));
+}
+
+bool RenderTheme::paintCheckboxUsingFallbackTheme(RenderObject* o, const PaintInfo& i, const IntRect& r)
+{
+ WebKit::WebFallbackThemeEngine::ExtraParams extraParams;
+ WebKit::WebCanvas* canvas = i.context->canvas();
+ extraParams.button.checked = isChecked(o);
+ extraParams.button.indeterminate = isIndeterminate(o);
+
+ float zoomLevel = o->style()->effectiveZoom();
+ GraphicsContextStateSaver stateSaver(*i.context);
+ IntRect unzoomedRect = r;
+ if (zoomLevel != 1) {
+ unzoomedRect.setWidth(unzoomedRect.width() / zoomLevel);
+ unzoomedRect.setHeight(unzoomedRect.height() / zoomLevel);
+ i.context->translate(unzoomedRect.x(), unzoomedRect.y());
+ i.context->scale(FloatSize(zoomLevel, zoomLevel));
+ i.context->translate(-unzoomedRect.x(), -unzoomedRect.y());
+ }
+
+ WebKit::Platform::current()->fallbackThemeEngine()->paint(canvas, WebKit::WebFallbackThemeEngine::PartCheckbox, getWebFallbackThemeState(this, o), WebKit::WebRect(unzoomedRect), &extraParams);
+ return false;
+}
+
+void RenderTheme::adjustCheckboxStyleUsingFallbackTheme(StyleResolver*, RenderStyle* style, Element*) const
+{
+ // If the width and height are both specified, then we have nothing to do.
+ if (!style->width().isIntrinsicOrAuto() && !style->height().isAuto())
+ return;
+
+ IntSize size = WebKit::Platform::current()->fallbackThemeEngine()->getSize(WebKit::WebFallbackThemeEngine::PartCheckbox);
+ float zoomLevel = style->effectiveZoom();
+ size.setWidth(size.width() * zoomLevel);
+ size.setHeight(size.height() * zoomLevel);
+ setSizeIfAuto(style, size);
+
+ // padding - not honored by WinIE, needs to be removed.
+ style->resetPadding();
+
+ // border - honored by WinIE, but looks terrible (just paints in the control box and turns off the Windows XP theme)
+ // for now, we will not honor it.
+ style->resetBorder();
+}
+
+bool RenderTheme::paintRadioUsingFallbackTheme(RenderObject* o, const PaintInfo& i, const IntRect& r)
+{
+ WebKit::WebFallbackThemeEngine::ExtraParams extraParams;
+ WebKit::WebCanvas* canvas = i.context->canvas();
+ extraParams.button.checked = isChecked(o);
+ extraParams.button.indeterminate = isIndeterminate(o);
+
+ float zoomLevel = o->style()->effectiveZoom();
+ GraphicsContextStateSaver stateSaver(*i.context);
+ IntRect unzoomedRect = r;
+ if (zoomLevel != 1) {
+ unzoomedRect.setWidth(unzoomedRect.width() / zoomLevel);
+ unzoomedRect.setHeight(unzoomedRect.height() / zoomLevel);
+ i.context->translate(unzoomedRect.x(), unzoomedRect.y());
+ i.context->scale(FloatSize(zoomLevel, zoomLevel));
+ i.context->translate(-unzoomedRect.x(), -unzoomedRect.y());
+ }
+
+ WebKit::Platform::current()->fallbackThemeEngine()->paint(canvas, WebKit::WebFallbackThemeEngine::PartRadio, getWebFallbackThemeState(this, o), WebKit::WebRect(unzoomedRect), &extraParams);
+ return false;
+}
+
+void RenderTheme::adjustRadioStyleUsingFallbackTheme(StyleResolver*, RenderStyle* style, Element*) const
+{
+ // If the width and height are both specified, then we have nothing to do.
+ if (!style->width().isIntrinsicOrAuto() && !style->height().isAuto())
+ return;
+
+ IntSize size = WebKit::Platform::current()->fallbackThemeEngine()->getSize(WebKit::WebFallbackThemeEngine::PartRadio);
+ float zoomLevel = style->effectiveZoom();
+ size.setWidth(size.width() * zoomLevel);
+ size.setHeight(size.height() * zoomLevel);
+ setSizeIfAuto(style, size);
+
+ // padding - not honored by WinIE, needs to be removed.
+ style->resetPadding();
+
+ // border - honored by WinIE, but looks terrible (just paints in the control box and turns off the Windows XP theme)
+ // for now, we will not honor it.
+ style->resetBorder();
+}
+
} // namespace WebCore
« no previous file with comments | « Source/core/rendering/RenderTheme.h ('k') | Source/core/rendering/RenderThemeChromiumMac.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698