| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "ui/native_theme/native_theme_base.h" | 5 #include "ui/native_theme/native_theme_base.h" |
| 6 | 6 |
| 7 #include <limits> | 7 #include <limits> |
| 8 | 8 |
| 9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| (...skipping 455 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 466 paint); | 466 paint); |
| 467 DrawVertLine(canvas, | 467 DrawVertLine(canvas, |
| 468 midx + inter_grippy_offset, | 468 midx + inter_grippy_offset, |
| 469 midy - grippy_half_width, | 469 midy - grippy_half_width, |
| 470 midy + grippy_half_width, | 470 midy + grippy_half_width, |
| 471 paint); | 471 paint); |
| 472 } | 472 } |
| 473 } | 473 } |
| 474 } | 474 } |
| 475 | 475 |
| 476 bool NativeThemeBase::IsNewCheckboxStyleEnabled(SkCanvas* canvas) const { | |
| 477 // The new style is now the default. | |
| 478 // TODO(rbyers): Remove this flag once we're sure the new behavior is fine. | |
| 479 // http://crbug.com/133991 | |
| 480 if (!CommandLine::ForCurrentProcess()->HasSwitch( | |
| 481 switches::kOldCheckboxStyle)) | |
| 482 return true; | |
| 483 | |
| 484 return false; | |
| 485 } | |
| 486 | |
| 487 void NativeThemeBase::PaintCheckbox(SkCanvas* canvas, | 476 void NativeThemeBase::PaintCheckbox(SkCanvas* canvas, |
| 488 State state, | 477 State state, |
| 489 const gfx::Rect& rect, | 478 const gfx::Rect& rect, |
| 490 const ButtonExtraParams& button) const { | 479 const ButtonExtraParams& button) const { |
| 491 if (IsNewCheckboxStyleEnabled(canvas)) { | 480 SkRect skrect = PaintCheckboxRadioCommon(canvas, state, rect, |
| 492 PaintCheckboxNew(canvas, state, rect, button); | 481 SkIntToScalar(2)); |
| 493 return; | 482 if (!skrect.isEmpty()) { |
| 483 // Draw the checkmark / dash. |
| 484 SkPaint paint; |
| 485 paint.setAntiAlias(true); |
| 486 paint.setStyle(SkPaint::kStroke_Style); |
| 487 if (state == kDisabled) |
| 488 paint.setColor(kCheckboxStrokeDisabledColor); |
| 489 else |
| 490 paint.setColor(kCheckboxStrokeColor); |
| 491 if (button.indeterminate) { |
| 492 SkPath dash; |
| 493 dash.moveTo(skrect.x() + skrect.width() * 0.16, |
| 494 (skrect.y() + skrect.bottom()) / 2); |
| 495 dash.rLineTo(skrect.width() * 0.68, 0); |
| 496 paint.setStrokeWidth(SkFloatToScalar(skrect.height() * 0.2)); |
| 497 canvas->drawPath(dash, paint); |
| 498 } else if (button.checked) { |
| 499 SkPath check; |
| 500 check.moveTo(skrect.x() + skrect.width() * 0.2, |
| 501 skrect.y() + skrect.height() * 0.5); |
| 502 check.rLineTo(skrect.width() * 0.2, skrect.height() * 0.2); |
| 503 paint.setStrokeWidth(SkFloatToScalar(skrect.height() * 0.23)); |
| 504 check.lineTo(skrect.right() - skrect.width() * 0.2, |
| 505 skrect.y() + skrect.height() * 0.2); |
| 506 canvas->drawPath(check, paint); |
| 507 } |
| 494 } | 508 } |
| 495 | |
| 496 ResourceBundle& rb = ResourceBundle::GetSharedInstance(); | |
| 497 gfx::ImageSkia* image = NULL; | |
| 498 if (button.indeterminate) { | |
| 499 image = state == kDisabled ? | |
| 500 rb.GetImageSkiaNamed(IDR_CHECKBOX_DISABLED_INDETERMINATE) : | |
| 501 rb.GetImageSkiaNamed(IDR_CHECKBOX_INDETERMINATE); | |
| 502 } else if (button.checked) { | |
| 503 image = state == kDisabled ? | |
| 504 rb.GetImageSkiaNamed(IDR_CHECKBOX_DISABLED_ON) : | |
| 505 rb.GetImageSkiaNamed(IDR_CHECKBOX_ON); | |
| 506 } else { | |
| 507 image = state == kDisabled ? | |
| 508 rb.GetImageSkiaNamed(IDR_CHECKBOX_DISABLED_OFF) : | |
| 509 rb.GetImageSkiaNamed(IDR_CHECKBOX_OFF); | |
| 510 } | |
| 511 | |
| 512 gfx::Rect bounds = rect; | |
| 513 bounds.ClampToCenteredSize(gfx::Size(image->width(), image->height())); | |
| 514 DrawImageInt(canvas, *image, 0, 0, image->width(), image->height(), | |
| 515 bounds.x(), bounds.y(), bounds.width(), bounds.height()); | |
| 516 } | 509 } |
| 517 | 510 |
| 518 // Draws the common elements of checkboxes and radio buttons. | 511 // Draws the common elements of checkboxes and radio buttons. |
| 519 // Returns the rectangle within which any additional decorations should be | 512 // Returns the rectangle within which any additional decorations should be |
| 520 // drawn, or empty if none. | 513 // drawn, or empty if none. |
| 521 SkRect NativeThemeBase::PaintCheckboxRadioNewCommon( | 514 SkRect NativeThemeBase::PaintCheckboxRadioCommon( |
| 522 SkCanvas* canvas, | 515 SkCanvas* canvas, |
| 523 State state, | 516 State state, |
| 524 const gfx::Rect& rect, | 517 const gfx::Rect& rect, |
| 525 const SkScalar borderRadius) const { | 518 const SkScalar borderRadius) const { |
| 526 | 519 |
| 527 SkRect skrect = gfx::RectToSkRect(rect); | 520 SkRect skrect = gfx::RectToSkRect(rect); |
| 528 | 521 |
| 529 // Use the largest square that fits inside the provided rectangle. | 522 // Use the largest square that fits inside the provided rectangle. |
| 530 // No other browser seems to support non-square widget, so accidentally | 523 // No other browser seems to support non-square widget, so accidentally |
| 531 // having non-square sizes is common (eg. amazon and webkit dev tools). | 524 // having non-square sizes is common (eg. amazon and webkit dev tools). |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 600 paint.setStyle(SkPaint::kStroke_Style); | 593 paint.setStyle(SkPaint::kStroke_Style); |
| 601 paint.setStrokeWidth(SkIntToScalar(1)); | 594 paint.setStrokeWidth(SkIntToScalar(1)); |
| 602 skrect.inset(SkFloatToScalar(.5f), SkFloatToScalar(.5f)); | 595 skrect.inset(SkFloatToScalar(.5f), SkFloatToScalar(.5f)); |
| 603 canvas->drawRoundRect(skrect, borderRadius, borderRadius, paint); | 596 canvas->drawRoundRect(skrect, borderRadius, borderRadius, paint); |
| 604 | 597 |
| 605 // Return the rectangle excluding the drop shadow for drawing any additional | 598 // Return the rectangle excluding the drop shadow for drawing any additional |
| 606 // decorations. | 599 // decorations. |
| 607 return skrect; | 600 return skrect; |
| 608 } | 601 } |
| 609 | 602 |
| 610 void NativeThemeBase::PaintCheckboxNew(SkCanvas* canvas, | |
| 611 State state, | |
| 612 const gfx::Rect& rect, | |
| 613 const ButtonExtraParams& button) const { | |
| 614 SkRect skrect = PaintCheckboxRadioNewCommon(canvas, state, rect, | |
| 615 SkIntToScalar(2)); | |
| 616 if (!skrect.isEmpty()) { | |
| 617 // Draw the checkmark / dash. | |
| 618 SkPaint paint; | |
| 619 paint.setAntiAlias(true); | |
| 620 paint.setStyle(SkPaint::kStroke_Style); | |
| 621 if (state == kDisabled) | |
| 622 paint.setColor(kCheckboxStrokeDisabledColor); | |
| 623 else | |
| 624 paint.setColor(kCheckboxStrokeColor); | |
| 625 if (button.indeterminate) { | |
| 626 SkPath dash; | |
| 627 dash.moveTo(skrect.x() + skrect.width() * 0.16, | |
| 628 (skrect.y() + skrect.bottom()) / 2); | |
| 629 dash.rLineTo(skrect.width() * 0.68, 0); | |
| 630 paint.setStrokeWidth(SkFloatToScalar(skrect.height() * 0.2)); | |
| 631 canvas->drawPath(dash, paint); | |
| 632 } else if (button.checked) { | |
| 633 SkPath check; | |
| 634 check.moveTo(skrect.x() + skrect.width() * 0.2, | |
| 635 skrect.y() + skrect.height() * 0.5); | |
| 636 check.rLineTo(skrect.width() * 0.2, skrect.height() * 0.2); | |
| 637 paint.setStrokeWidth(SkFloatToScalar(skrect.height() * 0.23)); | |
| 638 check.lineTo(skrect.right() - skrect.width() * 0.2, | |
| 639 skrect.y() + skrect.height() * 0.2); | |
| 640 canvas->drawPath(check, paint); | |
| 641 } | |
| 642 } | |
| 643 } | |
| 644 | |
| 645 void NativeThemeBase::PaintRadio(SkCanvas* canvas, | 603 void NativeThemeBase::PaintRadio(SkCanvas* canvas, |
| 646 State state, | 604 State state, |
| 647 const gfx::Rect& rect, | 605 const gfx::Rect& rect, |
| 648 const ButtonExtraParams& button) const { | 606 const ButtonExtraParams& button) const { |
| 649 if (IsNewCheckboxStyleEnabled(canvas)) { | |
| 650 PaintRadioNew(canvas, state, rect, button); | |
| 651 return; | |
| 652 } | |
| 653 | |
| 654 ResourceBundle& rb = ResourceBundle::GetSharedInstance(); | |
| 655 gfx::ImageSkia* image = NULL; | |
| 656 if (state == kDisabled) { | |
| 657 image = button.checked ? | |
| 658 rb.GetImageSkiaNamed(IDR_RADIO_DISABLED_ON) : | |
| 659 rb.GetImageSkiaNamed(IDR_RADIO_DISABLED_OFF); | |
| 660 } else { | |
| 661 image = button.checked ? | |
| 662 rb.GetImageSkiaNamed(IDR_RADIO_ON) : | |
| 663 rb.GetImageSkiaNamed(IDR_RADIO_OFF); | |
| 664 } | |
| 665 | |
| 666 gfx::Rect bounds = rect; | |
| 667 bounds.ClampToCenteredSize(gfx::Size(image->width(), image->height())); | |
| 668 DrawImageInt(canvas, *image, 0, 0, image->width(), image->height(), | |
| 669 bounds.x(), bounds.y(), bounds.width(), bounds.height()); | |
| 670 } | |
| 671 | |
| 672 void NativeThemeBase::PaintRadioNew(SkCanvas* canvas, | |
| 673 State state, | |
| 674 const gfx::Rect& rect, | |
| 675 const ButtonExtraParams& button) const { | |
| 676 | 607 |
| 677 // Most of a radio button is the same as a checkbox, except the the rounded | 608 // Most of a radio button is the same as a checkbox, except the the rounded |
| 678 // square is a circle (i.e. border radius >= 100%). | 609 // square is a circle (i.e. border radius >= 100%). |
| 679 const SkScalar radius = SkFloatToScalar( | 610 const SkScalar radius = SkFloatToScalar( |
| 680 static_cast<float>(std::max(rect.width(), rect.height())) / 2); | 611 static_cast<float>(std::max(rect.width(), rect.height())) / 2); |
| 681 SkRect skrect = PaintCheckboxRadioNewCommon(canvas, state, rect, radius); | 612 SkRect skrect = PaintCheckboxRadioCommon(canvas, state, rect, radius); |
| 682 if (!skrect.isEmpty() && button.checked) { | 613 if (!skrect.isEmpty() && button.checked) { |
| 683 // Draw the dot. | 614 // Draw the dot. |
| 684 SkPaint paint; | 615 SkPaint paint; |
| 685 paint.setAntiAlias(true); | 616 paint.setAntiAlias(true); |
| 686 paint.setStyle(SkPaint::kFill_Style); | 617 paint.setStyle(SkPaint::kFill_Style); |
| 687 if (state == kDisabled) | 618 if (state == kDisabled) |
| 688 paint.setColor(kRadioDotDisabledColor); | 619 paint.setColor(kRadioDotDisabledColor); |
| 689 else | 620 else |
| 690 paint.setColor(kRadioDotColor); | 621 paint.setColor(kRadioDotColor); |
| 691 skrect.inset(skrect.width() * 0.25, skrect.height() * 0.25); | 622 skrect.inset(skrect.width() * 0.25, skrect.height() * 0.25); |
| (...skipping 443 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1135 SkScalar min_diff = Clamp((hsv1[1] + hsv2[1]) * 1.2f, 0.28f, 0.5f); | 1066 SkScalar min_diff = Clamp((hsv1[1] + hsv2[1]) * 1.2f, 0.28f, 0.5f); |
| 1136 SkScalar diff = Clamp(fabs(hsv1[2] - hsv2[2]) / 2, min_diff, 0.5f); | 1067 SkScalar diff = Clamp(fabs(hsv1[2] - hsv2[2]) / 2, min_diff, 0.5f); |
| 1137 | 1068 |
| 1138 if (hsv1[2] + hsv2[2] > 1.0) | 1069 if (hsv1[2] + hsv2[2] > 1.0) |
| 1139 diff = -diff; | 1070 diff = -diff; |
| 1140 | 1071 |
| 1141 return SaturateAndBrighten(hsv2, -0.2f, diff); | 1072 return SaturateAndBrighten(hsv2, -0.2f, diff); |
| 1142 } | 1073 } |
| 1143 | 1074 |
| 1144 } // namespace ui | 1075 } // namespace ui |
| OLD | NEW |