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

Unified Diff: ui/base/native_theme/native_theme_android.cc

Issue 10985076: NativeThemeAndroid should inherit from NativeThemeBase (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Patch Created 8 years, 3 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 | « ui/base/native_theme/native_theme_android.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/base/native_theme/native_theme_android.cc
diff --git a/ui/base/native_theme/native_theme_android.cc b/ui/base/native_theme/native_theme_android.cc
index 79b1067d4c838b0374540c76e8a2c0eda5479976..e6f31924efb309e0dbdd917b486cb53f351212ed 100644
--- a/ui/base/native_theme/native_theme_android.cc
+++ b/ui/base/native_theme/native_theme_android.cc
@@ -4,54 +4,11 @@
#include "ui/base/native_theme/native_theme_android.h"
-#include <limits>
-
#include "base/basictypes.h"
#include "base/logging.h"
-#include "base/memory/scoped_ptr.h"
-#include "grit/ui_resources.h"
-#include "third_party/skia/include/effects/SkGradientShader.h"
-#include "ui/base/layout.h"
-#include "ui/base/resource/resource_bundle.h"
-#include "ui/gfx/canvas.h"
-#include "ui/gfx/color_utils.h"
-#include "ui/gfx/rect.h"
-#include "ui/gfx/size.h"
namespace ui {
-const unsigned int kButtonLength = 14;
-const unsigned int kScrollbarWidth = 15;
-const unsigned int kThumbInactiveColor = 0xeaeaea;
-const unsigned int kTrackColor= 0xd3d3d3;
-
-// These are the default dimensions of radio buttons and checkboxes.
-const int kCheckboxAndRadioWidth = 13;
-const int kCheckboxAndRadioHeight = 13;
-
-// These sizes match the sizes in Chromium Win.
-const int kSliderThumbWidth = 11;
-const int kSliderThumbHeight = 21;
-
-const SkColor kSliderTrackBackgroundColor = SkColorSetRGB(0xe3, 0xdd, 0xd8);
-const SkColor kSliderThumbLightGrey = SkColorSetRGB(0xf4, 0xf2, 0xef);
-const SkColor kSliderThumbDarkGrey = SkColorSetRGB(0xea, 0xe5, 0xe0);
-const SkColor kSliderThumbBorderDarkGrey = SkColorSetRGB(0x9d, 0x96, 0x8e);
-
-// Get lightness adjusted color.
-SkColor BrightenColor(const color_utils::HSL& hsl,
- SkAlpha alpha,
- double lightness_amount) {
- color_utils::HSL adjusted = hsl;
- adjusted.l += lightness_amount;
- if (adjusted.l > 1.0)
- adjusted.l = 1.0;
- if (adjusted.l < 0.0)
- adjusted.l = 0.0;
-
- return color_utils::HSLToSkColor(adjusted, alpha);
-}
-
// static
const NativeTheme* NativeTheme::instance() {
return NativeThemeAndroid::instance();
@@ -63,80 +20,6 @@ const NativeThemeAndroid* NativeThemeAndroid::instance() {
return &s_native_theme;
}
-gfx::Size NativeThemeAndroid::GetPartSize(Part part,
- State state,
- const ExtraParams& extra) const {
- switch (part) {
- case kScrollbarDownArrow:
- case kScrollbarUpArrow:
- return gfx::Size(kScrollbarWidth, kButtonLength);
- case kScrollbarLeftArrow:
- case kScrollbarRightArrow:
- return gfx::Size(kButtonLength, kScrollbarWidth);
- case kCheckbox:
- case kRadio:
- return gfx::Size(kCheckboxAndRadioWidth, kCheckboxAndRadioHeight);
- case kSliderThumb:
- // These sizes match the sizes in Chromium Win.
- return gfx::Size(kSliderThumbWidth, kSliderThumbHeight);
- case kInnerSpinButton:
- return gfx::Size(kScrollbarWidth, 0);
- case kPushButton:
- case kTextField:
- case kMenuList:
- case kSliderTrack:
- case kProgressBar:
- return gfx::Size(); // No default size.
- default:
- NOTREACHED();
- }
- return gfx::Size();
-}
-
-void NativeThemeAndroid::Paint(SkCanvas* canvas,
- Part part,
- State state,
- const gfx::Rect& rect,
- const ExtraParams& extra) const {
- switch (part) {
- case kScrollbarDownArrow:
- case kScrollbarUpArrow:
- case kScrollbarLeftArrow:
- case kScrollbarRightArrow:
- PaintArrowButton(canvas, rect, part, state);
- break;
- case kCheckbox:
- PaintCheckbox(canvas, state, rect, extra.button);
- break;
- case kRadio:
- PaintRadio(canvas, state, rect, extra.button);
- break;
- case kPushButton:
- PaintButton(canvas, state, rect, extra.button);
- break;
- case kTextField:
- PaintTextField(canvas, state, rect, extra.text_field);
- break;
- case kMenuList:
- PaintMenuList(canvas, state, rect, extra.menu_list);
- break;
- case kSliderTrack:
- PaintSliderTrack(canvas, state, rect, extra.slider);
- break;
- case kSliderThumb:
- PaintSliderThumb(canvas, state, rect, extra.slider);
- break;
- case kInnerSpinButton:
- PaintInnerSpinButton(canvas, state, rect, extra.inner_spin);
- break;
- case kProgressBar:
- PaintProgressBar(canvas, state, rect, extra.progress_bar);
- break;
- default:
- NOTREACHED();
- }
-}
-
SkColor NativeThemeAndroid::GetSystemColor(ColorId color_id) const {
NOTIMPLEMENTED();
return SK_ColorBLACK;
@@ -148,612 +31,4 @@ NativeThemeAndroid::NativeThemeAndroid() {
NativeThemeAndroid::~NativeThemeAndroid() {
}
-void NativeThemeAndroid::PaintArrowButton(SkCanvas* canvas,
- const gfx::Rect& rect,
- Part direction,
- State state) const {
- int widthMiddle;
- int lengthMiddle;
- SkPaint paint;
- if (direction == kScrollbarUpArrow || direction == kScrollbarDownArrow) {
- widthMiddle = rect.width() / 2 + 1;
- lengthMiddle = rect.height() / 2 + 1;
- } else {
- lengthMiddle = rect.width() / 2 + 1;
- widthMiddle = rect.height() / 2 + 1;
- }
-
- // Calculate button color.
- SkScalar trackHSV[3];
- SkColorToHSV(kTrackColor, trackHSV);
- SkColor buttonColor = SaturateAndBrighten(trackHSV, 0, 0.2);
- SkColor backgroundColor = buttonColor;
- if (state == kPressed) {
- SkScalar buttonHSV[3];
- SkColorToHSV(buttonColor, buttonHSV);
- buttonColor = SaturateAndBrighten(buttonHSV, 0, -0.1);
- } else if (state == kHovered) {
- SkScalar buttonHSV[3];
- SkColorToHSV(buttonColor, buttonHSV);
- buttonColor = SaturateAndBrighten(buttonHSV, 0, 0.05);
- }
-
- SkIRect skrect;
- skrect.set(rect.x(), rect.y(), rect.x() + rect.width(), rect.y()
- + rect.height());
- // Paint the background (the area visible behind the rounded corners).
- paint.setColor(backgroundColor);
- canvas->drawIRect(skrect, paint);
-
- // Paint the button's outline and fill the middle
- SkPath outline;
- switch (direction) {
- case kScrollbarUpArrow:
- outline.moveTo(rect.x() + 0.5, rect.y() + rect.height() + 0.5);
- outline.rLineTo(0, -(rect.height() - 2));
- outline.rLineTo(2, -2);
- outline.rLineTo(rect.width() - 5, 0);
- outline.rLineTo(2, 2);
- outline.rLineTo(0, rect.height() - 2);
- break;
- case kScrollbarDownArrow:
- outline.moveTo(rect.x() + 0.5, rect.y() - 0.5);
- outline.rLineTo(0, rect.height() - 2);
- outline.rLineTo(2, 2);
- outline.rLineTo(rect.width() - 5, 0);
- outline.rLineTo(2, -2);
- outline.rLineTo(0, -(rect.height() - 2));
- break;
- case kScrollbarRightArrow:
- outline.moveTo(rect.x() - 0.5, rect.y() + 0.5);
- outline.rLineTo(rect.width() - 2, 0);
- outline.rLineTo(2, 2);
- outline.rLineTo(0, rect.height() - 5);
- outline.rLineTo(-2, 2);
- outline.rLineTo(-(rect.width() - 2), 0);
- break;
- case kScrollbarLeftArrow:
- outline.moveTo(rect.x() + rect.width() + 0.5, rect.y() + 0.5);
- outline.rLineTo(-(rect.width() - 2), 0);
- outline.rLineTo(-2, 2);
- outline.rLineTo(0, rect.height() - 5);
- outline.rLineTo(2, 2);
- outline.rLineTo(rect.width() - 2, 0);
- break;
- default:
- break;
- }
- outline.close();
-
- paint.setStyle(SkPaint::kFill_Style);
- paint.setColor(buttonColor);
- canvas->drawPath(outline, paint);
-
- paint.setAntiAlias(true);
- paint.setStyle(SkPaint::kStroke_Style);
- SkScalar thumbHSV[3];
- SkColorToHSV(kThumbInactiveColor, thumbHSV);
- paint.setColor(OutlineColor(trackHSV, thumbHSV));
- canvas->drawPath(outline, paint);
-
- // If the button is disabled or read-only, the arrow is drawn with the
- // outline color.
- if (state != kDisabled)
- paint.setColor(SK_ColorBLACK);
-
- paint.setAntiAlias(false);
- paint.setStyle(SkPaint::kFill_Style);
-
- SkPath path;
- // The constants in this block of code are hand-tailored to produce good
- // looking arrows without anti-aliasing.
- switch (direction) {
- case kScrollbarUpArrow:
- path.moveTo(rect.x() + widthMiddle - 4, rect.y() + lengthMiddle + 2);
- path.rLineTo(7, 0);
- path.rLineTo(-4, -4);
- break;
- case kScrollbarDownArrow:
- path.moveTo(rect.x() + widthMiddle - 4, rect.y() + lengthMiddle - 3);
- path.rLineTo(7, 0);
- path.rLineTo(-4, 4);
- break;
- case kScrollbarRightArrow:
- path.moveTo(rect.x() + lengthMiddle - 3, rect.y() + widthMiddle - 4);
- path.rLineTo(0, 7);
- path.rLineTo(4, -4);
- break;
- case kScrollbarLeftArrow:
- path.moveTo(rect.x() + lengthMiddle + 1, rect.y() + widthMiddle - 5);
- path.rLineTo(0, 9);
- path.rLineTo(-4, -4);
- break;
- default:
- break;
- }
- path.close();
-
- canvas->drawPath(path, paint);
-}
-
-void NativeThemeAndroid::PaintCheckbox(SkCanvas* canvas,
- State state,
- const gfx::Rect& rect,
- const ButtonExtraParams& button) const {
- ResourceBundle& rb = ResourceBundle::GetSharedInstance();
- gfx::ImageSkia* image = NULL;
- if (button.indeterminate) {
- image = state == kDisabled ?
- rb.GetImageSkiaNamed(IDR_CHECKBOX_DISABLED_INDETERMINATE) :
- rb.GetImageSkiaNamed(IDR_CHECKBOX_INDETERMINATE);
- } else if (button.checked) {
- image = state == kDisabled ?
- rb.GetImageSkiaNamed(IDR_CHECKBOX_DISABLED_ON) :
- rb.GetImageSkiaNamed(IDR_CHECKBOX_ON);
- } else {
- image = state == kDisabled ?
- rb.GetImageSkiaNamed(IDR_CHECKBOX_DISABLED_OFF) :
- rb.GetImageSkiaNamed(IDR_CHECKBOX_OFF);
- }
-
- gfx::Rect bounds = rect.Center(gfx::Size(image->width(), image->height()));
- DrawImageInt(canvas, *image, 0, 0, image->width(), image->height(),
- bounds.x(), bounds.y(), bounds.width(), bounds.height());
-}
-
-void NativeThemeAndroid::PaintRadio(SkCanvas* canvas,
- State state,
- const gfx::Rect& rect,
- const ButtonExtraParams& button) const {
- ResourceBundle& rb = ResourceBundle::GetSharedInstance();
- gfx::ImageSkia* image = NULL;
- if (state == kDisabled) {
- image = button.checked ?
- rb.GetImageSkiaNamed(IDR_RADIO_DISABLED_ON) :
- rb.GetImageSkiaNamed(IDR_RADIO_DISABLED_OFF);
- } else {
- image = button.checked ?
- rb.GetImageSkiaNamed(IDR_RADIO_ON) :
- rb.GetImageSkiaNamed(IDR_RADIO_OFF);
- }
-
- gfx::Rect bounds = rect.Center(gfx::Size(image->width(), image->height()));
- DrawImageInt(canvas, *image, 0, 0, image->width(), image->height(),
- bounds.x(), bounds.y(), bounds.width(), bounds.height());
-}
-
-void NativeThemeAndroid::PaintButton(SkCanvas* canvas,
- State state,
- const gfx::Rect& rect,
- const ButtonExtraParams& button) const {
- SkPaint paint;
- SkRect skrect;
- int kRight = rect.right();
- int kBottom = rect.bottom();
- SkColor base_color = button.background_color;
-
- color_utils::HSL base_hsl;
- color_utils::SkColorToHSL(base_color, &base_hsl);
-
- // Our standard gradient is from 0xdd to 0xf8. This is the amount of
- // increased luminance between those values.
- SkColor light_color(BrightenColor(base_hsl, SkColorGetA(base_color), 0.105));
-
- // If the button is too small, fallback to drawing a single, solid color
- if (rect.width() < 5 || rect.height() < 5) {
- paint.setColor(base_color);
- skrect.set(rect.x(), rect.y(), kRight, kBottom);
- canvas->drawRect(skrect, paint);
- return;
- }
-
- if (button.has_border) {
- int kBorderAlpha = state == kHovered ? 0x80 : 0x55;
- paint.setARGB(kBorderAlpha, 0, 0, 0);
- canvas->drawLine(rect.x() + 1, rect.y(), kRight - 1, rect.y(), paint);
- canvas->drawLine(kRight - 1, rect.y() + 1, kRight - 1, kBottom - 1, paint);
- canvas->drawLine(rect.x() + 1, kBottom - 1, kRight - 1, kBottom - 1, paint);
- canvas->drawLine(rect.x(), rect.y() + 1, rect.x(), kBottom - 1, paint);
- }
-
- paint.setColor(SK_ColorBLACK);
- int kLightEnd = state == kPressed ? 1 : 0;
- int kDarkEnd = !kLightEnd;
- SkPoint gradient_bounds[2];
- gradient_bounds[kLightEnd].iset(rect.x(), rect.y());
- gradient_bounds[kDarkEnd].iset(rect.x(), kBottom - 1);
- SkColor colors[2];
- colors[0] = light_color;
- colors[1] = base_color;
-
- SkShader* shader = SkGradientShader::CreateLinear(
- gradient_bounds, colors, NULL, 2, SkShader::kClamp_TileMode, NULL);
- paint.setStyle(SkPaint::kFill_Style);
- paint.setShader(shader);
- shader->unref();
-
- if (button.has_border) {
- skrect.set(rect.x() + 1, rect.y() + 1, kRight - 1, kBottom - 1);
- } else {
- skrect.set(rect.x(), rect.y(), kRight, kBottom);
- }
- canvas->drawRect(skrect, paint);
- paint.setShader(NULL);
-
- if (button.has_border) {
- paint.setColor(BrightenColor(base_hsl, SkColorGetA(base_color), -0.0588));
- canvas->drawPoint(rect.x() + 1, rect.y() + 1, paint);
- canvas->drawPoint(kRight - 2, rect.y() + 1, paint);
- canvas->drawPoint(rect.x() + 1, kBottom - 2, paint);
- canvas->drawPoint(kRight - 2, kBottom - 2, paint);
- }
-}
-
-void NativeThemeAndroid::PaintTextField(
- SkCanvas* canvas,
- State state,
- const gfx::Rect& rect,
- const TextFieldExtraParams& text) const {
- // The following drawing code simulates the user-agent css border for
- // text area and text input so that we do not break layout tests. Once we
- // have decided the desired looks, we should update the code here and
- // the layout test expectations.
- SkRect bounds;
- bounds.set(rect.x(), rect.y(), rect.right() - 1, rect.bottom() - 1);
-
- SkPaint fill_paint;
- fill_paint.setStyle(SkPaint::kFill_Style);
- fill_paint.setColor(text.background_color);
- canvas->drawRect(bounds, fill_paint);
-
- if (text.is_text_area) {
- // Draw text area border: 1px solid black
- SkPaint stroke_paint;
- fill_paint.setStyle(SkPaint::kStroke_Style);
- fill_paint.setColor(SK_ColorBLACK);
- canvas->drawRect(bounds, fill_paint);
- } else {
- // Draw text input and listbox inset border
- // Text Input: 2px inset #eee
- // Listbox: 1px inset #808080
- SkColor kLightColor = text.is_listbox ?
- SkColorSetRGB(0x80, 0x80, 0x80) : SkColorSetRGB(0xee, 0xee, 0xee);
- SkColor kDarkColor = text.is_listbox ?
- SkColorSetRGB(0x2c, 0x2c, 0x2c) : SkColorSetRGB(0x9a, 0x9a, 0x9a);
- int kBorderWidth = text.is_listbox ? 1 : 2;
-
- SkPaint dark_paint;
- dark_paint.setAntiAlias(true);
- dark_paint.setStyle(SkPaint::kFill_Style);
- dark_paint.setColor(kDarkColor);
-
- SkPaint light_paint;
- light_paint.setAntiAlias(true);
- light_paint.setStyle(SkPaint::kFill_Style);
- light_paint.setColor(kLightColor);
-
- int left = rect.x();
- int top = rect.y();
- int right = rect.right();
- int bottom = rect.bottom();
-
- SkPath path;
- path.incReserve(4);
-
- // Top
- path.moveTo(SkIntToScalar(left), SkIntToScalar(top));
- path.lineTo(SkIntToScalar(left + kBorderWidth),
- SkIntToScalar(top + kBorderWidth));
- path.lineTo(SkIntToScalar(right - kBorderWidth),
- SkIntToScalar(top + kBorderWidth));
- path.lineTo(SkIntToScalar(right), SkIntToScalar(top));
- canvas->drawPath(path, dark_paint);
-
- // Bottom
- path.reset();
- path.moveTo(SkIntToScalar(left + kBorderWidth),
- SkIntToScalar(bottom - kBorderWidth));
- path.lineTo(SkIntToScalar(left), SkIntToScalar(bottom));
- path.lineTo(SkIntToScalar(right), SkIntToScalar(bottom));
- path.lineTo(SkIntToScalar(right - kBorderWidth),
- SkIntToScalar(bottom - kBorderWidth));
- canvas->drawPath(path, light_paint);
-
- // Left
- path.reset();
- path.moveTo(SkIntToScalar(left), SkIntToScalar(top));
- path.lineTo(SkIntToScalar(left), SkIntToScalar(bottom));
- path.lineTo(SkIntToScalar(left + kBorderWidth),
- SkIntToScalar(bottom - kBorderWidth));
- path.lineTo(SkIntToScalar(left + kBorderWidth),
- SkIntToScalar(top + kBorderWidth));
- canvas->drawPath(path, dark_paint);
-
- // Right
- path.reset();
- path.moveTo(SkIntToScalar(right - kBorderWidth),
- SkIntToScalar(top + kBorderWidth));
- path.lineTo(SkIntToScalar(right - kBorderWidth), SkIntToScalar(bottom));
- path.lineTo(SkIntToScalar(right), SkIntToScalar(bottom));
- path.lineTo(SkIntToScalar(right), SkIntToScalar(top));
- canvas->drawPath(path, light_paint);
- }
-}
-
-void NativeThemeAndroid::PaintMenuList(
- SkCanvas* canvas,
- State state,
- const gfx::Rect& rect,
- const MenuListExtraParams& menu_list) const {
- // If a border radius is specified, we let the WebCore paint the background
- // and the border of the control.
- if (!menu_list.has_border_radius) {
- ButtonExtraParams button = { 0 };
- button.background_color = menu_list.background_color;
- button.has_border = menu_list.has_border;
- PaintButton(canvas, state, rect, button);
- }
-
- SkPaint paint;
- paint.setColor(SK_ColorBLACK);
- paint.setAntiAlias(true);
- paint.setStyle(SkPaint::kFill_Style);
-
- SkPath path;
- path.moveTo(menu_list.arrow_x, menu_list.arrow_y - 3);
- path.rLineTo(6, 0);
- path.rLineTo(-3, 6);
- path.close();
- canvas->drawPath(path, paint);
-}
-
-void NativeThemeAndroid::PaintSliderTrack(
- SkCanvas* canvas,
- State state,
- const gfx::Rect& rect,
- const SliderExtraParams& slider) const {
- int kMidX = rect.x() + rect.width() / 2;
- int kMidY = rect.y() + rect.height() / 2;
-
- SkPaint paint;
- paint.setColor(kSliderTrackBackgroundColor);
-
- SkRect skrect;
- if (slider.vertical) {
- skrect.set(std::max(rect.x(), kMidX - 2),
- rect.y(),
- std::min(rect.right(), kMidX + 2),
- rect.bottom());
- } else {
- skrect.set(rect.x(),
- std::max(rect.y(), kMidY - 2),
- rect.right(),
- std::min(rect.bottom(), kMidY + 2));
- }
- canvas->drawRect(skrect, paint);
-}
-
-void NativeThemeAndroid::PaintSliderThumb(
- SkCanvas* canvas,
- State state,
- const gfx::Rect& rect,
- const SliderExtraParams& slider) const {
- bool hovered = (state == kHovered) || slider.in_drag;
- int kMidX = rect.x() + rect.width() / 2;
- int kMidY = rect.y() + rect.height() / 2;
-
- SkPaint paint;
- paint.setColor(hovered ? SK_ColorWHITE : kSliderThumbLightGrey);
-
- SkIRect skrect;
- if (slider.vertical)
- skrect.set(rect.x(), rect.y(), kMidX + 1, rect.bottom());
- else
- skrect.set(rect.x(), rect.y(), rect.right(), kMidY + 1);
-
- canvas->drawIRect(skrect, paint);
-
- paint.setColor(hovered ? kSliderThumbLightGrey : kSliderThumbDarkGrey);
-
- if (slider.vertical)
- skrect.set(kMidX + 1, rect.y(), rect.right(), rect.bottom());
- else
- skrect.set(rect.x(), kMidY + 1, rect.right(), rect.bottom());
-
- canvas->drawIRect(skrect, paint);
-
- paint.setColor(kSliderThumbBorderDarkGrey);
- DrawBox(canvas, rect, paint);
-
- if (rect.height() > 10 && rect.width() > 10) {
- DrawHorizLine(canvas, kMidX - 2, kMidX + 2, kMidY, paint);
- DrawHorizLine(canvas, kMidX - 2, kMidX + 2, kMidY - 3, paint);
- DrawHorizLine(canvas, kMidX - 2, kMidX + 2, kMidY + 3, paint);
- }
-}
-
-void NativeThemeAndroid::PaintInnerSpinButton(
- SkCanvas* canvas,
- State state,
- const gfx::Rect& rect,
- const InnerSpinButtonExtraParams& spin_button) const {
- if (spin_button.read_only)
- state = kDisabled;
-
- State north_state = state;
- State south_state = state;
- if (spin_button.spin_up)
- south_state = south_state != kDisabled ? kNormal : kDisabled;
- else
- north_state = north_state != kDisabled ? kNormal : kDisabled;
-
- gfx::Rect half = rect;
- half.set_height(rect.height() / 2);
- PaintArrowButton(canvas, half, kScrollbarUpArrow, north_state);
-
- half.set_y(rect.y() + rect.height() / 2);
- PaintArrowButton(canvas, half, kScrollbarDownArrow, south_state);
-}
-
-void NativeThemeAndroid::PaintProgressBar(
- SkCanvas* canvas,
- State state,
- const gfx::Rect& rect,
- const ProgressBarExtraParams& progress_bar) const {
- ResourceBundle& rb = ResourceBundle::GetSharedInstance();
- gfx::ImageSkia* bar_image = rb.GetImageSkiaNamed(IDR_PROGRESS_BAR);
- gfx::ImageSkia* left_border_image = rb.GetImageSkiaNamed(
- IDR_PROGRESS_BORDER_LEFT);
- gfx::ImageSkia* right_border_image = rb.GetImageSkiaNamed(
- IDR_PROGRESS_BORDER_RIGHT);
-
- float tile_scale = static_cast<float>(rect.height()) /
- bar_image->height();
-
- int new_tile_width = static_cast<int>(bar_image->width() * tile_scale);
- float tile_scale_x = static_cast<float>(new_tile_width) /
- bar_image->width();
-
- DrawTiledImage(canvas, *bar_image, 0, 0, tile_scale_x, tile_scale,
- rect.x(), rect.y(), rect.width(), rect.height());
-
- if (progress_bar.value_rect_width) {
- gfx::ImageSkia* value_image = rb.GetImageSkiaNamed(IDR_PROGRESS_VALUE);
-
- new_tile_width = static_cast<int>(value_image->width() * tile_scale);
- tile_scale_x = static_cast<float>(new_tile_width) /
- value_image->width();
-
- DrawTiledImage(canvas, *value_image, 0, 0, tile_scale_x, tile_scale,
- progress_bar.value_rect_x,
- progress_bar.value_rect_y,
- progress_bar.value_rect_width,
- progress_bar.value_rect_height);
- }
-
- int dest_left_border_width = static_cast<int>(left_border_image->width() *
- tile_scale);
- DrawImageInt(canvas, *left_border_image, 0, 0, left_border_image->width(),
- left_border_image->height(), rect.x(), rect.y(), dest_left_border_width,
- rect.height());
-
- int dest_right_border_width = static_cast<int>(right_border_image->width() *
- tile_scale);
- int dest_x = rect.right() - dest_right_border_width;
- DrawImageInt(canvas, *right_border_image, 0, 0, right_border_image->width(),
- right_border_image->height(), dest_x, rect.y(), dest_right_border_width,
- rect.height());
-}
-
-bool NativeThemeAndroid::IntersectsClipRectInt(SkCanvas* canvas,
- int x,
- int y,
- int w,
- int h) const {
- SkRect clip;
- return canvas->getClipBounds(&clip) &&
- clip.intersect(SkIntToScalar(x), SkIntToScalar(y), SkIntToScalar(x + w),
- SkIntToScalar(y + h));
-}
-
-void NativeThemeAndroid::DrawImageInt(SkCanvas* sk_canvas,
- const gfx::ImageSkia& image,
- int src_x,
- int src_y,
- int src_w,
- int src_h,
- int dest_x,
- int dest_y,
- int dest_w,
- int dest_h) const {
- // TODO(pkotwicz): Do something better and don't infer device
- // scale factor from canvas scale.
- SkMatrix m = sk_canvas->getTotalMatrix();
- ui::ScaleFactor device_scale_factor = ui::GetScaleFactorFromScale(
- SkScalarAbs(m.getScaleX()));
- scoped_ptr<gfx::Canvas> canvas(gfx::Canvas::CreateCanvasWithoutScaling(
- sk_canvas, device_scale_factor));
- canvas->DrawImageInt(image, src_x, src_y, src_w, src_h,
- dest_x, dest_y, dest_w, dest_h, true);
-}
-
-void NativeThemeAndroid::DrawTiledImage(SkCanvas* sk_canvas,
- const gfx::ImageSkia& image,
- int src_x,
- int src_y,
- float tile_scale_x,
- float tile_scale_y,
- int dest_x,
- int dest_y,
- int w,
- int h) const {
- // TODO(pkotwicz): Do something better and don't infer device
- // scale factor from canvas scale.
- SkMatrix m = sk_canvas->getTotalMatrix();
- ui::ScaleFactor device_scale_factor = ui::GetScaleFactorFromScale(
- SkScalarAbs(m.getScaleX()));
- scoped_ptr<gfx::Canvas> canvas(gfx::Canvas::CreateCanvasWithoutScaling(
- sk_canvas, device_scale_factor));
- canvas->TileImageInt(image, src_x, src_y, tile_scale_x,
- tile_scale_y, dest_x, dest_y, w, h);
-}
-
-SkColor NativeThemeAndroid::SaturateAndBrighten(
- SkScalar* hsv,
- SkScalar saturate_amount,
- SkScalar brighten_amount) const {
- SkScalar color[3];
- color[0] = hsv[0];
- color[1] = Clamp(hsv[1] + saturate_amount, 0.0, 1.0);
- color[2] = Clamp(hsv[2] + brighten_amount, 0.0, 1.0);
- return SkHSVToColor(color);
-}
-
-SkScalar NativeThemeAndroid::Clamp(SkScalar value,
- SkScalar min,
- SkScalar max) const {
- return std::min(std::max(value, min), max);
-}
-
-void NativeThemeAndroid::DrawVertLine(SkCanvas* canvas,
- int x,
- int y1,
- int y2,
- const SkPaint& paint) const {
- SkIRect skrect;
- skrect.set(x, y1, x + 1, y2 + 1);
- canvas->drawIRect(skrect, paint);
-}
-
-void NativeThemeAndroid::DrawHorizLine(SkCanvas* canvas,
- int x1,
- int x2,
- int y,
- const SkPaint& paint) const {
- SkIRect skrect;
- skrect.set(x1, y, x2 + 1, y + 1);
- canvas->drawIRect(skrect, paint);
-}
-
-void NativeThemeAndroid::DrawBox(SkCanvas* canvas,
- const gfx::Rect& rect,
- const SkPaint& paint) const {
- int right = rect.x() + rect.width() - 1;
- int bottom = rect.y() + rect.height() - 1;
- DrawHorizLine(canvas, rect.x(), right, rect.y(), paint);
- DrawVertLine(canvas, right, rect.y(), bottom, paint);
- DrawHorizLine(canvas, rect.x(), right, bottom, paint);
- DrawVertLine(canvas, rect.x(), rect.y(), bottom, paint);
-}
-
-SkColor NativeThemeAndroid::OutlineColor(SkScalar* hsv1, SkScalar* hsv2) const {
- SkScalar min_diff = Clamp((hsv1[1] + hsv2[1]) * 1.2, 0.28, 0.5);
- SkScalar diff = Clamp(fabs(hsv1[2] - hsv2[2]) / 2, min_diff, 0.5);
-
- if (hsv1[2] + hsv2[2] > 1.0)
- diff = -diff;
-
- return SaturateAndBrighten(hsv2, -0.2, diff);
-}
-
} // namespace ui
« no previous file with comments | « ui/base/native_theme/native_theme_android.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698