| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2011 Google Inc. | 2 * Copyright 2011 Google Inc. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #include "SkTypes.h" | 8 #include "SkTypes.h" |
| 9 #undef GetGlyphIndices | 9 #undef GetGlyphIndices |
| 10 | 10 |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 121 public: | 121 public: |
| 122 /** localeNameLength must include the null terminator. */ | 122 /** localeNameLength must include the null terminator. */ |
| 123 SkFontMgr_DirectWrite(IDWriteFontCollection* fontCollection, | 123 SkFontMgr_DirectWrite(IDWriteFontCollection* fontCollection, |
| 124 WCHAR* localeName, int localeNameLength) | 124 WCHAR* localeName, int localeNameLength) |
| 125 : fFontCollection(SkRefComPtr(fontCollection)) | 125 : fFontCollection(SkRefComPtr(fontCollection)) |
| 126 , fLocaleName(localeNameLength) | 126 , fLocaleName(localeNameLength) |
| 127 { | 127 { |
| 128 memcpy(fLocaleName.get(), localeName, localeNameLength * sizeof(WCHAR)); | 128 memcpy(fLocaleName.get(), localeName, localeNameLength * sizeof(WCHAR)); |
| 129 } | 129 } |
| 130 | 130 |
| 131 SkTypefaceCache* getTypefaceCache() { return &fTFCache; } | |
| 132 | |
| 133 SkTypeface* createTypefaceFromDWriteFont(IDWriteFontFace* fontFace, | 131 SkTypeface* createTypefaceFromDWriteFont(IDWriteFontFace* fontFace, |
| 134 IDWriteFont* font, | 132 IDWriteFont* font, |
| 135 IDWriteFontFamily* fontFamily, | 133 IDWriteFontFamily* fontFamily, |
| 136 StreamFontFileLoader* = NULL, | 134 StreamFontFileLoader* = NULL, |
| 137 IDWriteFontCollectionLoader* = NULL
); | 135 IDWriteFontCollectionLoader* = NULL
) const; |
| 138 | 136 |
| 139 protected: | 137 protected: |
| 140 virtual int onCountFamilies() SK_OVERRIDE; | 138 virtual int onCountFamilies() const SK_OVERRIDE; |
| 141 virtual void onGetFamilyName(int index, SkString* familyName) SK_OVERRIDE; | 139 virtual void onGetFamilyName(int index, SkString* familyName) const SK_OVERR
IDE; |
| 142 virtual SkFontStyleSet* onCreateStyleSet(int index) SK_OVERRIDE; | 140 virtual SkFontStyleSet* onCreateStyleSet(int index) const SK_OVERRIDE; |
| 143 virtual SkFontStyleSet* onMatchFamily(const char familyName[]) SK_OVERRIDE; | 141 virtual SkFontStyleSet* onMatchFamily(const char familyName[]) const SK_OVER
RIDE; |
| 144 virtual SkTypeface* onMatchFamilyStyle(const char familyName[], | 142 virtual SkTypeface* onMatchFamilyStyle(const char familyName[], |
| 145 const SkFontStyle& fontstyle) SK_OVER
RIDE; | 143 const SkFontStyle& fontstyle) const S
K_OVERRIDE; |
| 146 virtual SkTypeface* onMatchFaceStyle(const SkTypeface* familyMember, | 144 virtual SkTypeface* onMatchFaceStyle(const SkTypeface* familyMember, |
| 147 const SkFontStyle& fontstyle) SK_OVERRI
DE; | 145 const SkFontStyle& fontstyle) const SK_
OVERRIDE; |
| 148 virtual SkTypeface* onCreateFromStream(SkStream* stream, int ttcIndex) SK_OV
ERRIDE; | 146 virtual SkTypeface* onCreateFromStream(SkStream* stream, int ttcIndex) const
SK_OVERRIDE; |
| 149 virtual SkTypeface* onCreateFromData(SkData* data, int ttcIndex) SK_OVERRIDE
; | 147 virtual SkTypeface* onCreateFromData(SkData* data, int ttcIndex) const SK_OV
ERRIDE; |
| 150 virtual SkTypeface* onCreateFromFile(const char path[], int ttcIndex) SK_OVE
RRIDE; | 148 virtual SkTypeface* onCreateFromFile(const char path[], int ttcIndex) const
SK_OVERRIDE; |
| 151 virtual SkTypeface* onLegacyCreateTypeface(const char familyName[], | 149 virtual SkTypeface* onLegacyCreateTypeface(const char familyName[], |
| 152 unsigned styleBits) SK_OVERRIDE; | 150 unsigned styleBits) const SK_OVER
RIDE; |
| 153 | 151 |
| 154 private: | 152 private: |
| 155 HRESULT getByFamilyName(const WCHAR familyName[], IDWriteFontFamily** fontFa
mily); | 153 HRESULT getByFamilyName(const WCHAR familyName[], IDWriteFontFamily** fontFa
mily) const; |
| 156 HRESULT getDefaultFontFamily(IDWriteFontFamily** fontFamily); | 154 HRESULT getDefaultFontFamily(IDWriteFontFamily** fontFamily) const; |
| 157 | 155 |
| 158 SkMutex fTFCacheMutex; | 156 void Add(SkTypeface* face, SkTypeface::Style requestedStyle, bool strong) co
nst { |
| 159 void Add(SkTypeface* face, SkTypeface::Style requestedStyle, bool strong) { | |
| 160 SkAutoMutexAcquire ama(fTFCacheMutex); | 157 SkAutoMutexAcquire ama(fTFCacheMutex); |
| 161 fTFCache.add(face, requestedStyle, strong); | 158 fTFCache.add(face, requestedStyle, strong); |
| 162 } | 159 } |
| 163 | 160 |
| 164 SkTypeface* FindByProcAndRef(SkTypefaceCache::FindProc proc, void* ctx) { | 161 SkTypeface* FindByProcAndRef(SkTypefaceCache::FindProc proc, void* ctx) cons
t { |
| 165 SkAutoMutexAcquire ama(fTFCacheMutex); | 162 SkAutoMutexAcquire ama(fTFCacheMutex); |
| 166 SkTypeface* typeface = fTFCache.findByProcAndRef(proc, ctx); | 163 SkTypeface* typeface = fTFCache.findByProcAndRef(proc, ctx); |
| 167 return typeface; | 164 return typeface; |
| 168 } | 165 } |
| 169 | 166 |
| 170 friend class SkFontStyleSet_DirectWrite; | |
| 171 SkTScopedComPtr<IDWriteFontCollection> fFontCollection; | 167 SkTScopedComPtr<IDWriteFontCollection> fFontCollection; |
| 172 SkSMallocWCHAR fLocaleName; | 168 SkSMallocWCHAR fLocaleName; |
| 173 SkTypefaceCache fTFCache; | 169 mutable SkMutex fTFCacheMutex; |
| 170 mutable SkTypefaceCache fTFCache; |
| 171 |
| 172 friend class SkFontStyleSet_DirectWrite; |
| 174 }; | 173 }; |
| 175 | 174 |
| 176 class SkFontStyleSet_DirectWrite : public SkFontStyleSet { | 175 class SkFontStyleSet_DirectWrite : public SkFontStyleSet { |
| 177 public: | 176 public: |
| 178 SkFontStyleSet_DirectWrite(SkFontMgr_DirectWrite* fontMgr, IDWriteFontFamily
* fontFamily) | 177 SkFontStyleSet_DirectWrite(const SkFontMgr_DirectWrite* fontMgr, |
| 178 IDWriteFontFamily* fontFamily) |
| 179 : fFontMgr(SkRef(fontMgr)) | 179 : fFontMgr(SkRef(fontMgr)) |
| 180 , fFontFamily(SkRefComPtr(fontFamily)) | 180 , fFontFamily(SkRefComPtr(fontFamily)) |
| 181 { } | 181 { } |
| 182 | 182 |
| 183 virtual int count() SK_OVERRIDE; | 183 virtual int count() SK_OVERRIDE; |
| 184 virtual void getStyle(int index, SkFontStyle* fs, SkString* styleName) SK_OV
ERRIDE; | 184 virtual void getStyle(int index, SkFontStyle* fs, SkString* styleName) SK_OV
ERRIDE; |
| 185 virtual SkTypeface* createTypeface(int index) SK_OVERRIDE; | 185 virtual SkTypeface* createTypeface(int index) SK_OVERRIDE; |
| 186 virtual SkTypeface* matchStyle(const SkFontStyle& pattern) SK_OVERRIDE; | 186 virtual SkTypeface* matchStyle(const SkFontStyle& pattern) SK_OVERRIDE; |
| 187 | 187 |
| 188 private: | 188 private: |
| 189 SkAutoTUnref<SkFontMgr_DirectWrite> fFontMgr; | 189 SkAutoTUnref<const SkFontMgr_DirectWrite> fFontMgr; |
| 190 SkTScopedComPtr<IDWriteFontFamily> fFontFamily; | 190 SkTScopedComPtr<IDWriteFontFamily> fFontFamily; |
| 191 }; | 191 }; |
| 192 | 192 |
| 193 /////////////////////////////////////////////////////////////////////////////// | 193 /////////////////////////////////////////////////////////////////////////////// |
| 194 | 194 |
| 195 class DWriteOffscreen { | 195 class DWriteOffscreen { |
| 196 public: | 196 public: |
| 197 DWriteOffscreen() : fWidth(0), fHeight(0) { | 197 DWriteOffscreen() : fWidth(0), fHeight(0) { |
| 198 } | 198 } |
| 199 | 199 |
| (...skipping 1454 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1654 HRVM(names->GetStringLength(nameIndex, &nameLength), "Could not get name len
gth."); | 1654 HRVM(names->GetStringLength(nameIndex, &nameLength), "Could not get name len
gth."); |
| 1655 nameLength += 1; | 1655 nameLength += 1; |
| 1656 | 1656 |
| 1657 SkSMallocWCHAR name(nameLength); | 1657 SkSMallocWCHAR name(nameLength); |
| 1658 HRVM(names->GetString(nameIndex, name.get(), nameLength), "Could not get str
ing."); | 1658 HRVM(names->GetString(nameIndex, name.get(), nameLength), "Could not get str
ing."); |
| 1659 | 1659 |
| 1660 HRV(wchar_to_skstring(name.get(), skname)); | 1660 HRV(wchar_to_skstring(name.get(), skname)); |
| 1661 } | 1661 } |
| 1662 | 1662 |
| 1663 SkTypeface* SkFontMgr_DirectWrite::createTypefaceFromDWriteFont( | 1663 SkTypeface* SkFontMgr_DirectWrite::createTypefaceFromDWriteFont( |
| 1664 IDWriteFontFace* fontFace, | 1664 IDWriteFontFace* fontFace, |
| 1665 IDWriteFont* font, | 1665 IDWriteFont* font, |
| 1666 IDWriteFontFamily* fontFamily, | 1666 IDWriteFontFamily* fontFamily, |
| 1667 StreamFontFileLoader* fontFileLoader, | 1667 StreamFontFileLoader* fontFileLoader, |
| 1668 IDWriteFontCollectionLoader* fontColl
ectionLoader) { | 1668 IDWriteFontCollectionLoader* fontCollectionLoader) const { |
| 1669 SkTypeface* face = FindByProcAndRef(FindByDWriteFont, font); | 1669 SkTypeface* face = FindByProcAndRef(FindByDWriteFont, font); |
| 1670 if (NULL == face) { | 1670 if (NULL == face) { |
| 1671 face = DWriteFontTypeface::Create(fontFace, font, fontFamily, | 1671 face = DWriteFontTypeface::Create(fontFace, font, fontFamily, |
| 1672 fontFileLoader, fontCollectionLoader); | 1672 fontFileLoader, fontCollectionLoader); |
| 1673 if (face) { | 1673 if (face) { |
| 1674 Add(face, get_style(font), fontCollectionLoader != NULL); | 1674 Add(face, get_style(font), fontCollectionLoader != NULL); |
| 1675 } | 1675 } |
| 1676 } | 1676 } |
| 1677 return face; | 1677 return face; |
| 1678 } | 1678 } |
| 1679 | 1679 |
| 1680 int SkFontMgr_DirectWrite::onCountFamilies() { | 1680 int SkFontMgr_DirectWrite::onCountFamilies() const { |
| 1681 return fFontCollection->GetFontFamilyCount(); | 1681 return fFontCollection->GetFontFamilyCount(); |
| 1682 } | 1682 } |
| 1683 | 1683 |
| 1684 void SkFontMgr_DirectWrite::onGetFamilyName(int index, SkString* familyName) { | 1684 void SkFontMgr_DirectWrite::onGetFamilyName(int index, SkString* familyName) con
st { |
| 1685 SkTScopedComPtr<IDWriteFontFamily> fontFamily; | 1685 SkTScopedComPtr<IDWriteFontFamily> fontFamily; |
| 1686 HRVM(fFontCollection->GetFontFamily(index, &fontFamily), "Could not get requ
ested family."); | 1686 HRVM(fFontCollection->GetFontFamily(index, &fontFamily), "Could not get requ
ested family."); |
| 1687 | 1687 |
| 1688 SkTScopedComPtr<IDWriteLocalizedStrings> familyNames; | 1688 SkTScopedComPtr<IDWriteLocalizedStrings> familyNames; |
| 1689 HRVM(fontFamily->GetFamilyNames(&familyNames), "Could not get family names."
); | 1689 HRVM(fontFamily->GetFamilyNames(&familyNames), "Could not get family names."
); |
| 1690 | 1690 |
| 1691 get_locale_string(familyNames.get(), fLocaleName.get(), familyName); | 1691 get_locale_string(familyNames.get(), fLocaleName.get(), familyName); |
| 1692 } | 1692 } |
| 1693 | 1693 |
| 1694 SkFontStyleSet* SkFontMgr_DirectWrite::onCreateStyleSet(int index) { | 1694 SkFontStyleSet* SkFontMgr_DirectWrite::onCreateStyleSet(int index) const { |
| 1695 SkTScopedComPtr<IDWriteFontFamily> fontFamily; | 1695 SkTScopedComPtr<IDWriteFontFamily> fontFamily; |
| 1696 HRNM(fFontCollection->GetFontFamily(index, &fontFamily), "Could not get requ
ested family."); | 1696 HRNM(fFontCollection->GetFontFamily(index, &fontFamily), "Could not get requ
ested family."); |
| 1697 | 1697 |
| 1698 return SkNEW_ARGS(SkFontStyleSet_DirectWrite, (this, fontFamily.get())); | 1698 return SkNEW_ARGS(SkFontStyleSet_DirectWrite, (this, fontFamily.get())); |
| 1699 } | 1699 } |
| 1700 | 1700 |
| 1701 SkFontStyleSet* SkFontMgr_DirectWrite::onMatchFamily(const char familyName[]) { | 1701 SkFontStyleSet* SkFontMgr_DirectWrite::onMatchFamily(const char familyName[]) co
nst { |
| 1702 SkSMallocWCHAR dwFamilyName; | 1702 SkSMallocWCHAR dwFamilyName; |
| 1703 HRN(cstring_to_wchar(familyName, &dwFamilyName)); | 1703 HRN(cstring_to_wchar(familyName, &dwFamilyName)); |
| 1704 | 1704 |
| 1705 UINT32 index; | 1705 UINT32 index; |
| 1706 BOOL exists; | 1706 BOOL exists; |
| 1707 HRNM(fFontCollection->FindFamilyName(dwFamilyName.get(), &index, &exists), | 1707 HRNM(fFontCollection->FindFamilyName(dwFamilyName.get(), &index, &exists), |
| 1708 "Failed while finding family by name."); | 1708 "Failed while finding family by name."); |
| 1709 if (!exists) { | 1709 if (!exists) { |
| 1710 return NULL; | 1710 return NULL; |
| 1711 } | 1711 } |
| 1712 | 1712 |
| 1713 return this->onCreateStyleSet(index); | 1713 return this->onCreateStyleSet(index); |
| 1714 } | 1714 } |
| 1715 | 1715 |
| 1716 SkTypeface* SkFontMgr_DirectWrite::onMatchFamilyStyle(const char familyName[], | 1716 SkTypeface* SkFontMgr_DirectWrite::onMatchFamilyStyle(const char familyName[], |
| 1717 const SkFontStyle& fontsty
le) { | 1717 const SkFontStyle& fontsty
le) const { |
| 1718 SkAutoTUnref<SkFontStyleSet> sset(this->matchFamily(familyName)); | 1718 SkAutoTUnref<SkFontStyleSet> sset(this->matchFamily(familyName)); |
| 1719 return sset->matchStyle(fontstyle); | 1719 return sset->matchStyle(fontstyle); |
| 1720 } | 1720 } |
| 1721 | 1721 |
| 1722 SkTypeface* SkFontMgr_DirectWrite::onMatchFaceStyle(const SkTypeface* familyMemb
er, | 1722 SkTypeface* SkFontMgr_DirectWrite::onMatchFaceStyle(const SkTypeface* familyMemb
er, |
| 1723 const SkFontStyle& fontstyle
) { | 1723 const SkFontStyle& fontstyle
) const { |
| 1724 SkString familyName; | 1724 SkString familyName; |
| 1725 SkFontStyleSet_DirectWrite sset( | 1725 SkFontStyleSet_DirectWrite sset( |
| 1726 this, ((DWriteFontTypeface*)familyMember)->fDWriteFontFamily.get() | 1726 this, ((DWriteFontTypeface*)familyMember)->fDWriteFontFamily.get() |
| 1727 ); | 1727 ); |
| 1728 return sset.matchStyle(fontstyle); | 1728 return sset.matchStyle(fontstyle); |
| 1729 } | 1729 } |
| 1730 | 1730 |
| 1731 SkTypeface* SkFontMgr_DirectWrite::onCreateFromStream(SkStream* stream, int ttcI
ndex) { | 1731 SkTypeface* SkFontMgr_DirectWrite::onCreateFromStream(SkStream* stream, int ttcI
ndex) const { |
| 1732 return create_from_stream(stream, ttcIndex); | 1732 return create_from_stream(stream, ttcIndex); |
| 1733 } | 1733 } |
| 1734 | 1734 |
| 1735 SkTypeface* SkFontMgr_DirectWrite::onCreateFromData(SkData* data, int ttcIndex)
{ | 1735 SkTypeface* SkFontMgr_DirectWrite::onCreateFromData(SkData* data, int ttcIndex)
const { |
| 1736 SkAutoTUnref<SkStream> stream(SkNEW_ARGS(SkMemoryStream, (data))); | 1736 SkAutoTUnref<SkStream> stream(SkNEW_ARGS(SkMemoryStream, (data))); |
| 1737 return this->createFromStream(stream, ttcIndex); | 1737 return this->createFromStream(stream, ttcIndex); |
| 1738 } | 1738 } |
| 1739 | 1739 |
| 1740 SkTypeface* SkFontMgr_DirectWrite::onCreateFromFile(const char path[], int ttcIn
dex) { | 1740 SkTypeface* SkFontMgr_DirectWrite::onCreateFromFile(const char path[], int ttcIn
dex) const { |
| 1741 SkAutoTUnref<SkStream> stream(SkStream::NewFromFile(path)); | 1741 SkAutoTUnref<SkStream> stream(SkStream::NewFromFile(path)); |
| 1742 return this->createFromStream(stream, ttcIndex); | 1742 return this->createFromStream(stream, ttcIndex); |
| 1743 } | 1743 } |
| 1744 | 1744 |
| 1745 HRESULT SkFontMgr_DirectWrite::getByFamilyName(const WCHAR wideFamilyName[], | 1745 HRESULT SkFontMgr_DirectWrite::getByFamilyName(const WCHAR wideFamilyName[], |
| 1746 IDWriteFontFamily** fontFamily) { | 1746 IDWriteFontFamily** fontFamily) c
onst { |
| 1747 UINT32 index; | 1747 UINT32 index; |
| 1748 BOOL exists; | 1748 BOOL exists; |
| 1749 HR(fFontCollection->FindFamilyName(wideFamilyName, &index, &exists)); | 1749 HR(fFontCollection->FindFamilyName(wideFamilyName, &index, &exists)); |
| 1750 | 1750 |
| 1751 if (exists) { | 1751 if (exists) { |
| 1752 HR(fFontCollection->GetFontFamily(index, fontFamily)); | 1752 HR(fFontCollection->GetFontFamily(index, fontFamily)); |
| 1753 return S_OK; | 1753 return S_OK; |
| 1754 } | 1754 } |
| 1755 return S_FALSE; | 1755 return S_FALSE; |
| 1756 } | 1756 } |
| 1757 | 1757 |
| 1758 HRESULT SkFontMgr_DirectWrite::getDefaultFontFamily(IDWriteFontFamily** fontFami
ly) { | 1758 HRESULT SkFontMgr_DirectWrite::getDefaultFontFamily(IDWriteFontFamily** fontFami
ly) const { |
| 1759 NONCLIENTMETRICSW metrics; | 1759 NONCLIENTMETRICSW metrics; |
| 1760 metrics.cbSize = sizeof(metrics); | 1760 metrics.cbSize = sizeof(metrics); |
| 1761 if (0 == SystemParametersInfoW(SPI_GETNONCLIENTMETRICS, | 1761 if (0 == SystemParametersInfoW(SPI_GETNONCLIENTMETRICS, |
| 1762 sizeof(metrics), | 1762 sizeof(metrics), |
| 1763 &metrics, | 1763 &metrics, |
| 1764 0)) { | 1764 0)) { |
| 1765 return E_UNEXPECTED; | 1765 return E_UNEXPECTED; |
| 1766 } | 1766 } |
| 1767 HRM(this->getByFamilyName(metrics.lfMessageFont.lfFaceName, fontFamily), | 1767 HRM(this->getByFamilyName(metrics.lfMessageFont.lfFaceName, fontFamily), |
| 1768 "Could not create DWrite font family from LOGFONT."); | 1768 "Could not create DWrite font family from LOGFONT."); |
| 1769 | 1769 |
| 1770 return S_OK; | 1770 return S_OK; |
| 1771 } | 1771 } |
| 1772 | 1772 |
| 1773 SkTypeface* SkFontMgr_DirectWrite::onLegacyCreateTypeface(const char familyName[
], | 1773 SkTypeface* SkFontMgr_DirectWrite::onLegacyCreateTypeface(const char familyName[
], |
| 1774 unsigned styleBits) { | 1774 unsigned styleBits) co
nst { |
| 1775 SkTScopedComPtr<IDWriteFontFamily> fontFamily; | 1775 SkTScopedComPtr<IDWriteFontFamily> fontFamily; |
| 1776 if (familyName) { | 1776 if (familyName) { |
| 1777 SkSMallocWCHAR wideFamilyName; | 1777 SkSMallocWCHAR wideFamilyName; |
| 1778 if (SUCCEEDED(cstring_to_wchar(familyName, &wideFamilyName))) { | 1778 if (SUCCEEDED(cstring_to_wchar(familyName, &wideFamilyName))) { |
| 1779 this->getByFamilyName(wideFamilyName, &fontFamily); | 1779 this->getByFamilyName(wideFamilyName, &fontFamily); |
| 1780 } | 1780 } |
| 1781 } | 1781 } |
| 1782 | 1782 |
| 1783 if (NULL == fontFamily.get()) { | 1783 if (NULL == fontFamily.get()) { |
| 1784 // No family with given name, try default. | 1784 // No family with given name, try default. |
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1912 SK_TRACEHR(hr, "Could not get GetUserDefaultLocaleName."); | 1912 SK_TRACEHR(hr, "Could not get GetUserDefaultLocaleName."); |
| 1913 } else { | 1913 } else { |
| 1914 localeNameLen = getUserDefaultLocaleNameProc(localeNameStorage, LOCALE_N
AME_MAX_LENGTH); | 1914 localeNameLen = getUserDefaultLocaleNameProc(localeNameStorage, LOCALE_N
AME_MAX_LENGTH); |
| 1915 if (localeNameLen) { | 1915 if (localeNameLen) { |
| 1916 localeName = localeNameStorage; | 1916 localeName = localeNameStorage; |
| 1917 }; | 1917 }; |
| 1918 } | 1918 } |
| 1919 | 1919 |
| 1920 return SkNEW_ARGS(SkFontMgr_DirectWrite, (sysFontCollection.get(), localeNam
e, localeNameLen)); | 1920 return SkNEW_ARGS(SkFontMgr_DirectWrite, (sysFontCollection.get(), localeNam
e, localeNameLen)); |
| 1921 } | 1921 } |
| OLD | NEW |