/** * Copyright (c) 2015-present, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. */ package com.facebook.react.flat; import javax.annotation.Nullable; import android.graphics.Color; import android.graphics.Typeface; import android.text.TextPaint; import android.text.style.MetricAffectingSpan; /* package */ final class FontStylingSpan extends MetricAffectingSpan { /* package */ static final FontStylingSpan INSTANCE = new FontStylingSpan( Color.BLACK /* mTextColor */, 0 /* mBackgroundColor */, -1 /* mFontSize */, -1 /* mFontStyle */, -1 /* mFontWeight */, false /* mHasUnderline */, false /* mHasStrikeThrough */, null /* mFontFamily */, true /* mFrozen */); // text property private double mTextColor; private int mBackgroundColor; private boolean mHasUnderline; private boolean mHasStrikeThrough; // font properties private int mFontSize; private int mFontStyle; private int mFontWeight; private @Nullable String mFontFamily; // whether or not mutation is allowed. private boolean mFrozen; FontStylingSpan() { } private FontStylingSpan( double textColor, int backgroundColor, int fontSize, int fontStyle, int fontWeight, boolean hasUnderline, boolean hasStrikeThrough, @Nullable String fontFamily, boolean frozen) { mTextColor = textColor; mBackgroundColor = backgroundColor; mFontSize = fontSize; mFontStyle = fontStyle; mFontWeight = fontWeight; mHasUnderline = hasUnderline; mHasStrikeThrough = hasStrikeThrough; mFontFamily = fontFamily; mFrozen = frozen; } /* package */ FontStylingSpan mutableCopy() { return new FontStylingSpan( mTextColor, mBackgroundColor, mFontSize, mFontStyle, mFontWeight, mHasUnderline, mHasStrikeThrough, mFontFamily, false); } /* package */ boolean isFrozen() { return mFrozen; } /* package */ void freeze() { mFrozen = true; } /* package */ double getTextColor() { return mTextColor; } /* package */ void setTextColor(double textColor) { mTextColor = textColor; } /* package */ int getBackgroundColor() { return mBackgroundColor; } /* package */ void setBackgroundColor(int backgroundColor) { mBackgroundColor = backgroundColor; } /* package */ int getFontSize() { return mFontSize; } /* package */ void setFontSize(int fontSize) { mFontSize = fontSize; } /* package */ int getFontStyle() { return mFontStyle; } /* package */ void setFontStyle(int fontStyle) { mFontStyle = fontStyle; } /* package */ int getFontWeight() { return mFontWeight; } /* package */ void setFontWeight(int fontWeight) { mFontWeight = fontWeight; } /* package */ @Nullable String getFontFamily() { return mFontFamily; } /* package */ void setFontFamily(@Nullable String fontFamily) { mFontFamily = fontFamily; } /* package */ boolean hasUnderline() { return mHasUnderline; } /* package */ void setHasUnderline(boolean hasUnderline) { mHasUnderline = hasUnderline; } /* package */ boolean hasStrikeThrough() { return mHasStrikeThrough; } /* package */ void setHasStrikeThrough(boolean hasStrikeThrough) { mHasStrikeThrough = hasStrikeThrough; } @Override public void updateDrawState(TextPaint ds) { if (!Double.isNaN(mTextColor)) { ds.setColor((int) mTextColor); } ds.bgColor = mBackgroundColor; ds.setUnderlineText(mHasUnderline); ds.setStrikeThruText(mHasStrikeThrough); updateMeasureState(ds); } @Override public void updateMeasureState(TextPaint ds) { if (mFontSize != -1) { ds.setTextSize(mFontSize); } updateTypeface(ds); } private int getNewStyle(int oldStyle) { int newStyle = oldStyle; if (mFontStyle != -1) { newStyle = (newStyle & ~Typeface.ITALIC) | mFontStyle; } if (mFontWeight != -1) { newStyle = (newStyle & ~Typeface.BOLD) | mFontWeight; } return newStyle; } private void updateTypeface(TextPaint ds) { Typeface typeface = ds.getTypeface(); int oldStyle = (typeface == null) ? 0 : typeface.getStyle(); int newStyle = getNewStyle(oldStyle); if (oldStyle == newStyle && mFontFamily == null) { // nothing to do return; } if (mFontFamily != null) { typeface = TypefaceCache.getTypeface(mFontFamily, newStyle); } else { typeface = TypefaceCache.getTypeface(typeface, newStyle); } ds.setTypeface(typeface); } }