[PATCH 1/4] d2d1: Implement FillContainsPoint for rectangles
Andrew Eikum
aeikum at codeweavers.com
Fri Oct 21 11:28:49 CDT 2016
Signed-off-by: Andrew Eikum <aeikum at codeweavers.com>
---
dlls/d2d1/d2d1_private.h | 21 +++++++++++++++++++++
dlls/d2d1/geometry.c | 24 ++++++++++++++++++++++--
dlls/d2d1/render_target.c | 6 ------
3 files changed, 43 insertions(+), 8 deletions(-)
diff --git a/dlls/d2d1/d2d1_private.h b/dlls/d2d1/d2d1_private.h
index b49fce4..c80a14d 100644
--- a/dlls/d2d1/d2d1_private.h
+++ b/dlls/d2d1/d2d1_private.h
@@ -357,4 +357,25 @@ static inline void d2d_matrix_multiply(D2D_MATRIX_3X2_F *a, const D2D_MATRIX_3X2
a->_32 = tmp._31 * b->_12 + tmp._32 * b->_22 + b->_32;
}
+static inline void d2d_point_transform(D2D1_POINT_2F *dst, const D2D1_MATRIX_3X2_F *matrix, float x, float y)
+{
+ dst->x = x * matrix->_11 + y * matrix->_21 + matrix->_31;
+ dst->y = x * matrix->_12 + y * matrix->_22 + matrix->_32;
+}
+
+/* dst must be different from src */
+static inline BOOL d2d_matrix_invert(D2D_MATRIX_3X2_F *dst, const D2D_MATRIX_3X2_F *src)
+{
+ float d = src->_11 * src->_22 - src->_21 * src->_12;
+ if (d == 0.0f)
+ return FALSE;
+ dst->_11 = src->_22 / d;
+ dst->_21 = -src->_21 / d;
+ dst->_31 = (src->_21 * src->_32 - src->_31 * src->_22) / d;
+ dst->_12 = -src->_12 / d;
+ dst->_22 = src->_11 / d;
+ dst->_32 = -(src->_11 * src->_32 - src->_31 * src->_12) / d;
+ return TRUE;
+}
+
#endif /* __WINE_D2D1_PRIVATE_H */
diff --git a/dlls/d2d1/geometry.c b/dlls/d2d1/geometry.c
index 9fa1783..eba9911 100644
--- a/dlls/d2d1/geometry.c
+++ b/dlls/d2d1/geometry.c
@@ -2374,10 +2374,30 @@ static HRESULT STDMETHODCALLTYPE d2d_rectangle_geometry_StrokeContainsPoint(ID2D
static HRESULT STDMETHODCALLTYPE d2d_rectangle_geometry_FillContainsPoint(ID2D1RectangleGeometry *iface,
D2D1_POINT_2F point, const D2D1_MATRIX_3X2_F *transform, float tolerance, BOOL *contains)
{
- FIXME("iface %p, point {%.8e, %.8e}, transform %p, tolerance %.8e, contains %p stub!\n",
+ struct d2d_geometry *geometry = impl_from_ID2D1RectangleGeometry(iface);
+ D2D1_MATRIX_3X2_F g_i;
+ D2D1_POINT_2F probe;
+
+ TRACE("iface %p, point {%.8e, %.8e}, transform %p, tolerance %.8e, contains %p\n",
iface, point.x, point.y, transform, tolerance, contains);
- return E_NOTIMPL;
+ if (transform)
+ {
+ if (!d2d_matrix_invert(&g_i, transform))
+ return D2DERR_UNSUPPORTED_OPERATION;
+ d2d_point_transform(&probe, &g_i, point.x, point.y);
+ }
+ else
+ probe = point;
+
+ *contains = probe.x > geometry->u.rectangle.rect.left - tolerance &&
+ probe.x < geometry->u.rectangle.rect.right + tolerance &&
+ probe.y > geometry->u.rectangle.rect.top - tolerance &&
+ probe.y < geometry->u.rectangle.rect.bottom + tolerance;
+
+ TRACE("-> %#x\n", *contains);
+
+ return S_OK;
}
static HRESULT STDMETHODCALLTYPE d2d_rectangle_geometry_CompareWithGeometry(ID2D1RectangleGeometry *iface,
diff --git a/dlls/d2d1/render_target.c b/dlls/d2d1/render_target.c
index bc31f4d..798dd0d 100644
--- a/dlls/d2d1/render_target.c
+++ b/dlls/d2d1/render_target.c
@@ -48,12 +48,6 @@ static void d2d_point_set(D2D1_POINT_2F *dst, float x, float y)
dst->y = y;
}
-static void d2d_point_transform(D2D1_POINT_2F *dst, const D2D1_MATRIX_3X2_F *matrix, float x, float y)
-{
- dst->x = x * matrix->_11 + y * matrix->_21 + matrix->_31;
- dst->y = x * matrix->_12 + y * matrix->_22 + matrix->_32;
-}
-
static void d2d_rect_expand(D2D1_RECT_F *dst, const D2D1_POINT_2F *point)
{
if (point->x < dst->left)
--
2.10.0
More information about the wine-patches
mailing list