Henri Verbeet : d2d1: Implement d2d_d3d_render_target_DrawTextLayout().
Alexandre Julliard
julliard at wine.codeweavers.com
Mon Oct 6 15:19:10 CDT 2014
Module: wine
Branch: master
Commit: 0d962da9d3c7a5b3b6509da66c1a05926c7554b1
URL: http://source.winehq.org/git/wine.git/?a=commit;h=0d962da9d3c7a5b3b6509da66c1a05926c7554b1
Author: Henri Verbeet <hverbeet at codeweavers.com>
Date: Mon Oct 6 08:24:17 2014 +0200
d2d1: Implement d2d_d3d_render_target_DrawTextLayout().
---
dlls/d2d1/d2d1_private.h | 5 ++
dlls/d2d1/factory.c | 1 +
dlls/d2d1/render_target.c | 138 +++++++++++++++++++++++++++++++++++++++++++++-
3 files changed, 143 insertions(+), 1 deletion(-)
diff --git a/dlls/d2d1/d2d1_private.h b/dlls/d2d1/d2d1_private.h
index 7c7956b..2d1fea2 100644
--- a/dlls/d2d1/d2d1_private.h
+++ b/dlls/d2d1/d2d1_private.h
@@ -24,6 +24,10 @@
#include <limits.h>
#define COBJMACROS
#include "d2d1.h"
+#ifdef D2D1_INIT_GUID
+#include "initguid.h"
+#endif
+#include "dwrite.h"
struct d2d_clip_stack
{
@@ -35,6 +39,7 @@ struct d2d_clip_stack
struct d2d_d3d_render_target
{
ID2D1RenderTarget ID2D1RenderTarget_iface;
+ IDWriteTextRenderer IDWriteTextRenderer_iface;
LONG refcount;
ID3D10Device *device;
diff --git a/dlls/d2d1/factory.c b/dlls/d2d1/factory.c
index 7919210..27370c1 100644
--- a/dlls/d2d1/factory.c
+++ b/dlls/d2d1/factory.c
@@ -19,6 +19,7 @@
#include "config.h"
#include "wine/port.h"
+#define D2D1_INIT_GUID
#include "d2d1_private.h"
WINE_DEFAULT_DEBUG_CHANNEL(d2d);
diff --git a/dlls/d2d1/render_target.c b/dlls/d2d1/render_target.c
index 4a69fce..f730e64 100644
--- a/dlls/d2d1/render_target.c
+++ b/dlls/d2d1/render_target.c
@@ -26,6 +26,12 @@ WINE_DEFAULT_DEBUG_CHANNEL(d2d);
#define INITIAL_CLIP_STACK_SIZE 4
+struct d2d_draw_text_layout_ctx
+{
+ ID2D1Brush *brush;
+ D2D1_DRAW_TEXT_OPTIONS options;
+};
+
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;
@@ -503,8 +509,19 @@ static void STDMETHODCALLTYPE d2d_d3d_render_target_DrawText(ID2D1RenderTarget *
static void STDMETHODCALLTYPE d2d_d3d_render_target_DrawTextLayout(ID2D1RenderTarget *iface,
D2D1_POINT_2F origin, IDWriteTextLayout *layout, ID2D1Brush *brush, D2D1_DRAW_TEXT_OPTIONS options)
{
- FIXME("iface %p, origin {%.8e, %.8e}, layout %p, brush %p, options %#x stub!\n",
+ struct d2d_d3d_render_target *render_target = impl_from_ID2D1RenderTarget(iface);
+ struct d2d_draw_text_layout_ctx ctx;
+ HRESULT hr;
+
+ TRACE("iface %p, origin {%.8e, %.8e}, layout %p, brush %p, options %#x.\n",
iface, origin.x, origin.y, layout, brush, options);
+
+ ctx.brush = brush;
+ ctx.options = options;
+
+ if (FAILED(hr = IDWriteTextLayout_Draw(layout,
+ &ctx, &render_target->IDWriteTextRenderer_iface, origin.x, origin.y)))
+ FIXME("Failed to draw text layout, hr %#x.\n", hr);
}
static void STDMETHODCALLTYPE d2d_d3d_render_target_DrawGlyphRun(ID2D1RenderTarget *iface,
@@ -883,6 +900,124 @@ static const struct ID2D1RenderTargetVtbl d2d_d3d_render_target_vtbl =
d2d_d3d_render_target_IsSupported,
};
+static inline struct d2d_d3d_render_target *impl_from_IDWriteTextRenderer(IDWriteTextRenderer *iface)
+{
+ return CONTAINING_RECORD(iface, struct d2d_d3d_render_target, IDWriteTextRenderer_iface);
+}
+
+HRESULT STDMETHODCALLTYPE d2d_text_renderer_QueryInterface(IDWriteTextRenderer *iface, REFIID iid, void **out)
+{
+ TRACE("iface %p, iid %s, out %p.\n", iface, debugstr_guid(iid), out);
+
+ if (IsEqualGUID(iid, &IID_IDWriteTextRenderer)
+ || IsEqualGUID(iid, &IID_IDWritePixelSnapping)
+ || IsEqualGUID(iid, &IID_IUnknown))
+ {
+ IDWriteTextRenderer_AddRef(iface);
+ *out = iface;
+ return S_OK;
+ }
+
+ WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(iid));
+
+ *out = NULL;
+ return E_NOINTERFACE;
+}
+
+ULONG STDMETHODCALLTYPE d2d_text_renderer_AddRef(IDWriteTextRenderer *iface)
+{
+ struct d2d_d3d_render_target *render_target = impl_from_IDWriteTextRenderer(iface);
+
+ TRACE("iface %p.\n", iface);
+
+ return d2d_d3d_render_target_AddRef(&render_target->ID2D1RenderTarget_iface);
+}
+
+ULONG STDMETHODCALLTYPE d2d_text_renderer_Release(IDWriteTextRenderer *iface)
+{
+ struct d2d_d3d_render_target *render_target = impl_from_IDWriteTextRenderer(iface);
+
+ TRACE("iface %p.\n", iface);
+
+ return d2d_d3d_render_target_Release(&render_target->ID2D1RenderTarget_iface);
+}
+
+HRESULT STDMETHODCALLTYPE d2d_text_renderer_IsPixelSnappingDisabled(IDWriteTextRenderer *iface,
+ void *ctx, BOOL *disabled)
+{
+ FIXME("iface %p, ctx %p, disabled %p stub!\n", iface, ctx, disabled);
+
+ return E_NOTIMPL;
+}
+
+HRESULT STDMETHODCALLTYPE d2d_text_renderer_GetCurrentTransform(IDWriteTextRenderer *iface,
+ void *ctx, DWRITE_MATRIX *transform)
+{
+ FIXME("iface %p, ctx %p, transform %p stub!\n", iface, ctx, transform);
+
+ return E_NOTIMPL;
+}
+
+HRESULT STDMETHODCALLTYPE d2d_text_renderer_GetPixelsPerDip(IDWriteTextRenderer *iface, void *ctx, float *ppd)
+{
+ FIXME("iface %p, ctx %p, ppd %p stub!\n", iface, ctx, ppd);
+
+ return E_NOTIMPL;
+}
+
+HRESULT STDMETHODCALLTYPE d2d_text_renderer_DrawGlyphRun(IDWriteTextRenderer *iface, void *ctx,
+ float baseline_origin_x, float baseline_origin_y, DWRITE_MEASURING_MODE measuring_mode,
+ const DWRITE_GLYPH_RUN *glyph_run, const DWRITE_GLYPH_RUN_DESCRIPTION *desc, IUnknown *effect)
+{
+ FIXME("iface %p, ctx %p, baseline_origin_x %.8e, baseline_origin_y %.8e, "
+ "measuring_mode %#x, glyph_run %p, desc %p, effect %p stub!\n",
+ iface, ctx, baseline_origin_x, baseline_origin_y,
+ measuring_mode, glyph_run, desc, effect);
+
+ return E_NOTIMPL;
+}
+
+HRESULT STDMETHODCALLTYPE d2d_text_renderer_DrawUnderline(IDWriteTextRenderer *iface, void *ctx,
+ float baseline_origin_x, float baseline_origin_y, const DWRITE_UNDERLINE *underline, IUnknown *effect)
+{
+ FIXME("iface %p, ctx %p, baseline_origin_x %.8e, baseline_origin_y %.8e, underline %p, effect %p stub!\n",
+ iface, ctx, baseline_origin_x, baseline_origin_y, underline, effect);
+
+ return E_NOTIMPL;
+}
+
+HRESULT STDMETHODCALLTYPE d2d_text_renderer_DrawStrikethrough(IDWriteTextRenderer *iface, void *ctx,
+ float baseline_origin_x, float baseline_origin_y, const DWRITE_STRIKETHROUGH *strikethrough, IUnknown *effect)
+{
+ FIXME("iface %p, ctx %p, baseline_origin_x %.8e, baseline_origin_y %.8e, strikethrough %p, effect %p stub!\n",
+ iface, ctx, baseline_origin_x, baseline_origin_y, strikethrough, effect);
+
+ return E_NOTIMPL;
+}
+
+HRESULT STDMETHODCALLTYPE d2d_text_renderer_DrawInlineObject(IDWriteTextRenderer *iface, void *ctx,
+ float origin_x, float origin_y, IDWriteInlineObject *object, BOOL is_sideways, BOOL is_rtl, IUnknown *effect)
+{
+ FIXME("iface %p, ctx %p, origin_x %.8e, origin_y %.8e, object %p, is_sideways %#x, is_rtl %#x, effect %p stub!\n",
+ iface, ctx, origin_x, origin_y, object, is_sideways, is_rtl, effect);
+
+ return E_NOTIMPL;
+}
+
+static const struct IDWriteTextRendererVtbl d2d_text_renderer_vtbl =
+{
+ d2d_text_renderer_QueryInterface,
+ d2d_text_renderer_AddRef,
+ d2d_text_renderer_Release,
+ d2d_text_renderer_IsPixelSnappingDisabled,
+ d2d_text_renderer_GetCurrentTransform,
+ d2d_text_renderer_GetPixelsPerDip,
+ d2d_text_renderer_DrawGlyphRun,
+ d2d_text_renderer_DrawUnderline,
+ d2d_text_renderer_DrawStrikethrough,
+ d2d_text_renderer_DrawInlineObject,
+};
+
HRESULT d2d_d3d_render_target_init(struct d2d_d3d_render_target *render_target, ID2D1Factory *factory,
IDXGISurface *surface, const D2D1_RENDER_TARGET_PROPERTIES *desc)
{
@@ -967,6 +1102,7 @@ HRESULT d2d_d3d_render_target_init(struct d2d_d3d_render_target *render_target,
FIXME("Ignoring render target properties.\n");
render_target->ID2D1RenderTarget_iface.lpVtbl = &d2d_d3d_render_target_vtbl;
+ render_target->IDWriteTextRenderer_iface.lpVtbl = &d2d_text_renderer_vtbl;
render_target->refcount = 1;
if (FAILED(hr = IDXGISurface_GetDevice(surface, &IID_ID3D10Device, (void **)&render_target->device)))
More information about the wine-cvs
mailing list