Index: platform/chromium/ThemeChromiumMac.mm |
=================================================================== |
--- platform/chromium/ThemeChromiumMac.mm (revision 0) |
+++ platform/chromium/ThemeChromiumMac.mm (revision 0) |
@@ -0,0 +1,569 @@ |
+/* |
+ * Copyright (C) 2008 Apple Inc. All Rights Reserved. |
+ * Copyright (C) 2009 Google Inc. All Rights Reserved. |
+ * |
+ * Redistribution and use in source and binary forms, with or without |
+ * modification, are permitted provided that the following conditions |
+ * are met: |
+ * 1. Redistributions of source code must retain the above copyright |
+ * notice, this list of conditions and the following disclaimer. |
+ * 2. Redistributions in binary form must reproduce the above copyright |
+ * notice, this list of conditions and the following disclaimer in the |
+ * documentation and/or other materials provided with the distribution. |
+ * |
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY |
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR |
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY |
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
+ */ |
+ |
+#import "config.h" |
+#import "ThemeChromiumMac.h" |
+ |
+#import "BlockExceptions.h" |
+#import "GraphicsContext.h" |
+#import "LocalCurrentGraphicsContext.h" |
+#import "ScrollView.h" |
+#import "WebCoreSystemInterface.h" |
+#include <wtf/StdLibExtras.h> |
+ |
+using namespace std; |
+ |
+// This file (and its associated .h file) is a clone of ThemeMac.mm. |
+// Because the original file is designed to run in-process inside a Cocoa view, |
+// we must maintain a fork. Please maintain this file by performing parallel |
+// changes to it. |
+// |
+// The only changes from ThemeMac should be: |
+// - The classname change from ThemeMac to ThemeChromiumMac. |
+// - The import of FlippedView() and its use as the parent view for cell |
+// rendering. |
+// - In updateStates() the code to update the cells' inactive state. |
+// - In paintButton() the code to save/restore the window's default button cell. |
+// |
+// For all other differences, if it was introduced in this file, then the |
+// maintainer forgot to include it in the list; otherwise it is an update that |
+// should have been applied to this file but was not. |
+ |
+// FIXME: Default buttons really should be more like push buttons and not like buttons. |
+ |
+namespace WebCore { |
+ |
+// Pick up utility function from RenderThemeChromiumMac. |
+extern NSView* FlippedView(); |
+ |
+enum { |
+ topMargin, |
+ rightMargin, |
+ bottomMargin, |
+ leftMargin |
+}; |
+ |
+Theme* platformTheme() |
+{ |
+ DEFINE_STATIC_LOCAL(ThemeChromiumMac, themeMac, ()); |
+ return &themeMac; |
+} |
+ |
+// Helper functions used by a bunch of different control parts. |
+ |
+static NSControlSize controlSizeForFont(const Font& font) |
+{ |
+ int fontSize = font.pixelSize(); |
+ if (fontSize >= 16) |
+ return NSRegularControlSize; |
+ if (fontSize >= 11) |
+ return NSSmallControlSize; |
+ return NSMiniControlSize; |
+} |
+ |
+static LengthSize sizeFromFont(const Font& font, const LengthSize& zoomedSize, float zoomFactor, const IntSize* sizes) |
+{ |
+ IntSize controlSize = sizes[controlSizeForFont(font)]; |
+ if (zoomFactor != 1.0f) |
+ controlSize = IntSize(controlSize.width() * zoomFactor, controlSize.height() * zoomFactor); |
+ LengthSize result = zoomedSize; |
+ if (zoomedSize.width().isIntrinsicOrAuto() && controlSize.width() > 0) |
+ result.setWidth(Length(controlSize.width(), Fixed)); |
+ if (zoomedSize.height().isIntrinsicOrAuto() && controlSize.height() > 0) |
+ result.setHeight(Length(controlSize.height(), Fixed)); |
+ return result; |
+} |
+ |
+static void setControlSize(NSCell* cell, const IntSize* sizes, const IntSize& minZoomedSize, float zoomFactor) |
+{ |
+ NSControlSize size; |
+ if (minZoomedSize.width() >= static_cast<int>(sizes[NSRegularControlSize].width() * zoomFactor) && |
+ minZoomedSize.height() >= static_cast<int>(sizes[NSRegularControlSize].height() * zoomFactor)) |
+ size = NSRegularControlSize; |
+ else if (minZoomedSize.width() >= static_cast<int>(sizes[NSSmallControlSize].width() * zoomFactor) && |
+ minZoomedSize.height() >= static_cast<int>(sizes[NSSmallControlSize].height() * zoomFactor)) |
+ size = NSSmallControlSize; |
+ else |
+ size = NSMiniControlSize; |
+ if (size != [cell controlSize]) // Only update if we have to, since AppKit does work even if the size is the same. |
+ [cell setControlSize:size]; |
+} |
+ |
+static void updateStates(NSCell* cell, ControlStates states) |
+{ |
+ // Hover state is not supported by Aqua. |
+ |
+ // Pressed state |
+ bool oldPressed = [cell isHighlighted]; |
+ bool pressed = states & PressedState; |
+ if (pressed != oldPressed) |
+ [cell setHighlighted:pressed]; |
+ |
+ // Enabled state |
+ bool oldEnabled = [cell isEnabled]; |
+ bool enabled = states & EnabledState; |
+ if (enabled != oldEnabled) |
+ [cell setEnabled:enabled]; |
+ |
+ // Focused state |
+ bool oldFocused = [cell showsFirstResponder]; |
+ bool focused = states & FocusState; |
+ if (focused != oldFocused) |
+ [cell setShowsFirstResponder:focused]; |
+ |
+ // Checked and Indeterminate |
+ bool oldIndeterminate = [cell state] == NSMixedState; |
+ bool indeterminate = (states & IndeterminateState); |
+ bool checked = states & CheckedState; |
+ bool oldChecked = [cell state] == NSOnState; |
+ if (oldIndeterminate != indeterminate || checked != oldChecked) |
+ [cell setState:indeterminate ? NSMixedState : (checked ? NSOnState : NSOffState)]; |
+ |
+ // Window Inactive state |
+ NSControlTint oldTint = [cell controlTint]; |
+ bool windowInactive = (states & WindowInactiveState); |
+ NSControlTint tint = windowInactive ? NSClearControlTint : [NSColor currentControlTint]; |
+ if (tint != oldTint) |
+ [cell setControlTint:tint]; |
+} |
+ |
+static IntRect inflateRect(const IntRect& zoomedRect, const IntSize& zoomedSize, const int* margins, float zoomFactor) |
+{ |
+ // Only do the inflation if the available width/height are too small. Otherwise try to |
+ // fit the glow/check space into the available box's width/height. |
+ int widthDelta = zoomedRect.width() - (zoomedSize.width() + margins[leftMargin] * zoomFactor + margins[rightMargin] * zoomFactor); |
+ int heightDelta = zoomedRect.height() - (zoomedSize.height() + margins[topMargin] * zoomFactor + margins[bottomMargin] * zoomFactor); |
+ IntRect result(zoomedRect); |
+ if (widthDelta < 0) { |
+ result.setX(result.x() - margins[leftMargin] * zoomFactor); |
+ result.setWidth(result.width() - widthDelta); |
+ } |
+ if (heightDelta < 0) { |
+ result.setY(result.y() - margins[topMargin] * zoomFactor); |
+ result.setHeight(result.height() - heightDelta); |
+ } |
+ return result; |
+} |
+ |
+// Checkboxes |
+ |
+static const IntSize* checkboxSizes() |
+{ |
+ static const IntSize sizes[3] = { IntSize(14, 14), IntSize(12, 12), IntSize(10, 10) }; |
+ return sizes; |
+} |
+ |
+static const int* checkboxMargins(NSControlSize controlSize) |
+{ |
+ static const int margins[3][4] = |
+ { |
+ { 3, 4, 4, 2 }, |
+ { 4, 3, 3, 3 }, |
+ { 4, 3, 3, 3 }, |
+ }; |
+ return margins[controlSize]; |
+} |
+ |
+static LengthSize checkboxSize(const Font& font, const LengthSize& zoomedSize, float zoomFactor) |
+{ |
+ // If the width and height are both specified, then we have nothing to do. |
+ if (!zoomedSize.width().isIntrinsicOrAuto() && !zoomedSize.height().isIntrinsicOrAuto()) |
+ return zoomedSize; |
+ |
+ // Use the font size to determine the intrinsic width of the control. |
+ return sizeFromFont(font, zoomedSize, zoomFactor, checkboxSizes()); |
+} |
+ |
+static NSButtonCell* checkbox(ControlStates states, const IntRect& zoomedRect, float zoomFactor) |
+{ |
+ static NSButtonCell* checkboxCell; |
+ if (!checkboxCell) { |
+ checkboxCell = [[NSButtonCell alloc] init]; |
+ [checkboxCell setButtonType:NSSwitchButton]; |
+ [checkboxCell setTitle:nil]; |
+ [checkboxCell setAllowsMixedState:YES]; |
+ [checkboxCell setFocusRingType:NSFocusRingTypeExterior]; |
+ } |
+ |
+ // Set the control size based off the rectangle we're painting into. |
+ setControlSize(checkboxCell, checkboxSizes(), zoomedRect.size(), zoomFactor); |
+ |
+ // Update the various states we respond to. |
+ updateStates(checkboxCell, states); |
+ |
+ return checkboxCell; |
+} |
+ |
+// FIXME: Share more code with radio buttons. |
+static void paintCheckbox(ControlStates states, GraphicsContext* context, const IntRect& zoomedRect, float zoomFactor, ScrollView* scrollView) |
+{ |
+ BEGIN_BLOCK_OBJC_EXCEPTIONS |
+ |
+ // Determine the width and height needed for the control and prepare the cell for painting. |
+ NSButtonCell* checkboxCell = checkbox(states, zoomedRect, zoomFactor); |
+ |
+ context->save(); |
+ |
+ NSControlSize controlSize = [checkboxCell controlSize]; |
+ IntSize zoomedSize = checkboxSizes()[controlSize]; |
+ zoomedSize.setWidth(zoomedSize.width() * zoomFactor); |
+ zoomedSize.setHeight(zoomedSize.height() * zoomFactor); |
+ IntRect inflatedRect = inflateRect(zoomedRect, zoomedSize, checkboxMargins(controlSize), zoomFactor); |
+ |
+ if (zoomFactor != 1.0f) { |
+ inflatedRect.setWidth(inflatedRect.width() / zoomFactor); |
+ inflatedRect.setHeight(inflatedRect.height() / zoomFactor); |
+ context->translate(inflatedRect.x(), inflatedRect.y()); |
+ context->scale(FloatSize(zoomFactor, zoomFactor)); |
+ context->translate(-inflatedRect.x(), -inflatedRect.y()); |
+ } |
+ |
+ [checkboxCell drawWithFrame:NSRect(inflatedRect) inView:FlippedView()]; |
+ [checkboxCell setControlView:nil]; |
+ |
+ context->restore(); |
+ |
+ END_BLOCK_OBJC_EXCEPTIONS |
+} |
+ |
+// Radio Buttons |
+ |
+static const IntSize* radioSizes() |
+{ |
+ static const IntSize sizes[3] = { IntSize(14, 15), IntSize(12, 13), IntSize(10, 10) }; |
+ return sizes; |
+} |
+ |
+static const int* radioMargins(NSControlSize controlSize) |
+{ |
+ static const int margins[3][4] = |
+ { |
+ { 2, 2, 4, 2 }, |
+ { 3, 2, 3, 2 }, |
+ { 1, 0, 2, 0 }, |
+ }; |
+ return margins[controlSize]; |
+} |
+ |
+static LengthSize radioSize(const Font& font, const LengthSize& zoomedSize, float zoomFactor) |
+{ |
+ // If the width and height are both specified, then we have nothing to do. |
+ if (!zoomedSize.width().isIntrinsicOrAuto() && !zoomedSize.height().isIntrinsicOrAuto()) |
+ return zoomedSize; |
+ |
+ // Use the font size to determine the intrinsic width of the control. |
+ return sizeFromFont(font, zoomedSize, zoomFactor, radioSizes()); |
+} |
+ |
+static NSButtonCell* radio(ControlStates states, const IntRect& zoomedRect, float zoomFactor) |
+{ |
+ static NSButtonCell* radioCell; |
+ if (!radioCell) { |
+ radioCell = [[NSButtonCell alloc] init]; |
+ [radioCell setButtonType:NSRadioButton]; |
+ [radioCell setTitle:nil]; |
+ [radioCell setFocusRingType:NSFocusRingTypeExterior]; |
+ } |
+ |
+ // Set the control size based off the rectangle we're painting into. |
+ setControlSize(radioCell, radioSizes(), zoomedRect.size(), zoomFactor); |
+ |
+ // Update the various states we respond to. |
+ updateStates(radioCell, states); |
+ |
+ return radioCell; |
+} |
+ |
+static void paintRadio(ControlStates states, GraphicsContext* context, const IntRect& zoomedRect, float zoomFactor, ScrollView* scrollView) |
+{ |
+ // Determine the width and height needed for the control and prepare the cell for painting. |
+ NSButtonCell* radioCell = radio(states, zoomedRect, zoomFactor); |
+ |
+ context->save(); |
+ |
+ NSControlSize controlSize = [radioCell controlSize]; |
+ IntSize zoomedSize = radioSizes()[controlSize]; |
+ zoomedSize.setWidth(zoomedSize.width() * zoomFactor); |
+ zoomedSize.setHeight(zoomedSize.height() * zoomFactor); |
+ IntRect inflatedRect = inflateRect(zoomedRect, zoomedSize, radioMargins(controlSize), zoomFactor); |
+ |
+ if (zoomFactor != 1.0f) { |
+ inflatedRect.setWidth(inflatedRect.width() / zoomFactor); |
+ inflatedRect.setHeight(inflatedRect.height() / zoomFactor); |
+ context->translate(inflatedRect.x(), inflatedRect.y()); |
+ context->scale(FloatSize(zoomFactor, zoomFactor)); |
+ context->translate(-inflatedRect.x(), -inflatedRect.y()); |
+ } |
+ |
+ BEGIN_BLOCK_OBJC_EXCEPTIONS |
+ [radioCell drawWithFrame:NSRect(inflatedRect) inView:FlippedView()]; |
+ [radioCell setControlView:nil]; |
+ END_BLOCK_OBJC_EXCEPTIONS |
+ |
+ context->restore(); |
+} |
+ |
+// Buttons |
+ |
+// Buttons really only constrain height. They respect width. |
+static const IntSize* buttonSizes() |
+{ |
+ static const IntSize sizes[3] = { IntSize(0, 21), IntSize(0, 18), IntSize(0, 15) }; |
+ return sizes; |
+} |
+ |
+static const int* buttonMargins(NSControlSize controlSize) |
+{ |
+ static const int margins[3][4] = |
+ { |
+ { 4, 6, 7, 6 }, |
+ { 4, 5, 6, 5 }, |
+ { 0, 1, 1, 1 }, |
+ }; |
+ return margins[controlSize]; |
+} |
+ |
+static NSButtonCell* button(ControlPart part, ControlStates states, const IntRect& zoomedRect, float zoomFactor) |
+{ |
+ static NSButtonCell *buttonCell; |
+ static bool defaultButton; |
+ if (!buttonCell) { |
+ buttonCell = [[NSButtonCell alloc] init]; |
+ [buttonCell setTitle:nil]; |
+ [buttonCell setButtonType:NSMomentaryPushInButton]; |
+ } |
+ |
+ // Set the control size based off the rectangle we're painting into. |
+ if (part == SquareButtonPart || zoomedRect.height() > buttonSizes()[NSRegularControlSize].height() * zoomFactor) { |
+ // Use the square button |
+ if ([buttonCell bezelStyle] != NSShadowlessSquareBezelStyle) |
+ [buttonCell setBezelStyle:NSShadowlessSquareBezelStyle]; |
+ } else if ([buttonCell bezelStyle] != NSRoundedBezelStyle) |
+ [buttonCell setBezelStyle:NSRoundedBezelStyle]; |
+ |
+ setControlSize(buttonCell, buttonSizes(), zoomedRect.size(), zoomFactor); |
+ |
+ if (defaultButton != (states & DefaultState)) { |
+ defaultButton = !defaultButton; |
+ [buttonCell setKeyEquivalent:(defaultButton ? @"\r" : @"")]; |
+ } |
+ |
+ // Update the various states we respond to. |
+ updateStates(buttonCell, states); |
+ |
+ return buttonCell; |
+} |
+ |
+static void paintButton(ControlPart part, ControlStates states, GraphicsContext* context, const IntRect& zoomedRect, float zoomFactor, ScrollView* scrollView) |
+{ |
+ BEGIN_BLOCK_OBJC_EXCEPTIONS |
+ |
+ // Determine the width and height needed for the control and prepare the cell for painting. |
+ NSButtonCell *buttonCell = button(part, states, zoomedRect, zoomFactor); |
+ LocalCurrentGraphicsContext localContext(context); |
+ |
+ NSControlSize controlSize = [buttonCell controlSize]; |
+ IntSize zoomedSize = buttonSizes()[controlSize]; |
+ zoomedSize.setWidth(zoomedRect.width()); // Buttons don't ever constrain width, so the zoomed width can just be honored. |
+ zoomedSize.setHeight(zoomedSize.height() * zoomFactor); |
+ IntRect inflatedRect = zoomedRect; |
+ if ([buttonCell bezelStyle] == NSRoundedBezelStyle) { |
+ // Center the button within the available space. |
+ if (inflatedRect.height() > zoomedSize.height()) { |
+ inflatedRect.setY(inflatedRect.y() + (inflatedRect.height() - zoomedSize.height()) / 2); |
+ inflatedRect.setHeight(zoomedSize.height()); |
+ } |
+ |
+ // Now inflate it to account for the shadow. |
+ inflatedRect = inflateRect(inflatedRect, zoomedSize, buttonMargins(controlSize), zoomFactor); |
+ |
+ if (zoomFactor != 1.0f) { |
+ inflatedRect.setWidth(inflatedRect.width() / zoomFactor); |
+ inflatedRect.setHeight(inflatedRect.height() / zoomFactor); |
+ context->translate(inflatedRect.x(), inflatedRect.y()); |
+ context->scale(FloatSize(zoomFactor, zoomFactor)); |
+ context->translate(-inflatedRect.x(), -inflatedRect.y()); |
+ } |
+ } |
+ |
+ [buttonCell drawWithFrame:NSRect(inflatedRect) inView:FlippedView()]; |
+ [buttonCell setControlView:nil]; |
+ |
+ END_BLOCK_OBJC_EXCEPTIONS |
+} |
+ |
+// Theme overrides |
+ |
+int ThemeChromiumMac::baselinePositionAdjustment(ControlPart part) const |
+{ |
+ if (part == CheckboxPart || part == RadioPart) |
+ return -2; |
+ return Theme::baselinePositionAdjustment(part); |
+} |
+ |
+FontDescription ThemeChromiumMac::controlFont(ControlPart part, const Font& font, float zoomFactor) const |
+{ |
+ switch (part) { |
+ case PushButtonPart: { |
+ FontDescription fontDescription; |
+ fontDescription.setIsAbsoluteSize(true); |
+ fontDescription.setGenericFamily(FontDescription::SerifFamily); |
+ |
+ NSFont* nsFont = [NSFont systemFontOfSize:[NSFont systemFontSizeForControlSize:controlSizeForFont(font)]]; |
+ fontDescription.firstFamily().setFamily([nsFont familyName]); |
+ fontDescription.setComputedSize([nsFont pointSize] * zoomFactor); |
+ fontDescription.setSpecifiedSize([nsFont pointSize] * zoomFactor); |
+ return fontDescription; |
+ } |
+ default: |
+ return Theme::controlFont(part, font, zoomFactor); |
+ } |
+} |
+ |
+LengthSize ThemeChromiumMac::controlSize(ControlPart part, const Font& font, const LengthSize& zoomedSize, float zoomFactor) const |
+{ |
+ switch (part) { |
+ case CheckboxPart: |
+ return checkboxSize(font, zoomedSize, zoomFactor); |
+ case RadioPart: |
+ return radioSize(font, zoomedSize, zoomFactor); |
+ case PushButtonPart: |
+ // Height is reset to auto so that specified heights can be ignored. |
+ return sizeFromFont(font, LengthSize(zoomedSize.width(), Length()), zoomFactor, buttonSizes()); |
+ default: |
+ return zoomedSize; |
+ } |
+} |
+ |
+LengthSize ThemeChromiumMac::minimumControlSize(ControlPart part, const Font& font, float zoomFactor) const |
+{ |
+ switch (part) { |
+ case SquareButtonPart: |
+ case DefaultButtonPart: |
+ case ButtonPart: |
+ return LengthSize(Length(0, Fixed), Length(static_cast<int>(15 * zoomFactor), Fixed)); |
+ default: |
+ return Theme::minimumControlSize(part, font, zoomFactor); |
+ } |
+} |
+ |
+LengthBox ThemeChromiumMac::controlBorder(ControlPart part, const Font& font, const LengthBox& zoomedBox, float zoomFactor) const |
+{ |
+ switch (part) { |
+ case SquareButtonPart: |
+ case DefaultButtonPart: |
+ case ButtonPart: |
+ return LengthBox(0, zoomedBox.right().value(), 0, zoomedBox.left().value()); |
+ default: |
+ return Theme::controlBorder(part, font, zoomedBox, zoomFactor); |
+ } |
+} |
+ |
+LengthBox ThemeChromiumMac::controlPadding(ControlPart part, const Font& font, const LengthBox& zoomedBox, float zoomFactor) const |
+{ |
+ switch (part) { |
+ case PushButtonPart: { |
+ // Just use 8px. AppKit wants to use 11px for mini buttons, but that padding is just too large |
+ // for real-world Web sites (creating a huge necessary minimum width for buttons whose space is |
+ // by definition constrained, since we select mini only for small cramped environments. |
+ // This also guarantees the HTML <button> will match our rendering by default, since we're using a consistent |
+ // padding. |
+ const int padding = 8 * zoomFactor; |
+ return LengthBox(0, padding, 0, padding); |
+ } |
+ default: |
+ return Theme::controlPadding(part, font, zoomedBox, zoomFactor); |
+ } |
+} |
+ |
+void ThemeChromiumMac::inflateControlPaintRect(ControlPart part, ControlStates states, IntRect& zoomedRect, float zoomFactor) const |
+{ |
+ BEGIN_BLOCK_OBJC_EXCEPTIONS |
+ switch (part) { |
+ case CheckboxPart: { |
+ // We inflate the rect as needed to account for padding included in the cell to accommodate the checkbox |
+ // shadow" and the check. We don't consider this part of the bounds of the control in WebKit. |
+ NSCell *cell = checkbox(states, zoomedRect, zoomFactor); |
+ NSControlSize controlSize = [cell controlSize]; |
+ IntSize zoomedSize = checkboxSizes()[controlSize]; |
+ zoomedSize.setHeight(zoomedSize.height() * zoomFactor); |
+ zoomedSize.setWidth(zoomedSize.width() * zoomFactor); |
+ zoomedRect = inflateRect(zoomedRect, zoomedSize, checkboxMargins(controlSize), zoomFactor); |
+ break; |
+ } |
+ case RadioPart: { |
+ // We inflate the rect as needed to account for padding included in the cell to accommodate the radio button |
+ // shadow". We don't consider this part of the bounds of the control in WebKit. |
+ NSCell *cell = radio(states, zoomedRect, zoomFactor); |
+ NSControlSize controlSize = [cell controlSize]; |
+ IntSize zoomedSize = radioSizes()[controlSize]; |
+ zoomedSize.setHeight(zoomedSize.height() * zoomFactor); |
+ zoomedSize.setWidth(zoomedSize.width() * zoomFactor); |
+ zoomedRect = inflateRect(zoomedRect, zoomedSize, radioMargins(controlSize), zoomFactor); |
+ break; |
+ } |
+ case PushButtonPart: |
+ case DefaultButtonPart: |
+ case ButtonPart: { |
+ NSButtonCell *cell = button(part, states, zoomedRect, zoomFactor); |
+ NSControlSize controlSize = [cell controlSize]; |
+ |
+ // We inflate the rect as needed to account for the Aqua button's shadow. |
+ if ([cell bezelStyle] == NSRoundedBezelStyle) { |
+ IntSize zoomedSize = buttonSizes()[controlSize]; |
+ zoomedSize.setHeight(zoomedSize.height() * zoomFactor); |
+ zoomedSize.setWidth(zoomedRect.width()); // Buttons don't ever constrain width, so the zoomed width can just be honored. |
+ zoomedRect = inflateRect(zoomedRect, zoomedSize, buttonMargins(controlSize), zoomFactor); |
+ } |
+ break; |
+ } |
+ default: |
+ break; |
+ } |
+ END_BLOCK_OBJC_EXCEPTIONS |
+} |
+ |
+void ThemeChromiumMac::paint(ControlPart part, ControlStates states, GraphicsContext* context, const IntRect& zoomedRect, float zoomFactor, ScrollView* scrollView) const |
+{ |
+ switch (part) { |
+ case CheckboxPart: |
+ paintCheckbox(states, context, zoomedRect, zoomFactor, scrollView); |
+ break; |
+ case RadioPart: |
+ paintRadio(states, context, zoomedRect, zoomFactor, scrollView); |
+ break; |
+ case PushButtonPart: |
+ case DefaultButtonPart: |
+ case ButtonPart: |
+ case SquareButtonPart: |
+ paintButton(part, states, context, zoomedRect, zoomFactor, scrollView); |
+ break; |
+ default: |
+ break; |
+ } |
+} |
+ |
+} |
Property changes on: platform/chromium/ThemeChromiumMac.mm |
___________________________________________________________________ |
Name: svn:eol-style |
+ LF |