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

Unified Diff: chrome/common/extensions/extension_action.cc

Issue 341045: Fix up extension badge text drawing.... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 11 years, 2 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 | « chrome/browser/views/options/options_group_view.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/common/extensions/extension_action.cc
===================================================================
--- chrome/common/extensions/extension_action.cc (revision 30614)
+++ chrome/common/extensions/extension_action.cc (working copy)
@@ -5,14 +5,81 @@
#include "chrome/common/extensions/extension_action.h"
#include "app/gfx/canvas.h"
+#include "app/gfx/font.h"
#include "app/resource_bundle.h"
#include "base/gfx/rect.h"
+#include "base/string_util.h"
#include "chrome/app/chrome_dll_resource.h"
#include "grit/app_resources.h"
#include "third_party/skia/include/core/SkBitmap.h"
#include "third_party/skia/include/core/SkTypeface.h"
#include "third_party/skia/include/effects/SkGradientShader.h"
+namespace {
+
+// Different platforms need slightly different constants to look good.
+#if defined(OS_LINUX)
+const int kTextSize = 9;
+const int kBottomMargin = 0;
+const int kPadding = 2;
+const int kTopTextPadding = 0;
+const int kBadgeHeight = 11;
+const int kMaxTextWidth = 23;
+// The minimum width for center-aligning the badge.
+const int kCenterAlignThreshold = 20;
+#else
+const int kTextSize = 8;
+const int kBottomMargin = 5;
+const int kPadding = 2;
+// The padding between the top of the badge and the top of the text.
+const int kTopTextPadding = 1;
+const int kBadgeHeight = 11;
+const int kMaxTextWidth = 23;
+// The minimum width for center-aligning the badge.
+const int kCenterAlignThreshold = 20;
+#endif
+
+#if defined(OS_MACOSX)
+const char kPreferredTypeface[] = "Helvetica";
+#else
+const char kPreferredTypeface[] = "Arial";
+#endif
+
+SkPaint* GetTextPaint() {
+ static SkPaint* text_paint = NULL;
+ if (!text_paint) {
+ text_paint = new SkPaint;
+ text_paint->setAntiAlias(true);
+
+ text_paint->setTextAlign(SkPaint::kLeft_Align);
+ text_paint->setTextSize(SkIntToScalar(kTextSize));
+
+ SkTypeface* typeface = SkTypeface::CreateFromName(
+ kPreferredTypeface, SkTypeface::kBold);
+ // Skia doesn't do any font fallback---if the user is missing the font then
+ // typeface will be NULL. If we don't do manual fallback then we'll crash.
+ if (typeface) {
+ text_paint->setFakeBoldText(true);
+ } else {
+ // Fall back to the system font. We don't bold it because we aren't sure
+ // how it will look.
+ // For the most part this code path will only be hit on Linux systems
+ // that don't have Arial.
+ ResourceBundle& rb = ResourceBundle::GetSharedInstance();
+ const gfx::Font& base_font = rb.GetFont(ResourceBundle::BaseFont);
+ typeface = SkTypeface::CreateFromName(
+ WideToUTF8(base_font.FontName()).c_str(), SkTypeface::kNormal);
+ }
+
+ text_paint->setTypeface(typeface);
+ // |text_paint| adds its own ref. Release the ref from CreateFontName.
+ typeface->unref();
+ }
+ return text_paint;
+}
+
+} // namespace
+
const int ExtensionAction::kDefaultTabId = -1;
void ExtensionAction::ClearAllValuesForTab(int tab_id) {
@@ -41,48 +108,13 @@
if (SkColorGetA(background_color) == 0x00)
background_color = SkColorSetARGB(255, 218, 0, 24); // default badge color
- // Different platforms need slightly different constants to look good.
-#if defined(OS_LINUX)
- const int kTextSize = 9;
- const int kBottomMargin = 0;
- const int kPadding = 2;
- const int kTopTextPadding = 0;
- const int kBadgeHeight = 11;
- const int kMaxTextWidth = 23;
- // The minimum width for center-aligning the badge.
- const int kCenterAlignThreshold = 20;
-#else
- const int kTextSize = 8;
- const int kBottomMargin = 5;
- const int kPadding = 2;
- // The padding between the top of the badge and the top of the text.
- const int kTopTextPadding = 1;
- const int kBadgeHeight = 11;
- const int kMaxTextWidth = 23;
- // The minimum width for center-aligning the badge.
- const int kCenterAlignThreshold = 20;
-#endif
-
-#if defined(OS_MACOSX)
- const char kTypeFaceName[] = "Helvetica";
-#else
- const char kTypeFaceName[] = "Arial";
-#endif
-
canvas->save();
- SkTypeface* typeface = SkTypeface::CreateFromName(kTypeFaceName,
- SkTypeface::kBold);
- SkPaint text_paint;
- text_paint.setAntiAlias(true);
- text_paint.setColor(text_color);
- text_paint.setFakeBoldText(true);
- text_paint.setTextAlign(SkPaint::kLeft_Align);
- text_paint.setTextSize(SkIntToScalar(kTextSize));
- text_paint.setTypeface(typeface);
+ SkPaint* text_paint = GetTextPaint();
+ text_paint->setColor(text_color);
// Calculate text width. We clamp it to a max size.
- SkScalar text_width = text_paint.measureText(text.c_str(), text.size());
+ SkScalar text_width = text_paint->measureText(text.c_str(), text.size());
text_width = SkIntToScalar(
std::min(kMaxTextWidth, SkScalarFloor(text_width)));
@@ -137,6 +169,6 @@
canvas->drawText(text.c_str(), text.size(),
rect.fLeft + (rect.width() - text_width) / 2,
rect.fTop + kTextSize + kTopTextPadding,
- text_paint);
+ *text_paint);
canvas->restore();
}
« no previous file with comments | « chrome/browser/views/options/options_group_view.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698