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

Commit acbe18d0 authored by Pat Manning's avatar Pat Manning
Browse files

Set draw drop shadow for vector pointer icons when sprite is set.

Drop shadow was not being retained when reloading pointers, like when
the display size changes.

Bug: 305193969
Test: Manual
Flag: ACONFIG com.android.systemui.enable_vector_cursors STAGING
Change-Id: Ic6c80166df0d64ca5709aac7ca401f442564698d
parent acbdee14
Loading
Loading
Loading
Loading
+18 −13
Original line number Original line Diff line number Diff line
@@ -202,11 +202,13 @@ void SpriteController::doUpdateSprites() {
                && update.state.surfaceDrawn;
                && update.state.surfaceDrawn;
        bool becomingVisible = wantSurfaceVisibleAndDrawn && !update.state.surfaceVisible;
        bool becomingVisible = wantSurfaceVisibleAndDrawn && !update.state.surfaceVisible;
        bool becomingHidden = !wantSurfaceVisibleAndDrawn && update.state.surfaceVisible;
        bool becomingHidden = !wantSurfaceVisibleAndDrawn && update.state.surfaceVisible;
        if (update.state.surfaceControl != NULL && (becomingVisible || becomingHidden
        if (update.state.surfaceControl != NULL &&
                || (wantSurfaceVisibleAndDrawn && (update.state.dirty & (DIRTY_ALPHA
            (becomingVisible || becomingHidden ||
                        | DIRTY_POSITION | DIRTY_TRANSFORMATION_MATRIX | DIRTY_LAYER
             (wantSurfaceVisibleAndDrawn &&
                        | DIRTY_VISIBILITY | DIRTY_HOTSPOT | DIRTY_DISPLAY_ID
              (update.state.dirty &
                        | DIRTY_ICON_STYLE))))) {
               (DIRTY_ALPHA | DIRTY_POSITION | DIRTY_TRANSFORMATION_MATRIX | DIRTY_LAYER |
                DIRTY_VISIBILITY | DIRTY_HOTSPOT | DIRTY_DISPLAY_ID | DIRTY_ICON_STYLE |
                DIRTY_DRAW_DROP_SHADOW))))) {
            needApplyTransaction = true;
            needApplyTransaction = true;


            if (wantSurfaceVisibleAndDrawn
            if (wantSurfaceVisibleAndDrawn
@@ -235,13 +237,15 @@ void SpriteController::doUpdateSprites() {
                        update.state.transformationMatrix.dtdy);
                        update.state.transformationMatrix.dtdy);
            }
            }


            if (wantSurfaceVisibleAndDrawn
            if (wantSurfaceVisibleAndDrawn &&
                    && (becomingVisible
                (becomingVisible ||
                            || (update.state.dirty & (DIRTY_HOTSPOT | DIRTY_ICON_STYLE)))) {
                 (update.state.dirty &
                  (DIRTY_HOTSPOT | DIRTY_ICON_STYLE | DIRTY_DRAW_DROP_SHADOW)))) {
                Parcel p;
                Parcel p;
                p.writeInt32(static_cast<int32_t>(update.state.icon.style));
                p.writeInt32(static_cast<int32_t>(update.state.icon.style));
                p.writeFloat(update.state.icon.hotSpotX);
                p.writeFloat(update.state.icon.hotSpotX);
                p.writeFloat(update.state.icon.hotSpotY);
                p.writeFloat(update.state.icon.hotSpotY);
                p.writeBool(update.state.icon.drawNativeDropShadow);


                // Pass cursor metadata in the sprite surface so that when Android is running as a
                // Pass cursor metadata in the sprite surface so that when Android is running as a
                // client OS (e.g. ARC++) the host OS can get the requested cursor metadata and
                // client OS (e.g. ARC++) the host OS can get the requested cursor metadata and
@@ -388,12 +392,13 @@ void SpriteController::SpriteImpl::setIcon(const SpriteIcon& icon) {
    uint32_t dirty;
    uint32_t dirty;
    if (icon.isValid()) {
    if (icon.isValid()) {
        mLocked.state.icon.bitmap = icon.bitmap.copy(ANDROID_BITMAP_FORMAT_RGBA_8888);
        mLocked.state.icon.bitmap = icon.bitmap.copy(ANDROID_BITMAP_FORMAT_RGBA_8888);
        if (!mLocked.state.icon.isValid()
        if (!mLocked.state.icon.isValid() || mLocked.state.icon.hotSpotX != icon.hotSpotX ||
                || mLocked.state.icon.hotSpotX != icon.hotSpotX
            mLocked.state.icon.hotSpotY != icon.hotSpotY ||
                || mLocked.state.icon.hotSpotY != icon.hotSpotY) {
            mLocked.state.icon.drawNativeDropShadow != icon.drawNativeDropShadow) {
            mLocked.state.icon.hotSpotX = icon.hotSpotX;
            mLocked.state.icon.hotSpotX = icon.hotSpotX;
            mLocked.state.icon.hotSpotY = icon.hotSpotY;
            mLocked.state.icon.hotSpotY = icon.hotSpotY;
            dirty = DIRTY_BITMAP | DIRTY_HOTSPOT;
            mLocked.state.icon.drawNativeDropShadow = icon.drawNativeDropShadow;
            dirty = DIRTY_BITMAP | DIRTY_HOTSPOT | DIRTY_DRAW_DROP_SHADOW;
        } else {
        } else {
            dirty = DIRTY_BITMAP;
            dirty = DIRTY_BITMAP;
        }
        }
@@ -404,7 +409,7 @@ void SpriteController::SpriteImpl::setIcon(const SpriteIcon& icon) {
        }
        }
    } else if (mLocked.state.icon.isValid()) {
    } else if (mLocked.state.icon.isValid()) {
        mLocked.state.icon.bitmap.reset();
        mLocked.state.icon.bitmap.reset();
        dirty = DIRTY_BITMAP | DIRTY_HOTSPOT | DIRTY_ICON_STYLE;
        dirty = DIRTY_BITMAP | DIRTY_HOTSPOT | DIRTY_ICON_STYLE | DIRTY_DRAW_DROP_SHADOW;
    } else {
    } else {
        return; // setting to invalid icon and already invalid so nothing to do
        return; // setting to invalid icon and already invalid so nothing to do
    }
    }
+1 −0
Original line number Original line Diff line number Diff line
@@ -151,6 +151,7 @@ private:
        DIRTY_HOTSPOT = 1 << 6,
        DIRTY_HOTSPOT = 1 << 6,
        DIRTY_DISPLAY_ID = 1 << 7,
        DIRTY_DISPLAY_ID = 1 << 7,
        DIRTY_ICON_STYLE = 1 << 8,
        DIRTY_ICON_STYLE = 1 << 8,
        DIRTY_DRAW_DROP_SHADOW = 1 << 9,
    };
    };


    /* Describes the state of a sprite.
    /* Describes the state of a sprite.
+1 −1
Original line number Original line Diff line number Diff line
@@ -40,7 +40,7 @@ struct SpriteIcon {
    PointerIconStyle style{PointerIconStyle::TYPE_NULL};
    PointerIconStyle style{PointerIconStyle::TYPE_NULL};
    float hotSpotX{};
    float hotSpotX{};
    float hotSpotY{};
    float hotSpotY{};
    bool drawNativeDropShadow{false};
    bool drawNativeDropShadow{};


    inline bool isValid() const { return bitmap.isValid() && !bitmap.isEmpty(); }
    inline bool isValid() const { return bitmap.isValid() && !bitmap.isEmpty(); }