Henri Verbeet : d2d1: Introduce a separate function to construct pixel shader constant buffers for brushes.

Alexandre Julliard julliard at wine.codeweavers.com
Tue Jul 14 09:42:26 CDT 2015


Module: wine
Branch: master
Commit: 3bb382aabbbb6cc95df05ef359a6fce4124754f6
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=3bb382aabbbb6cc95df05ef359a6fce4124754f6

Author: Henri Verbeet <hverbeet at codeweavers.com>
Date:   Tue Jul 14 15:57:41 2015 +0200

d2d1: Introduce a separate function to construct pixel shader constant buffers for brushes.

---

 dlls/d2d1/brush.c         | 87 +++++++++++++++++++++++++++++++++++++++++++++++
 dlls/d2d1/d2d1_private.h  | 14 ++++++++
 dlls/d2d1/render_target.c | 72 ++-------------------------------------
 3 files changed, 103 insertions(+), 70 deletions(-)

diff --git a/dlls/d2d1/brush.c b/dlls/d2d1/brush.c
index edce7a2..762d201 100644
--- a/dlls/d2d1/brush.c
+++ b/dlls/d2d1/brush.c
@@ -709,6 +709,93 @@ static D3D10_TEXTURE_ADDRESS_MODE texture_addres_mode_from_extend_mode(D2D1_EXTE
     }
 }
 
