summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/api/current.txt2
-rw-r--r--graphics/java/android/graphics/Paint.java71
2 files changed, 73 insertions, 0 deletions
diff --git a/core/api/current.txt b/core/api/current.txt
index 6707c15de682..b7f7a7f9e779 100644
--- a/core/api/current.txt
+++ b/core/api/current.txt
@@ -16896,6 +16896,7 @@ package android.graphics {
method public android.graphics.Paint.FontMetricsInt getFontMetricsInt();
method @FlaggedApi("com.android.text.flags.fix_line_height_for_locale") public void getFontMetricsIntForLocale(@NonNull android.graphics.Paint.FontMetricsInt);
method public float getFontSpacing();
+ method @FlaggedApi("com.android.text.flags.typeface_redesign_readonly") @Nullable public String getFontVariationOverride();
method public String getFontVariationSettings();
method public int getHinting();
method public float getLetterSpacing();
@@ -16974,6 +16975,7 @@ package android.graphics {
method public void setFilterBitmap(boolean);
method public void setFlags(int);
method public void setFontFeatureSettings(String);
+ method @FlaggedApi("com.android.text.flags.typeface_redesign_readonly") public boolean setFontVariationOverride(@Nullable String);
method public boolean setFontVariationSettings(String);
method public void setHinting(int);
method public void setLetterSpacing(float);
diff --git a/graphics/java/android/graphics/Paint.java b/graphics/java/android/graphics/Paint.java
index 3378cc11d565..b332cf0d751f 100644
--- a/graphics/java/android/graphics/Paint.java
+++ b/graphics/java/android/graphics/Paint.java
@@ -19,6 +19,7 @@ package android.graphics;
import static com.android.text.flags.Flags.FLAG_DEPRECATE_ELEGANT_TEXT_HEIGHT_API;
import static com.android.text.flags.Flags.FLAG_FIX_LINE_HEIGHT_FOR_LOCALE;
import static com.android.text.flags.Flags.FLAG_LETTER_SPACING_JUSTIFICATION;
+import static com.android.text.flags.Flags.FLAG_TYPEFACE_REDESIGN_READONLY;
import static com.android.text.flags.Flags.FLAG_VERTICAL_TEXT_LAYOUT;
import android.annotation.ColorInt;
@@ -57,6 +58,7 @@ import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
+import java.util.List;
import java.util.Locale;
import java.util.Objects;
@@ -96,6 +98,7 @@ public class Paint {
private LocaleList mLocales;
private String mFontFeatureSettings;
private String mFontVariationSettings;
+ private String mFontVariationOverride;
private float mShadowLayerRadius;
private float mShadowLayerDx;
@@ -2140,6 +2143,12 @@ public class Paint {
* @see #getFontVariationSettings()
* @see FontVariationAxis
*/
+ // Add following API description once the setFontVariationOverride becomes public.
+ // This method generates new variation instance of the {@link Typeface} instance and set it to
+ // this object. Therefore, subsequent {@link #setTypeface(Typeface)} call will clear the font
+ // variation settings. Also, creating variation instance of the Typeface requires non trivial
+ // amount of time and memories, therefore consider using
+ // {@link #setFontVariationOverride(String, int)} for better performance.
public boolean setFontVariationSettings(String fontVariationSettings) {
final String settings = TextUtils.nullIfEmpty(fontVariationSettings);
if (settings == mFontVariationSettings
@@ -2174,6 +2183,68 @@ public class Paint {
}
/**
+ * Sets TrueType or OpenType font variation settings for overriding.
+ *
+ * The settings string is constructed from multiple pairs of axis tag and style values. The axis
+ * tag must contain four ASCII characters and must be wrapped with single quotes (U+0027) or
+ * double quotes (U+0022). Axis strings that are longer or shorter than four characters, or
+ * contain characters outside of U+0020..U+007E are invalid.
+ *
+ * If invalid font variation settings is provided, this method does nothing and returning false
+ * with printing error message to the logcat.
+ *
+ * Different from {@link #setFontVariationSettings(String)}, this overrides the font variation
+ * settings which is already assigned to the font instance. For example, if the underlying font
+ * is configured as {@code 'wght' 500, 'ital' 1}, and if the override is specified as
+ * {@code 'wght' 700, `wdth` 150}, then the effective font variation setting is
+ * {@code `wght' 700, 'ital' 1, 'wdth' 150}. The `wght` value is updated by override, 'ital'
+ * value is preserved because no overrides, and `wdth` value is added by override.
+ *
+ * @param fontVariationOverride font variation settings. You can pass null or empty string as
+ * no variation settings.
+ *
+ * @return true if the provided font variation settings is valid. Otherwise returns false.
+ *
+ * @see #getFontVariationSettings()
+ * @see #setFontVariationSettings(String)
+ * @see #getFontVariationOverride()
+ * @see FontVariationAxis
+ */
+ @FlaggedApi(FLAG_TYPEFACE_REDESIGN_READONLY)
+ public boolean setFontVariationOverride(@Nullable String fontVariationOverride) {
+ if (Objects.equals(fontVariationOverride, mFontVariationOverride)) {
+ return true;
+ }
+
+ List<FontVariationAxis> axes;
+ try {
+ axes = FontVariationAxis.fromFontVariationSettingsForList(fontVariationOverride);
+ } catch (IllegalArgumentException e) {
+ Log.i(TAG, "failed to parse font variation settings.", e);
+ return false;
+ }
+ long builderPtr = nCreateFontVariationBuilder(axes.size());
+ for (int i = 0; i < axes.size(); ++i) {
+ FontVariationAxis axis = axes.get(i);
+ nAddFontVariationToBuilder(
+ builderPtr, axis.getOpenTypeTagValue(), axis.getStyleValue());
+ }
+ nSetFontVariationOverride(mNativePaint, builderPtr);
+ mFontVariationOverride = fontVariationOverride;
+ return true;
+ }
+
+ /**
+ * Gets the current font variation override value.
+ *
+ * @return a current font variation override value.
+ */
+ @FlaggedApi(FLAG_TYPEFACE_REDESIGN_READONLY)
+ public @Nullable String getFontVariationOverride() {
+ return mFontVariationOverride;
+ }
+
+ /**
* Get the current value of start hyphen edit.
*
* The default value is 0 which is equivalent to {@link #START_HYPHEN_EDIT_NO_EDIT}.