aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar bungeman <bungeman@google.com>2014-08-25 10:16:01 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2014-08-25 10:16:01 -0700
commit5e7b4f967b37cc303a20b87617446605f26f1867 (patch)
treed18420aac29bebc2811ea2c9dbee54f6aa733c8c
parent708f154d7e25256038f43adeafbcf7b9aa74e40f (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.cpp47
-rw-r--r--src/utils/win/SkDWrite.cpp31
-rw-r--r--src/utils/win/SkDWrite.h6
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