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

Unified Diff: chrome/browser/chromeos/login/username_view.cc

Issue 5552003: Login pod visual enhancements. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/chrome/browser/chromeos/login
Patch Set: special frame for the unselected label Created 10 years 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
Index: chrome/browser/chromeos/login/username_view.cc
diff --git a/chrome/browser/chromeos/login/username_view.cc b/chrome/browser/chromeos/login/username_view.cc
index 526d7c4feb8b1d4883c848d6bfbb6f8a76742c26..18cbfedfe57f94c3b66a448e596bc2496228cda1 100644
--- a/chrome/browser/chromeos/login/username_view.cc
+++ b/chrome/browser/chromeos/login/username_view.cc
@@ -6,21 +6,73 @@
#include "base/logging.h"
#include "base/utf_string_conversions.h"
+#include "chrome/browser/chromeos/login/rounded_view.h"
#include "gfx/canvas.h"
#include "gfx/canvas_skia.h"
#include "gfx/rect.h"
+#include "third_party/skia/include/core/SkColorShader.h"
#include "third_party/skia/include/core/SkComposeShader.h"
#include "third_party/skia/include/effects/SkGradientShader.h"
+namespace chromeos {
+
namespace {
// Username label background color.
const SkColor kLabelBackgoundColor = 0x55000000;
// Holds margin to height ratio.
const double kMarginRatio = 1.0 / 3.0;
-} // namespace
-
-namespace chromeos {
+// Holds the frame width for the small shaped username view.
+const SkScalar kSmallShapeFrameWidth = SkIntToScalar(1);
+
+// Class that sets up half rounded rectangle (only the bottom corners are
+// rounded) as a clip region of the view.
+// For more info see the file "chrome/browser/chromeos/login/rounded_view.h".
+template<typename C>
+class HalfRoundedView : public RoundedView<C> {
+ public:
+ HalfRoundedView(const std::wstring &text, bool use_small_shape)
+ : RoundedView<C>(text), use_small_shape_(use_small_shape) {
+ }
+
+ protected:
+ // Overrides ViewFilter.
+ virtual SkPath GetClipPath() const {
+ if (!use_small_shape_) {
+ return RoundedView<C>::GetClipPath();
+ } else {
+ SkPath path;
+ gfx::Rect bounds = C::GetLocalBounds(false);
+ bounds.Inset(kSmallShapeFrameWidth, kSmallShapeFrameWidth,
+ kSmallShapeFrameWidth, kSmallShapeFrameWidth);
+ path.addRect(SkIntToScalar(bounds.x()),
+ SkIntToScalar(bounds.y()),
+ SkIntToScalar(bounds.x() + bounds.width()),
+ SkIntToScalar(bounds.y() + bounds.height()));
+ return path;
+ }
+ }
+
+ virtual void DrawFrame(gfx::Canvas* canvas) {
+ // No frame is needed.
+ }
+
+ virtual SkRect GetViewRect() const {
+ gfx::Rect bounds = C::GetLocalBounds(false);
+ SkRect view_rect;
+ // The rectangle will be intersected with the bounds, so the correct half
+ // of the round rectangle will be obtained.
+ view_rect.iset(bounds.x(), bounds.y() - bounds.width(),
+ bounds.x() + bounds.width(),
+ bounds.y() + bounds.height());
+ return view_rect;
+ }
+
+ private:
+ // Whether the shape for the smaller view should be used.
+ bool use_small_shape_;
+};
+} // namespace
UsernameView::UsernameView(const std::wstring& username)
: views::Label(username) {
}
@@ -33,66 +85,96 @@ void UsernameView::Paint(gfx::Canvas* canvas) {
DCHECK(bounds.size() ==
gfx::Size(text_image_->width(), text_image_->height()));
+ canvas->DrawBitmapInt(*text_image_, bounds.x(), bounds.y());
+}
+
+void UsernameView::PaintUsername(const gfx::Rect& bounds) {
+ margin_width_ = bounds.height() * kMarginRatio;
+ gfx::CanvasSkia canvas(bounds.width(), bounds.height(), false);
+ // Draw transparent background.
+ canvas.drawColor(0);
+
+ // Calculate needed space.
+ int flags = gfx::Canvas::TEXT_ALIGN_LEFT |
+ gfx::Canvas::TEXT_VALIGN_MIDDLE |
+ gfx::Canvas::NO_ELLIPSIS;
+ int text_height, text_width;
+ gfx::CanvasSkia::SizeStringInt(WideToUTF16Hack(GetText()), font(),
+ &text_width, &text_height,
+ flags);
+ text_width += margin_width_;
+
+ // Also leave the right margin.
+ bool use_fading_for_text = text_width + margin_width_ >= bounds.width();
+
// Only alpha channel counts.
SkColor gradient_colors[2];
gradient_colors[0] = 0xFFFFFFFF;
gradient_colors[1] = 0x00FFFFFF;
- int gradient_start = std::min(margin_width_ + text_width_,
- bounds.width() - bounds.height());
+ int gradient_start = use_fading_for_text ?
+ bounds.width() - bounds.height() - margin_width_ :
+ text_width;
+ int gradient_end = std::min(gradient_start + bounds.height(),
+ bounds.width() - margin_width_);
SkPoint gradient_borders[2];
gradient_borders[0].set(SkIntToScalar(gradient_start), SkIntToScalar(0));
- gradient_borders[1].set(SkIntToScalar(
- gradient_start + bounds.height()), SkIntToScalar(0));
+ gradient_borders[1].set(SkIntToScalar(gradient_end), SkIntToScalar(0));
SkShader* gradient_shader =
SkGradientShader::CreateLinear(gradient_borders, gradient_colors, NULL, 2,
SkShader::kClamp_TileMode, NULL);
- SkShader* image_shader = SkShader::CreateBitmapShader(
- *text_image_,
- SkShader::kRepeat_TileMode,
- SkShader::kRepeat_TileMode);
-
- SkXfermode* mode = SkXfermode::Create(SkXfermode::kSrcIn_Mode);
- SkShader* composite_shader = new SkComposeShader(gradient_shader,
- image_shader, mode);
- gradient_shader->unref();
- image_shader->unref();
-
- SkPaint paint;
- paint.setAntiAlias(true);
- paint.setFilterBitmap(true);
- paint.setShader(composite_shader)->unref();
- canvas->DrawRectInt(bounds.x(), bounds.y(),
- bounds.width(), bounds.height(), paint);
-}
-void UsernameView::PaintUsername(const gfx::Rect& bounds) {
- margin_width_ = bounds.height() * kMarginRatio;
- gfx::CanvasSkia canvas(bounds.width(), bounds.height(), false);
- // Draw background.
- canvas.drawColor(kLabelBackgoundColor);
- // Calculate needed space.
- int flags = gfx::Canvas::TEXT_ALIGN_LEFT |
- gfx::Canvas::TEXT_VALIGN_MIDDLE |
- gfx::Canvas::NO_ELLIPSIS;
- int text_height;
- gfx::CanvasSkia::SizeStringInt(WideToUTF16Hack(GetText()), font(),
- &text_width_, &text_height,
- flags);
- text_width_ = std::min(text_width_, bounds.width() - margin_width_);
+ if (!use_fading_for_text) {
+ // Draw the final background with the fading in the end.
+ SkShader* solid_shader = new SkColorShader(kLabelBackgoundColor);
+ SkXfermode* mode = SkXfermode::Create(SkXfermode::kSrcIn_Mode);
+ SkShader* composite_shader = new SkComposeShader(gradient_shader,
+ solid_shader, mode);
+ gradient_shader->unref();
+ solid_shader->unref();
+
+ SkPaint paint;
+ paint.setShader(composite_shader)->unref();
+ canvas.drawPaint(paint);
+ }
+
// Draw the text.
// Note, direct call of the DrawStringInt method produces the green dots
// along the text perimeter (when the label is place on the white background).
SkColor kInvisibleHaloColor = 0x00000000;
canvas.DrawStringWithHalo(GetText(), font(), GetColor(), kInvisibleHaloColor,
bounds.x() + margin_width_, bounds.y(),
- bounds.width() - margin_width_, bounds.height(),
+ bounds.width() - 2 * margin_width_, bounds.height(),
flags);
text_image_.reset(new SkBitmap(canvas.ExtractBitmap()));
- text_image_->buildMipMap(false);
+
+ if (use_fading_for_text) {
+ // Fade out only the text in the end. Use regualar background.
+ canvas.drawColor(kLabelBackgoundColor, SkXfermode::kSrc_Mode);
+ SkShader* image_shader = SkShader::CreateBitmapShader(
+ *text_image_,
+ SkShader::kRepeat_TileMode,
+ SkShader::kRepeat_TileMode);
+ SkXfermode* mode = SkXfermode::Create(SkXfermode::kSrcIn_Mode);
+ SkShader* composite_shader = new SkComposeShader(gradient_shader,
+ image_shader, mode);
+ gradient_shader->unref();
+ image_shader->unref();
+
+ SkPaint paint;
+ paint.setShader(composite_shader)->unref();
+ canvas.drawPaint(paint);
+ text_image_.reset(new SkBitmap(canvas.ExtractBitmap()));
+ }
+}
+
+UsernameView* UsernameView::CreateShapedUsernameView(
Nikita (slow) 2010/12/07 09:32:40 // static Should go after Paint to follow header
altimofeev 2010/12/10 10:25:25 Done.
+ const std::wstring& username,
+ bool use_small_shape) {
+ return new HalfRoundedView<UsernameView>(username, use_small_shape);
}
} // namespace chromeos

Powered by Google App Engine
This is Rietveld 408576698