summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOleg Oshmyan <chortos@inbox.lv>2021-06-26 15:00:39 +0300
committerOleg Oshmyan <chortos@inbox.lv>2021-07-10 02:36:31 +0300
commitb4656109dbf9cf6384939f6475672b6db2d4a206 (patch)
tree9b6f0ff0e52c5309b3983d00acc8e571708b175c
parent5158b405a645fbc8d63f457803d4b40ef4239b33 (diff)
downloadlibass-b4656109dbf9cf6384939f6475672b6db2d4a206.tar.bz2
libass-b4656109dbf9cf6384939f6475672b6db2d4a206.tar.xz
directwrite: factor out conversion to UTF-8
-rw-r--r--libass/ass_directwrite.c84
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);