mirror of
https://github.com/zhigang1992/react-native.git
synced 2026-04-03 17:45:12 +08:00
Summary: Nodes' default text color was NaN, which ended up being white on some devices. Differential Revision: D3638348
210 lines
4.8 KiB
Java
210 lines
4.8 KiB
Java
/**
|
|
* 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);
|
|
}
|
|
}
|