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

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

Merge "Revive the behavior of setFontVariationSettings as of API35" into main

parents 75f7e9b6 7e9ec53f
Loading
Loading
Loading
Loading
+23 −5
Original line number Diff line number Diff line
@@ -18,7 +18,6 @@ package android.widget;
import static android.Manifest.permission.INTERACT_ACROSS_USERS_FULL;
import static android.content.res.Configuration.ORIENTATION_PORTRAIT;
import static android.graphics.Paint.NEW_FONT_VARIATION_MANAGEMENT;
import static android.view.ContentInfo.FLAG_CONVERT_TO_PLAIN_TEXT;
import static android.view.ContentInfo.SOURCE_AUTOFILL;
import static android.view.ContentInfo.SOURCE_CLIPBOARD;
@@ -5544,13 +5543,32 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
            return true;
        }
        final boolean useFontVariationStore = Flags.typefaceRedesignReadonly()
                && CompatChanges.isChangeEnabled(NEW_FONT_VARIATION_MANAGEMENT);
        boolean effective;
        if (useFontVariationStore) {
        if (Flags.typefaceRedesignReadonly()) {
            if (mFontWeightAdjustment != 0
                    && mFontWeightAdjustment != Configuration.FONT_WEIGHT_ADJUSTMENT_UNDEFINED) {
                mTextPaint.setFontVariationSettings(fontVariationSettings, mFontWeightAdjustment);
                List<FontVariationAxis> axes = FontVariationAxis.fromFontVariationSettingsForList(
                        fontVariationSettings);
                if (axes == null) {
                    return false;  // invalid format of the font variation settings.
                }
                boolean wghtAdjusted = false;
                for (int i = 0; i < axes.size(); ++i) {
                    FontVariationAxis axis = axes.get(i);
                    if (axis.getOpenTypeTagValue() == 0x77676874 /* wght */) {
                        axes.set(i, new FontVariationAxis("wght",
                                Math.clamp(axis.getStyleValue() + mFontWeightAdjustment,
                                        FontStyle.FONT_WEIGHT_MIN, FontStyle.FONT_WEIGHT_MAX)));
                        wghtAdjusted = true;
                    }
                }
                if (!wghtAdjusted) {
                    axes.add(new FontVariationAxis("wght",
                            Math.clamp(400 + mFontWeightAdjustment,
                                    FontStyle.FONT_WEIGHT_MIN, FontStyle.FONT_WEIGHT_MAX)));
                }
                mTextPaint.setFontVariationSettings(
                        FontVariationAxis.toFontVariationSettings(axes));
            } else {
                mTextPaint.setFontVariationSettings(fontVariationSettings);
            }
+4 −50
Original line number Diff line number Diff line
@@ -16,9 +16,9 @@

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_DEPRECATE_ELEGANT_TEXT_HEIGHT_API;
import static com.android.text.flags.Flags.FLAG_VERTICAL_TEXT_LAYOUT;

import android.annotation.ColorInt;
@@ -34,7 +34,6 @@ import android.app.compat.CompatChanges;
import android.compat.annotation.ChangeId;
import android.compat.annotation.EnabledSince;
import android.compat.annotation.UnsupportedAppUsage;
import android.graphics.fonts.FontStyle;
import android.graphics.fonts.FontVariationAxis;
import android.graphics.text.TextRunShaper;
import android.os.Build;
@@ -2099,14 +2098,6 @@ public class Paint {
        return mFontVariationSettings;
    }

    /**
     * A change ID for new font variation settings management.
     * @hide
     */
    @ChangeId
    @EnabledSince(targetSdkVersion = 36)
    public static final long NEW_FONT_VARIATION_MANAGEMENT = 361260253L;

    /**
     * Sets TrueType or OpenType font variation settings. The settings string is constructed from
     * multiple pairs of axis tag and style values. The axis tag must contain four ASCII characters
@@ -2136,16 +2127,12 @@ public class Paint {
     * </li>
     * </ul>
     *
     * <p>Note: If the application that targets API 35 or before, this function mutates the
     * underlying typeface instance.
     *
     * @param fontVariationSettings font variation settings. You can pass null or empty string as
     *                              no variation settings.
     *
     * @return If the application that targets API 36 or later and is running on devices API 36 or
     *         later, this function always returns true. Otherwise, this function returns true if
     *         the given settings is effective to at least one font file underlying this typeface.
     *         This function also returns true for empty settings string. Otherwise returns false.
     * @return true if the given settings is effective to at least one font file underlying this
     *         typeface. This function also returns true for empty settings string. Otherwise
     *         returns false
     *
     * @throws IllegalArgumentException If given string is not a valid font variation settings
     *                                  format
@@ -2154,39 +2141,6 @@ public class Paint {
     * @see FontVariationAxis
     */
    public boolean setFontVariationSettings(String fontVariationSettings) {
        return setFontVariationSettings(fontVariationSettings, 0 /* wght adjust */);
    }

    /**
     * Set font variation settings with weight adjustment
     * @hide
     */
    public boolean setFontVariationSettings(String fontVariationSettings, int wghtAdjust) {
        final boolean useFontVariationStore = Flags.typefaceRedesignReadonly()
                && CompatChanges.isChangeEnabled(NEW_FONT_VARIATION_MANAGEMENT);
        if (useFontVariationStore) {
            FontVariationAxis[] axes =
                    FontVariationAxis.fromFontVariationSettings(fontVariationSettings);
            if (axes == null) {
                nSetFontVariationOverride(mNativePaint, 0);
                mFontVariationSettings = null;
                return true;
            }

            long builderPtr = nCreateFontVariationBuilder(axes.length);
            for (int i = 0; i < axes.length; ++i) {
                int tag = axes[i].getOpenTypeTagValue();
                float value = axes[i].getStyleValue();
                if (tag == 0x77676874 /* wght */) {
                    value = Math.clamp(value + wghtAdjust,
                            FontStyle.FONT_WEIGHT_MIN, FontStyle.FONT_WEIGHT_MAX);
                }
                nAddFontVariationToBuilder(builderPtr, tag, value);
            }
            nSetFontVariationOverride(mNativePaint, builderPtr);
            mFontVariationSettings = fontVariationSettings;
            return true;
        }
        final String settings = TextUtils.nullIfEmpty(fontVariationSettings);
        if (settings == mFontVariationSettings
                || (settings != null && settings.equals(mFontVariationSettings))) {
+14 −3
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ import android.os.Build;
import android.text.TextUtils;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.regex.Pattern;
@@ -139,9 +140,19 @@ public final class FontVariationAxis {
     */
    public static @Nullable FontVariationAxis[] fromFontVariationSettings(
            @Nullable String settings) {
        if (settings == null || settings.isEmpty()) {
        List<FontVariationAxis> result = fromFontVariationSettingsForList(settings);
        if (result.isEmpty()) {
            return null;
        }
        return result.toArray(new FontVariationAxis[0]);
    }

    /** @hide */
    public static @NonNull List<FontVariationAxis> fromFontVariationSettingsForList(
            @Nullable String settings) {
        if (settings == null || settings.isEmpty()) {
            return Collections.emptyList();
        }
        final ArrayList<FontVariationAxis> axisList = new ArrayList<>();
        final int length = settings.length();
        for (int i = 0; i < length; i++) {
@@ -172,9 +183,9 @@ public final class FontVariationAxis {
            i = endOfValueString;
        }
        if (axisList.isEmpty()) {
            return null;
            return Collections.emptyList();
        }
        return axisList.toArray(new FontVariationAxis[0]);
        return axisList;
    }

    /**