+HRESULT d2d_brush_get_ps_cb(struct d2d_brush *brush, struct d2d_d3d_render_target *render_target,
+        ID3D10Buffer **ps_cb)
+{
+    D3D10_SUBRESOURCE_DATA buffer_data;
+    D3D10_BUFFER_DESC buffer_desc;
+    struct
+    {
+        float _11, _21, _31, pad0;
+        float _12, _22, _32, pad1;
+    } transform;
+    D2D1_COLOR_F color;
+    HRESULT hr;
+
+    buffer_desc.Usage = D3D10_USAGE_DEFAULT;
+    buffer_desc.BindFlags = D3D10_BIND_CONSTANT_BUFFER;
+    buffer_desc.CPUAccessFlags = 0;
+    buffer_desc.MiscFlags = 0;
+
+    buffer_data.SysMemPitch = 0;
+    buffer_data.SysMemSlicePitch = 0;
+
+    if (brush->type == D2D_BRUSH_TYPE_SOLID)
+    {
+        color = brush->u.solid.color;
+        color.a *= brush->opacity;
+
+        buffer_desc.ByteWidth = sizeof(color);
+        buffer_data.pSysMem = &color;
+    }
+    else if (brush->type == D2D_BRUSH_TYPE_BITMAP)
+    {
+        struct d2d_bitmap *bitmap = brush->u.bitmap.bitmap;
+        D2D_MATRIX_3X2_F w, b;
+        float dpi_scale, d;
+
+        /* Scale for dpi. */
+        w = render_target->drawing_state.transform;
+        dpi_scale = render_target->dpi_x / 96.0f;
+        w._11 *= dpi_scale;
+        w._21 *= dpi_scale;
+        w._31 *= dpi_scale;
+        dpi_scale = render_target->dpi_y / 96.0f;
+        w._12 *= dpi_scale;
+        w._22 *= dpi_scale;
+        w._32 *= dpi_scale;
+
+        /* Scale for bitmap size and dpi. */
+        b = brush->transform;
+        dpi_scale = bitmap->pixel_size.width * (bitmap->dpi_x / 96.0f);
+        b._11 *= dpi_scale;
+        b._21 *= dpi_scale;
+        dpi_scale = bitmap->pixel_size.height * (bitmap->dpi_y / 96.0f);
+        b._12 *= dpi_scale;
+        b._22 *= dpi_scale;
+
+        d2d_matrix_multiply(&b, &w);
+
+        /* Invert the matrix. (Because the matrix is applied to the sampling
+         * coordinates. I.e., to scale the bitmap by 2 we need to divide the
+         * coordinates by 2.) */
+        d = b._11 * b._22 - b._21 * b._12;
+        if (d != 0.0f)
+        {
+            transform._11 = b._22 / d;
+            transform._21 = -b._21 / d;
+            transform._31 = (b._21 * b._32 - b._31 * b._22) / d;
+            transform._12 = -b._12 / d;
+            transform._22 = b._11 / d;
+            transform._32 = -(b._11 * b._32 - b._31 * b._12) / d;
+        }
+        transform.pad1 = brush->opacity;
+
+        buffer_desc.ByteWidth = sizeof(transform);
+        buffer_data.pSysMem = &transform;
+    }
+    else
+    {
+        FIXME("Unhandled brush type %#x.\n", brush->type);
+        return E_NOTIMPL;
+    }
+
+    if (FAILED(hr = ID3D10Device_CreateBuffer(render_target->device, &buffer_desc, &buffer_data, ps_cb)))
+        ERR("Failed to create constant buffer, hr %#x.\n", hr);
+
+    return hr;
+}
+
 void d2d_brush_bind_resources(struct d2d_brush *brush, struct d2d_d3d_render_target *render_target)
 {
     static const float blend_factor[] = {1.0f, 1.0f, 1.0f, 1.0f};
diff --git a/dlls/d2d1/d2d1_private.h b/dlls/d2d1/d2d1_private.h
index 91ebd9f..2e9f741 100644
--- a/dlls/d2d1/d2d1_private.h
+++ b/dlls/d2d1/d2d1_private.h
@@ -142,6 +142,8 @@ HRESULT d2d_bitmap_brush_init(struct d2d_brush *brush, struct d2d_d3d_render_tar
         ID2D1Bitmap *bitmap, const D2D1_BITMAP_BRUSH_PROPERTIES *bitmap_brush_desc,
         const D2D1_BRUSH_PROPERTIES *brush_desc) DECLSPEC_HIDDEN;
 void d2d_brush_bind_resources(struct d2d_brush *brush, struct d2d_d3d_render_target *render_target) DECLSPEC_HIDDEN;
+HRESULT d2d_brush_get_ps_cb(struct d2d_brush *brush, struct d2d_d3d_render_target *render_target,
+        ID3D10Buffer **ps_cb) DECLSPEC_HIDDEN;
 struct d2d_brush *unsafe_impl_from_ID2D1Brush(ID2D1Brush *iface) DECLSPEC_HIDDEN;
 
 struct d2d_stroke_style
@@ -233,4 +235,16 @@ struct d2d_geometry
 void d2d_path_geometry_init(struct d2d_geometry *geometry) DECLSPEC_HIDDEN;
 HRESULT d2d_rectangle_geometry_init(struct d2d_geometry *geometry, const D2D1_RECT_F *rect) DECLSPEC_HIDDEN;
 
+static inline void d2d_matrix_multiply(D2D_MATRIX_3X2_F *a, const D2D_MATRIX_3X2_F *b)
+{
+    D2D_MATRIX_3X2_F tmp = *a;
+
+    a->_11 = tmp._11 * b->_11 + tmp._12 * b->_21;
+    a->_12 = tmp._11 * b->_12 + tmp._12 * b->_22;
+    a->_21 = tmp._21 * b->_11 + tmp._22 * b->_21;
+    a->_22 = tmp._21 * b->_12 + tmp._22 * b->_22;
+    a->_31 = tmp._31 * b->_11 + tmp._32 * b->_21 + b->_31;
+    a->_32 = tmp._31 * b->_12 + tmp._32 * b->_22 + b->_32;
+}
+
 #endif /* __WINE_D2D1_PRIVATE_H */
diff --git a/dlls/d2d1/render_target.c b/dlls/d2d1/render_target.c
index fa98b5b..01b484e 100644
--- a/dlls/d2d1/render_target.c
+++ b/dlls/d2d1/render_target.c
@@ -32,18 +32,6 @@ struct d2d_draw_text_layout_ctx
     D2D1_DRAW_TEXT_OPTIONS options;
 };
 
