Nikolay Sivov : dwrite: Implement IDWriteFont::Equals().
Alexandre Julliard
julliard at winehq.org
Tue Nov 10 13:46:22 CST 2020
Module: wine
Branch: stable
Commit: 7e7fa4cae694ca3cad1206db6ac4c339adc4b0da
URL: https://source.winehq.org/git/wine.git/?a=commit;h=7e7fa4cae694ca3cad1206db6ac4c339adc4b0da
Author: Nikolay Sivov <nsivov at codeweavers.com>
Date: Mon Jan 27 08:52:49 2020 +0300
dwrite: Implement IDWriteFont::Equals().
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
(cherry picked from commit 4d3e0ba0a5ca7c3d59a5941965d19cbcecfeef89)
Signed-off-by: Michael Stefaniuc <mstefani at winehq.org>
---
dlls/dwrite/font.c | 63 +++++++++++++++++++++++++++++++-----------------------
1 file changed, 36 insertions(+), 27 deletions(-)
diff --git a/dlls/dwrite/font.c b/dlls/dwrite/font.c
index 99894276253..9f3e005236e 100644
--- a/dlls/dwrite/font.c
+++ b/dlls/dwrite/font.c
@@ -299,6 +299,8 @@ static inline struct dwrite_font *impl_from_IDWriteFont3(IDWriteFont3 *iface)
return CONTAINING_RECORD(iface, struct dwrite_font, IDWriteFont3_iface);
}
+static struct dwrite_font *unsafe_impl_from_IDWriteFont(IDWriteFont *iface);
+
static inline struct dwrite_fontfile *impl_from_IDWriteFontFile(IDWriteFontFile *iface)
{
return CONTAINING_RECORD(iface, struct dwrite_fontfile, IDWriteFontFile_iface);
@@ -472,6 +474,29 @@ void fontface_detach_from_cache(IDWriteFontFace5 *iface)
fontface->cached = NULL;
}
+static BOOL is_same_fontfile(IDWriteFontFile *left, IDWriteFontFile *right)
+{
+ UINT32 left_key_size, right_key_size;
+ const void *left_key, *right_key;
+ HRESULT hr;
+
+ if (left == right)
+ return TRUE;
+
+ hr = IDWriteFontFile_GetReferenceKey(left, &left_key, &left_key_size);
+ if (FAILED(hr))
+ return FALSE;
+
+ hr = IDWriteFontFile_GetReferenceKey(right, &right_key, &right_key_size);
+ if (FAILED(hr))
+ return FALSE;
+
+ if (left_key_size != right_key_size)
+ return FALSE;
+
+ return !memcmp(left_key, right_key, left_key_size);
+}
+
static HRESULT WINAPI dwritefontface_QueryInterface(IDWriteFontFace5 *iface, REFIID riid, void **obj)
{
struct dwrite_fontface *fontface = impl_from_IDWriteFontFace5(iface);
@@ -1821,11 +1846,18 @@ static HRESULT WINAPI dwritefont3_CreateFontFace(IDWriteFont3 *iface, IDWriteFon
return get_fontface_from_font(font, (IDWriteFontFace5 **)fontface);
}
-static BOOL WINAPI dwritefont3_Equals(IDWriteFont3 *iface, IDWriteFont *font)
+static BOOL WINAPI dwritefont3_Equals(IDWriteFont3 *iface, IDWriteFont *other)
{
- struct dwrite_font *This = impl_from_IDWriteFont3(iface);
- FIXME("(%p)->(%p): stub\n", This, font);
- return FALSE;
+ struct dwrite_font *font = impl_from_IDWriteFont3(iface), *other_font;
+
+ TRACE("%p, %p.\n", iface, other);
+
+ if (!(other_font = unsafe_impl_from_IDWriteFont(other)))
+ return FALSE;
+
+ return font->data->face_index == other_font->data->face_index
+ && font->data->simulations == other_font->data->simulations
+ && is_same_fontfile(font->data->file, other_font->data->file);
}
static HRESULT WINAPI dwritefont3_GetFontFaceReference(IDWriteFont3 *iface, IDWriteFontFaceReference **reference)
@@ -2691,29 +2723,6 @@ static HRESULT WINAPI dwritefontcollection_FindFamilyName(IDWriteFontCollection3
return S_OK;
}
-static BOOL is_same_fontfile(IDWriteFontFile *left, IDWriteFontFile *right)
-{
- UINT32 left_key_size, right_key_size;
- const void *left_key, *right_key;
- HRESULT hr;
-
- if (left == right)
- return TRUE;
-
- hr = IDWriteFontFile_GetReferenceKey(left, &left_key, &left_key_size);
- if (FAILED(hr))
- return FALSE;
-
- hr = IDWriteFontFile_GetReferenceKey(right, &right_key, &right_key_size);
- if (FAILED(hr))
- return FALSE;
-
- if (left_key_size != right_key_size)
- return FALSE;
-
- return !memcmp(left_key, right_key, left_key_size);
-}
-
static HRESULT WINAPI dwritefontcollection_GetFontFromFontFace(IDWriteFontCollection3 *iface, IDWriteFontFace *face,
IDWriteFont **font)
{
More information about the wine-cvs
mailing list