Chromium Code Reviews| 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; |
| + } |
| +} |