Introduce set/getFontVariationSettings.

This is 2nd attempt of I249d464f8cdaa56017a987588b94ed685aadeb58.
The original CL was reverted due to conflicting with another CL submitted
before.
Nothing has changed except for following class name changes.

Here is the original commit message of reverted change.

This CL enables developers to specify axis values to the underlying
font collection. The specification of the font variation settings is
the same as the CSS font-variation-settings attribute in CSS working
draft as of 2016-11-30.

Code example: Here is an example to set width 100 and weight 1.5.

  TextView tv = (TextView) findViewById(R.id.textView);
  tv.setFontVariationSettings("'wdth' 100, 'wght' 1.5");

Bug: 33062398
Test: Manually done. Ran FrameworksGraphicsTests, CtsGraphicsTestCases
      and CtsWidgetTestCases

Change-Id: I9cdfbdecc87c995d805096883ef2652768c6c21e
This commit is contained in:
Seigo Nonaka
2016-11-30 14:04:21 -08:00
parent ac2d178578
commit 9ff994d988
16 changed files with 304 additions and 86 deletions

View File

@ -22,6 +22,7 @@ import android.util.Xml;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import android.annotation.Nullable;
import com.android.internal.annotations.VisibleForTesting;
import java.io.IOException;
@ -52,9 +53,12 @@ public class FontListParser {
// Note that a well-formed variation contains a four-character tag and a float as styleValue,
// with spacers in between. The tag is enclosd either by double quotes or single quotes.
@VisibleForTesting
public static FontConfig.Axis[] parseFontVariationSettings(String settings) {
String[] settingList = settings.split(",");
public static ArrayList<FontConfig.Axis> parseFontVariationSettings(@Nullable String settings) {
ArrayList<FontConfig.Axis> axisList = new ArrayList<>();
if (settings == null) {
return axisList;
}
String[] settingList = settings.split(",");
settingLoop:
for (String setting : settingList) {
int pos = 0;
@ -98,7 +102,7 @@ public class FontListParser {
tagString.charAt(3));
axisList.add(new FontConfig.Axis(tag, styleValue));
}
return axisList.toArray(new FontConfig.Axis[axisList.size()]);
return axisList;
}
@VisibleForTesting

View File

@ -71,6 +71,7 @@ public class Paint {
private LocaleList mLocales;
private String mFontFeatureSettings;
private String mFontVariationSettings;
private static final Object sCacheLock = new Object();
@ -1493,6 +1494,37 @@ public class Paint {
nSetFontFeatureSettings(mNativePaint, settings);
}
/**
* Returns the font variation settings.
*
* @return the paint's currently set font variation settings. Default is null.
*
* @see #setFontVariationSettings(String)
*/
public String getFontVariationSettings() {
return mFontVariationSettings;
}
/**
* Set font variation settings.
*
* @param settings font variation settings, e.g. "'wdth' 300, 'wght' 1.8"
*
* @see #getFontVariationSettings()
*
* @param settings the font variation settings. You can pass null or empty string as no
* variation settings.
*/
public void setFontVariationSettings(String settings) {
settings = TextUtils.nullIfEmpty(settings);
if (settings == mFontVariationSettings
|| (settings != null && settings.equals(mFontVariationSettings))) {
return;
}
mFontVariationSettings = settings;
setTypeface(Typeface.createFromTypefaceWithVariation(mTypeface, settings));
}
/**
* Get the current value of hyphen edit.
*

View File

@ -31,6 +31,7 @@ import android.util.Log;
import android.util.LongSparseArray;
import android.util.LruCache;
import android.util.SparseArray;
import android.graphics.FontListParser;
import com.android.internal.annotations.GuardedBy;
@ -349,6 +350,15 @@ public class Typeface {
return typeface;
}
/** @hide */
public static Typeface createFromTypefaceWithVariation(Typeface family,
String fontVariationSettings) {
final long ni = family == null ? 0 : family.native_instance;
ArrayList<FontConfig.Axis> axes =
FontListParser.parseFontVariationSettings(fontVariationSettings);
return new Typeface(nativeCreateFromTypefaceWithVariation(ni, axes));
}
/**
* Returns one of the default typeface objects, based on the specified style
*
@ -625,6 +635,8 @@ public class Typeface {
}
private static native long nativeCreateFromTypeface(long native_instance, int style);
private static native long nativeCreateFromTypefaceWithVariation(
long native_instance, List<FontConfig.Axis> axes);
private static native long nativeCreateWeightAlias(long native_instance, int weight);
private static native void nativeUnref(long native_instance);
private static native int nativeGetStyle(long native_instance);