Index: chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/content/TitleBitmapFactory.java |
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/content/TitleBitmapFactory.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/content/TitleBitmapFactory.java |
new file mode 100644 |
index 0000000000000000000000000000000000000000..dbf39e0adc8d9012b2d17235bc359b83babe5dcb |
--- /dev/null |
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/content/TitleBitmapFactory.java |
@@ -0,0 +1,152 @@ |
+// Copyright 2015 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+package org.chromium.chrome.browser.compositor.layouts.content; |
+ |
+import android.content.Context; |
+import android.content.res.Resources; |
+import android.graphics.Bitmap; |
+import android.graphics.Canvas; |
+import android.graphics.Paint; |
+import android.graphics.Paint.FontMetrics; |
+import android.graphics.drawable.BitmapDrawable; |
+import android.graphics.drawable.Drawable; |
+import android.text.Layout; |
+import android.text.TextPaint; |
+import android.text.TextUtils; |
+import android.util.FloatMath; |
+import android.util.Log; |
+import android.view.InflateException; |
+ |
+import org.chromium.chrome.R; |
+ |
+/** |
+ * A factory that creates text and favicon bitmaps. This is only relevant for the phone tab |
Nico
2015/07/22 20:15:51
I don't think this comment is true: This seems to
Jaekyun Seok (inactive)
2015/07/22 21:35:55
I will update this soon.
|
+ * switcher. |
+ */ |
+public class TitleBitmapFactory { |
+ private static final String TAG = "TitleBitmapFactory"; |
+ |
+ private static final float TITLE_WIDTH_PERCENTAGE = 1.f; |
+ |
+ private final int mMaxWidth; |
+ private final int mNullFaviconResourceId; |
+ |
+ private final TextPaint mTextPaint; |
+ private int mFaviconDimension; |
+ private final int mViewHeight; |
+ private final float mTextHeight; |
+ private final float mTextYOffset; |
+ |
+ /** |
+ * @param context The current Android's context. |
+ * @param incognito Whether the title are for incognito mode. |
+ * @param nullFaviconResourceId A drawable resource id of a default favicon. |
+ */ |
+ public TitleBitmapFactory(Context context, boolean incognito, int nullFaviconResourceId) { |
+ mNullFaviconResourceId = nullFaviconResourceId; |
+ |
+ Resources res = context.getResources(); |
+ int textColor = res.getColor(incognito ? R.color.compositor_tab_title_bar_text_incognito |
+ : R.color.compositor_tab_title_bar_text); |
+ int shadowColor = res.getColor(incognito ? R.color.compositor_tab_title_bar_shadow_incognito |
+ : R.color.compositor_tab_title_bar_shadow); |
+ int shadowXOffset = res.getDimensionPixelOffset(incognito |
+ ? R.dimen.compositor_tab_title_bar_shadow_x_offset_incognito |
+ : R.dimen.compositor_tab_title_bar_shadow_x_offset); |
+ int shadowYOffset = res.getDimensionPixelOffset(incognito |
+ ? R.dimen.compositor_tab_title_bar_shadow_y_offset_incognito |
+ : R.dimen.compositor_tab_title_bar_shadow_y_offset); |
+ float textSize = res.getDimensionPixelSize(R.dimen.compositor_tab_title_text_size); |
+ float adjustedTextSize = textSize * res.getConfiguration().fontScale; |
+ |
+ boolean fakeBoldText = res.getBoolean(R.bool.compositor_tab_title_fake_bold_text); |
+ |
+ mTextPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG); |
+ mTextPaint.setColor(textColor); |
+ if (shadowXOffset != 0 && shadowYOffset != 0) { |
+ mTextPaint.setShadowLayer(0.001f, shadowXOffset, shadowYOffset, shadowColor); |
+ } |
+ mTextPaint.setTextSize(adjustedTextSize); |
+ mTextPaint.setFakeBoldText(fakeBoldText); |
+ mTextPaint.density = res.getDisplayMetrics().density; |
+ |
+ FontMetrics textFontMetrics = mTextPaint.getFontMetrics(); |
+ mTextHeight = FloatMath.ceil(textFontMetrics.bottom - textFontMetrics.top); |
+ mTextYOffset = -textFontMetrics.top; |
+ |
+ mFaviconDimension = res.getDimensionPixelSize(R.dimen.compositor_tab_title_favicon_size); |
+ mViewHeight = (int) Math.max(mFaviconDimension, mTextHeight); |
+ |
+ int width = res.getDisplayMetrics().widthPixels; |
+ int height = res.getDisplayMetrics().heightPixels; |
+ mMaxWidth = (int) (TITLE_WIDTH_PERCENTAGE * Math.max(width, height)); |
+ |
+ // Set the favicon dimension here. |
+ mFaviconDimension = Math.min(mMaxWidth, mFaviconDimension); |
+ } |
+ |
+ /** |
+ * Generates the favicon bitmap. |
+ * |
+ * @param context Android's UI context. |
+ * @param favicon The favicon of the tab. |
+ * @return The Bitmap with the favicon. |
+ */ |
+ public Bitmap getFaviconBitmap(Context context, Bitmap favicon) { |
+ try { |
+ Bitmap b = Bitmap.createBitmap( |
+ mFaviconDimension, mFaviconDimension, Bitmap.Config.ARGB_8888); |
+ Canvas c = new Canvas(b); |
+ if (favicon == null) { |
+ Drawable drawable = context.getResources().getDrawable(mNullFaviconResourceId); |
+ if (drawable != null && drawable instanceof BitmapDrawable) { |
+ favicon = ((BitmapDrawable) drawable).getBitmap(); |
+ } |
+ } |
+ if (favicon != null) { |
+ c.drawBitmap(favicon, Math.round((mFaviconDimension - favicon.getWidth()) / 2.0f), |
+ Math.round((mFaviconDimension - favicon.getHeight()) / 2.0f), null); |
+ } |
+ return b; |
+ } catch (OutOfMemoryError ex) { |
+ Log.w(TAG, "OutOfMemoryError while building favicon texture."); |
+ } catch (InflateException ex) { |
+ Log.w(TAG, "InflateException while building favicon texture."); |
+ } |
+ |
+ return null; |
+ } |
+ |
+ /** |
+ * Generates the title bitmap. |
+ * |
+ * @param context Android's UI context. |
+ * @param title The title of the tab. |
+ * @return The Bitmap with the title. |
+ */ |
+ public Bitmap getTitleBitmap(Context context, String title) { |
+ try { |
+ boolean drawText = !TextUtils.isEmpty(title); |
+ int textWidth = |
+ drawText ? (int) FloatMath.ceil(Layout.getDesiredWidth(title, mTextPaint)) : 0; |
+ // Minimum 1 width bitmap to avoid createBitmap function's IllegalArgumentException, |
+ // when textWidth == 0. |
+ Bitmap b = Bitmap.createBitmap(Math.max(Math.min(mMaxWidth, textWidth), 1), mViewHeight, |
+ Bitmap.Config.ARGB_8888); |
+ Canvas c = new Canvas(b); |
+ if (drawText) { |
+ c.drawText(title, 0, title.length(), 0, |
+ Math.round((mViewHeight - mTextHeight) / 2.0f + mTextYOffset), mTextPaint); |
+ } |
+ return b; |
+ } catch (OutOfMemoryError ex) { |
+ Log.w(TAG, "OutOfMemoryError while building title texture."); |
+ } catch (InflateException ex) { |
+ Log.w(TAG, "InflateException while building title texture."); |
+ } |
+ |
+ return null; |
+ } |
+} |