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

Commit 39d4aa5b authored by Riddle Hsu's avatar Riddle Hsu
Browse files

Fix empty region if the scale is smaller than 1

It may be used by Layer of SurfaceFlinger to calculate
touchable region. It should be able to scale a window
to a smaller size.

Bug: 111440400
Test: manual - An input-associated surface with a scaling
      matrix that has dsdx, dsdy < 1. Use "dumpsys input"
      to observe its touchable region.

Change-Id: I495bd16acec77f913fd39dcac90404eddc71cabb
parent 75cc36e4
Loading
Loading
Loading
Loading
+5 −5
Original line number Diff line number Diff line
@@ -325,14 +325,14 @@ Region& Region::translateSelf(int x, int y) {
    return *this;
}

Region& Region::scaleSelf(int sx, int sy) {
Region& Region::scaleSelf(float sx, float sy) {
    size_t count = mStorage.size();
    Rect* rects = mStorage.editArray();
    while (count) {
        rects->left *= sx;
        rects->right *= sx;
        rects->top *= sy;
        rects->bottom *= sy;
        rects->left = static_cast<int32_t>(rects->left * sx + 0.5f);
        rects->right = static_cast<int32_t>(rects->right * sx + 0.5f);
        rects->top = static_cast<int32_t>(rects->top * sy + 0.5f);
        rects->bottom = static_cast<int32_t>(rects->bottom * sy + 0.5f);
        rects++;
        count--;
    }
+1 −1
Original line number Diff line number Diff line
@@ -89,7 +89,7 @@ public:

            // these translate rhs first
            Region&     translateSelf(int dx, int dy);
            Region&     scaleSelf(int sx, int sy);
            Region&     scaleSelf(float sx, float sy);
            Region&     orSelf(const Region& rhs, int dx, int dy);
            Region&     xorSelf(const Region& rhs, int dx, int dy);
            Region&     andSelf(const Region& rhs, int dx, int dy);
+1 −1
Original line number Diff line number Diff line
@@ -3518,7 +3518,7 @@ void InputDispatcher::dumpDispatchStateLocked(std::string& dump) {
                    dump += StringPrintf(INDENT3 "%zu: name='%s', displayId=%d, "
                            "paused=%s, hasFocus=%s, hasWallpaper=%s, "
                            "visible=%s, canReceiveKeys=%s, flags=0x%08x, type=0x%08x, layer=%d, "
                            "frame=[%d,%d][%d,%d], globalScale=%f, windowScale=%f,%f"
                            "frame=[%d,%d][%d,%d], globalScale=%f, windowScale=(%f,%f), "
                            "touchableRegion=",
                            i, windowInfo->name.c_str(), windowInfo->displayId,
                            toString(windowInfo->paused),
+7 −4
Original line number Diff line number Diff line
@@ -2069,10 +2069,13 @@ InputWindowInfo Layer::fillInputInfo(const Rect& screenBounds) {
    info.frameBottom = screenBounds.bottom - info.surfaceInset;

    ui::Transform t = getTransform();
    info.windowXScale *= 1.0f / t.sx();
    info.windowYScale *= 1.0f / t.sy();

    info.touchableRegion.scaleSelf(t.sx(), t.sy());
    const float xScale = t.sx();
    const float yScale = t.sy();
    if (xScale != 1.0f || yScale != 1.0f) {
        info.windowXScale *= 1.0f / xScale;
        info.windowYScale *= 1.0f / yScale;
        info.touchableRegion.scaleSelf(xScale, yScale);
    }

    info.touchableRegion = info.touchableRegion.translate(
            screenBounds.left,