| Index: src/ports/SkFontHost_win_dw.cpp
|
| diff --git a/src/ports/SkFontHost_win_dw.cpp b/src/ports/SkFontHost_win_dw.cpp
|
| index 3772a092d3af5e97d8ca3c8a457d366c4b469461..96bad37022448b7d9adf0a1fa7bafde9baf14c26 100644
|
| --- a/src/ports/SkFontHost_win_dw.cpp
|
| +++ b/src/ports/SkFontHost_win_dw.cpp
|
| @@ -494,12 +494,13 @@ protected:
|
| virtual void onGetFontDescriptor(SkFontDescriptor*, bool*) const SK_OVERRIDE;
|
| virtual int onCountGlyphs() const SK_OVERRIDE;
|
| virtual int onGetUPEM() const SK_OVERRIDE;
|
| + virtual SkTypeface* onRefMatchingStyle(Style) const SK_OVERRIDE;
|
| };
|
|
|
| -class SkScalerContext_Windows : public SkScalerContext {
|
| +class SkScalerContext_DW : public SkScalerContext {
|
| public:
|
| - SkScalerContext_Windows(DWriteFontTypeface*, const SkDescriptor* desc);
|
| - virtual ~SkScalerContext_Windows();
|
| + SkScalerContext_DW(DWriteFontTypeface*, const SkDescriptor* desc);
|
| + virtual ~SkScalerContext_DW();
|
|
|
| protected:
|
| virtual unsigned generateGlyphCount() SK_OVERRIDE;
|
| @@ -723,7 +724,7 @@ static DWriteFontTypeface* GetDWriteFontByID(SkFontID fontID) {
|
| return static_cast<DWriteFontTypeface*>(SkTypefaceCache::FindByID(fontID));
|
| }
|
|
|
| -SkScalerContext_Windows::SkScalerContext_Windows(DWriteFontTypeface* typeface,
|
| +SkScalerContext_DW::SkScalerContext_DW(DWriteFontTypeface* typeface,
|
| const SkDescriptor* desc)
|
| : SkScalerContext(typeface, desc)
|
| , fTypeface(SkRef(typeface))
|
| @@ -740,23 +741,23 @@ SkScalerContext_Windows::SkScalerContext_Windows(DWriteFontTypeface* typeface,
|
| fOffscreen.init(fTypeface->fDWriteFontFace.get(), fXform, SkScalarToFloat(fRec.fTextSize));
|
| }
|
|
|
| -SkScalerContext_Windows::~SkScalerContext_Windows() {
|
| +SkScalerContext_DW::~SkScalerContext_DW() {
|
| }
|
|
|
| -unsigned SkScalerContext_Windows::generateGlyphCount() {
|
| +unsigned SkScalerContext_DW::generateGlyphCount() {
|
| if (fGlyphCount < 0) {
|
| fGlyphCount = fTypeface->fDWriteFontFace->GetGlyphCount();
|
| }
|
| return fGlyphCount;
|
| }
|
|
|
| -uint16_t SkScalerContext_Windows::generateCharToGlyph(SkUnichar uni) {
|
| +uint16_t SkScalerContext_DW::generateCharToGlyph(SkUnichar uni) {
|
| uint16_t index = 0;
|
| fTypeface->fDWriteFontFace->GetGlyphIndices(reinterpret_cast<UINT32*>(&uni), 1, &index);
|
| return index;
|
| }
|
|
|
| -void SkScalerContext_Windows::generateAdvance(SkGlyph* glyph) {
|
| +void SkScalerContext_DW::generateAdvance(SkGlyph* glyph) {
|
| //Delta is the difference between the right/left side bearing metric
|
| //and where the right/left side bearing ends up after hinting.
|
| //DirectWrite does not provide this information.
|
| @@ -791,7 +792,7 @@ void SkScalerContext_Windows::generateAdvance(SkGlyph* glyph) {
|
| glyph->fAdvanceY = SkScalarToFixed(vecs[0].fY);
|
| }
|
|
|
| -void SkScalerContext_Windows::generateMetrics(SkGlyph* glyph) {
|
| +void SkScalerContext_DW::generateMetrics(SkGlyph* glyph) {
|
| glyph->fWidth = 0;
|
|
|
| this->generateAdvance(glyph);
|
| @@ -853,7 +854,7 @@ void SkScalerContext_Windows::generateMetrics(SkGlyph* glyph) {
|
| glyph->fTop = SkToS16(bbox.top);
|
| }
|
|
|
| -void SkScalerContext_Windows::generateFontMetrics(SkPaint::FontMetrics* mx,
|
| +void SkScalerContext_DW::generateFontMetrics(SkPaint::FontMetrics* mx,
|
| SkPaint::FontMetrics* my) {
|
| if (!(mx || my))
|
| return;
|
| @@ -987,7 +988,7 @@ static void rgb_to_lcd32(const uint8_t* SK_RESTRICT src, const SkGlyph& glyph,
|
| }
|
| }
|
|
|
| -void SkScalerContext_Windows::generateImage(const SkGlyph& glyph) {
|
| +void SkScalerContext_DW::generateImage(const SkGlyph& glyph) {
|
| SkAutoMutexAcquire ac(gFTMutex);
|
|
|
| const bool isBW = SkMask::kBW_Format == fRec.fMaskFormat;
|
| @@ -1026,7 +1027,7 @@ void SkScalerContext_Windows::generateImage(const SkGlyph& glyph) {
|
| }
|
| }
|
|
|
| -void SkScalerContext_Windows::generatePath(const SkGlyph& glyph, SkPath* path) {
|
| +void SkScalerContext_DW::generatePath(const SkGlyph& glyph, SkPath* path) {
|
| SkAutoMutexAcquire ac(gFTMutex);
|
|
|
| SkASSERT(&glyph && path);
|
| @@ -1162,10 +1163,6 @@ static SkTypeface* create_from_stream(SkStream* stream, int ttcIndex) {
|
| return NULL;
|
| }
|
|
|
| -SkTypeface* SkFontHost::CreateTypefaceFromStream(SkStream* stream) {
|
| - return create_from_stream(stream, 0);
|
| -}
|
| -
|
| SkStream* DWriteFontTypeface::onOpenStream(int* ttcIndex) const {
|
| *ttcIndex = fDWriteFontFace->GetIndex();
|
|
|
| @@ -1196,7 +1193,7 @@ SkStream* DWriteFontTypeface::onOpenStream(int* ttcIndex) const {
|
| }
|
|
|
| SkScalerContext* DWriteFontTypeface::onCreateScalerContext(const SkDescriptor* desc) const {
|
| - return SkNEW_ARGS(SkScalerContext_Windows, (const_cast<DWriteFontTypeface*>(this), desc));
|
| + return SkNEW_ARGS(SkScalerContext_DW, (const_cast<DWriteFontTypeface*>(this), desc));
|
| }
|
|
|
| static HRESULT get_by_family_name(const char familyName[], IDWriteFontFamily** fontFamily) {
|
| @@ -1220,55 +1217,6 @@ static HRESULT get_by_family_name(const char familyName[], IDWriteFontFamily** f
|
| return S_FALSE;
|
| }
|
|
|
| -/** Return the closest matching typeface given either an existing family
|
| - (specified by a typeface in that family) or by a familyName, and a
|
| - requested style.
|
| - 1) If familyFace is null, use familyName.
|
| - 2) If familyName is null, use familyFace.
|
| - 3) If both are null, return the default font that best matches style
|
| - This MUST not return NULL.
|
| - */
|
| -SkTypeface* SkFontHost::CreateTypeface(const SkTypeface* familyFace,
|
| - const char familyName[],
|
| - SkTypeface::Style style) {
|
| - HRESULT hr;
|
| - SkTScopedComPtr<IDWriteFontFamily> fontFamily;
|
| - if (familyFace) {
|
| - const DWriteFontTypeface* face = static_cast<const DWriteFontTypeface*>(familyFace);
|
| - *(&fontFamily) = SkRefComPtr(face->fDWriteFontFamily.get());
|
| -
|
| - } else if (familyName) {
|
| - hr = get_by_family_name(familyName, &fontFamily);
|
| - }
|
| -
|
| - if (NULL == fontFamily.get()) {
|
| - //No good family found, go with default.
|
| - SkTScopedComPtr<IDWriteFont> font;
|
| - hr = get_default_font(&font);
|
| - hr = font->GetFontFamily(&fontFamily);
|
| - }
|
| -
|
| - SkTScopedComPtr<IDWriteFont> font;
|
| - DWRITE_FONT_WEIGHT weight = (style & SkTypeface::kBold)
|
| - ? DWRITE_FONT_WEIGHT_BOLD
|
| - : DWRITE_FONT_WEIGHT_NORMAL;
|
| - DWRITE_FONT_STRETCH stretch = DWRITE_FONT_STRETCH_UNDEFINED;
|
| - DWRITE_FONT_STYLE italic = (style & SkTypeface::kItalic)
|
| - ? DWRITE_FONT_STYLE_ITALIC
|
| - : DWRITE_FONT_STYLE_NORMAL;
|
| - hr = fontFamily->GetFirstMatchingFont(weight, stretch, italic, &font);
|
| -
|
| - SkTScopedComPtr<IDWriteFontFace> fontFace;
|
| - hr = font->CreateFontFace(&fontFace);
|
| -
|
| - return SkCreateTypefaceFromDWriteFont(fontFace.get(), font.get(), fontFamily.get());
|
| -}
|
| -
|
| -SkTypeface* SkFontHost::CreateTypefaceFromFile(const char path[]) {
|
| - printf("SkFontHost::CreateTypefaceFromFile unimplemented");
|
| - return NULL;
|
| -}
|
| -
|
| void DWriteFontTypeface::onFilterRec(SkScalerContext::Rec* rec) const {
|
| if (rec->fFlags & SkScalerContext::kLCD_BGROrder_Flag ||
|
| rec->fFlags & SkScalerContext::kLCD_Vertical_Flag)
|
| @@ -1564,6 +1512,46 @@ SkAdvancedTypefaceMetrics* DWriteFontTypeface::onGetAdvancedTypefaceMetrics(
|
| return info;
|
| }
|
|
|
| +static SkTypeface* create_typeface(const SkTypeface* familyFace,
|
| + const char familyName[],
|
| + unsigned style) {
|
| + HRESULT hr;
|
| + SkTScopedComPtr<IDWriteFontFamily> fontFamily;
|
| + if (familyFace) {
|
| + const DWriteFontTypeface* face = static_cast<const DWriteFontTypeface*>(familyFace);
|
| + *(&fontFamily) = SkRefComPtr(face->fDWriteFontFamily.get());
|
| +
|
| + } else if (familyName) {
|
| + hr = get_by_family_name(familyName, &fontFamily);
|
| + }
|
| +
|
| + if (NULL == fontFamily.get()) {
|
| + //No good family found, go with default.
|
| + SkTScopedComPtr<IDWriteFont> font;
|
| + hr = get_default_font(&font);
|
| + hr = font->GetFontFamily(&fontFamily);
|
| + }
|
| +
|
| + SkTScopedComPtr<IDWriteFont> font;
|
| + DWRITE_FONT_WEIGHT weight = (style & SkTypeface::kBold)
|
| + ? DWRITE_FONT_WEIGHT_BOLD
|
| + : DWRITE_FONT_WEIGHT_NORMAL;
|
| + DWRITE_FONT_STRETCH stretch = DWRITE_FONT_STRETCH_UNDEFINED;
|
| + DWRITE_FONT_STYLE italic = (style & SkTypeface::kItalic)
|
| + ? DWRITE_FONT_STYLE_ITALIC
|
| + : DWRITE_FONT_STYLE_NORMAL;
|
| + hr = fontFamily->GetFirstMatchingFont(weight, stretch, italic, &font);
|
| +
|
| + SkTScopedComPtr<IDWriteFontFace> fontFace;
|
| + hr = font->CreateFontFace(&fontFace);
|
| +
|
| + return SkCreateTypefaceFromDWriteFont(fontFace.get(), font.get(), fontFamily.get());
|
| +}
|
| +
|
| +SkTypeface* DWriteFontTypeface::onRefMatchingStyle(Style style) const {
|
| + return create_typeface(this, NULL, style);
|
| +}
|
| +
|
| ///////////////////////////////////////////////////////////////////////////////
|
|
|
| #include "SkFontMgr.h"
|
| @@ -1720,6 +1708,11 @@ protected:
|
| SkAutoTUnref<SkStream> stream(SkStream::NewFromFile(path));
|
| return this->createFromStream(stream, ttcIndex);
|
| }
|
| +
|
| + virtual SkTypeface* onLegacyCreateTypeface(const char familyName[],
|
| + unsigned styleBits) SK_OVERRIDE {
|
| + return create_typeface(NULL, familyName, styleBits);
|
| + }
|
| };
|
|
|
| void SkFontStyleSet_DirectWrite::getStyle(int index, SkFontStyle* fs, SkString* styleName) {
|
| @@ -1750,6 +1743,27 @@ void SkFontStyleSet_DirectWrite::getStyle(int index, SkFontStyle* fs, SkString*
|
| }
|
| }
|
|
|
| +///////////////////////////////////////////////////////////////////////////////
|
| +
|
| +#ifndef SK_FONTHOST_USES_FONTMGR
|
| +
|
| +SkTypeface* SkFontHost::CreateTypeface(const SkTypeface* familyFace,
|
| + const char familyName[],
|
| + SkTypeface::Style style) {
|
| + return create_typeface(familyFace, familyName, style);
|
| +}
|
| +
|
| +SkTypeface* SkFontHost::CreateTypefaceFromFile(const char path[]) {
|
| + printf("SkFontHost::CreateTypefaceFromFile unimplemented");
|
| + return NULL;
|
| +}
|
| +
|
| +SkTypeface* SkFontHost::CreateTypefaceFromStream(SkStream* stream) {
|
| + return create_from_stream(stream, 0);
|
| +}
|
| +
|
| +#endif
|
| +
|
| SkFontMgr* SkFontMgr::Factory() {
|
| IDWriteFactory* factory;
|
| HRNM(get_dwrite_factory(&factory), "Could not get factory.");
|
|
|