hwc2: set layer visible region
am: df4e35671b

Change-Id: I255f897aabe5dae3bca11fe10c873407af0965bc
diff --git a/hwc2/hwc2.cpp b/hwc2/hwc2.cpp
index 9da3561..f6ed40d 100644
--- a/hwc2/hwc2.cpp
+++ b/hwc2/hwc2.cpp
@@ -322,11 +322,11 @@
     return dev->set_layer_transform(display, layer, transform);
 }
 
-hwc2_error_t set_layer_visible_region(hwc2_device_t* /*device*/,
-        hwc2_display_t /*display*/, hwc2_layer_t /*layer*/,
-        hwc_region_t /*visible*/)
+hwc2_error_t set_layer_visible_region(hwc2_device_t *device,
+        hwc2_display_t display, hwc2_layer_t layer, hwc_region_t visible)
 {
-    return HWC2_ERROR_NONE;
+    hwc2_dev *dev = reinterpret_cast<hwc2_context *>(device)->hwc2_dev;
+    return dev->set_layer_visible_region(display, layer, visible);
 }
 
 hwc2_error_t set_layer_z_order(hwc2_device_t *device, hwc2_display_t display,
diff --git a/hwc2/hwc2.h b/hwc2/hwc2.h
index fc4ed06..423f589 100644
--- a/hwc2/hwc2.h
+++ b/hwc2/hwc2.h
@@ -63,6 +63,7 @@
     hwc2_error_t set_blend_mode(hwc2_blend_mode_t blend_mode);
     hwc2_error_t set_plane_alpha(float plane_alpha);
     hwc2_error_t set_transform(hwc_transform_t transform);
+    hwc2_error_t set_visible_region(const hwc_region_t &visible_region);
 
 private:
     /* A handle to the buffer */
@@ -100,6 +101,10 @@
 
     /* The rotation or flip of the buffer */
     hwc_transform_t transform;
+
+    /* The portion of the layer that is visible including portions under
+     * translucent areas of other buffers */
+    std::vector<hwc_rect_t> visible_region;
 };
 
 class hwc2_config {
@@ -170,6 +175,7 @@
     hwc2_error_t set_blend_mode(hwc2_blend_mode_t blend_mode);
     hwc2_error_t set_plane_alpha(float plane_alpha);
     hwc2_error_t set_transform(hwc_transform_t transform);
+    hwc2_error_t set_visible_region(const hwc_region_t &visible_region);
 
     static hwc2_layer_t get_next_id();
 
@@ -242,6 +248,8 @@
     hwc2_error_t set_layer_plane_alpha(hwc2_layer_t lyr_id, float plane_alpha);
     hwc2_error_t set_layer_transform(hwc2_layer_t lyr_id,
                     hwc_transform_t transform);
+    hwc2_error_t set_layer_visible_region(hwc2_layer_t lyr_id,
+                    const hwc_region_t &visible_region);
     hwc2_error_t set_layer_color(hwc2_layer_t lyr_id, const hwc_color_t &color);
     hwc2_error_t set_cursor_position(hwc2_layer_t lyr_id, int32_t x, int32_t y);
 
@@ -338,6 +346,8 @@
                     hwc2_layer_t lyr_id, float plane_alpha);
     hwc2_error_t set_layer_transform(hwc2_display_t dpy_id, hwc2_layer_t lyr_id,
                     hwc_transform_t transform);
+    hwc2_error_t set_layer_visible_region(hwc2_display_t dpy_id,
+                    hwc2_layer_t lyr_id, const hwc_region_t &visible_region);
     hwc2_error_t set_layer_color(hwc2_display_t dpy_id, hwc2_layer_t lyr_id,
                     const hwc_color_t &color);
     hwc2_error_t set_cursor_position(hwc2_display_t dpy_id, hwc2_layer_t lyr_id,
diff --git a/hwc2/hwc2_buffer.cpp b/hwc2/hwc2_buffer.cpp
index 7bd2361..2344eb4 100644
--- a/hwc2/hwc2_buffer.cpp
+++ b/hwc2/hwc2_buffer.cpp
@@ -28,7 +28,8 @@
       surface_damage(),
       blend_mode(HWC2_BLEND_MODE_NONE),
       plane_alpha(1.0),
-      transform() { }
+      transform(),
+      visible_region() { }
 
 hwc2_buffer::~hwc2_buffer()
 {
@@ -124,3 +125,12 @@
 
     return HWC2_ERROR_NONE;
 }
+
+hwc2_error_t hwc2_buffer::set_visible_region(const hwc_region_t &visible_region)
+{
+    this->visible_region.clear();
+    for (size_t idx = 0; idx < visible_region.numRects; idx++)
+        this->visible_region.push_back(visible_region.rects[idx]);
+
+    return HWC2_ERROR_NONE;
+}
diff --git a/hwc2/hwc2_dev.cpp b/hwc2/hwc2_dev.cpp
index 294272b..cbe9bc2 100644
--- a/hwc2/hwc2_dev.cpp
+++ b/hwc2/hwc2_dev.cpp
@@ -247,6 +247,13 @@
     return displays.find(dpy_id)->second.set_layer_transform(lyr_id, transform);
 }
 
+hwc2_error_t hwc2_dev::set_layer_visible_region(hwc2_display_t dpy_id,
+        hwc2_layer_t lyr_id, const hwc_region_t &visible_region)
+{
+    return displays.find(dpy_id)->second.set_layer_visible_region(lyr_id,
+            visible_region);
+}
+
 hwc2_error_t hwc2_dev::set_layer_color(hwc2_display_t dpy_id,
         hwc2_layer_t lyr_id, const hwc_color_t &color)
 {
diff --git a/hwc2/hwc2_display.cpp b/hwc2/hwc2_display.cpp
index c84d36b..983bba7 100644
--- a/hwc2/hwc2_display.cpp
+++ b/hwc2/hwc2_display.cpp
@@ -382,6 +382,18 @@
     return it->second.set_transform(transform);
 }
 
+hwc2_error_t hwc2_display::set_layer_visible_region(hwc2_layer_t lyr_id,
+        const hwc_region_t &visible_region)
+{
+    auto it = layers.find(lyr_id);
+    if (it == layers.end()) {
+        ALOGE("dpy %" PRIu64 ": lyr %" PRIu64 ": bad layer handle", id, lyr_id);
+        return HWC2_ERROR_BAD_LAYER;
+    }
+
+    return it->second.set_visible_region(visible_region);
+}
+
 hwc2_error_t hwc2_display::set_layer_color(hwc2_layer_t lyr_id,
         const hwc_color_t& /*color*/)
 {
diff --git a/hwc2/hwc2_layer.cpp b/hwc2/hwc2_layer.cpp
index 65e9b84..125f28f 100644
--- a/hwc2/hwc2_layer.cpp
+++ b/hwc2/hwc2_layer.cpp
@@ -107,6 +107,11 @@
     return buffer.set_transform(transform);
 }
 
+hwc2_error_t hwc2_layer::set_visible_region(const hwc_region_t &visible_region)
+{
+    return buffer.set_visible_region(visible_region);
+}
+
 hwc2_layer_t hwc2_layer::get_next_id()
 {
     return layer_cnt++;