dwrite: Use consistent trace format for font data access objects.

Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Nikolay Sivov 2020-12-02 14:44:05 +03:00 committed by Alexandre Julliard
parent 87d6e45514
commit 62b6b9a952
2 changed files with 151 additions and 148 deletions

View file

@ -213,9 +213,10 @@ struct dwrite_colorglyphenum
#define GLYPH_BLOCK_MASK (GLYPH_BLOCK_SIZE - 1)
#define GLYPH_MAX 65536
struct dwrite_fontfile {
struct dwrite_fontfile
{
IDWriteFontFile IDWriteFontFile_iface;
LONG ref;
LONG refcount;
IDWriteFontFileLoader *loader;
void *reference_key;
@ -4786,9 +4787,7 @@ HRESULT get_eudc_fontcollection(IDWriteFactory7 *factory, IDWriteFontCollection3
static HRESULT WINAPI dwritefontfile_QueryInterface(IDWriteFontFile *iface, REFIID riid, void **obj)
{
struct dwrite_fontfile *This = impl_from_IDWriteFontFile(iface);
TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), obj);
TRACE("%p, %s, %p.\n", iface, debugstr_guid(riid), obj);
if (IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IDWriteFontFile))
{
@ -4805,46 +4804,53 @@ static HRESULT WINAPI dwritefontfile_QueryInterface(IDWriteFontFile *iface, REFI
static ULONG WINAPI dwritefontfile_AddRef(IDWriteFontFile *iface)
{
struct dwrite_fontfile *This = impl_from_IDWriteFontFile(iface);
ULONG ref = InterlockedIncrement(&This->ref);
TRACE("(%p)->(%d)\n", This, ref);
return ref;
struct dwrite_fontfile *file = impl_from_IDWriteFontFile(iface);
ULONG refcount = InterlockedIncrement(&file->refcount);
TRACE("%p, refcount %d.\n", iface, refcount);
return refcount;
}
static ULONG WINAPI dwritefontfile_Release(IDWriteFontFile *iface)
{
struct dwrite_fontfile *This = impl_from_IDWriteFontFile(iface);
ULONG ref = InterlockedDecrement(&This->ref);
struct dwrite_fontfile *file = impl_from_IDWriteFontFile(iface);
ULONG refcount = InterlockedDecrement(&file->refcount);
TRACE("(%p)->(%d)\n", This, ref);
TRACE("%p, refcount %d.\n", iface, refcount);
if (!ref)
if (!refcount)
{
IDWriteFontFileLoader_Release(This->loader);
if (This->stream) IDWriteFontFileStream_Release(This->stream);
heap_free(This->reference_key);
heap_free(This);
IDWriteFontFileLoader_Release(file->loader);
if (file->stream)
IDWriteFontFileStream_Release(file->stream);
heap_free(file->reference_key);
heap_free(file);
}
return ref;
return refcount;
}
static HRESULT WINAPI dwritefontfile_GetReferenceKey(IDWriteFontFile *iface, const void **fontFileReferenceKey, UINT32 *fontFileReferenceKeySize)
static HRESULT WINAPI dwritefontfile_GetReferenceKey(IDWriteFontFile *iface, const void **key, UINT32 *key_size)
{
struct dwrite_fontfile *This = impl_from_IDWriteFontFile(iface);
TRACE("(%p)->(%p, %p)\n", This, fontFileReferenceKey, fontFileReferenceKeySize);
*fontFileReferenceKey = This->reference_key;
*fontFileReferenceKeySize = This->key_size;
struct dwrite_fontfile *file = impl_from_IDWriteFontFile(iface);
TRACE("%p, %p, %p.\n", iface, key, key_size);
*key = file->reference_key;
*key_size = file->key_size;
return S_OK;
}
static HRESULT WINAPI dwritefontfile_GetLoader(IDWriteFontFile *iface, IDWriteFontFileLoader **fontFileLoader)
static HRESULT WINAPI dwritefontfile_GetLoader(IDWriteFontFile *iface, IDWriteFontFileLoader **loader)
{
struct dwrite_fontfile *This = impl_from_IDWriteFontFile(iface);
TRACE("(%p)->(%p)\n", This, fontFileLoader);
*fontFileLoader = This->loader;
IDWriteFontFileLoader_AddRef(This->loader);
struct dwrite_fontfile *file = impl_from_IDWriteFontFile(iface);
TRACE("%p, %p.\n", iface, loader);
*loader = file->loader;
IDWriteFontFileLoader_AddRef(*loader);
return S_OK;
}
@ -4852,11 +4858,11 @@ static HRESULT WINAPI dwritefontfile_GetLoader(IDWriteFontFile *iface, IDWriteFo
static HRESULT WINAPI dwritefontfile_Analyze(IDWriteFontFile *iface, BOOL *is_supported, DWRITE_FONT_FILE_TYPE *file_type,
DWRITE_FONT_FACE_TYPE *face_type, UINT32 *face_count)
{
struct dwrite_fontfile *This = impl_from_IDWriteFontFile(iface);
struct dwrite_fontfile *file = impl_from_IDWriteFontFile(iface);
IDWriteFontFileStream *stream;
HRESULT hr;
TRACE("(%p)->(%p, %p, %p, %p)\n", This, is_supported, file_type, face_type, face_count);
TRACE("%p, %p, %p, %p, %p.\n", iface, is_supported, file_type, face_type, face_count);
*is_supported = FALSE;
*file_type = DWRITE_FONT_FILE_TYPE_UNKNOWN;
@ -4864,7 +4870,7 @@ static HRESULT WINAPI dwritefontfile_Analyze(IDWriteFontFile *iface, BOOL *is_su
*face_type = DWRITE_FONT_FACE_TYPE_UNKNOWN;
*face_count = 0;
hr = IDWriteFontFileLoader_CreateStreamFromKey(This->loader, This->reference_key, This->key_size, &stream);
hr = IDWriteFontFileLoader_CreateStreamFromKey(file->loader, file->reference_key, file->key_size, &stream);
if (FAILED(hr))
return hr;
@ -4875,7 +4881,8 @@ static HRESULT WINAPI dwritefontfile_Analyze(IDWriteFontFile *iface, BOOL *is_su
return S_OK;
}
static const IDWriteFontFileVtbl dwritefontfilevtbl = {
static const IDWriteFontFileVtbl dwritefontfilevtbl =
{
dwritefontfile_QueryInterface,
dwritefontfile_AddRef,
dwritefontfile_Release,
@ -4901,7 +4908,7 @@ HRESULT create_font_file(IDWriteFontFileLoader *loader, const void *reference_ke
}
file->IDWriteFontFile_iface.lpVtbl = &dwritefontfilevtbl;
file->ref = 1;
file->refcount = 1;
IDWriteFontFileLoader_AddRef(loader);
file->loader = loader;
file->stream = NULL;
@ -5042,16 +5049,17 @@ struct local_cached_stream
struct dwrite_localfontfilestream
{
IDWriteFontFileStream IDWriteFontFileStream_iface;
LONG ref;
LONG refcount;
struct local_cached_stream *entry;
const void *file_ptr;
UINT64 size;
};
struct dwrite_localfontfileloader {
struct dwrite_localfontfileloader
{
IDWriteLocalFontFileLoader IDWriteLocalFontFileLoader_iface;
LONG ref;
LONG refcount;
struct list streams;
CRITICAL_SECTION cs;
@ -5118,16 +5126,17 @@ static void release_inmemory_stream(struct dwrite_inmemory_stream_data *stream)
static HRESULT WINAPI localfontfilestream_QueryInterface(IDWriteFontFileStream *iface, REFIID riid, void **obj)
{
struct dwrite_localfontfilestream *This = impl_from_IDWriteFontFileStream(iface);
struct dwrite_localfontfilestream *stream = impl_from_IDWriteFontFileStream(iface);
TRACE_(dwrite_file)("(%p)->(%s %p)\n", This, debugstr_guid(riid), obj);
TRACE_(dwrite_file)("%p, %s, %p.\n", iface, debugstr_guid(riid), obj);
if (IsEqualIID(riid, &IID_IDWriteFontFileStream) ||
IsEqualIID(riid, &IID_IUnknown))
{
*obj = iface;
if (InterlockedIncrement(&This->ref) == 1) {
InterlockedDecrement(&This->ref);
if (InterlockedIncrement(&stream->refcount) == 1)
{
InterlockedDecrement(&stream->refcount);
*obj = NULL;
return E_FAIL;
}
@ -5142,10 +5151,12 @@ static HRESULT WINAPI localfontfilestream_QueryInterface(IDWriteFontFileStream *
static ULONG WINAPI localfontfilestream_AddRef(IDWriteFontFileStream *iface)
{
struct dwrite_localfontfilestream *This = impl_from_IDWriteFontFileStream(iface);
ULONG ref = InterlockedIncrement(&This->ref);
TRACE_(dwrite_file)("(%p)->(%d)\n", This, ref);
return ref;
struct dwrite_localfontfilestream *stream = impl_from_IDWriteFontFileStream(iface);
ULONG refcount = InterlockedIncrement(&stream->refcount);
TRACE_(dwrite_file)("%p, refcount %d.\n", iface, refcount);
return refcount;
}
static inline void release_cached_stream(struct local_cached_stream *stream)
@ -5157,66 +5168,69 @@ static inline void release_cached_stream(struct local_cached_stream *stream)
static ULONG WINAPI localfontfilestream_Release(IDWriteFontFileStream *iface)
{
struct dwrite_localfontfilestream *This = impl_from_IDWriteFontFileStream(iface);
ULONG ref = InterlockedDecrement(&This->ref);
struct dwrite_localfontfilestream *stream = impl_from_IDWriteFontFileStream(iface);
ULONG refcount = InterlockedDecrement(&stream->refcount);
TRACE_(dwrite_file)("(%p)->(%d)\n", This, ref);
TRACE_(dwrite_file)("%p, refcount %d.\n", iface, refcount);
if (!ref) {
UnmapViewOfFile(This->file_ptr);
if (!refcount)
{
UnmapViewOfFile(stream->file_ptr);
EnterCriticalSection(&local_fontfile_loader.cs);
release_cached_stream(This->entry);
release_cached_stream(stream->entry);
LeaveCriticalSection(&local_fontfile_loader.cs);
heap_free(This);
heap_free(stream);
}
return ref;
return refcount;
}
static HRESULT WINAPI localfontfilestream_ReadFileFragment(IDWriteFontFileStream *iface, void const **fragment_start,
UINT64 offset, UINT64 fragment_size, void **fragment_context)
{
struct dwrite_localfontfilestream *This = impl_from_IDWriteFontFileStream(iface);
struct dwrite_localfontfilestream *stream = impl_from_IDWriteFontFileStream(iface);
TRACE_(dwrite_file)("(%p)->(%p, 0x%s, 0x%s, %p)\n", This, fragment_start,
TRACE_(dwrite_file)("%p, %p, 0x%s, 0x%s, %p.\n", iface, fragment_start,
wine_dbgstr_longlong(offset), wine_dbgstr_longlong(fragment_size), fragment_context);
*fragment_context = NULL;
if ((offset >= This->size - 1) || (fragment_size > This->size - offset)) {
if ((offset >= stream->size - 1) || (fragment_size > stream->size - offset))
{
*fragment_start = NULL;
return E_FAIL;
}
*fragment_start = (char*)This->file_ptr + offset;
*fragment_start = (char *)stream->file_ptr + offset;
return S_OK;
}
static void WINAPI localfontfilestream_ReleaseFileFragment(IDWriteFontFileStream *iface, void *fragment_context)
{
struct dwrite_localfontfilestream *This = impl_from_IDWriteFontFileStream(iface);
TRACE_(dwrite_file)("(%p)->(%p)\n", This, fragment_context);
TRACE_(dwrite_file)("%p, %p.\n", iface, fragment_context);
}
static HRESULT WINAPI localfontfilestream_GetFileSize(IDWriteFontFileStream *iface, UINT64 *size)
{
struct dwrite_localfontfilestream *This = impl_from_IDWriteFontFileStream(iface);
TRACE_(dwrite_file)("(%p)->(%p)\n", This, size);
*size = This->size;
struct dwrite_localfontfilestream *stream = impl_from_IDWriteFontFileStream(iface);
TRACE_(dwrite_file)("%p, %p.\n", iface, size);
*size = stream->size;
return S_OK;
}
static HRESULT WINAPI localfontfilestream_GetLastWriteTime(IDWriteFontFileStream *iface, UINT64 *last_writetime)
{
struct dwrite_localfontfilestream *This = impl_from_IDWriteFontFileStream(iface);
struct dwrite_localfontfilestream *stream = impl_from_IDWriteFontFileStream(iface);
ULARGE_INTEGER li;
TRACE_(dwrite_file)("(%p)->(%p)\n", This, last_writetime);
TRACE_(dwrite_file)("%p, %p.\n", iface, last_writetime);
li.u.LowPart = This->entry->key->writetime.dwLowDateTime;
li.u.HighPart = This->entry->key->writetime.dwHighDateTime;
li.u.LowPart = stream->entry->key->writetime.dwLowDateTime;
li.u.HighPart = stream->entry->key->writetime.dwHighDateTime;
*last_writetime = li.QuadPart;
return S_OK;
@ -5233,32 +5247,31 @@ static const IDWriteFontFileStreamVtbl localfontfilestreamvtbl =
localfontfilestream_GetLastWriteTime
};
static HRESULT create_localfontfilestream(const void *file_ptr, UINT64 size, struct local_cached_stream *entry, IDWriteFontFileStream **ret)
static HRESULT create_localfontfilestream(const void *file_ptr, UINT64 size, struct local_cached_stream *entry,
IDWriteFontFileStream **ret)
{
struct dwrite_localfontfilestream *This;
struct dwrite_localfontfilestream *object;
*ret = NULL;
This = heap_alloc(sizeof(struct dwrite_localfontfilestream));
if (!This)
if (!(object = heap_alloc(sizeof(*object))))
return E_OUTOFMEMORY;
This->IDWriteFontFileStream_iface.lpVtbl = &localfontfilestreamvtbl;
This->ref = 1;
object->IDWriteFontFileStream_iface.lpVtbl = &localfontfilestreamvtbl;
object->refcount = 1;
This->file_ptr = file_ptr;
This->size = size;
This->entry = entry;
object->file_ptr = file_ptr;
object->size = size;
object->entry = entry;
*ret = &object->IDWriteFontFileStream_iface;
*ret = &This->IDWriteFontFileStream_iface;
return S_OK;
}
static HRESULT WINAPI localfontfileloader_QueryInterface(IDWriteLocalFontFileLoader *iface, REFIID riid, void **obj)
{
struct dwrite_localfontfileloader *This = impl_from_IDWriteLocalFontFileLoader(iface);
TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), obj);
TRACE("%p, %s, %p.\n", iface, debugstr_guid(riid), obj);
if (IsEqualIID(riid, &IID_IDWriteLocalFontFileLoader) ||
IsEqualIID(riid, &IID_IDWriteFontFileLoader) ||
@ -5277,20 +5290,22 @@ static HRESULT WINAPI localfontfileloader_QueryInterface(IDWriteLocalFontFileLoa
static ULONG WINAPI localfontfileloader_AddRef(IDWriteLocalFontFileLoader *iface)
{
struct dwrite_localfontfileloader *This = impl_from_IDWriteLocalFontFileLoader(iface);
ULONG ref = InterlockedIncrement(&This->ref);
TRACE("(%p)->(%d)\n", This, ref);
return ref;
struct dwrite_localfontfileloader *loader = impl_from_IDWriteLocalFontFileLoader(iface);
ULONG refcount = InterlockedIncrement(&loader->refcount);
TRACE("%p, refcount %d.\n", iface, refcount);
return refcount;
}
static ULONG WINAPI localfontfileloader_Release(IDWriteLocalFontFileLoader *iface)
{
struct dwrite_localfontfileloader *This = impl_from_IDWriteLocalFontFileLoader(iface);
ULONG ref = InterlockedDecrement(&This->ref);
struct dwrite_localfontfileloader *loader = impl_from_IDWriteLocalFontFileLoader(iface);
ULONG refcount = InterlockedDecrement(&loader->refcount);
TRACE("(%p)->(%d)\n", This, ref);
TRACE("%p, refcount %d.\n", iface, refcount);
return ref;
return refcount;
}
static HRESULT create_local_cached_stream(const void *key, UINT32 key_size, struct local_cached_stream **ret)
@ -5359,53 +5374,53 @@ static HRESULT create_local_cached_stream(const void *key, UINT32 key_size, stru
static HRESULT WINAPI localfontfileloader_CreateStreamFromKey(IDWriteLocalFontFileLoader *iface, const void *key,
UINT32 key_size, IDWriteFontFileStream **ret)
{
struct dwrite_localfontfileloader *This = impl_from_IDWriteLocalFontFileLoader(iface);
const struct local_refkey *refkey = key;
struct dwrite_localfontfileloader *loader = impl_from_IDWriteLocalFontFileLoader(iface);
struct local_cached_stream *stream;
HRESULT hr = S_OK;
TRACE("(%p)->(%p, %u, %p)\n", This, key, key_size, ret);
TRACE("name: %s\n", debugstr_w(refkey->name));
TRACE("%p, %p, %u, %p.\n", iface, key, key_size, ret);
EnterCriticalSection(&This->cs);
EnterCriticalSection(&loader->cs);
*ret = NULL;
/* search cache first */
LIST_FOR_EACH_ENTRY(stream, &This->streams, struct local_cached_stream, entry) {
LIST_FOR_EACH_ENTRY(stream, &loader->streams, struct local_cached_stream, entry)
{
if (key_size == stream->key_size && !memcmp(stream->key, key, key_size)) {
IDWriteFontFileStream_QueryInterface(stream->stream, &IID_IDWriteFontFileStream, (void **)ret);
break;
}
}
if (*ret == NULL && (hr = create_local_cached_stream(key, key_size, &stream)) == S_OK) {
list_add_head(&This->streams, &stream->entry);
if (*ret == NULL && (hr = create_local_cached_stream(key, key_size, &stream)) == S_OK)
{
list_add_head(&loader->streams, &stream->entry);
*ret = stream->stream;
}
LeaveCriticalSection(&This->cs);
LeaveCriticalSection(&loader->cs);
return hr;
}
static HRESULT WINAPI localfontfileloader_GetFilePathLengthFromKey(IDWriteLocalFontFileLoader *iface, void const *key, UINT32 key_size, UINT32 *length)
static HRESULT WINAPI localfontfileloader_GetFilePathLengthFromKey(IDWriteLocalFontFileLoader *iface, void const *key,
UINT32 key_size, UINT32 *length)
{
struct dwrite_localfontfileloader *This = impl_from_IDWriteLocalFontFileLoader(iface);
const struct local_refkey *refkey = key;
TRACE("(%p)->(%p, %i, %p)\n", This, key, key_size, length);
TRACE("%p, %p, %u, %p.\n", iface, key, key_size, length);
*length = strlenW(refkey->name);
return S_OK;
}
static HRESULT WINAPI localfontfileloader_GetFilePathFromKey(IDWriteLocalFontFileLoader *iface, void const *key, UINT32 key_size, WCHAR *path, UINT32 length)
static HRESULT WINAPI localfontfileloader_GetFilePathFromKey(IDWriteLocalFontFileLoader *iface, void const *key,
UINT32 key_size, WCHAR *path, UINT32 length)
{
struct dwrite_localfontfileloader *This = impl_from_IDWriteLocalFontFileLoader(iface);
const struct local_refkey *refkey = key;
TRACE("(%p)->(%p, %i, %p, %i)\n", This, key, key_size, path, length);
TRACE("%p, %p, %u, %p, %u.\n", iface, key, key_size, path, length);
if (length < strlenW(refkey->name))
return E_INVALIDARG;
@ -5417,16 +5432,16 @@ static HRESULT WINAPI localfontfileloader_GetFilePathFromKey(IDWriteLocalFontFil
static HRESULT WINAPI localfontfileloader_GetLastWriteTimeFromKey(IDWriteLocalFontFileLoader *iface, void const *key,
UINT32 key_size, FILETIME *writetime)
{
struct dwrite_localfontfileloader *This = impl_from_IDWriteLocalFontFileLoader(iface);
const struct local_refkey *refkey = key;
TRACE("(%p)->(%p, %u, %p)\n", This, key, key_size, writetime);
TRACE("%p, %p, %u, %p.\n", iface, key, key_size, writetime);
*writetime = refkey->writetime;
return S_OK;
}
static const struct IDWriteLocalFontFileLoaderVtbl localfontfileloadervtbl = {
static const struct IDWriteLocalFontFileLoaderVtbl localfontfileloadervtbl =
{
localfontfileloader_QueryInterface,
localfontfileloader_AddRef,
localfontfileloader_Release,
@ -5439,7 +5454,7 @@ static const struct IDWriteLocalFontFileLoaderVtbl localfontfileloadervtbl = {
void init_local_fontfile_loader(void)
{
local_fontfile_loader.IDWriteLocalFontFileLoader_iface.lpVtbl = &localfontfileloadervtbl;
local_fontfile_loader.ref = 1;
local_fontfile_loader.refcount = 1;
list_init(&local_fontfile_loader.streams);
InitializeCriticalSection(&local_fontfile_loader.cs);
local_fontfile_loader.cs.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": localfileloader.lock");

View file

@ -61,9 +61,10 @@ struct gdiinterop
IDWriteFactory7 *factory;
};
struct memresource_stream {
struct memresource_stream
{
IDWriteFontFileStream IDWriteFontFileStream_iface;
LONG ref;
LONG refcount;
DWORD key;
};
@ -120,11 +121,6 @@ static inline struct gdiinterop *impl_from_IDWriteGdiInterop1(IDWriteGdiInterop1
return CONTAINING_RECORD(iface, struct gdiinterop, IDWriteGdiInterop1_iface);
}
static inline struct gdiinterop *impl_from_IDWriteFontFileLoader(IDWriteFontFileLoader *iface)
{
return CONTAINING_RECORD(iface, struct gdiinterop, IDWriteFontFileLoader_iface);
}
static inline struct memresource_stream *impl_from_IDWriteFontFileStream(IDWriteFontFileStream *iface)
{
return CONTAINING_RECORD(iface, struct memresource_stream, IDWriteFontFileStream_iface);
@ -899,9 +895,7 @@ static HRESULT WINAPI gdiinterop1_GetFontSignature_(IDWriteGdiInterop1 *iface, I
static HRESULT WINAPI gdiinterop1_GetFontSignature(IDWriteGdiInterop1 *iface, IDWriteFont *font, FONTSIGNATURE *fontsig)
{
struct gdiinterop *This = impl_from_IDWriteGdiInterop1(iface);
TRACE("(%p)->(%p %p)\n", This, font, fontsig);
TRACE("%p, %p, %p.\n", iface, font, fontsig);
if (!font)
return E_INVALIDARG;
@ -934,9 +928,7 @@ static const struct IDWriteGdiInterop1Vtbl gdiinteropvtbl = {
static HRESULT WINAPI memresourcestream_QueryInterface(IDWriteFontFileStream *iface, REFIID riid, void **out)
{
struct memresource_stream *This = impl_from_IDWriteFontFileStream(iface);
TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), out);
TRACE("%p, %s, %p.\n", iface, debugstr_guid(riid), out);
if (IsEqualIID(&IID_IDWriteFontFileStream, riid) || IsEqualIID(&IID_IUnknown, riid)) {
*out = iface;
@ -951,39 +943,41 @@ static HRESULT WINAPI memresourcestream_QueryInterface(IDWriteFontFileStream *if
static ULONG WINAPI memresourcestream_AddRef(IDWriteFontFileStream *iface)
{
struct memresource_stream *This = impl_from_IDWriteFontFileStream(iface);
ULONG ref = InterlockedIncrement(&This->ref);
TRACE("(%p)->(%d)\n", This, ref);
return ref;
struct memresource_stream *stream = impl_from_IDWriteFontFileStream(iface);
ULONG refcount = InterlockedIncrement(&stream->refcount);
TRACE("%p, refcount %d.\n", iface, refcount);
return refcount;
}
static ULONG WINAPI memresourcestream_Release(IDWriteFontFileStream *iface)
{
struct memresource_stream *This = impl_from_IDWriteFontFileStream(iface);
ULONG ref = InterlockedDecrement(&This->ref);
struct memresource_stream *stream = impl_from_IDWriteFontFileStream(iface);
ULONG refcount = InterlockedDecrement(&stream->refcount);
TRACE("(%p)->(%d)\n", This, ref);
TRACE("%p, refcount %d.\n", iface, refcount);
if (!ref)
heap_free(This);
if (!refcount)
heap_free(stream);
return ref;
return refcount;
}
static HRESULT WINAPI memresourcestream_ReadFileFragment(IDWriteFontFileStream *iface, void const **fragment_start,
UINT64 offset, UINT64 fragment_size, void **fragment_context)
{
struct memresource_stream *This = impl_from_IDWriteFontFileStream(iface);
struct memresource_stream *stream = impl_from_IDWriteFontFileStream(iface);
struct font_fileinfo fileinfo;
void *fragment;
TRACE("(%p)->(%p %s %s %p)\n", This, fragment_start, wine_dbgstr_longlong(offset),
TRACE("%p, %p, %s, %s, %p.\n", iface, fragment_start, wine_dbgstr_longlong(offset),
wine_dbgstr_longlong(fragment_size), fragment_context);
*fragment_context = NULL;
*fragment_start = NULL;
if (!GetFontFileInfo(This->key, 0, &fileinfo, sizeof(fileinfo), NULL))
if (!GetFontFileInfo(stream->key, 0, &fileinfo, sizeof(fileinfo), NULL))
return E_INVALIDARG;
if ((offset >= fileinfo.size.QuadPart - 1) || (fragment_size > fileinfo.size.QuadPart - offset))
@ -992,7 +986,7 @@ static HRESULT WINAPI memresourcestream_ReadFileFragment(IDWriteFontFileStream *
if (!(fragment = heap_alloc(fragment_size)))
return E_OUTOFMEMORY;
if (!GetFontFileData(This->key, 0, offset, fragment, fragment_size))
if (!GetFontFileData(stream->key, 0, offset, fragment, fragment_size))
return E_FAIL;
*fragment_start = *fragment_context = fragment;
@ -1001,21 +995,19 @@ static HRESULT WINAPI memresourcestream_ReadFileFragment(IDWriteFontFileStream *
static void WINAPI memresourcestream_ReleaseFileFragment(IDWriteFontFileStream *iface, void *fragment_context)
{
struct memresource_stream *This = impl_from_IDWriteFontFileStream(iface);
TRACE("(%p)->(%p)\n", This, fragment_context);
TRACE("%p, %p.\n", iface, fragment_context);
heap_free(fragment_context);
}
static HRESULT WINAPI memresourcestream_GetFileSize(IDWriteFontFileStream *iface, UINT64 *size)
{
struct memresource_stream *This = impl_from_IDWriteFontFileStream(iface);
struct memresource_stream *stream = impl_from_IDWriteFontFileStream(iface);
struct font_fileinfo fileinfo;
TRACE("(%p)->(%p)\n", This, size);
TRACE("%p, %p.\n", iface, size);
if (!GetFontFileInfo(This->key, 0, &fileinfo, sizeof(fileinfo), NULL))
if (!GetFontFileInfo(stream->key, 0, &fileinfo, sizeof(fileinfo), NULL))
return E_INVALIDARG;
*size = fileinfo.size.QuadPart;
@ -1025,14 +1017,13 @@ static HRESULT WINAPI memresourcestream_GetFileSize(IDWriteFontFileStream *iface
static HRESULT WINAPI memresourcestream_GetLastWriteTime(IDWriteFontFileStream *iface, UINT64 *last_writetime)
{
struct memresource_stream *This = impl_from_IDWriteFontFileStream(iface);
TRACE("(%p)->(%p)\n", This, last_writetime);
TRACE("%p, %p.\n", iface, last_writetime);
return E_NOTIMPL;
}
static const struct IDWriteFontFileStreamVtbl memresourcestreamvtbl = {
static const struct IDWriteFontFileStreamVtbl memresourcestreamvtbl =
{
memresourcestream_QueryInterface,
memresourcestream_AddRef,
memresourcestream_Release,
@ -1044,9 +1035,7 @@ static const struct IDWriteFontFileStreamVtbl memresourcestreamvtbl = {
static HRESULT WINAPI memresourceloader_QueryInterface(IDWriteFontFileLoader *iface, REFIID riid, void **out)
{
struct gdiinterop *This = impl_from_IDWriteFontFileLoader(iface);
TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), out);
TRACE("%p, %s, %p.\n", iface, debugstr_guid(riid), out);
if (IsEqualIID(&IID_IDWriteFontFileLoader, riid) || IsEqualIID(&IID_IUnknown, riid)) {
*out = iface;
@ -1072,10 +1061,9 @@ static ULONG WINAPI memresourceloader_Release(IDWriteFontFileLoader *iface)
static HRESULT WINAPI memresourceloader_CreateStreamFromKey(IDWriteFontFileLoader *iface, void const *key,
UINT32 key_size, IDWriteFontFileStream **ret)
{
struct gdiinterop *This = impl_from_IDWriteFontFileLoader(iface);
struct memresource_stream *stream;
TRACE("(%p)->(%p %u %p)\n", This, key, key_size, ret);
TRACE("%p, %p, %u, %p.\n", iface, key, key_size, ret);
*ret = NULL;
@ -1086,7 +1074,7 @@ static HRESULT WINAPI memresourceloader_CreateStreamFromKey(IDWriteFontFileLoade
return E_OUTOFMEMORY;
stream->IDWriteFontFileStream_iface.lpVtbl = &memresourcestreamvtbl;
stream->ref = 1;
stream->refcount = 1;
memcpy(&stream->key, key, sizeof(stream->key));
*ret = &stream->IDWriteFontFileStream_iface;