[PATCH 2/4] dwrite: Read whole table directory with a single call when looking for table entry
Nikolay Sivov
nsivov at codeweavers.com
Mon Oct 9 02:47:03 CDT 2017
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
dlls/dwrite/opentype.c | 53 ++++++++++++++++++++++++++------------------------
1 file changed, 28 insertions(+), 25 deletions(-)
diff --git a/dlls/dwrite/opentype.c b/dlls/dwrite/opentype.c
index bb6f274cb4..71b90f9b74 100644
--- a/dlls/dwrite/opentype.c
+++ b/dlls/dwrite/opentype.c
@@ -74,7 +74,7 @@ typedef struct {
} TTC_SFNT_V1;
typedef struct {
- CHAR tag[4];
+ DWORD tag;
DWORD checkSum;
DWORD offset;
DWORD length;
@@ -1041,13 +1041,12 @@ HRESULT opentype_analyze_font(IDWriteFontFileStream *stream, UINT32* font_count,
HRESULT opentype_get_font_table(struct file_stream_desc *stream_desc, UINT32 tag, const void **table_data,
void **table_context, UINT32 *table_size, BOOL *found)
{
- HRESULT hr;
- TTC_SFNT_V1 *font_header = NULL;
- void *sfnt_context;
+ void *table_directory_context, *sfnt_context;
TT_TableRecord *table_record = NULL;
- void *table_record_context;
- int table_count, table_offset = 0;
- int i;
+ TTC_SFNT_V1 *font_header = NULL;
+ UINT32 table_offset = 0;
+ UINT16 table_count;
+ HRESULT hr;
if (found) *found = FALSE;
if (table_size) *table_size = 0;
@@ -1077,27 +1076,31 @@ HRESULT opentype_get_font_table(struct file_stream_desc *stream_desc, UINT32 tag
table_count = GET_BE_WORD(font_header->numTables);
table_offset += sizeof(*font_header);
- for (i = 0; i < table_count; i++)
- {
- hr = IDWriteFontFileStream_ReadFileFragment(stream_desc->stream, (const void**)&table_record, table_offset, sizeof(*table_record), &table_record_context);
- if (FAILED(hr))
- break;
- if (DWRITE_MAKE_OPENTYPE_TAG(table_record->tag[0], table_record->tag[1], table_record->tag[2], table_record->tag[3]) == tag)
- break;
- IDWriteFontFileStream_ReleaseFileFragment(stream_desc->stream, table_record_context);
- table_offset += sizeof(*table_record);
- }
IDWriteFontFileStream_ReleaseFileFragment(stream_desc->stream, sfnt_context);
- if (SUCCEEDED(hr) && i < table_count)
- {
- int offset = GET_BE_DWORD(table_record->offset);
- int length = GET_BE_DWORD(table_record->length);
- IDWriteFontFileStream_ReleaseFileFragment(stream_desc->stream, table_record_context);
- if (found) *found = TRUE;
- if (table_size) *table_size = length;
- hr = IDWriteFontFileStream_ReadFileFragment(stream_desc->stream, table_data, offset, length, table_context);
+ hr = IDWriteFontFileStream_ReadFileFragment(stream_desc->stream, (const void **)&table_record, table_offset,
+ table_count * sizeof(*table_record), &table_directory_context);
+ if (hr == S_OK) {
+ UINT16 i;
+
+ for (i = 0; i < table_count; i++) {
+ if (table_record->tag == tag) {
+ UINT32 offset = GET_BE_DWORD(table_record->offset);
+ UINT32 length = GET_BE_DWORD(table_record->length);
+
+ if (found)
+ *found = TRUE;
+ if (table_size)
+ *table_size = length;
+ hr = IDWriteFontFileStream_ReadFileFragment(stream_desc->stream, table_data, offset,
+ length, table_context);
+ break;
+ }
+ table_record++;
+ }
+
+ IDWriteFontFileStream_ReleaseFileFragment(stream_desc->stream, table_directory_context);
}
return hr;
--
2.14.2
More information about the wine-patches
mailing list