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 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
106 const SkFontStyle& fontstyle) SK_OVER
RIDE; | 106 const SkFontStyle& fontstyle) SK_OVER
RIDE; |
107 virtual SkTypeface* onMatchFaceStyle(const SkTypeface* familyMember, | 107 virtual SkTypeface* onMatchFaceStyle(const SkTypeface* familyMember, |
108 const SkFontStyle& fontstyle) SK_OVERRI
DE; | 108 const SkFontStyle& fontstyle) SK_OVERRI
DE; |
109 virtual SkTypeface* onCreateFromStream(SkStream* stream, int ttcIndex) SK_OV
ERRIDE; | 109 virtual SkTypeface* onCreateFromStream(SkStream* stream, int ttcIndex) SK_OV
ERRIDE; |
110 virtual SkTypeface* onCreateFromData(SkData* data, int ttcIndex) SK_OVERRIDE
; | 110 virtual SkTypeface* onCreateFromData(SkData* data, int ttcIndex) SK_OVERRIDE
; |
111 virtual SkTypeface* onCreateFromFile(const char path[], int ttcIndex) SK_OVE
RRIDE; | 111 virtual SkTypeface* onCreateFromFile(const char path[], int ttcIndex) SK_OVE
RRIDE; |
112 virtual SkTypeface* onLegacyCreateTypeface(const char familyName[], | 112 virtual SkTypeface* onLegacyCreateTypeface(const char familyName[], |
113 unsigned styleBits) SK_OVERRIDE; | 113 unsigned styleBits) SK_OVERRIDE; |
114 | 114 |
115 private: | 115 private: |
| 116 HRESULT getByFamilyName(const WCHAR familyName[], IDWriteFontFamily** fontFa
mily); |
| 117 HRESULT getDefaultFontFamily(IDWriteFontFamily** fontFamily); |
| 118 |
116 SkMutex fTFCacheMutex; | 119 SkMutex fTFCacheMutex; |
117 void Add(SkTypeface* face, SkTypeface::Style requestedStyle, bool strong) { | 120 void Add(SkTypeface* face, SkTypeface::Style requestedStyle, bool strong) { |
118 SkAutoMutexAcquire ama(fTFCacheMutex); | 121 SkAutoMutexAcquire ama(fTFCacheMutex); |
119 fTFCache.add(face, requestedStyle, strong); | 122 fTFCache.add(face, requestedStyle, strong); |
120 } | 123 } |
121 | 124 |
122 SkTypeface* FindByProcAndRef(SkTypefaceCache::FindProc proc, void* ctx) { | 125 SkTypeface* FindByProcAndRef(SkTypefaceCache::FindProc proc, void* ctx) { |
123 SkAutoMutexAcquire ama(fTFCacheMutex); | 126 SkAutoMutexAcquire ama(fTFCacheMutex); |
124 SkTypeface* typeface = fTFCache.findByProcAndRef(proc, ctx); | 127 SkTypeface* typeface = fTFCache.findByProcAndRef(proc, ctx); |
125 return typeface; | 128 return typeface; |
(...skipping 465 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
591 virtual void generateFontMetrics(SkPaint::FontMetrics* mX, | 594 virtual void generateFontMetrics(SkPaint::FontMetrics* mX, |
592 SkPaint::FontMetrics* mY) SK_OVERRIDE; | 595 SkPaint::FontMetrics* mY) SK_OVERRIDE; |
593 | 596 |
594 private: | 597 private: |
595 DWriteOffscreen fOffscreen; | 598 DWriteOffscreen fOffscreen; |
596 DWRITE_MATRIX fXform; | 599 DWRITE_MATRIX fXform; |
597 SkAutoTUnref<DWriteFontTypeface> fTypeface; | 600 SkAutoTUnref<DWriteFontTypeface> fTypeface; |
598 int fGlyphCount; | 601 int fGlyphCount; |
599 }; | 602 }; |
600 | 603 |
601 #define SK_DWRITE_DEFAULT_FONT_NAMED 1 | |
602 #define SK_DWRITE_DEFAULT_FONT_MESSAGE 2 | |
603 #define SK_DWRITE_DEFAULT_FONT_THEME 3 | |
604 #define SK_DWRITE_DEFAULT_FONT_SHELLDLG 4 | |
605 #define SK_DWRITE_DEFAULT_FONT_GDI 5 | |
606 #define SK_DWRITE_DEFAULT_FONT_STRATEGY SK_DWRITE_DEFAULT_FONT_MESSAGE | |
607 | |
608 static HRESULT get_default_font(IDWriteFont** font) { | |
609 IDWriteFactory* factory; | |
610 HRM(get_dwrite_factory(&factory), "Could not get factory."); | |
611 | |
612 #if SK_DWRITE_DEFAULT_FONT_STRATEGY == SK_DWRITE_DEFAULT_FONT_NAMED | |
613 SkTScopedComPtr<IDWriteFontCollection> sysFonts; | |
614 HRM(factory->GetSystemFontCollection(&sysFonts, false), | |
615 "Could not get system font collection."); | |
616 | |
617 UINT32 index; | |
618 BOOL exists; | |
619 //hr = sysFonts->FindFamilyName(L"Georgia", &index, &exists); | |
620 HRM(sysFonts->FindFamilyName(L"Microsoft Sans Serif", &index, &exists), | |
621 "Could not access family names."); | |
622 | |
623 if (!exists) { | |
624 SkDEBUGF(("The hard coded font family does not exist.")); | |
625 return E_UNEXPECTED; | |
626 } | |
627 | |
628 SkTScopedComPtr<IDWriteFontFamily> fontFamily; | |
629 HRM(sysFonts->GetFontFamily(index, &fontFamily), | |
630 "Could not load the requested font family."); | |
631 | |
632 HRM(fontFamily->GetFont(0, font), "Could not get first font from family."); | |
633 | |
634 #elif SK_DWRITE_DEFAULT_FONT_STRATEGY == SK_DWRITE_DEFAULT_FONT_MESSAGE | |
635 SkTScopedComPtr<IDWriteGdiInterop> gdi; | |
636 HRM(factory->GetGdiInterop(&gdi), "Could not get GDI interop."); | |
637 | |
638 NONCLIENTMETRICSW metrics; | |
639 metrics.cbSize = sizeof(metrics); | |
640 if (0 == SystemParametersInfoW(SPI_GETNONCLIENTMETRICS, | |
641 sizeof(metrics), | |
642 &metrics, | |
643 0)) { | |
644 return E_UNEXPECTED; | |
645 } | |
646 HRM(gdi->CreateFontFromLOGFONT(&metrics.lfMessageFont, font), | |
647 "Could not create DWrite font from LOGFONT."); | |
648 | |
649 #elif SK_DWRITE_DEFAULT_FONT_STRATEGY == SK_DWRITE_DEFAULT_FONT_THEME | |
650 //Theme body font? | |
651 | |
652 #elif SK_DWRITE_DEFAULT_FONT_STRATEGY == SK_DWRITE_DEFAULT_FONT_SHELLDLG | |
653 //"MS Shell Dlg" or "MS Shell Dlg 2"? | |
654 | |
655 #elif SK_DWRITE_DEFAULT_FONT_STRATEGY == SK_DWRITE_DEFAULT_FONT_GDI | |
656 //Never works. | |
657 SkTScopedComPtr<IDWriteGdiInterop> gdi; | |
658 HRM(factory->GetGdiInterop(&gdi), "Could not get GDI interop."); | |
659 | |
660 static LOGFONTW gDefaultFont = {}; | |
661 gDefaultFont.lfFaceName | |
662 HRM(gdi->CreateFontFromLOGFONT(&gDefaultFont, font), | |
663 "Could not create DWrite font from LOGFONT."; | |
664 #endif | |
665 return S_OK; | |
666 } | |
667 | |
668 static bool are_same(IUnknown* a, IUnknown* b) { | 604 static bool are_same(IUnknown* a, IUnknown* b) { |
669 SkTScopedComPtr<IUnknown> iunkA; | 605 SkTScopedComPtr<IUnknown> iunkA; |
670 if (FAILED(a->QueryInterface(&iunkA))) { | 606 if (FAILED(a->QueryInterface(&iunkA))) { |
671 return false; | 607 return false; |
672 } | 608 } |
673 | 609 |
674 SkTScopedComPtr<IUnknown> iunkB; | 610 SkTScopedComPtr<IUnknown> iunkB; |
675 if (FAILED(b->QueryInterface(&iunkB))) { | 611 if (FAILED(b->QueryInterface(&iunkB))) { |
676 return false; | 612 return false; |
677 } | 613 } |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
771 | 707 |
772 SkSMallocWCHAR dwFontFamilyNameChar(dwFontFamilyNameLength+1); | 708 SkSMallocWCHAR dwFontFamilyNameChar(dwFontFamilyNameLength+1); |
773 SkSMallocWCHAR dwFontNameChar(dwFontNameLength+1); | 709 SkSMallocWCHAR dwFontNameChar(dwFontNameLength+1); |
774 HRB(dwFontFamilyNames->GetString(0, dwFontFamilyNameChar.get(), dwFontFamily
NameLength+1)); | 710 HRB(dwFontFamilyNames->GetString(0, dwFontFamilyNameChar.get(), dwFontFamily
NameLength+1)); |
775 HRB(dwFontNames->GetString(0, dwFontNameChar.get(), dwFontNameLength+1)); | 711 HRB(dwFontNames->GetString(0, dwFontNameChar.get(), dwFontNameLength+1)); |
776 | 712 |
777 return wcscmp(dwFaceFontFamilyNameChar.get(), dwFontFamilyNameChar.get()) ==
0 && | 713 return wcscmp(dwFaceFontFamilyNameChar.get(), dwFontFamilyNameChar.get()) ==
0 && |
778 wcscmp(dwFaceFontNameChar.get(), dwFontNameChar.get()) == 0; | 714 wcscmp(dwFaceFontNameChar.get(), dwFontNameChar.get()) == 0; |
779 } | 715 } |
780 | 716 |
781 void SkDWriteFontFromTypeface(const SkTypeface* face, IDWriteFont** font) { | |
782 if (NULL == face) { | |
783 HRVM(get_default_font(font), "Could not get default font."); | |
784 } else { | |
785 *font = SkRefComPtr(static_cast<const DWriteFontTypeface*>(face)->fDWrit
eFont.get()); | |
786 } | |
787 } | |
788 | |
789 SkScalerContext_DW::SkScalerContext_DW(DWriteFontTypeface* typeface, | 717 SkScalerContext_DW::SkScalerContext_DW(DWriteFontTypeface* typeface, |
790 const SkDescriptor* desc) | 718 const SkDescriptor* desc) |
791 : SkScalerContext(typeface, desc) | 719 : SkScalerContext(typeface, desc) |
792 , fTypeface(SkRef(typeface)) | 720 , fTypeface(SkRef(typeface)) |
793 , fGlyphCount(-1) { | 721 , fGlyphCount(-1) { |
794 SkAutoMutexAcquire ac(gFTMutex); | 722 SkAutoMutexAcquire ac(gFTMutex); |
795 | 723 |
796 fXform.m11 = SkScalarToFloat(fRec.fPost2x2[0][0]); | 724 fXform.m11 = SkScalarToFloat(fRec.fPost2x2[0][0]); |
797 fXform.m12 = SkScalarToFloat(fRec.fPost2x2[1][0]); | 725 fXform.m12 = SkScalarToFloat(fRec.fPost2x2[1][0]); |
798 fXform.m21 = SkScalarToFloat(fRec.fPost2x2[0][1]); | 726 fXform.m21 = SkScalarToFloat(fRec.fPost2x2[0][1]); |
(...skipping 625 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1424 &fontFileStream), | 1352 &fontFileStream), |
1425 "Could not create font file stream."); | 1353 "Could not create font file stream."); |
1426 | 1354 |
1427 return SkNEW_ARGS(SkDWriteFontFileStream, (fontFileStream.get())); | 1355 return SkNEW_ARGS(SkDWriteFontFileStream, (fontFileStream.get())); |
1428 } | 1356 } |
1429 | 1357 |
1430 SkScalerContext* DWriteFontTypeface::onCreateScalerContext(const SkDescriptor* d
esc) const { | 1358 SkScalerContext* DWriteFontTypeface::onCreateScalerContext(const SkDescriptor* d
esc) const { |
1431 return SkNEW_ARGS(SkScalerContext_DW, (const_cast<DWriteFontTypeface*>(this)
, desc)); | 1359 return SkNEW_ARGS(SkScalerContext_DW, (const_cast<DWriteFontTypeface*>(this)
, desc)); |
1432 } | 1360 } |
1433 | 1361 |
1434 static HRESULT get_by_family_name(const char familyName[], IDWriteFontFamily** f
ontFamily) { | |
1435 IDWriteFactory* factory; | |
1436 HR(get_dwrite_factory(&factory)); | |
1437 | |
1438 SkTScopedComPtr<IDWriteFontCollection> sysFontCollection; | |
1439 HR(factory->GetSystemFontCollection(&sysFontCollection, FALSE)); | |
1440 | |
1441 SkSMallocWCHAR wideFamilyName; | |
1442 HR(cstring_to_wchar(familyName, &wideFamilyName)); | |
1443 | |
1444 UINT32 index; | |
1445 BOOL exists; | |
1446 HR(sysFontCollection->FindFamilyName(wideFamilyName.get(), &index, &exists))
; | |
1447 | |
1448 if (exists) { | |
1449 HR(sysFontCollection->GetFontFamily(index, fontFamily)); | |
1450 return S_OK; | |
1451 } | |
1452 return S_FALSE; | |
1453 } | |
1454 | |
1455 void DWriteFontTypeface::onFilterRec(SkScalerContext::Rec* rec) const { | 1362 void DWriteFontTypeface::onFilterRec(SkScalerContext::Rec* rec) const { |
1456 if (rec->fFlags & SkScalerContext::kLCD_BGROrder_Flag || | 1363 if (rec->fFlags & SkScalerContext::kLCD_BGROrder_Flag || |
1457 rec->fFlags & SkScalerContext::kLCD_Vertical_Flag) | 1364 rec->fFlags & SkScalerContext::kLCD_Vertical_Flag) |
1458 { | 1365 { |
1459 rec->fMaskFormat = SkMask::kA8_Format; | 1366 rec->fMaskFormat = SkMask::kA8_Format; |
1460 } | 1367 } |
1461 | 1368 |
1462 unsigned flagsWeDontSupport = SkScalerContext::kDevKernText_Flag | | 1369 unsigned flagsWeDontSupport = SkScalerContext::kDevKernText_Flag | |
1463 SkScalerContext::kAutohinting_Flag | | 1370 SkScalerContext::kAutohinting_Flag | |
1464 SkScalerContext::kEmbeddedBitmapText_Flag | | 1371 SkScalerContext::kEmbeddedBitmapText_Flag | |
(...skipping 358 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1823 SkTypeface* SkFontMgr_DirectWrite::onCreateFromData(SkData* data, int ttcIndex)
{ | 1730 SkTypeface* SkFontMgr_DirectWrite::onCreateFromData(SkData* data, int ttcIndex)
{ |
1824 SkAutoTUnref<SkStream> stream(SkNEW_ARGS(SkMemoryStream, (data))); | 1731 SkAutoTUnref<SkStream> stream(SkNEW_ARGS(SkMemoryStream, (data))); |
1825 return this->createFromStream(stream, ttcIndex); | 1732 return this->createFromStream(stream, ttcIndex); |
1826 } | 1733 } |
1827 | 1734 |
1828 SkTypeface* SkFontMgr_DirectWrite::onCreateFromFile(const char path[], int ttcIn
dex) { | 1735 SkTypeface* SkFontMgr_DirectWrite::onCreateFromFile(const char path[], int ttcIn
dex) { |
1829 SkAutoTUnref<SkStream> stream(SkStream::NewFromFile(path)); | 1736 SkAutoTUnref<SkStream> stream(SkStream::NewFromFile(path)); |
1830 return this->createFromStream(stream, ttcIndex); | 1737 return this->createFromStream(stream, ttcIndex); |
1831 } | 1738 } |
1832 | 1739 |
| 1740 HRESULT SkFontMgr_DirectWrite::getByFamilyName(const WCHAR wideFamilyName[], |
| 1741 IDWriteFontFamily** fontFamily) { |
| 1742 UINT32 index; |
| 1743 BOOL exists; |
| 1744 HR(fFontCollection->FindFamilyName(wideFamilyName, &index, &exists)); |
| 1745 |
| 1746 if (exists) { |
| 1747 HR(fFontCollection->GetFontFamily(index, fontFamily)); |
| 1748 return S_OK; |
| 1749 } |
| 1750 return S_FALSE; |
| 1751 } |
| 1752 |
| 1753 HRESULT SkFontMgr_DirectWrite::getDefaultFontFamily(IDWriteFontFamily** fontFami
ly) { |
| 1754 NONCLIENTMETRICSW metrics; |
| 1755 metrics.cbSize = sizeof(metrics); |
| 1756 if (0 == SystemParametersInfoW(SPI_GETNONCLIENTMETRICS, |
| 1757 sizeof(metrics), |
| 1758 &metrics, |
| 1759 0)) { |
| 1760 return E_UNEXPECTED; |
| 1761 } |
| 1762 HRM(this->getByFamilyName(metrics.lfMessageFont.lfFaceName, fontFamily), |
| 1763 "Could not create DWrite font family from LOGFONT."); |
| 1764 |
| 1765 return S_OK; |
| 1766 } |
| 1767 |
1833 SkTypeface* SkFontMgr_DirectWrite::onLegacyCreateTypeface(const char familyName[
], | 1768 SkTypeface* SkFontMgr_DirectWrite::onLegacyCreateTypeface(const char familyName[
], |
1834 unsigned styleBits) { | 1769 unsigned styleBits) { |
1835 SkTScopedComPtr<IDWriteFontFamily> fontFamily; | 1770 SkTScopedComPtr<IDWriteFontFamily> fontFamily; |
1836 if (familyName) { | 1771 if (familyName) { |
1837 get_by_family_name(familyName, &fontFamily); | 1772 SkSMallocWCHAR wideFamilyName; |
| 1773 if (SUCCEEDED(cstring_to_wchar(familyName, &wideFamilyName))) { |
| 1774 this->getByFamilyName(wideFamilyName, &fontFamily); |
| 1775 } |
1838 } | 1776 } |
1839 | 1777 |
1840 if (NULL == fontFamily.get()) { | 1778 if (NULL == fontFamily.get()) { |
1841 //No good family found, go with default. | 1779 // No family with given name, try default. |
1842 SkTScopedComPtr<IDWriteFont> defaultFont; | 1780 HRNM(this->getDefaultFontFamily(&fontFamily), "Could not get default fon
t family."); |
1843 HRNM(get_default_font(&defaultFont), "Could not get default font."); | |
1844 HRNM(defaultFont->GetFontFamily(&fontFamily), "Could not get default fon
t family."); | |
1845 } | 1781 } |
1846 | 1782 |
1847 SkTScopedComPtr<IDWriteFont> font; | 1783 SkTScopedComPtr<IDWriteFont> font; |
1848 DWRITE_FONT_WEIGHT weight = (styleBits & SkTypeface::kBold) | 1784 DWRITE_FONT_WEIGHT weight = (styleBits & SkTypeface::kBold) |
1849 ? DWRITE_FONT_WEIGHT_BOLD | 1785 ? DWRITE_FONT_WEIGHT_BOLD |
1850 : DWRITE_FONT_WEIGHT_NORMAL; | 1786 : DWRITE_FONT_WEIGHT_NORMAL; |
1851 DWRITE_FONT_STRETCH stretch = DWRITE_FONT_STRETCH_UNDEFINED; | 1787 DWRITE_FONT_STRETCH stretch = DWRITE_FONT_STRETCH_UNDEFINED; |
1852 DWRITE_FONT_STYLE italic = (styleBits & SkTypeface::kItalic) | 1788 DWRITE_FONT_STYLE italic = (styleBits & SkTypeface::kItalic) |
1853 ? DWRITE_FONT_STYLE_ITALIC | 1789 ? DWRITE_FONT_STYLE_ITALIC |
1854 : DWRITE_FONT_STYLE_NORMAL; | 1790 : DWRITE_FONT_STYLE_NORMAL; |
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1969 SK_TRACEHR(hr, "Could not get GetUserDefaultLocaleName."); | 1905 SK_TRACEHR(hr, "Could not get GetUserDefaultLocaleName."); |
1970 } else { | 1906 } else { |
1971 localeNameLen = getUserDefaultLocaleNameProc(localeNameStorage, LOCALE_N
AME_MAX_LENGTH); | 1907 localeNameLen = getUserDefaultLocaleNameProc(localeNameStorage, LOCALE_N
AME_MAX_LENGTH); |
1972 if (localeNameLen) { | 1908 if (localeNameLen) { |
1973 localeName = localeNameStorage; | 1909 localeName = localeNameStorage; |
1974 }; | 1910 }; |
1975 } | 1911 } |
1976 | 1912 |
1977 return SkNEW_ARGS(SkFontMgr_DirectWrite, (sysFontCollection.get(), localeNam
e, localeNameLen)); | 1913 return SkNEW_ARGS(SkFontMgr_DirectWrite, (sysFontCollection.get(), localeNam
e, localeNameLen)); |
1978 } | 1914 } |
OLD | NEW |