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

Commit 2d312c8e authored by Seigo Nonaka's avatar Seigo Nonaka
Browse files

Add setFontVariationOverride instead of changing setFontVariationSettings behavior

Bug: 361260253
Test: CtsWidgetTestCases
Test: CtsTextTestCases
Test: CtsGraphicsTestCases
Test: minikin_tests
Flag: com.android.text.flags.typeface_redesign_readonly
Change-Id: I6a45314f28fea4237ec2d10bc24b5814325fd5b4
parent b9b0e164
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.
     *