libui: add the Rect::transform method

This change adds a method to Rect to transform a rectangle by a graphics HAL
transform.

Change-Id: Ic0d0988e731bdb5662faee41a5927b1242891658
Bug: 6299171
diff --git a/include/ui/Rect.h b/include/ui/Rect.h
index 9e98bc5..bd82061 100644
--- a/include/ui/Rect.h
+++ b/include/ui/Rect.h
@@ -136,10 +136,18 @@
     void translate(int32_t dx, int32_t dy) { // legacy, don't use.
         offsetBy(dx, dy);
     }
- 
+
     Rect&   offsetTo(int32_t x, int32_t y);
     Rect&   offsetBy(int32_t x, int32_t y);
     bool    intersect(const Rect& with, Rect* result) const;
+
+    // Create a new Rect by transforming this one using a graphics HAL
+    // transform.  This rectangle is defined in a coordinate space starting at
+    // the origin and extending to (width, height).  If the transform includes
+    // a ROT90 then the output rectangle is defined in a space extending to
+    // (height, width).  Otherwise the output rectangle is in the same space as
+    // the input.
+    Rect transform(uint32_t xform, int32_t width, int32_t height);
 };
 
 ANDROID_BASIC_TYPES_TRAITS(Rect)
diff --git a/libs/ui/Rect.cpp b/libs/ui/Rect.cpp
index 5694e00..65fe5f9 100644
--- a/libs/ui/Rect.cpp
+++ b/libs/ui/Rect.cpp
@@ -14,6 +14,7 @@
  * limitations under the License.
  */
 
+#include <system/graphics.h>
 #include <ui/Rect.h>
 
 namespace android {
@@ -92,4 +93,24 @@
     return !(result->isEmpty());
 }
 
+Rect Rect::transform(uint32_t xform, int32_t width, int32_t height) {
+    Rect result(*this);
+    if (xform & HAL_TRANSFORM_FLIP_H) {
+        result = Rect(width - result.right, result.top,
+                width - result.left, result.bottom);
+    }
+    if (xform & HAL_TRANSFORM_FLIP_V) {
+        result = Rect(result.left, height - result.bottom,
+                result.right, height - result.top);
+    }
+    if (xform & HAL_TRANSFORM_ROT_90) {
+        int left = height - result.bottom;
+        int top = result.left;
+        int right = height - result.top;
+        int bottom = result.right;
+        result = Rect(left, top, right, bottom);
+    }
+    return result;
+}
+
 }; // namespace android