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

Commit eb957409 authored by John Hoford's avatar John Hoford
Browse files

Add support for color theaming

Bug: 339721781
Flag: EXEMPT External libraries
Test: in GOB

Change-Id: I6d0685d2732085716b042b9b176a4cbb13f17d2a
parent 9685f173
Loading
Loading
Loading
Loading
+35 −2
Original line number Diff line number Diff line
@@ -15,6 +15,7 @@
 */
package com.android.internal.widget.remotecompose.core;

import com.android.internal.widget.remotecompose.core.operations.NamedVariable;
import com.android.internal.widget.remotecompose.core.operations.RootContentBehavior;
import com.android.internal.widget.remotecompose.core.operations.Theme;

@@ -308,6 +309,7 @@ public class CoreDocument {

        /**
         * Returns true if x,y coordinate is within bounds
         *
         * @param x x-coordinate
         * @param y y-coordinate
         * @return x, y coordinate is within bounds
@@ -483,6 +485,37 @@ public class CoreDocument {
        return builder.toString();
    }

    /**
     * Gets the names of all named colors.
     *
     * @return array of named colors or null
     */
    public String[] getNamedColors() {
        int count = 0;
        for (Operation op : mOperations) {
            if (op instanceof NamedVariable) {
                NamedVariable n = (NamedVariable) op;
                if (n.mVarType == NamedVariable.COLOR_TYPE) {
                    count++;
                }
            }
        }
        if (count == 0) {
            return null;
        }
        String[] ret = new String[count];
        int i = 0;
        for (Operation op : mOperations) {
            if (op instanceof NamedVariable) {
                NamedVariable n = (NamedVariable) op;
                if (n.mVarType == NamedVariable.COLOR_TYPE) {
                    ret[i++] = n.mVarName;
                }
            }
        }
        return ret;
    }

    //////////////////////////////////////////////////////////////////////////
    // Painting
    //////////////////////////////////////////////////////////////////////////
@@ -493,6 +526,7 @@ public class CoreDocument {

    /**
     * Returns > 0 if it needs to repaint
     *
     * @return
     */
    public int needsRepaint() {
@@ -525,7 +559,6 @@ public class CoreDocument {
        context.loadFloat(RemoteContext.ID_WINDOW_WIDTH, getWidth());
        context.loadFloat(RemoteContext.ID_WINDOW_HEIGHT, getHeight());
        mRepaintNext = context.updateOps();

        for (Operation op : mOperations) {
            // operations will only be executed if no theme is set (ie UNSPECIFIED)
            // or the theme is equal as the one passed in argument to paint.
+6 −1
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ import com.android.internal.widget.remotecompose.core.operations.BitmapData;
import com.android.internal.widget.remotecompose.core.operations.ClickArea;
import com.android.internal.widget.remotecompose.core.operations.ClipPath;
import com.android.internal.widget.remotecompose.core.operations.ClipRect;
import com.android.internal.widget.remotecompose.core.operations.ColorConstant;
import com.android.internal.widget.remotecompose.core.operations.ColorExpression;
import com.android.internal.widget.remotecompose.core.operations.DrawArc;
import com.android.internal.widget.remotecompose.core.operations.DrawBitmap;
@@ -42,6 +43,7 @@ import com.android.internal.widget.remotecompose.core.operations.MatrixSave;
import com.android.internal.widget.remotecompose.core.operations.MatrixScale;
import com.android.internal.widget.remotecompose.core.operations.MatrixSkew;
import com.android.internal.widget.remotecompose.core.operations.MatrixTranslate;
import com.android.internal.widget.remotecompose.core.operations.NamedVariable;
import com.android.internal.widget.remotecompose.core.operations.PaintData;
import com.android.internal.widget.remotecompose.core.operations.PathData;
import com.android.internal.widget.remotecompose.core.operations.RootContentBehavior;
@@ -105,6 +107,8 @@ public class Operations {
    public static final int COLOR_EXPRESSIONS = 134;
    public static final int TEXT_FROM_FLOAT = 135;
    public static final int TEXT_MERGE = 136;
    public static final int NAMED_VARIABLE = 137;
    public static final int COLOR_CONSTANT = 138;

    /////////////////////////////////////////======================
    public static IntMap<CompanionOperation> map = new IntMap<>();
@@ -147,7 +151,8 @@ public class Operations {
        map.put(COLOR_EXPRESSIONS, ColorExpression.COMPANION);
        map.put(TEXT_FROM_FLOAT, TextFromFloat.COMPANION);
        map.put(TEXT_MERGE, TextMerge.COMPANION);

        map.put(NAMED_VARIABLE, NamedVariable.COMPANION);
        map.put(COLOR_CONSTANT, ColorConstant.COMPANION);
    }

}
+25 −0
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ import com.android.internal.widget.remotecompose.core.operations.BitmapData;
import com.android.internal.widget.remotecompose.core.operations.ClickArea;
import com.android.internal.widget.remotecompose.core.operations.ClipPath;
import com.android.internal.widget.remotecompose.core.operations.ClipRect;
import com.android.internal.widget.remotecompose.core.operations.ColorConstant;
import com.android.internal.widget.remotecompose.core.operations.ColorExpression;
import com.android.internal.widget.remotecompose.core.operations.DrawArc;
import com.android.internal.widget.remotecompose.core.operations.DrawBitmap;
@@ -42,6 +43,7 @@ import com.android.internal.widget.remotecompose.core.operations.MatrixSave;
import com.android.internal.widget.remotecompose.core.operations.MatrixScale;
import com.android.internal.widget.remotecompose.core.operations.MatrixSkew;
import com.android.internal.widget.remotecompose.core.operations.MatrixTranslate;
import com.android.internal.widget.remotecompose.core.operations.NamedVariable;
import com.android.internal.widget.remotecompose.core.operations.PaintData;
import com.android.internal.widget.remotecompose.core.operations.PathData;
import com.android.internal.widget.remotecompose.core.operations.RootContentBehavior;
@@ -898,6 +900,20 @@ public class RemoteComposeBuffer {
        return Utils.asNan(id);
    }

    /**
     * Add a simple color
     * @param color
     * @return id that represents that color
     */
    public int addColor(int color) {
        ColorConstant c = new ColorConstant(0, color);
        short id = (short) mRemoteComposeState.cache(c);
        c.mColorId = id;
        c.write(mBuffer);
        return id;
    }


    /**
     * Add a color that represents the tween between two colors
     * @param color1
@@ -1013,5 +1029,14 @@ public class RemoteComposeBuffer {
        return FloatAnimation.packToFloatArray(duration, type, spec, initialValue, wrap);
    }

    /**
     * This defines the name of the color given the id.
     * @param id of the color
     * @param name Name of the color
     */
    public void setColorName(int id, String name) {
        NamedVariable.COMPANION.apply(mBuffer, id,
                NamedVariable.COLOR_TYPE, name);
    }
}
+28 −1
Original line number Diff line number Diff line
@@ -33,11 +33,13 @@ import java.util.HashMap;
public class RemoteComposeState {
    public static final int START_ID = 42;
    private static final int MAX_FLOATS = 500;
    private static final int MAX_COLORS = 200;
    private final IntMap<Object> mIntDataMap = new IntMap<>();
    private final IntMap<Boolean> mIntWrittenMap = new IntMap<>();
    private final HashMap<Object, Integer> mDataIntMap = new HashMap();
    private final float[] mFloatMap = new float[MAX_FLOATS]; // efficient cache
    private final int[] mColorMap = new int[MAX_FLOATS]; // efficient cache
    private final int[] mColorMap = new int[MAX_COLORS]; // efficient cache
    private final boolean[] mColorOverride = new boolean[MAX_COLORS];
    private int mNextId = START_ID;

    {
@@ -49,6 +51,7 @@ public class RemoteComposeState {
    /**
     * Get Object based on id. The system will cache things like bitmaps
     * Paths etc. They can be accessed with this command
     *
     * @param id
     * @return
     */
@@ -58,6 +61,7 @@ public class RemoteComposeState {

    /**
     * true if the cache contain this id
     *
     * @param id
     * @return
     */
@@ -150,9 +154,32 @@ public class RemoteComposeState {
     * @param color
     */
    public void updateColor(int id, int color) {
        if (mColorOverride[id]) {
            return;
        }
        mColorMap[id] = color;
    }

    /**
     * Adds a colorOverride.
     * This is a list of ids and there colors optimized for playback;
     *
     * @param id
     * @param color
     */
    public void overrideColor(int id, int color) {
        mColorOverride[id] = true;
        mColorMap[id] = color;
    }

    /**
     * Clear the color Overrides
     */
    public void clearColorOverride() {
        for (int i = 0; i < mColorOverride.length; i++) {
            mColorOverride[i] = false;
        }
    }

    /**
     * Method to determine if a cached value has been written to the documents WireBuffer based on
+37 −0
Original line number Diff line number Diff line
@@ -72,6 +72,14 @@ public abstract class RemoteContext {
        return (System.nanoTime() - mStart) * 1E-9f;
    }

    /**
     * Set the value of a named Color.
     * This overrides the color in the document
     * @param colorName
     * @param color
     */
    public abstract void setNamedColorOverride(String colorName, int color);


    /**
     * The context can be used in a few different mode, allowing operations to skip being executed:
@@ -262,16 +270,45 @@ public abstract class RemoteContext {
    public static final int ID_COMPONENT_WIDTH = 7;
    public static final int ID_COMPONENT_HEIGHT = 8;
    public static final int ID_CALENDAR_MONTH = 9;
    public static final int ID_OFFSET_TO_UTC = 10;
    public static final int ID_WEEK_DAY = 11;
    public static final int ID_DAY_OF_MONTH = 12;

    /**
     * CONTINUOUS_SEC is seconds from midnight looping every hour 0-3600
     */
    public static final float FLOAT_CONTINUOUS_SEC = Utils.asNan(ID_CONTINUOUS_SEC);
    /**
     * seconds run from Midnight=0 quantized to seconds hour 0..3599
     */
    public static final float FLOAT_TIME_IN_SEC = Utils.asNan(ID_TIME_IN_SEC);
    /**
     * minutes run from Midnight=0 quantized to minutes 0..1439
     */
    public static final float FLOAT_TIME_IN_MIN = Utils.asNan(ID_TIME_IN_MIN);
    /**
     * hours run from Midnight=0 quantized to Hours 0-23
     */
    public static final float FLOAT_TIME_IN_HR = Utils.asNan(ID_TIME_IN_HR);
    /**
     * Moth of Year quantized to MONTHS 1-12. 1 = January
     */
    public static final float FLOAT_CALENDAR_MONTH = Utils.asNan(ID_CALENDAR_MONTH);
    /**
     * DAY OF THE WEEK 1-7. 1 = Monday
     */
    public static final float FLOAT_WEEK_DAY = Utils.asNan(ID_WEEK_DAY);
    /**
     * DAY OF THE MONTH 1-31
     */
    public static final float FLOAT_DAY_OF_MONTH = Utils.asNan(ID_DAY_OF_MONTH);

    public static final float FLOAT_WINDOW_WIDTH = Utils.asNan(ID_WINDOW_WIDTH);
    public static final float FLOAT_WINDOW_HEIGHT = Utils.asNan(ID_WINDOW_HEIGHT);
    public static final float FLOAT_COMPONENT_WIDTH = Utils.asNan(ID_COMPONENT_WIDTH);
    public static final float FLOAT_COMPONENT_HEIGHT = Utils.asNan(ID_COMPONENT_HEIGHT);
    // ID_OFFSET_TO_UTC is the offset from UTC in sec (typically / 3600f)
    public static final float FLOAT_OFFSET_TO_UTC = Utils.asNan(ID_OFFSET_TO_UTC);
    ///////////////////////////////////////////////////////////////////////////////////////////////
    // Click handling
    ///////////////////////////////////////////////////////////////////////////////////////////////
Loading