HWUI: Fix snapping in path rendering

bug:30444274
Change-Id: Ib10058659af47625b366c26e0b872fa3f1854cd0
diff --git a/libs/hwui/PathCache.cpp b/libs/hwui/PathCache.cpp
index b5c43ff..1c298b1 100644
--- a/libs/hwui/PathCache.cpp
+++ b/libs/hwui/PathCache.cpp
@@ -127,8 +127,8 @@
     const float pathWidth = std::max(bounds.width(), 1.0f);
     const float pathHeight = std::max(bounds.height(), 1.0f);
 
-    texture->left = bounds.fLeft;
-    texture->top = bounds.fTop;
+    texture->left = floorf(bounds.fLeft);
+    texture->top = floorf(bounds.fTop);
 
     texture->offset = (int) floorf(std::max(paint->getStrokeWidth(), 1.0f) * 1.5f + 0.5f);
 
diff --git a/libs/hwui/tests/unit/BakedOpDispatcherTests.cpp b/libs/hwui/tests/unit/BakedOpDispatcherTests.cpp
index eb236c4..9deb441 100644
--- a/libs/hwui/tests/unit/BakedOpDispatcherTests.cpp
+++ b/libs/hwui/tests/unit/BakedOpDispatcherTests.cpp
@@ -27,6 +27,7 @@
 
 #include <SkBlurDrawLooper.h>
 #include <SkDashPathEffect.h>
+#include <SkPath.h>
 
 using namespace android::uirenderer;
 
@@ -273,3 +274,17 @@
         }
     }
 }
+
+RENDERTHREAD_TEST(BakedOpDispatcher, pathTextureSnapping) {
+    Rect bounds(10, 15, 20, 25);
+    SkPaint paint;
+    SkPath path;
+    path.addRect(SkRect::MakeXYWH(1.5, 3.8, 100, 90));
+    PathOp op(bounds, Matrix4::identity(), nullptr, &paint, &path);
+    testUnmergedGlopDispatch(renderThread, &op, [] (const Glop& glop) {
+        auto texture = glop.fill.texture.texture;
+        ASSERT_NE(nullptr, texture);
+        EXPECT_EQ(1, reinterpret_cast<PathTexture*>(texture)->left);
+        EXPECT_EQ(3, reinterpret_cast<PathTexture*>(texture)->top);
+    });
+}
\ No newline at end of file