Nikolay Sivov : dwrite: Support Mac platform id and some of its encodings when reading 'name' table.
Alexandre Julliard
julliard at wine.codeweavers.com
Wed Oct 29 07:36:58 CDT 2014
Module: wine
Branch: master
Commit: 6128e73f7734db4d03048e05c574ebcd90618e6a
URL: http://source.winehq.org/git/wine.git/?a=commit;h=6128e73f7734db4d03048e05c574ebcd90618e6a
Author: Nikolay Sivov <nsivov at codeweavers.com>
Date: Mon Oct 27 13:40:37 2014 +0300
dwrite: Support Mac platform id and some of its encodings when reading 'name' table.
---
dlls/dwrite/opentype.c | 156 ++++++++++++++++++++++++++++++++++++++++---------
1 file changed, 128 insertions(+), 28 deletions(-)
diff --git a/dlls/dwrite/opentype.c b/dlls/dwrite/opentype.c
index c6f7a52..21b1cb2 100644
--- a/dlls/dwrite/opentype.c
+++ b/dlls/dwrite/opentype.c
@@ -201,6 +201,15 @@ typedef struct {
TT_NameRecord nameRecord[1];
} TT_NAME_V0;
+enum OPENTYPE_PLATFORM_ID
+{
+ OPENTYPE_PLATFORM_UNICODE = 0,
+ OPENTYPE_PLATFORM_MAC,
+ OPENTYPE_PLATFORM_ISO,
+ OPENTYPE_PLATFORM_WIN,
+ OPENTYPE_PLATFORM_CUSTOM
+};
+
enum TT_NAME_WINDOWS_ENCODING_ID
{
TT_NAME_WINDOWS_ENCODING_SYMBOL = 0,
@@ -216,6 +225,43 @@ enum TT_NAME_WINDOWS_ENCODING_ID
TT_NAME_WINDOWS_ENCODING_UCS4
};
+enum TT_NAME_MAC_ENCODING_ID
+{
+ TT_NAME_MAC_ENCODING_ROMAN = 0,
+ TT_NAME_MAC_ENCODING_JAPANESE,
+ TT_NAME_MAC_ENCODING_TRAD_CHINESE,
+ TT_NAME_MAC_ENCODING_KOREAN,
+ TT_NAME_MAC_ENCODING_ARABIC,
+ TT_NAME_MAC_ENCODING_HEBREW,
+ TT_NAME_MAC_ENCODING_GREEK,
+ TT_NAME_MAC_ENCODING_RUSSIAN,
+ TT_NAME_MAC_ENCODING_RSYMBOL,
+ TT_NAME_MAC_ENCODING_DEVANAGARI,
+ TT_NAME_MAC_ENCODING_GURMUKHI,
+ TT_NAME_MAC_ENCODING_GUJARATI,
+ TT_NAME_MAC_ENCODING_ORIYA,
+ TT_NAME_MAC_ENCODING_BENGALI,
+ TT_NAME_MAC_ENCODING_TAMIL,
+ TT_NAME_MAC_ENCODING_TELUGU,
+ TT_NAME_MAC_ENCODING_KANNADA,
+ TT_NAME_MAC_ENCODING_MALAYALAM,
+ TT_NAME_MAC_ENCODING_SINHALESE,
+ TT_NAME_MAC_ENCODING_BURMESE,
+ TT_NAME_MAC_ENCODING_KHMER,
+ TT_NAME_MAC_ENCODING_THAI,
+ TT_NAME_MAC_ENCODING_LAOTIAN,
+ TT_NAME_MAC_ENCODING_GEORGIAN,
+ TT_NAME_MAC_ENCODING_ARMENIAN,
+ TT_NAME_MAC_ENCODING_SIMPL_CHINESE,
+ TT_NAME_MAC_ENCODING_TIBETAN,
+ TT_NAME_MAC_ENCODING_MONGOLIAN,
+ TT_NAME_MAC_ENCODING_GEEZ,
+ TT_NAME_MAC_ENCODING_SLAVIC,
+ TT_NAME_MAC_ENCODING_VIETNAMESE,
+ TT_NAME_MAC_ENCODING_SINDHI,
+ TT_NAME_MAC_ENCODING_UNINTERPRETED
+};
+
enum OPENTYPE_STRING_ID
{
OPENTYPE_STRING_COPYRIGHT_NOTICE = 0,
@@ -615,6 +661,82 @@ VOID get_font_properties(LPCVOID os2, LPCVOID head, LPCVOID post, DWRITE_FONT_ME
}
}
+static UINT get_name_record_codepage(enum OPENTYPE_PLATFORM_ID platform, USHORT encoding)
+{
+ UINT codepage = 0;
+
+ switch (platform) {
+ case OPENTYPE_PLATFORM_MAC:
+ switch (encoding)
+ {
+ case TT_NAME_MAC_ENCODING_ROMAN:
+ codepage = 10000;
+ break;
+ case TT_NAME_MAC_ENCODING_JAPANESE:
+ codepage = 10001;
+ break;
+ case TT_NAME_MAC_ENCODING_TRAD_CHINESE:
+ codepage = 10002;
+ break;
+ case TT_NAME_MAC_ENCODING_KOREAN:
+ codepage = 10003;
+ break;
+ case TT_NAME_MAC_ENCODING_ARABIC:
+ codepage = 10004;
+ break;
+ case TT_NAME_MAC_ENCODING_HEBREW:
+ codepage = 10005;
+ break;
+ case TT_NAME_MAC_ENCODING_GREEK:
+ codepage = 10006;
+ break;
+ case TT_NAME_MAC_ENCODING_RUSSIAN:
+ codepage = 10007;
+ break;
+ case TT_NAME_MAC_ENCODING_SIMPL_CHINESE:
+ codepage = 10008;
+ break;
+ case TT_NAME_MAC_ENCODING_THAI:
+ codepage = 10021;
+ break;
+ default:
+ FIXME("encoding %u not handled, platform %d.\n", encoding, platform);
+ break;
+ }
+ break;
+ case OPENTYPE_PLATFORM_WIN:
+ switch (encoding)
+ {
+ case TT_NAME_WINDOWS_ENCODING_SYMBOL:
+ case TT_NAME_WINDOWS_ENCODING_UCS2:
+ break;
+ case TT_NAME_WINDOWS_ENCODING_SJIS:
+ codepage = 932;
+ break;
+ case TT_NAME_WINDOWS_ENCODING_PRC:
+ codepage = 936;
+ break;
+ case TT_NAME_WINDOWS_ENCODING_BIG5:
+ codepage = 950;
+ break;
+ case TT_NAME_WINDOWS_ENCODING_WANSUNG:
+ codepage = 20949;
+ break;
+ case TT_NAME_WINDOWS_ENCODING_JOHAB:
+ codepage = 1361;
+ break;
+ default:
+ FIXME("encoding %u not handled, platform %d.\n", encoding, platform);
+ break;
+ }
+ break;
+ default:
+ FIXME("unknown platform %d\n", platform);
+ }
+
+ return codepage;
+}
+
HRESULT opentype_get_font_strings_from_id(const void *table_data, DWRITE_INFORMATIONAL_STRING_ID id, IDWriteLocalizedStrings **strings)
{
const TT_NAME_V0 *header;
@@ -649,7 +771,10 @@ HRESULT opentype_get_font_strings_from_id(const void *table_data, DWRITE_INFORMA
/* Right now only accept unicode and windows encoded fonts */
platform = GET_BE_WORD(record->platformID);
- if (platform != 0 && platform != 3) {
+ if (platform != OPENTYPE_PLATFORM_UNICODE &&
+ platform != OPENTYPE_PLATFORM_MAC &&
+ platform != OPENTYPE_PLATFORM_WIN)
+ {
FIXME("platform %i not supported\n", platform);
continue;
}
@@ -662,34 +787,9 @@ HRESULT opentype_get_font_strings_from_id(const void *table_data, DWRITE_INFORMA
if (lang_id < 0x8000) {
WCHAR locale[LOCALE_NAME_MAX_LENGTH];
WCHAR *name_string;
- UINT codepage = 0;
+ UINT codepage;
- if (platform == 3)
- {
- switch (encoding)
- {
- case TT_NAME_WINDOWS_ENCODING_SYMBOL:
- case TT_NAME_WINDOWS_ENCODING_UCS2:
- break;
- case TT_NAME_WINDOWS_ENCODING_SJIS:
- codepage = 932;
- break;
- case TT_NAME_WINDOWS_ENCODING_PRC:
- codepage = 936;
- break;
- case TT_NAME_WINDOWS_ENCODING_BIG5:
- codepage = 950;
- break;
- case TT_NAME_WINDOWS_ENCODING_WANSUNG:
- codepage = 20949;
- break;
- case TT_NAME_WINDOWS_ENCODING_JOHAB:
- codepage = 1361;
- break;
- default:
- FIXME("encoding %d not handled.\n", encoding);
- }
- }
+ codepage = get_name_record_codepage(platform, encoding);
if (codepage) {
DWORD len = MultiByteToWideChar(codepage, 0, (LPSTR)(storage_area + offset), length, NULL, 0);
More information about the wine-cvs
mailing list