diff options
author | 2014-08-25 10:16:01 -0700 | |
---|---|---|
committer | 2014-08-25 10:16:01 -0700 | |
commit | 5e7b4f967b37cc303a20b87617446605f26f1867 (patch) | |
tree | d18420aac29bebc2811ea2c9dbee54f6aa733c8c | |
parent | 708f154d7e25256038f43adeafbcf7b9aa74e40f (diff) |
Require length in sk_wchar_to_string.
This information is already available at all call sites and allows
the call to WideCharToMultiByte to not overwrite the '\0' in the
writable_str() which isn't really writable.
BUG=skia:1989
R=reed@google.com
Author: bungeman@google.com
Review URL: https://codereview.chromium.org/500113002
-rw-r--r-- | src/ports/SkTypeface_win_dw.cpp | 47 | ||||
-rw-r--r-- | src/utils/win/SkDWrite.cpp | 31 | ||||
-rw-r--r-- | src/utils/win/SkDWrite.h | 6 |
3 files changed, 39 insertions, 45 deletions
diff --git a/src/ports/SkTypeface_win_dw.cpp b/src/ports/SkTypeface_win_dw.cpp index 566f3d166b..7b6b522cea 100644 --- a/src/ports/SkTypeface_win_dw.cpp +++ b/src/ports/SkTypeface_win_dw.cpp @@ -27,17 +27,17 @@ void DWriteFontTypeface::onGetFontDescriptor(SkFontDescriptor* desc, bool* isLocalStream) const { // Get the family name. - SkTScopedComPtr<IDWriteLocalizedStrings> dwFamilyNames; - HRV(fDWriteFontFamily->GetFamilyNames(&dwFamilyNames)); + SkTScopedComPtr<IDWriteLocalizedStrings> familyNames; + HRV(fDWriteFontFamily->GetFamilyNames(&familyNames)); - UINT32 dwFamilyNamesLength; - HRV(dwFamilyNames->GetStringLength(0, &dwFamilyNamesLength)); + UINT32 familyNamesLen; + HRV(familyNames->GetStringLength(0, &familyNamesLen)); - SkSMallocWCHAR dwFamilyNameChar(dwFamilyNamesLength+1); - HRV(dwFamilyNames->GetString(0, dwFamilyNameChar.get(), dwFamilyNamesLength+1)); + SkSMallocWCHAR familyName(familyNamesLen+1); + HRV(familyNames->GetString(0, familyName.get(), familyNamesLen+1)); SkString utf8FamilyName; - HRV(sk_wchar_to_skstring(dwFamilyNameChar.get(), &utf8FamilyName)); + HRV(sk_wchar_to_skstring(familyName.get(), familyNamesLen, &utf8FamilyName)); desc->setFamilyName(utf8FamilyName.c_str()); *isLocalStream = SkToBool(fDWriteFontFileLoader.get()); @@ -140,24 +140,22 @@ public: } // String - UINT32 stringLength; - HRBM(fStrings->GetStringLength(fIndex, &stringLength), "Could not get string length."); - stringLength += 1; + UINT32 stringLen; + HRBM(fStrings->GetStringLength(fIndex, &stringLen), "Could not get string length."); - SkSMallocWCHAR wString(stringLength); - HRBM(fStrings->GetString(fIndex, wString.get(), stringLength), "Could not get string."); + SkSMallocWCHAR wString(stringLen+1); + HRBM(fStrings->GetString(fIndex, wString.get(), stringLen+1), "Could not get string."); - HRB(sk_wchar_to_skstring(wString.get(), &localizedString->fString)); + HRB(sk_wchar_to_skstring(wString.get(), stringLen, &localizedString->fString)); // Locale - UINT32 localeLength; - HRBM(fStrings->GetLocaleNameLength(fIndex, &localeLength), "Could not get locale length."); - localeLength += 1; + UINT32 localeLen; + HRBM(fStrings->GetLocaleNameLength(fIndex, &localeLen), "Could not get locale length."); - SkSMallocWCHAR wLocale(localeLength); - HRBM(fStrings->GetLocaleName(fIndex, wLocale.get(), localeLength), "Could not get locale."); + SkSMallocWCHAR wLocale(localeLen+1); + HRBM(fStrings->GetLocaleName(fIndex, wLocale.get(), localeLen+1), "Could not get locale."); - HRB(sk_wchar_to_skstring(wLocale.get(), &localizedString->fLanguage)); + HRB(sk_wchar_to_skstring(wLocale.get(), localeLen, &localizedString->fLanguage)); ++fIndex; return true; @@ -349,14 +347,13 @@ SkAdvancedTypefaceMetrics* DWriteFontTypeface::onGetAdvancedTypefaceMetrics( SkTScopedComPtr<IDWriteLocalizedStrings> familyNames; hr = fDWriteFontFamily->GetFamilyNames(&familyNames); - UINT32 familyNameLength; - hr = familyNames->GetStringLength(0, &familyNameLength); + UINT32 familyNameLen; + hr = familyNames->GetStringLength(0, &familyNameLen); - UINT32 size = familyNameLength+1; - SkSMallocWCHAR wFamilyName(size); - hr = familyNames->GetString(0, wFamilyName.get(), size); + SkSMallocWCHAR familyName(familyNameLen+1); + hr = familyNames->GetString(0, familyName.get(), familyNameLen+1); - hr = sk_wchar_to_skstring(wFamilyName.get(), &info->fFontName); + hr = sk_wchar_to_skstring(familyName.get(), familyNameLen, &info->fFontName); if (perGlyphInfo & SkAdvancedTypefaceMetrics::kToUnicode_PerGlyphInfo) { populate_glyph_to_unicode(fDWriteFontFace.get(), glyphCount, &(info->fGlyphToUnicode)); diff --git a/src/utils/win/SkDWrite.cpp b/src/utils/win/SkDWrite.cpp index 87826b5194..7801059187 100644 --- a/src/utils/win/SkDWrite.cpp +++ b/src/utils/win/SkDWrite.cpp @@ -67,23 +67,19 @@ HRESULT sk_cstring_to_wchar(const char* skname, SkSMallocWCHAR* name) { } /** Converts a WCHAR string to a utf8 string. */ -HRESULT sk_wchar_to_skstring(WCHAR* name, SkString* skname) { - int len = WideCharToMultiByte(CP_UTF8, 0, name, -1, NULL, 0, NULL, NULL); +HRESULT sk_wchar_to_skstring(WCHAR* name, int nameLen, SkString* skname) { + int len = WideCharToMultiByte(CP_UTF8, 0, name, nameLen, NULL, 0, NULL, NULL); if (0 == len) { + if (nameLen <= 0) { + skname->reset(); + return S_OK; + } HRM(HRESULT_FROM_WIN32(GetLastError()), "Could not get length for utf-8 to wchar conversion."); } - skname->resize(len - 1); - - // TODO: remove after https://code.google.com/p/skia/issues/detail?id=1989 is fixed. - // If we resize to 0 then the skname points to gEmptyRec (the unique empty SkString::Rec). - // gEmptyRec is static const and on Windows this means the value is in a read only page. - // Writing to it in the following call to WideCharToMultiByte will cause an access violation. - if (1 == len) { - return S_OK; - } + skname->resize(len); - len = WideCharToMultiByte(CP_UTF8, 0, name, -1, skname->writable_str(), len, NULL, NULL); + len = WideCharToMultiByte(CP_UTF8, 0, name, nameLen, skname->writable_str(), len, NULL, NULL); if (0 == len) { HRM(HRESULT_FROM_WIN32(GetLastError()), "Could not convert utf-8 to wchar."); } @@ -105,14 +101,13 @@ void sk_get_locale_string(IDWriteLocalizedStrings* names, const WCHAR* preferedL } } - UINT32 nameLength; - HRVM(names->GetStringLength(nameIndex, &nameLength), "Could not get name length."); - nameLength += 1; + UINT32 nameLen; + HRVM(names->GetStringLength(nameIndex, &nameLen), "Could not get name length."); - SkSMallocWCHAR name(nameLength); - HRVM(names->GetString(nameIndex, name.get(), nameLength), "Could not get string."); + SkSMallocWCHAR name(nameLen+1); + HRVM(names->GetString(nameIndex, name.get(), nameLen+1), "Could not get string."); - HRV(sk_wchar_to_skstring(name.get(), skname)); + HRV(sk_wchar_to_skstring(name.get(), nameLen, skname)); } HRESULT SkGetGetUserDefaultLocaleNameProc(SkGetUserDefaultLocaleNameProc* proc) { diff --git a/src/utils/win/SkDWrite.h b/src/utils/win/SkDWrite.h index e763b4a097..a7799921d2 100644 --- a/src/utils/win/SkDWrite.h +++ b/src/utils/win/SkDWrite.h @@ -28,8 +28,10 @@ typedef SkAutoSTMalloc<16, WCHAR> SkSMallocWCHAR; /** Converts a utf8 string to a WCHAR string. */ HRESULT sk_cstring_to_wchar(const char* skname, SkSMallocWCHAR* name); -/** Converts a WCHAR string to a utf8 string. */ -HRESULT sk_wchar_to_skstring(WCHAR* name, SkString* skname); +/** Converts a WCHAR string to a utf8 string. + * @param nameLen the number of WCHARs in the name. + */ +HRESULT sk_wchar_to_skstring(WCHAR* name, int nameLen, SkString* skname); //////////////////////////////////////////////////////////////////////////////// // Locale |