Index: third_party/WebKit/WebCore/rendering/RenderThemeChromiumWin.cpp |
=================================================================== |
--- third_party/WebKit/WebCore/rendering/RenderThemeChromiumWin.cpp (revision 10194) |
+++ third_party/WebKit/WebCore/rendering/RenderThemeChromiumWin.cpp (working copy) |
@@ -38,7 +38,7 @@ |
#include "RenderBox.h" |
#include "ScrollbarTheme.h" |
#include "SkiaUtils.h" |
-#include "ThemeHelperChromiumWin.h" |
+#include "TransparencyWin.h" |
#include "UserAgentStyleSheets.h" |
#include "WindowsVersion.h" |
@@ -53,6 +53,43 @@ |
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) { |
+ // Compute the transform mode. |
+ TransformMode transformMode; |
+ const TransformationMatrix& matrix = context->getCTM(); |
+ if (matrix.b() != 0 || matrix.c() != 0) // Skew. |
+ transformMode = Untransform; |
+ else if (matrix.a() != 1.0 || matrix.d() != 1.0) // Scale. |
+ transformMode = ScaleTransform; |
+ else // Nothing interesting. |
+ transformMode = KeepTransform; |
+ |
+ // Compute the layer mode. |
+ LayerMode layerMode; |
+ if (context->platformContext()->isDrawingToImageBuffer()) // Might have transparent background. |
+ layerMode = WhiteLayer; |
+ else if (canvasHasMultipleLayers(context->platformContext()->canvas())) // Needs antialiasing help. |
+ layerMode = OpaqueCompositeLayer; |
+ else // Nothing interesting. |
+ layerMode = transformMode == KeepTransform ? NoLayer : OpaqueCompositeLayer; |
+ |
+ init(context, layerMode, transformMode, r); |
+ } |
+}; |
+ |
+} // namespace |
+ |
static void getNonClientMetrics(NONCLIENTMETRICS* metrics) { |
static UINT size = WebCore::isVistaOrNewer() ? |
sizeof(NONCLIENTMETRICS) : NONCLIENTMETRICS_SIZE_PRE_VISTA; |
@@ -373,12 +410,12 @@ |
{ |
const ThemeData& themeData = getThemeData(o); |
- WebCore::ThemeHelperWin helper(i.context, r); |
- ChromiumBridge::paintButton(helper.context(), |
+ WebCore::ThemePainter painter(i.context, r); |
+ ChromiumBridge::paintButton(painter.context(), |
themeData.m_part, |
themeData.m_state, |
themeData.m_classicState, |
- helper.rect()); |
+ painter.drawRect()); |
return false; |
} |
@@ -441,12 +478,12 @@ |
r.height() - (spacingTop + spacingBottom)); |
// Get the correct theme data for a textfield and paint the menu. |
- WebCore::ThemeHelperWin helper(i.context, rect); |
- ChromiumBridge::paintMenuList(helper.context(), |
+ WebCore::ThemePainter painter(i.context, rect); |
+ ChromiumBridge::paintMenuList(painter.context(), |
CP_DROPDOWNBUTTON, |
determineState(o), |
determineClassicState(o), |
- helper.rect()); |
+ painter.drawRect()); |
return false; |
} |
@@ -563,9 +600,9 @@ |
} |
bool RenderThemeChromiumWin::paintTextFieldInternal(RenderObject* o, |
- const RenderObject::PaintInfo& i, |
- const IntRect& r, |
- bool drawEdges) |
+ const RenderObject::PaintInfo& i, |
+ const IntRect& r, |
+ bool drawEdges) |
{ |
// Nasty hack to make us not paint the border on text fields with a |
// border-radius. Webkit paints elements with border-radius for us. |
@@ -577,12 +614,12 @@ |
const ThemeData& themeData = getThemeData(o); |
- WebCore::ThemeHelperWin helper(i.context, r); |
- ChromiumBridge::paintTextField(helper.context(), |
+ WebCore::ThemePainter painter(i.context, r); |
+ ChromiumBridge::paintTextField(painter.context(), |
themeData.m_part, |
themeData.m_state, |
themeData.m_classicState, |
- helper.rect(), |
+ painter.drawRect(), |
o->style()->backgroundColor(), |
true, |
drawEdges); |