[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