diff options
author | Oleg Oshmyan <chortos@inbox.lv> | 2021-06-26 15:00:39 +0300 |
---|---|---|
committer | Oleg Oshmyan <chortos@inbox.lv> | 2021-07-10 02:36:31 +0300 |
commit | b4656109dbf9cf6384939f6475672b6db2d4a206 (patch) | |
tree | 9b6f0ff0e52c5309b3983d00acc8e571708b175c | |
parent | 5158b405a645fbc8d63f457803d4b40ef4239b33 (diff) | |
download | libass-b4656109dbf9cf6384939f6475672b6db2d4a206.tar.bz2 libass-b4656109dbf9cf6384939f6475672b6db2d4a206.tar.xz |
directwrite: factor out conversion to UTF-8
-rw-r--r-- | libass/ass_directwrite.c | 84 |
1 files changed, 26 insertions, 58 deletions
diff --git a/libass/ass_directwrite.c b/libass/ass_directwrite.c index 3e839eb..4545bf5 100644 --- a/libass/ass_directwrite.c +++ b/libass/ass_directwrite.c @@ -426,6 +426,24 @@ static int encode_utf16(wchar_t *chars, uint32_t codepoint) } } +static char *get_utf8_name(IDWriteLocalizedStrings *names, int k) +{ + wchar_t temp_name[NAME_MAX_LENGTH]; + HRESULT hr = IDWriteLocalizedStrings_GetString(names, k, + temp_name, + NAME_MAX_LENGTH); + if (FAILED(hr)) + return NULL; + + temp_name[NAME_MAX_LENGTH-1] = 0; + int size_needed = WideCharToMultiByte(CP_UTF8, 0, temp_name, -1, NULL, 0, NULL, NULL); + char *mbName = (char *) malloc(size_needed); + if (!mbName) + return NULL; + WideCharToMultiByte(CP_UTF8, 0, temp_name, -1, mbName, size_needed, NULL, NULL); + return mbName; +} + static char *get_fallback(void *priv, ASS_Library *lib, const char *base, uint32_t codepoint) { @@ -483,15 +501,6 @@ static char *get_fallback(void *priv, ASS_Library *lib, return NULL; } - wchar_t temp_name[NAME_MAX_LENGTH]; - hr = IDWriteLocalizedStrings_GetString(familyNames, 0, temp_name, NAME_MAX_LENGTH); - if (FAILED(hr)) { - IDWriteLocalizedStrings_Release(familyNames); - IDWriteFont_Release(font); - return NULL; - } - temp_name[NAME_MAX_LENGTH-1] = 0; - // DirectWrite may not have found a valid fallback, so check that // the selected font actually has the requested glyph. if (codepoint > 0) { @@ -503,9 +512,7 @@ static char *get_fallback(void *priv, ASS_Library *lib, } } - int size_needed = WideCharToMultiByte(CP_UTF8, 0, temp_name, -1, NULL, 0,NULL, NULL); - char *family = (char *) malloc(size_needed); - WideCharToMultiByte(CP_UTF8, 0, temp_name, -1, family, size_needed, NULL, NULL); + char *family = get_utf8_name(familyNames, 0); IDWriteLocalizedStrings_Release(familyNames); IDWriteFont_Release(font); @@ -534,8 +541,6 @@ static void add_font(IDWriteFont *font, IDWriteFontFamily *fontFamily, { HRESULT hr; BOOL exists; - wchar_t temp_name[NAME_MAX_LENGTH]; - int size_needed; ASS_FontProviderMetaData meta = {0}; meta.weight = IDWriteFont_GetWeight(font); @@ -553,23 +558,10 @@ static void add_font(IDWriteFont *font, IDWriteFontFamily *fontFamily, goto cleanup; if (exists) { - hr = IDWriteLocalizedStrings_GetString(psNames, 0, temp_name, NAME_MAX_LENGTH); - if (FAILED(hr)) { - IDWriteLocalizedStrings_Release(psNames); - goto cleanup; - } - - temp_name[NAME_MAX_LENGTH-1] = 0; - size_needed = WideCharToMultiByte(CP_UTF8, 0, temp_name, -1, NULL, 0, NULL, NULL); - char *mbName = (char *) malloc(size_needed); - if (!mbName) { - IDWriteLocalizedStrings_Release(psNames); - goto cleanup; - } - WideCharToMultiByte(CP_UTF8, 0, temp_name, -1, mbName, size_needed, NULL, NULL); - meta.postscript_name = mbName; - + meta.postscript_name = get_utf8_name(psNames, 0); IDWriteLocalizedStrings_Release(psNames); + if (!meta.postscript_name) + goto cleanup; } IDWriteLocalizedStrings *fontNames; @@ -586,23 +578,11 @@ static void add_font(IDWriteFont *font, IDWriteFontFamily *fontFamily, goto cleanup; } for (int k = 0; k < meta.n_fullname; k++) { - hr = IDWriteLocalizedStrings_GetString(fontNames, k, - temp_name, - NAME_MAX_LENGTH); - if (FAILED(hr)) { - IDWriteLocalizedStrings_Release(fontNames); - goto cleanup; - } - - temp_name[NAME_MAX_LENGTH-1] = 0; - size_needed = WideCharToMultiByte(CP_UTF8, 0, temp_name, -1, NULL, 0, NULL, NULL); - char *mbName = (char *) malloc(size_needed); - if (!mbName) { + meta.fullnames[k] = get_utf8_name(fontNames, k); + if (!meta.fullnames[k]) { IDWriteLocalizedStrings_Release(fontNames); goto cleanup; } - WideCharToMultiByte(CP_UTF8, 0, temp_name, -1, mbName, size_needed, NULL, NULL); - meta.fullnames[k] = mbName; } IDWriteLocalizedStrings_Release(fontNames); } @@ -622,23 +602,11 @@ static void add_font(IDWriteFont *font, IDWriteFontFamily *fontFamily, goto cleanup; } for (int k = 0; k < meta.n_family; k++) { - hr = IDWriteLocalizedStrings_GetString(familyNames, k, - temp_name, - NAME_MAX_LENGTH); - if (FAILED(hr)) { - IDWriteLocalizedStrings_Release(familyNames); - goto cleanup; - } - - temp_name[NAME_MAX_LENGTH-1] = 0; - size_needed = WideCharToMultiByte(CP_UTF8, 0, temp_name, -1, NULL, 0, NULL, NULL); - char *mbName = (char *) malloc(size_needed); - if (!mbName) { + meta.families[k] = get_utf8_name(familyNames, k); + if (!meta.families[k]) { IDWriteLocalizedStrings_Release(familyNames); goto cleanup; } - WideCharToMultiByte(CP_UTF8, 0, temp_name, -1, mbName, size_needed, NULL, NULL); - meta.families[k] = mbName; } IDWriteLocalizedStrings_Release(familyNames); |