Chromium Code Reviews| 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 686 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 697 | 697 |
| 698 SkSMallocWCHAR dwFontFamilyNameChar(dwFontFamilyNameLength+1); | 698 SkSMallocWCHAR dwFontFamilyNameChar(dwFontFamilyNameLength+1); |
| 699 SkSMallocWCHAR dwFontNameChar(dwFontNameLength+1); | 699 SkSMallocWCHAR dwFontNameChar(dwFontNameLength+1); |
| 700 HRB(dwFontFamilyNames->GetString(0, dwFontFamilyNameChar.get(), dwFontFamily NameLength+1)); | 700 HRB(dwFontFamilyNames->GetString(0, dwFontFamilyNameChar.get(), dwFontFamily NameLength+1)); |
| 701 HRB(dwFontNames->GetString(0, dwFontNameChar.get(), dwFontNameLength+1)); | 701 HRB(dwFontNames->GetString(0, dwFontNameChar.get(), dwFontNameLength+1)); |
| 702 | 702 |
| 703 return wcscmp(dwFaceFontFamilyNameChar.get(), dwFontFamilyNameChar.get()) == 0 && | 703 return wcscmp(dwFaceFontFamilyNameChar.get(), dwFontFamilyNameChar.get()) == 0 && |
| 704 wcscmp(dwFaceFontNameChar.get(), dwFontNameChar.get()) == 0; | 704 wcscmp(dwFaceFontNameChar.get(), dwFontNameChar.get()) == 0; |
| 705 } | 705 } |
| 706 | 706 |
| 707 SkTypeface* SkCreateTypefaceFromDWriteFont(IDWriteFontFace* fontFace, | 707 SkTypeface* SkCreateTypefaceFromDWriteFont(SkTypefaceCache* cache, |
|
bungeman-skia
2013/08/13 15:53:45
This is really odd looking, I think what we logica
| |
| 708 IDWriteFontFace* fontFace, | |
| 708 IDWriteFont* font, | 709 IDWriteFont* font, |
| 709 IDWriteFontFamily* fontFamily, | 710 IDWriteFontFamily* fontFamily, |
| 710 StreamFontFileLoader* fontFileLoader = NULL, | 711 StreamFontFileLoader* fontFileLoader = NULL, |
| 711 IDWriteFontCollectionLoader* fontColl ectionLoader = NULL) { | 712 IDWriteFontCollectionLoader* fontColl ectionLoader = NULL) { |
| 712 SkTypeface* face = SkTypefaceCache::FindByProcAndRef(FindByDWriteFont, font) ; | 713 SkTypeface* face = NULL; |
| 714 if (cache) { | |
| 715 face = cache->findByProcAndRef(FindByDWriteFont, font); | |
| 716 } | |
| 713 if (NULL == face) { | 717 if (NULL == face) { |
| 714 face = DWriteFontTypeface::Create(fontFace, font, fontFamily, | 718 face = DWriteFontTypeface::Create(fontFace, font, fontFamily, |
| 715 fontFileLoader, fontCollectionLoader); | 719 fontFileLoader, fontCollectionLoader); |
| 716 SkTypefaceCache::Add(face, get_style(font), fontCollectionLoader != NULL ); | 720 if (face) { |
|
bungeman-skia
2013/08/13 15:53:45
&& cache
| |
| 721 cache->add(face, get_style(font), fontCollectionLoader != NULL); | |
| 722 } | |
| 717 } | 723 } |
| 718 return face; | 724 return face; |
| 719 } | 725 } |
| 720 | 726 |
| 721 void SkDWriteFontFromTypeface(const SkTypeface* face, IDWriteFont** font) { | 727 void SkDWriteFontFromTypeface(const SkTypeface* face, IDWriteFont** font) { |
| 722 if (NULL == face) { | 728 if (NULL == face) { |
| 723 HRVM(get_default_font(font), "Could not get default font."); | 729 HRVM(get_default_font(font), "Could not get default font."); |
| 724 } else { | 730 } else { |
| 725 *font = SkRefComPtr(static_cast<const DWriteFontTypeface*>(face)->fDWrit eFont.get()); | 731 *font = SkRefComPtr(static_cast<const DWriteFontTypeface*>(face)->fDWrit eFont.get()); |
| 726 } | 732 } |
| (...skipping 486 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1213 } | 1219 } |
| 1214 | 1220 |
| 1215 HRESULT unregister(IDWriteFactory* factory, IDWriteFontCollectionLoader* unr egister) { | 1221 HRESULT unregister(IDWriteFactory* factory, IDWriteFontCollectionLoader* unr egister) { |
| 1216 return factory->UnregisterFontCollectionLoader(unregister); | 1222 return factory->UnregisterFontCollectionLoader(unregister); |
| 1217 } | 1223 } |
| 1218 | 1224 |
| 1219 IDWriteFactory* fFactory; | 1225 IDWriteFactory* fFactory; |
| 1220 T* fUnregister; | 1226 T* fUnregister; |
| 1221 }; | 1227 }; |
| 1222 | 1228 |
| 1223 static SkTypeface* create_from_stream(SkStream* stream, int ttcIndex) { | 1229 static SkTypeface* create_from_stream(SkStream* stream, int ttcIndex, |
|
bungeman-skia
2013/08/13 15:53:45
I've been debating this for a while, but should th
| |
| 1230 SkTypefaceCache* cache) { | |
| 1224 IDWriteFactory* factory; | 1231 IDWriteFactory* factory; |
| 1225 HRN(get_dwrite_factory(&factory)); | 1232 HRN(get_dwrite_factory(&factory)); |
| 1226 | 1233 |
| 1227 SkTScopedComPtr<StreamFontFileLoader> fontFileLoader; | 1234 SkTScopedComPtr<StreamFontFileLoader> fontFileLoader; |
| 1228 HRN(StreamFontFileLoader::Create(stream, &fontFileLoader)); | 1235 HRN(StreamFontFileLoader::Create(stream, &fontFileLoader)); |
| 1229 HRN(factory->RegisterFontFileLoader(fontFileLoader.get())); | 1236 HRN(factory->RegisterFontFileLoader(fontFileLoader.get())); |
| 1230 SkAutoIDWriteUnregister<StreamFontFileLoader> autoUnregisterFontFileLoader( | 1237 SkAutoIDWriteUnregister<StreamFontFileLoader> autoUnregisterFontFileLoader( |
| 1231 factory, fontFileLoader.get()); | 1238 factory, fontFileLoader.get()); |
| 1232 | 1239 |
| 1233 SkTScopedComPtr<StreamFontCollectionLoader> fontCollectionLoader; | 1240 SkTScopedComPtr<StreamFontCollectionLoader> fontCollectionLoader; |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 1251 HRN(fontFamily->GetFont(fontIndex, &font)); | 1258 HRN(fontFamily->GetFont(fontIndex, &font)); |
| 1252 if (font->GetSimulations() != DWRITE_FONT_SIMULATIONS_NONE) { | 1259 if (font->GetSimulations() != DWRITE_FONT_SIMULATIONS_NONE) { |
| 1253 continue; | 1260 continue; |
| 1254 } | 1261 } |
| 1255 | 1262 |
| 1256 SkTScopedComPtr<IDWriteFontFace> fontFace; | 1263 SkTScopedComPtr<IDWriteFontFace> fontFace; |
| 1257 HRN(font->CreateFontFace(&fontFace)); | 1264 HRN(font->CreateFontFace(&fontFace)); |
| 1258 | 1265 |
| 1259 UINT32 faceIndex = fontFace->GetIndex(); | 1266 UINT32 faceIndex = fontFace->GetIndex(); |
| 1260 if (faceIndex == ttcIndex) { | 1267 if (faceIndex == ttcIndex) { |
| 1261 return SkCreateTypefaceFromDWriteFont(fontFace.get(), font.get() , fontFamily.get(), | 1268 return SkCreateTypefaceFromDWriteFont(cache, fontFace.get(), fon t.get(), fontFamily.get(), |
| 1262 autoUnregisterFontFileLoad er.detatch(), | 1269 autoUnregisterFontFileLoad er.detatch(), |
| 1263 autoUnregisterFontCollecti onLoader.detatch()); | 1270 autoUnregisterFontCollecti onLoader.detatch()); |
| 1264 } | 1271 } |
| 1265 } | 1272 } |
| 1266 } | 1273 } |
| 1267 | 1274 |
| 1268 return NULL; | 1275 return NULL; |
| 1269 } | 1276 } |
| 1270 | 1277 |
| 1271 SkStream* DWriteFontTypeface::onOpenStream(int* ttcIndex) const { | 1278 SkStream* DWriteFontTypeface::onOpenStream(int* ttcIndex) const { |
| (...skipping 317 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1589 glyphIDsCount, | 1596 glyphIDsCount, |
| 1590 getWidthAdvance)); | 1597 getWidthAdvance)); |
| 1591 } | 1598 } |
| 1592 } | 1599 } |
| 1593 | 1600 |
| 1594 return info; | 1601 return info; |
| 1595 } | 1602 } |
| 1596 | 1603 |
| 1597 static SkTypeface* create_typeface(const SkTypeface* familyFace, | 1604 static SkTypeface* create_typeface(const SkTypeface* familyFace, |
| 1598 const char familyName[], | 1605 const char familyName[], |
| 1599 unsigned style) { | 1606 unsigned style, |
| 1607 SkTypefaceCache* cache) { | |
| 1600 HRESULT hr; | 1608 HRESULT hr; |
| 1601 SkTScopedComPtr<IDWriteFontFamily> fontFamily; | 1609 SkTScopedComPtr<IDWriteFontFamily> fontFamily; |
| 1602 if (familyFace) { | 1610 if (familyFace) { |
| 1603 const DWriteFontTypeface* face = static_cast<const DWriteFontTypeface*>( familyFace); | 1611 const DWriteFontTypeface* face = static_cast<const DWriteFontTypeface*>( familyFace); |
| 1604 *(&fontFamily) = SkRefComPtr(face->fDWriteFontFamily.get()); | 1612 *(&fontFamily) = SkRefComPtr(face->fDWriteFontFamily.get()); |
| 1605 | 1613 |
| 1606 } else if (familyName) { | 1614 } else if (familyName) { |
| 1607 hr = get_by_family_name(familyName, &fontFamily); | 1615 hr = get_by_family_name(familyName, &fontFamily); |
| 1608 } | 1616 } |
| 1609 | 1617 |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 1620 : DWRITE_FONT_WEIGHT_NORMAL; | 1628 : DWRITE_FONT_WEIGHT_NORMAL; |
| 1621 DWRITE_FONT_STRETCH stretch = DWRITE_FONT_STRETCH_UNDEFINED; | 1629 DWRITE_FONT_STRETCH stretch = DWRITE_FONT_STRETCH_UNDEFINED; |
| 1622 DWRITE_FONT_STYLE italic = (style & SkTypeface::kItalic) | 1630 DWRITE_FONT_STYLE italic = (style & SkTypeface::kItalic) |
| 1623 ? DWRITE_FONT_STYLE_ITALIC | 1631 ? DWRITE_FONT_STYLE_ITALIC |
| 1624 : DWRITE_FONT_STYLE_NORMAL; | 1632 : DWRITE_FONT_STYLE_NORMAL; |
| 1625 hr = fontFamily->GetFirstMatchingFont(weight, stretch, italic, &font); | 1633 hr = fontFamily->GetFirstMatchingFont(weight, stretch, italic, &font); |
| 1626 | 1634 |
| 1627 SkTScopedComPtr<IDWriteFontFace> fontFace; | 1635 SkTScopedComPtr<IDWriteFontFace> fontFace; |
| 1628 hr = font->CreateFontFace(&fontFace); | 1636 hr = font->CreateFontFace(&fontFace); |
| 1629 | 1637 |
| 1630 return SkCreateTypefaceFromDWriteFont(fontFace.get(), font.get(), fontFamily .get()); | 1638 return SkCreateTypefaceFromDWriteFont(cache, fontFace.get(), font.get(), fon tFamily.get()); |
| 1631 } | 1639 } |
| 1632 | 1640 |
| 1633 SkTypeface* DWriteFontTypeface::onRefMatchingStyle(Style style) const { | 1641 SkTypeface* DWriteFontTypeface::onRefMatchingStyle(Style style) const { |
| 1634 return create_typeface(this, NULL, style); | 1642 SkTypefaceCache* cache = NULL; |
| 1643 // todo: should each typeface have a ref to its fontmgr/cache? | |
| 1644 return create_typeface(this, NULL, style, cache); | |
| 1635 } | 1645 } |
| 1636 | 1646 |
| 1637 /////////////////////////////////////////////////////////////////////////////// | 1647 /////////////////////////////////////////////////////////////////////////////// |
| 1638 | 1648 |
| 1639 #include "SkFontMgr.h" | 1649 #include "SkFontMgr.h" |
| 1640 | 1650 |
| 1641 static void get_locale_string(IDWriteLocalizedStrings* names, const WCHAR* prefe redLocale, | 1651 static void get_locale_string(IDWriteLocalizedStrings* names, const WCHAR* prefe redLocale, |
| 1642 SkString* skname) { | 1652 SkString* skname) { |
| 1643 UINT32 nameIndex = 0; | 1653 UINT32 nameIndex = 0; |
| 1644 if (preferedLocale) { | 1654 if (preferedLocale) { |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 1657 SkSMallocWCHAR name(nameLength); | 1667 SkSMallocWCHAR name(nameLength); |
| 1658 HRVM(names->GetString(nameIndex, name.get(), nameLength), "Could not get str ing."); | 1668 HRVM(names->GetString(nameIndex, name.get(), nameLength), "Could not get str ing."); |
| 1659 | 1669 |
| 1660 HRV(wchar_to_skstring(name.get(), skname)); | 1670 HRV(wchar_to_skstring(name.get(), skname)); |
| 1661 } | 1671 } |
| 1662 | 1672 |
| 1663 class SkFontMgr_DirectWrite; | 1673 class SkFontMgr_DirectWrite; |
| 1664 | 1674 |
| 1665 class SkFontStyleSet_DirectWrite : public SkFontStyleSet { | 1675 class SkFontStyleSet_DirectWrite : public SkFontStyleSet { |
| 1666 public: | 1676 public: |
| 1667 SkFontStyleSet_DirectWrite(const SkFontMgr_DirectWrite* fontMgr, IDWriteFont Family* fontFamily) | 1677 SkFontStyleSet_DirectWrite(SkFontMgr_DirectWrite* fontMgr, IDWriteFontFamily * fontFamily) |
| 1668 : fFontMgr(SkRef(fontMgr)) | 1678 : fFontMgr(SkRef(fontMgr)) |
| 1669 , fFontFamily(SkRefComPtr(fontFamily)) | 1679 , fFontFamily(SkRefComPtr(fontFamily)) |
| 1670 { } | 1680 { } |
| 1671 | 1681 |
| 1672 virtual int count() SK_OVERRIDE { | 1682 virtual int count() SK_OVERRIDE; |
| 1673 return fFontFamily->GetFontCount(); | 1683 virtual void getStyle(int index, SkFontStyle* fs, SkString* styleName) SK_OV ERRIDE; |
| 1674 } | 1684 virtual SkTypeface* createTypeface(int index) SK_OVERRIDE; |
| 1675 | 1685 virtual SkTypeface* matchStyle(const SkFontStyle& pattern) SK_OVERRIDE; |
| 1676 virtual void getStyle(int index, SkFontStyle* fs, SkString* styleName); | |
| 1677 | |
| 1678 virtual SkTypeface* createTypeface(int index) SK_OVERRIDE { | |
| 1679 SkTScopedComPtr<IDWriteFont> font; | |
| 1680 HRNM(fFontFamily->GetFont(index, &font), "Could not get font."); | |
| 1681 | |
| 1682 SkTScopedComPtr<IDWriteFontFace> fontFace; | |
| 1683 HRNM(font->CreateFontFace(&fontFace), "Could not create font face."); | |
| 1684 | |
| 1685 return SkCreateTypefaceFromDWriteFont(fontFace.get(), font.get(), fFontF amily.get()); | |
| 1686 } | |
| 1687 | |
| 1688 virtual SkTypeface* matchStyle(const SkFontStyle& pattern) SK_OVERRIDE { | |
| 1689 DWRITE_FONT_STYLE slant; | |
| 1690 switch (pattern.slant()) { | |
| 1691 case SkFontStyle::kUpright_Slant: | |
| 1692 slant = DWRITE_FONT_STYLE_NORMAL; | |
| 1693 break; | |
| 1694 case SkFontStyle::kItalic_Slant: | |
| 1695 slant = DWRITE_FONT_STYLE_ITALIC; | |
| 1696 break; | |
| 1697 default: | |
| 1698 SkASSERT(false); | |
| 1699 } | |
| 1700 | |
| 1701 DWRITE_FONT_WEIGHT weight = (DWRITE_FONT_WEIGHT)pattern.weight(); | |
| 1702 DWRITE_FONT_STRETCH width = (DWRITE_FONT_STRETCH)pattern.width(); | |
| 1703 | |
| 1704 SkTScopedComPtr<IDWriteFont> font; | |
| 1705 // TODO: perhaps use GetMatchingFonts and get the least simulated? | |
| 1706 HRNM(fFontFamily->GetFirstMatchingFont(weight, width, slant, &font), | |
| 1707 "Could not match font in family."); | |
| 1708 | |
| 1709 SkTScopedComPtr<IDWriteFontFace> fontFace; | |
| 1710 HRNM(font->CreateFontFace(&fontFace), "Could not create font face."); | |
| 1711 | |
| 1712 return SkCreateTypefaceFromDWriteFont(fontFace.get(), font.get(), fFontF amily.get()); | |
| 1713 } | |
| 1714 | 1686 |
| 1715 private: | 1687 private: |
| 1716 SkAutoTUnref<const SkFontMgr_DirectWrite> fFontMgr; | 1688 SkAutoTUnref<SkFontMgr_DirectWrite> fFontMgr; |
| 1717 SkTScopedComPtr<IDWriteFontFamily> fFontFamily; | 1689 SkTScopedComPtr<IDWriteFontFamily> fFontFamily; |
| 1718 }; | 1690 }; |
| 1719 | 1691 |
| 1720 class SkFontMgr_DirectWrite : public SkFontMgr { | 1692 class SkFontMgr_DirectWrite : public SkFontMgr { |
| 1721 public: | 1693 public: |
| 1722 /** localeNameLength must include the null terminator. */ | 1694 /** localeNameLength must include the null terminator. */ |
| 1723 SkFontMgr_DirectWrite(IDWriteFontCollection* fontCollection, | 1695 SkFontMgr_DirectWrite(IDWriteFontCollection* fontCollection, |
| 1724 WCHAR* localeName, int localeNameLength) | 1696 WCHAR* localeName, int localeNameLength) |
| 1725 : fFontCollection(SkRefComPtr(fontCollection)) | 1697 : fFontCollection(SkRefComPtr(fontCollection)) |
| 1726 , fLocaleName(localeNameLength) | 1698 , fLocaleName(localeNameLength) |
| 1727 { | 1699 { |
| 1728 memcpy(fLocaleName.get(), localeName, localeNameLength * sizeof(WCHAR)); | 1700 memcpy(fLocaleName.get(), localeName, localeNameLength * sizeof(WCHAR)); |
| 1729 } | 1701 } |
| 1730 | 1702 |
| 1703 SkTypefaceCache* getTypefaceCache() { return &fTFCache; } | |
| 1704 | |
| 1731 private: | 1705 private: |
| 1732 friend class SkFontStyleSet_DirectWrite; | 1706 friend class SkFontStyleSet_DirectWrite; |
| 1733 SkTScopedComPtr<IDWriteFontCollection> fFontCollection; | 1707 SkTScopedComPtr<IDWriteFontCollection> fFontCollection; |
| 1734 SkSMallocWCHAR fLocaleName; | 1708 SkSMallocWCHAR fLocaleName; |
| 1709 SkTypefaceCache fTFCache; | |
| 1735 | 1710 |
| 1736 protected: | 1711 protected: |
| 1737 virtual int onCountFamilies() SK_OVERRIDE { | 1712 virtual int onCountFamilies() SK_OVERRIDE { |
| 1738 return fFontCollection->GetFontFamilyCount(); | 1713 return fFontCollection->GetFontFamilyCount(); |
| 1739 } | 1714 } |
| 1740 virtual void onGetFamilyName(int index, SkString* familyName) SK_OVERRIDE { | 1715 virtual void onGetFamilyName(int index, SkString* familyName) SK_OVERRIDE { |
| 1741 SkTScopedComPtr<IDWriteFontFamily> fontFamily; | 1716 SkTScopedComPtr<IDWriteFontFamily> fontFamily; |
| 1742 HRVM(fFontCollection->GetFontFamily(index, &fontFamily), "Could not get requested family."); | 1717 HRVM(fFontCollection->GetFontFamily(index, &fontFamily), "Could not get requested family."); |
| 1743 | 1718 |
| 1744 SkTScopedComPtr<IDWriteLocalizedStrings> familyNames; | 1719 SkTScopedComPtr<IDWriteLocalizedStrings> familyNames; |
| (...skipping 29 matching lines...) Expand all Loading... | |
| 1774 } | 1749 } |
| 1775 virtual SkTypeface* onMatchFaceStyle(const SkTypeface* familyMember, | 1750 virtual SkTypeface* onMatchFaceStyle(const SkTypeface* familyMember, |
| 1776 const SkFontStyle& fontstyle) SK_OVERRI DE { | 1751 const SkFontStyle& fontstyle) SK_OVERRI DE { |
| 1777 SkString familyName; | 1752 SkString familyName; |
| 1778 SkFontStyleSet_DirectWrite sset( | 1753 SkFontStyleSet_DirectWrite sset( |
| 1779 this, ((DWriteFontTypeface*)familyMember)->fDWriteFontFamily.get() | 1754 this, ((DWriteFontTypeface*)familyMember)->fDWriteFontFamily.get() |
| 1780 ); | 1755 ); |
| 1781 return sset.matchStyle(fontstyle); | 1756 return sset.matchStyle(fontstyle); |
| 1782 } | 1757 } |
| 1783 virtual SkTypeface* onCreateFromStream(SkStream* stream, int ttcIndex) SK_OV ERRIDE { | 1758 virtual SkTypeface* onCreateFromStream(SkStream* stream, int ttcIndex) SK_OV ERRIDE { |
| 1784 return create_from_stream(stream, ttcIndex); | 1759 return create_from_stream(stream, ttcIndex, this->getTypefaceCache()); |
| 1785 } | 1760 } |
| 1786 virtual SkTypeface* onCreateFromData(SkData* data, int ttcIndex) SK_OVERRIDE { | 1761 virtual SkTypeface* onCreateFromData(SkData* data, int ttcIndex) SK_OVERRIDE { |
| 1787 SkAutoTUnref<SkStream> stream(SkNEW_ARGS(SkMemoryStream, (data))); | 1762 SkAutoTUnref<SkStream> stream(SkNEW_ARGS(SkMemoryStream, (data))); |
| 1788 return this->createFromStream(stream, ttcIndex); | 1763 return this->createFromStream(stream, ttcIndex); |
| 1789 } | 1764 } |
| 1790 virtual SkTypeface* onCreateFromFile(const char path[], int ttcIndex) SK_OVE RRIDE { | 1765 virtual SkTypeface* onCreateFromFile(const char path[], int ttcIndex) SK_OVE RRIDE { |
| 1791 SkAutoTUnref<SkStream> stream(SkStream::NewFromFile(path)); | 1766 SkAutoTUnref<SkStream> stream(SkStream::NewFromFile(path)); |
| 1792 return this->createFromStream(stream, ttcIndex); | 1767 return this->createFromStream(stream, ttcIndex); |
| 1793 } | 1768 } |
| 1794 | 1769 |
| 1795 virtual SkTypeface* onLegacyCreateTypeface(const char familyName[], | 1770 virtual SkTypeface* onLegacyCreateTypeface(const char familyName[], |
| 1796 unsigned styleBits) SK_OVERRIDE { | 1771 unsigned styleBits) SK_OVERRIDE { |
| 1797 return create_typeface(NULL, familyName, styleBits); | 1772 return create_typeface(NULL, familyName, styleBits, this->getTypefaceCac he()); |
| 1798 } | 1773 } |
| 1799 }; | 1774 }; |
| 1800 | 1775 |
| 1776 /////////////////////////////////////////////////////////////////////////////// | |
| 1777 | |
| 1778 int SkFontStyleSet_DirectWrite::count() { | |
| 1779 return fFontFamily->GetFontCount(); | |
| 1780 } | |
| 1781 | |
| 1782 SkTypeface* SkFontStyleSet_DirectWrite::createTypeface(int index) { | |
| 1783 SkTScopedComPtr<IDWriteFont> font; | |
| 1784 HRNM(fFontFamily->GetFont(index, &font), "Could not get font."); | |
| 1785 | |
| 1786 SkTScopedComPtr<IDWriteFontFace> fontFace; | |
| 1787 HRNM(font->CreateFontFace(&fontFace), "Could not create font face."); | |
| 1788 | |
| 1789 return SkCreateTypefaceFromDWriteFont(fFontMgr->getTypefaceCache(), | |
| 1790 fontFace.get(), font.get(), fFontFam ily.get()); | |
| 1791 } | |
| 1792 | |
| 1801 void SkFontStyleSet_DirectWrite::getStyle(int index, SkFontStyle* fs, SkString* styleName) { | 1793 void SkFontStyleSet_DirectWrite::getStyle(int index, SkFontStyle* fs, SkString* styleName) { |
| 1802 SkTScopedComPtr<IDWriteFont> font; | 1794 SkTScopedComPtr<IDWriteFont> font; |
| 1803 HRVM(fFontFamily->GetFont(index, &font), "Could not get font."); | 1795 HRVM(fFontFamily->GetFont(index, &font), "Could not get font."); |
| 1804 | 1796 |
| 1805 SkFontStyle::Slant slant; | 1797 SkFontStyle::Slant slant; |
| 1806 switch (font->GetStyle()) { | 1798 switch (font->GetStyle()) { |
| 1807 case DWRITE_FONT_STYLE_NORMAL: | 1799 case DWRITE_FONT_STYLE_NORMAL: |
| 1808 slant = SkFontStyle::kUpright_Slant; | 1800 slant = SkFontStyle::kUpright_Slant; |
| 1809 break; | 1801 break; |
| 1810 case DWRITE_FONT_STYLE_OBLIQUE: | 1802 case DWRITE_FONT_STYLE_OBLIQUE: |
| 1811 case DWRITE_FONT_STYLE_ITALIC: | 1803 case DWRITE_FONT_STYLE_ITALIC: |
| 1812 slant = SkFontStyle::kItalic_Slant; | 1804 slant = SkFontStyle::kItalic_Slant; |
| 1813 break; | 1805 break; |
| 1814 default: | 1806 default: |
| 1815 SkASSERT(false); | 1807 SkASSERT(false); |
| 1816 } | 1808 } |
| 1817 | 1809 |
| 1818 int weight = font->GetWeight(); | 1810 int weight = font->GetWeight(); |
| 1819 int width = font->GetStretch(); | 1811 int width = font->GetStretch(); |
| 1820 | 1812 |
| 1821 *fs = SkFontStyle(weight, width, slant); | 1813 *fs = SkFontStyle(weight, width, slant); |
| 1822 | 1814 |
| 1823 SkTScopedComPtr<IDWriteLocalizedStrings> faceNames; | 1815 SkTScopedComPtr<IDWriteLocalizedStrings> faceNames; |
| 1824 if (SUCCEEDED(font->GetFaceNames(&faceNames))) { | 1816 if (SUCCEEDED(font->GetFaceNames(&faceNames))) { |
| 1825 get_locale_string(faceNames.get(), fFontMgr->fLocaleName.get(), styleNam e); | 1817 get_locale_string(faceNames.get(), fFontMgr->fLocaleName.get(), styleNam e); |
| 1826 } | 1818 } |
| 1827 } | 1819 } |
| 1828 | 1820 |
| 1821 SkTypeface* SkFontStyleSet_DirectWrite::matchStyle(const SkFontStyle& pattern) { | |
| 1822 DWRITE_FONT_STYLE slant; | |
| 1823 switch (pattern.slant()) { | |
| 1824 case SkFontStyle::kUpright_Slant: | |
| 1825 slant = DWRITE_FONT_STYLE_NORMAL; | |
| 1826 break; | |
| 1827 case SkFontStyle::kItalic_Slant: | |
| 1828 slant = DWRITE_FONT_STYLE_ITALIC; | |
| 1829 break; | |
| 1830 default: | |
| 1831 SkASSERT(false); | |
| 1832 } | |
| 1833 | |
| 1834 DWRITE_FONT_WEIGHT weight = (DWRITE_FONT_WEIGHT)pattern.weight(); | |
| 1835 DWRITE_FONT_STRETCH width = (DWRITE_FONT_STRETCH)pattern.width(); | |
| 1836 | |
| 1837 SkTScopedComPtr<IDWriteFont> font; | |
| 1838 // TODO: perhaps use GetMatchingFonts and get the least simulated? | |
| 1839 HRNM(fFontFamily->GetFirstMatchingFont(weight, width, slant, &font), | |
| 1840 "Could not match font in family."); | |
| 1841 | |
| 1842 SkTScopedComPtr<IDWriteFontFace> fontFace; | |
| 1843 HRNM(font->CreateFontFace(&fontFace), "Could not create font face."); | |
| 1844 | |
| 1845 return SkCreateTypefaceFromDWriteFont(fFontMgr->getTypefaceCache(), | |
| 1846 fontFace.get(), font.get(), fFontFam ily.get()); | |
| 1847 } | |
| 1848 | |
| 1829 /////////////////////////////////////////////////////////////////////////////// | 1849 /////////////////////////////////////////////////////////////////////////////// |
| 1830 | 1850 |
| 1831 #ifndef SK_FONTHOST_USES_FONTMGR | 1851 #ifndef SK_FONTHOST_USES_FONTMGR |
| 1832 | 1852 |
| 1833 SkTypeface* SkFontHost::CreateTypeface(const SkTypeface* familyFace, | 1853 SkTypeface* SkFontHost::CreateTypeface(const SkTypeface* familyFace, |
| 1834 const char familyName[], | 1854 const char familyName[], |
| 1835 SkTypeface::Style style) { | 1855 SkTypeface::Style style) { |
| 1836 return create_typeface(familyFace, familyName, style); | 1856 return create_typeface(familyFace, familyName, style); |
| 1837 } | 1857 } |
| 1838 | 1858 |
| 1839 SkTypeface* SkFontHost::CreateTypefaceFromFile(const char path[]) { | 1859 SkTypeface* SkFontHost::CreateTypefaceFromFile(const char path[]) { |
| 1840 printf("SkFontHost::CreateTypefaceFromFile unimplemented"); | 1860 printf("SkFontHost::CreateTypefaceFromFile unimplemented"); |
| 1841 return NULL; | 1861 return NULL; |
| 1842 } | 1862 } |
| 1843 | 1863 |
| 1844 SkTypeface* SkFontHost::CreateTypefaceFromStream(SkStream* stream) { | 1864 SkTypeface* SkFontHost::CreateTypefaceFromStream(SkStream* stream) { |
| 1845 return create_from_stream(stream, 0); | 1865 return create_from_stream(stream, 0, NULL); |
| 1846 } | 1866 } |
| 1847 | 1867 |
| 1848 #endif | 1868 #endif |
| 1849 | 1869 |
| 1850 SkFontMgr* SkFontMgr::Factory() { | 1870 extern SkFontMgr* SkFontMgr_New_DirectWrite(); |
| 1871 SkFontMgr* SkFontMgr_New_DirectWrite() { | |
| 1851 IDWriteFactory* factory; | 1872 IDWriteFactory* factory; |
| 1852 HRNM(get_dwrite_factory(&factory), "Could not get factory."); | 1873 HRNM(get_dwrite_factory(&factory), "Could not get factory."); |
| 1853 | 1874 |
| 1854 SkTScopedComPtr<IDWriteFontCollection> sysFontCollection; | 1875 SkTScopedComPtr<IDWriteFontCollection> sysFontCollection; |
| 1855 HRNM(factory->GetSystemFontCollection(&sysFontCollection, FALSE), | 1876 HRNM(factory->GetSystemFontCollection(&sysFontCollection, FALSE), |
| 1856 "Could not get system font collection."); | 1877 "Could not get system font collection."); |
| 1857 | 1878 |
| 1858 WCHAR localeNameStorage[LOCALE_NAME_MAX_LENGTH]; | 1879 WCHAR localeNameStorage[LOCALE_NAME_MAX_LENGTH]; |
| 1859 WCHAR* localeName = NULL; | 1880 WCHAR* localeName = NULL; |
| 1860 int localeNameLen = GetUserDefaultLocaleName(localeNameStorage, LOCALE_NAME_ MAX_LENGTH); | 1881 int localeNameLen = GetUserDefaultLocaleName(localeNameStorage, LOCALE_NAME_ MAX_LENGTH); |
| 1861 if (localeNameLen) { | 1882 if (localeNameLen) { |
| 1862 localeName = localeNameStorage; | 1883 localeName = localeNameStorage; |
| 1863 }; | 1884 }; |
| 1864 | 1885 |
| 1865 return SkNEW_ARGS(SkFontMgr_DirectWrite, (sysFontCollection.get(), localeNam e, localeNameLen)); | 1886 return SkNEW_ARGS(SkFontMgr_DirectWrite, (sysFontCollection.get(), localeNam e, localeNameLen)); |
| 1866 } | 1887 } |
| 1888 | |
| OLD | NEW |