Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 55468be6 authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Add setFontVariationOverride instead of changing...

Merge "Add setFontVariationOverride instead of changing setFontVariationSettings behavior" into main
parents 61049c86 2d312c8e
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -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);
+71 −0
Original line number Diff line number Diff line
@@ -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
@@ -2173,6 +2182,68 @@ public class Paint {
        return true;
    }

    /**
     * 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.
     *