-static void d2d_matrix_multiply(D2D_MATRIX_3X2_F *a, const D2D_MATRIX_3X2_F *b)
-{
-    D2D_MATRIX_3X2_F tmp = *a;
-
-    a->_11 = tmp._11 * b->_11 + tmp._12 * b->_21;
-    a->_12 = tmp._11 * b->_12 + tmp._12 * b->_22;
-    a->_21 = tmp._21 * b->_11 + tmp._22 * b->_21;
-    a->_22 = tmp._21 * b->_12 + tmp._22 * b->_22;
-    a->_31 = tmp._31 * b->_11 + tmp._32 * b->_21 + b->_31;
-    a->_32 = tmp._31 * b->_12 + tmp._32 * b->_22 + b->_32;
-}
-
 static void d2d_point_set(D2D1_POINT_2F *dst, float x, float y)
 {
     dst->x = x;
@@ -550,7 +538,6 @@ static void STDMETHODCALLTYPE d2d_d3d_render_target_FillRectangle(ID2D1RenderTar
     D3D10_SUBRESOURCE_DATA buffer_data;
     D3D10_BUFFER_DESC buffer_desc;
     ID3D10Buffer *vs_cb, *ps_cb;
-    D2D1_COLOR_F color;
     float tmp_x, tmp_y;
     HRESULT hr;
     struct
@@ -609,64 +596,9 @@ static void STDMETHODCALLTYPE d2d_d3d_render_target_FillRectangle(ID2D1RenderTar
         return;
     }
 
-    if (brush_impl->type == D2D_BRUSH_TYPE_BITMAP)
-    {
-        struct d2d_bitmap *bitmap = brush_impl->u.bitmap.bitmap;
-        D2D_MATRIX_3X2_F w, b;
-        float dpi_scale, d;
-
-        /* Scale for dpi. */
-        w = render_target->drawing_state.transform;
-        dpi_scale = render_target->dpi_x / 96.0f;
-        w._11 *= dpi_scale;
-        w._21 *= dpi_scale;
-        w._31 *= dpi_scale;
-        dpi_scale = render_target->dpi_y / 96.0f;
-        w._12 *= dpi_scale;
-        w._22 *= dpi_scale;
-        w._32 *= dpi_scale;
-
-        /* Scale for bitmap size and dpi. */
-        b = brush_impl->transform;
-        dpi_scale = bitmap->pixel_size.width * (bitmap->dpi_x / 96.0f);
-        b._11 *= dpi_scale;
-        b._21 *= dpi_scale;
-        dpi_scale = bitmap->pixel_size.height * (bitmap->dpi_y / 96.0f);
-        b._12 *= dpi_scale;
-        b._22 *= dpi_scale;
-
-        d2d_matrix_multiply(&b, &w);
-
-        /* Invert the matrix. (Because the matrix is applied to the sampling
-         * coordinates. I.e., to scale the bitmap by 2 we need to divide the
-         * coordinates by 2.) */
-        d = b._11 * b._22 - b._21 * b._12;
-        if (d != 0.0f)
-        {
-            transform._11 = b._22 / d;
-            transform._21 = -b._21 / d;
-            transform._31 = (b._21 * b._32 - b._31 * b._22) / d;
-            transform._12 = -b._12 / d;
-            transform._22 = b._11 / d;
-            transform._32 = -(b._11 * b._32 - b._31 * b._12) / d;
-        }
-        transform.pad1 = brush_impl->opacity;
-
-        buffer_desc.ByteWidth = sizeof(transform);
-        buffer_data.pSysMem = &transform;
-    }
-    else
-    {
-        color = brush_impl->u.solid.color;
-        color.a *= brush_impl->opacity;
-
-        buffer_desc.ByteWidth = sizeof(color);
-        buffer_data.pSysMem = &color;
-    }
-
-    if (FAILED(hr = ID3D10Device_CreateBuffer(render_target->device, &buffer_desc, &buffer_data, &ps_cb)))
+    if (FAILED(hr = d2d_brush_get_ps_cb(brush_impl, render_target, &ps_cb)))
     {
-        WARN("Failed to create constant buffer, hr %#x.\n", hr);
+        WARN("Failed to get ps constant buffer, hr %#x.\n", hr);
         ID3D10Buffer_Release(vs_cb);
         return;
     }




More information about the wine-cvs mailing list