[prev in list] [next in list] [prev in thread] [next in thread] 

List:       wine-devel
Subject:    Implementation of IDwriteFactory::CreateCustomFontCollection
From:       Guillaume Charifi <guillaume.charifi () sfr ! fr>
Date:       2014-08-29 11:47:04
Message-ID: 1694105751.2072658.1409312824761.JavaMail.www () wsfrf1318
[Download RAW message or body]

Hello, I heard you are working on IDwriteFactory::CreateCustomFontCollection \
implementation, so I attached my current work, if it can help. It's almost done, just \
this part, retrieving the font family name to effectively save it, is to be \
implemented (even if Adobe Creative Cloud works with this changes):

+               if(!This->families) {
+                       This->count = 1;
+                       This->alloc = 1;
+                       This->families = heap_alloc(This->alloc * sizeof(WCHAR *));
+                       This->families[0] = heap_strdupW((const \
WCHAR[]){'d','u','m','m','y',0}); +               } else {
+                       add_family_syscollection(This, (const \
WCHAR[]){'d','u','m','m','y',0}); +               }

In the hope it could be useful,
Regards


["dwrite.CreateCustomFontCollection.patch" (text/x-patch)]

diff --git a/dlls/dwrite/dwrite_private.h b/dlls/dwrite/dwrite_private.h
index 0f386ce..8f31787 100644
--- a/dlls/dwrite/dwrite_private.h
+++ b/dlls/dwrite/dwrite_private.h
@@ -89,6 +89,7 @@ extern HRESULT add_localizedstring(IDWriteLocalizedStrings*,const \
WCHAR*,const W  extern HRESULT get_system_fontcollection(IDWriteFontCollection**) \
DECLSPEC_HIDDEN;  extern void release_system_fontcollection(void) DECLSPEC_HIDDEN;
 extern HRESULT get_textanalyzer(IDWriteTextAnalyzer**) DECLSPEC_HIDDEN;
+extern HRESULT create_font_collection(IDWriteFactory *factory, \
IDWriteFontCollectionLoader *loader, const void *reference_key, UINT32 key_size, \
IDWriteFontCollection **font_collection) DECLSPEC_HIDDEN;  extern HRESULT \
create_font_file(IDWriteFontFileLoader *loader, const void *reference_key, UINT32 \
key_size, IDWriteFontFile **font_file) DECLSPEC_HIDDEN;  extern HRESULT \
create_localfontfileloader(IDWriteLocalFontFileLoader** iface) DECLSPEC_HIDDEN;  \
extern HRESULT font_create_fontface(IDWriteFactory *iface, DWRITE_FONT_FACE_TYPE \
facetype, UINT32 files_number, IDWriteFontFile* const* font_files, UINT32 index, \
                DWRITE_FONT_SIMULATIONS sim_flags, IDWriteFontFace **font_face) \
                DECLSPEC_HIDDEN;
diff --git a/dlls/dwrite/font.c b/dlls/dwrite/font.c
index 6c3d162..b0a12d0 100644
--- a/dlls/dwrite/font.c
+++ b/dlls/dwrite/font.c
@@ -938,6 +938,116 @@ static INT CALLBACK enum_font_families(const LOGFONTW *lf, \
const TEXTMETRICW *tm  return add_family_syscollection(collection, lf->lfFaceName) == \
S_OK;  }
 
+HRESULT create_font_collection(IDWriteFactory *factory, IDWriteFontCollectionLoader \
*loader, const void *reference_key, UINT32 key_size, IDWriteFontCollection \
**font_collection) +{
+    HRESULT hr;
+    struct dwrite_fontcollection *This;
+    IDWriteFontFileEnumerator *fontFileEnum = NULL;
+    IDWriteFontFile *fontFile = NULL;
+    BOOL hasCurFile;
+    const void *fontFileReferenceKey = NULL;
+    UINT32 fontFileReferenceKeySize;
+    IDWriteFontFileLoader *fontFileLoader = NULL;
+    IDWriteFontFileStream *fontFileStream = NULL;
+    UINT64 fontFileSize;
+    const void *fontFileData = NULL;
+    void *fontFileFragCtx = NULL;
+    DWORD cFonts;
+    HANDLE hFont;
+
+    *font_collection = NULL;
+
+    This = heap_alloc(sizeof(struct dwrite_fontcollection));
+    if (!This) return E_OUTOFMEMORY;
+
+    This->IDWriteFontCollection_iface.lpVtbl = &systemfontcollectionvtbl;
+    This->families = NULL;
+    This->alloc = 0;
+    This->count = 0;
+
+    hr = IDWriteFontCollectionLoader_CreateEnumeratorFromKey(loader, factory, \
reference_key, key_size, &fontFileEnum); +    if(hr != S_OK || !fontFileEnum)
+        goto fail;
+
+    hr = IDWriteFontFileEnumerator_MoveNext(fontFileEnum, &hasCurFile);
+    if(hr != S_OK)
+        goto fail;
+
+    while(hasCurFile) {
+        hr = IDWriteFontFileEnumerator_GetCurrentFontFile(fontFileEnum, &fontFile);
+        if(hr != S_OK)
+            goto fail;
+
+        hr = IDWriteFontFile_GetReferenceKey(fontFile, &fontFileReferenceKey, \
&fontFileReferenceKeySize); +        if(hr != S_OK)
+            goto fail;
+
+        hr = IDWriteFontFile_GetLoader(fontFile, &fontFileLoader);
+        if(hr != S_OK)
+            goto fail;
+
+        hr = IDWriteFontFileLoader_CreateStreamFromKey(fontFileLoader, \
fontFileReferenceKey, fontFileReferenceKeySize, &fontFileStream); +        if(hr != \
S_OK) +            goto fail;
+
+        hr = IDWriteFontFileStream_GetFileSize(fontFileStream, &fontFileSize);
+        if(hr != S_OK)
+            goto fail;
+
+        hr = IDWriteFontFileStream_ReadFileFragment(fontFileStream, &fontFileData, \
0, fontFileSize, &fontFileFragCtx); +        if(hr != S_OK)
+            goto fail;
+
+        hFont = AddFontMemResourceEx((void *)fontFileData, fontFileSize, 0, \
&cFonts); +        if(!hFont)
+            goto fail;
+
+        if(!This->families) {
+            This->count = 1;
+            This->alloc = 1;
+            This->families = heap_alloc(This->alloc * sizeof(WCHAR *));
+            This->families[0] = heap_strdupW((const \
WCHAR[]){'d','u','m','m','y',0}); +        } else {
+            add_family_syscollection(This, (const WCHAR[]){'d','u','m','m','y',0});
+        }
+
+        IDWriteFontFileStream_ReleaseFileFragment(fontFileStream, fontFileFragCtx);
+        fontFileFragCtx = NULL;
+        IDWriteFontFileStream_Release(fontFileStream);
+        fontFileStream = NULL;
+        IDWriteFontFileLoader_Release(fontFileLoader);
+        fontFileLoader = NULL;
+        IDWriteFontFile_Release(fontFile);
+        fontFile = NULL;
+
+        hr = IDWriteFontFileEnumerator_MoveNext(fontFileEnum, &hasCurFile);
+        if(hr != S_OK)
+            goto fail;
+    }
+
+    IDWriteFontFileEnumerator_Release(fontFileEnum);
+    fontFileEnum = NULL;
+
+    *font_collection = &This->IDWriteFontCollection_iface;
+
+    return S_OK;
+
+    fail:
+    if(fontFileFragCtx)
+        IDWriteFontFileStream_ReleaseFileFragment(fontFileStream, fontFileFragCtx);
+    if(fontFileStream)
+        IDWriteFontFileStream_Release(fontFileStream);
+    if(fontFileLoader)
+        IDWriteFontFileLoader_Release(fontFileLoader);
+    if(fontFile)
+        IDWriteFontFile_Release(fontFile);
+    if(fontFileEnum)
+        IDWriteFontFileEnumerator_Release(fontFileEnum);
+
+    heap_free(This);
+    return E_FAIL;
+}
+
 static void release_font_collection(IDWriteFontCollection *iface)
 {
     struct dwrite_fontcollection *This = impl_from_IDWriteFontCollection(iface);
diff --git a/dlls/dwrite/main.c b/dlls/dwrite/main.c
index 59d9d64..ea8d51b 100644
--- a/dlls/dwrite/main.c
+++ b/dlls/dwrite/main.c
@@ -443,9 +443,21 @@ static HRESULT WINAPI \
dwritefactory_GetSystemFontCollection(IDWriteFactory *ifac  static HRESULT WINAPI \
                dwritefactory_CreateCustomFontCollection(IDWriteFactory *iface,
     IDWriteFontCollectionLoader *loader, void const *key, UINT32 key_size, \
IDWriteFontCollection **collection)  {
+    int i;
     struct dwritefactory *This = impl_from_IDWriteFactory(iface);
-    FIXME("(%p)->(%p %p %u %p): stub\n", This, loader, key, key_size, collection);
-    return E_NOTIMPL;
+    HRESULT hr;
+
+    FIXME("(%p)->(%p %p %u %p): implementing\n", This, loader, key, key_size, \
collection); +
+    if (loader == NULL)
+        return E_INVALIDARG;
+
+    for (i = 0; i < This->loader_count; i++)
+        if (This->loaders[i] == loader) break;
+    if (i == This->loader_count)
+        return E_INVALIDARG;
+    hr = create_font_collection(iface, loader, key, key_size, collection);
+    return hr;
 }
 
 static HRESULT WINAPI dwritefactory_RegisterFontCollectionLoader(IDWriteFactory \
*iface,





[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic