Bug 1309917 - Stop defaulting to system wide default fonts if no IDWriteFont exists. r=jfkthame

This commit is contained in:
Mason Chang 2016-10-12 15:53:04 -07:00
Родитель 52e2c45728
Коммит b844183f9d
11 изменённых файлов: 74 добавлений и 146 удалений

Просмотреть файл

@ -45,11 +45,10 @@ struct ID3D11Texture2D;
struct ID3D11Device;
struct ID2D1Device;
struct IDWriteRenderingParams;
struct IDWriteFont;
struct IDWriteFontFamily;
struct IDWriteFontFace;
class GrContext;
struct gfxFontStyle;
struct CGContext;
typedef struct CGContext *CGContextRef;
@ -1496,9 +1495,8 @@ public:
static void D2DCleanup();
static already_AddRefed<ScaledFont>
CreateScaledFontForDWriteFont(IDWriteFont* aFont,
IDWriteFontFamily* aFontFamily,
IDWriteFontFace* aFontFace,
CreateScaledFontForDWriteFont(IDWriteFontFace* aFontFace,
const gfxFontStyle* aStyle,
Float aSize,
bool aUseEmbeddedBitmap,
bool aForceGDIMode);

Просмотреть файл

@ -705,15 +705,15 @@ Factory::D2DCleanup()
}
already_AddRefed<ScaledFont>
Factory::CreateScaledFontForDWriteFont(IDWriteFont* aFont,
IDWriteFontFamily* aFontFamily,
IDWriteFontFace* aFontFace,
Factory::CreateScaledFontForDWriteFont(IDWriteFontFace* aFontFace,
const gfxFontStyle* aStyle,
float aSize,
bool aUseEmbeddedBitmap,
bool aForceGDIMode)
{
return MakeAndAddRef<ScaledFontDWrite>(aFont, aFontFamily, aFontFace,
aSize, aUseEmbeddedBitmap, aForceGDIMode);
return MakeAndAddRef<ScaledFontDWrite>(aFontFace, aSize,
aUseEmbeddedBitmap, aForceGDIMode,
aStyle);
}
#endif // XP_WIN

Просмотреть файл

@ -6,6 +6,7 @@
#include "DrawTargetD2D1.h"
#include "ScaledFontDWrite.h"
#include "PathD2D.h"
#include "gfxFont.h"
using namespace std;
@ -74,6 +75,47 @@ DoGrayscale(IDWriteFontFace *aDWFace, Float ppem)
return true;
}
static inline DWRITE_FONT_STRETCH
DWriteFontStretchFromStretch(int16_t aStretch)
{
switch (aStretch) {
case NS_FONT_STRETCH_ULTRA_CONDENSED:
return DWRITE_FONT_STRETCH_ULTRA_CONDENSED;
case NS_FONT_STRETCH_EXTRA_CONDENSED:
return DWRITE_FONT_STRETCH_EXTRA_CONDENSED;
case NS_FONT_STRETCH_CONDENSED:
return DWRITE_FONT_STRETCH_CONDENSED;
case NS_FONT_STRETCH_SEMI_CONDENSED:
return DWRITE_FONT_STRETCH_SEMI_CONDENSED;
case NS_FONT_STRETCH_NORMAL:
return DWRITE_FONT_STRETCH_NORMAL;
case NS_FONT_STRETCH_SEMI_EXPANDED:
return DWRITE_FONT_STRETCH_SEMI_EXPANDED;
case NS_FONT_STRETCH_EXPANDED:
return DWRITE_FONT_STRETCH_EXPANDED;
case NS_FONT_STRETCH_EXTRA_EXPANDED:
return DWRITE_FONT_STRETCH_EXTRA_EXPANDED;
case NS_FONT_STRETCH_ULTRA_EXPANDED:
return DWRITE_FONT_STRETCH_ULTRA_EXPANDED;
default:
return DWRITE_FONT_STRETCH_UNDEFINED;
}
}
ScaledFontDWrite::ScaledFontDWrite(IDWriteFontFace *aFontFace, Float aSize,
bool aUseEmbeddedBitmap, bool aForceGDIMode,
const gfxFontStyle* aStyle)
: ScaledFontBase(aSize)
, mFontFace(aFontFace)
, mUseEmbeddedBitmap(aUseEmbeddedBitmap)
, mForceGDIMode(aForceGDIMode)
{
mStyle = SkFontStyle(aStyle->weight,
DWriteFontStretchFromStretch(aStyle->stretch),
aStyle->style == NS_FONT_STYLE_NORMAL ?
SkFontStyle::kUpright_Slant : SkFontStyle::kItalic_Slant);
}
already_AddRefed<Path>
ScaledFontDWrite::GetPathForGlyphs(const GlyphBuffer &aBuffer, const DrawTarget *aTarget)
{
@ -93,67 +135,6 @@ ScaledFontDWrite::GetPathForGlyphs(const GlyphBuffer &aBuffer, const DrawTarget
#ifdef USE_SKIA
bool
ScaledFontDWrite::DefaultToArialFont(IDWriteFontCollection* aSystemFonts)
{
// If we can't find the same font face as we're given, fallback to arial
static const WCHAR fontFamilyName[] = L"Arial";
UINT32 fontIndex;
BOOL exists;
HRESULT hr = aSystemFonts->FindFamilyName(fontFamilyName, &fontIndex, &exists);
if (FAILED(hr)) {
gfxCriticalNote << "Failed to get backup arial font font from system fonts. Code: " << hexa(hr);
return false;
}
hr = aSystemFonts->GetFontFamily(fontIndex, getter_AddRefs(mFontFamily));
if (FAILED(hr)) {
gfxCriticalNote << "Failed to get font family for arial. Code: " << hexa(hr);
return false;
}
hr = mFontFamily->GetFirstMatchingFont(DWRITE_FONT_WEIGHT_NORMAL,
DWRITE_FONT_STRETCH_NORMAL,
DWRITE_FONT_STYLE_NORMAL,
getter_AddRefs(mFont));
if (FAILED(hr)) {
gfxCriticalNote << "Failed to get a matching font for arial. Code: " << hexa(hr);
return false;
}
return true;
}
// This can happen if we have mixed backends which create DWrite
// fonts in a mixed environment. e.g. a cairo content backend
// but Skia canvas backend.
bool
ScaledFontDWrite::GetFontDataFromSystemFonts(IDWriteFactory* aFactory)
{
MOZ_ASSERT(mFontFace);
RefPtr<IDWriteFontCollection> systemFonts;
HRESULT hr = aFactory->GetSystemFontCollection(getter_AddRefs(systemFonts));
if (FAILED(hr)) {
gfxCriticalNote << "Failed to get system font collection from file data. Code: " << hexa(hr);
return false;
}
hr = systemFonts->GetFontFromFontFace(mFontFace, getter_AddRefs(mFont));
if (FAILED(hr)) {
gfxCriticalNote << "Failed to get system font from font face. Code: " << hexa(hr);
return DefaultToArialFont(systemFonts);
}
hr = mFont->GetFontFamily(getter_AddRefs(mFontFamily));
if (FAILED(hr)) {
gfxCriticalNote << "Failed to get font family from font face. Code: " << hexa(hr);
return DefaultToArialFont(systemFonts);
}
return true;
}
SkTypeface*
ScaledFontDWrite::GetSkTypeface()
{
@ -163,13 +144,7 @@ ScaledFontDWrite::GetSkTypeface()
return nullptr;
}
if (!mFont || !mFontFamily) {
if (!GetFontDataFromSystemFonts(factory)) {
return nullptr;
}
}
mTypeface = SkCreateTypefaceFromDWriteFont(factory, mFontFace, mFont, mFontFamily);
mTypeface = SkCreateTypefaceFromDWriteFont(factory, mFontFace, mStyle);
}
return mTypeface;
}

Просмотреть файл

@ -10,6 +10,7 @@
#include "ScaledFontBase.h"
struct ID2D1GeometrySink;
struct gfxFontStyle;
namespace mozilla {
namespace gfx {
@ -20,23 +21,13 @@ public:
MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(ScaledFontDwrite)
ScaledFontDWrite(IDWriteFontFace *aFont, Float aSize)
: ScaledFontBase(aSize)
, mFont(nullptr)
, mFontFamily(nullptr)
, mFontFace(aFont)
, mUseEmbeddedBitmap(false)
, mForceGDIMode(false)
{}
ScaledFontDWrite(IDWriteFont* aFont, IDWriteFontFamily* aFontFamily,
IDWriteFontFace *aFontFace, Float aSize, bool aUseEmbeddedBitmap,
bool aForceGDIMode)
: ScaledFontBase(aSize)
, mFont(aFont)
, mFontFamily(aFontFamily)
, mFontFace(aFontFace)
, mUseEmbeddedBitmap(aUseEmbeddedBitmap)
, mForceGDIMode(aForceGDIMode)
{}
ScaledFontDWrite(IDWriteFontFace *aFontFace, Float aSize, bool aUseEmbeddedBitmap,
bool aForceGDIMode, const gfxFontStyle* aStyle);
virtual FontType GetType() const { return FontType::DWRITE; }
@ -56,13 +47,9 @@ public:
#ifdef USE_SKIA
virtual SkTypeface* GetSkTypeface();
bool GetFontDataFromSystemFonts(IDWriteFactory* aFactory);
bool DefaultToArialFont(IDWriteFontCollection* aSystemFonts);
SkFontStyle mStyle;
#endif
// The font and font family are only used with Skia
RefPtr<IDWriteFont> mFont;
RefPtr<IDWriteFontFamily> mFontFamily;
RefPtr<IDWriteFontFace> mFontFace;
bool mUseEmbeddedBitmap;
bool mForceGDIMode;

Просмотреть файл

@ -50,8 +50,7 @@ struct IDWriteFontCollection;
*/
SK_API SkTypeface* SkCreateTypefaceFromDWriteFont(IDWriteFactory* aFactory,
IDWriteFontFace* aFontFace,
IDWriteFont* aFont,
IDWriteFontFamily* aFontFamily);
SkFontStyle aStyle);
SK_API SkFontMgr* SkFontMgr_New_GDI();
SK_API SkFontMgr* SkFontMgr_New_DirectWrite(IDWriteFactory* factory = NULL,

Просмотреть файл

@ -338,10 +338,9 @@ SkTypeface* SkCreateTypefaceFromLOGFONT(const LOGFONT& origLF) {
SkTypeface* SkCreateTypefaceFromDWriteFont(IDWriteFactory* aFactory,
IDWriteFontFace* aFontFace,
IDWriteFont* aFont,
IDWriteFontFamily* aFontFamily)
SkFontStyle aStyle)
{
return DWriteFontTypeface::Create(aFactory, aFontFace, aFont, aFontFamily);
return DWriteFontTypeface::Create(aFactory, aFontFace, aStyle);
}
/**

Просмотреть файл

@ -39,16 +39,16 @@ private:
DWriteFontTypeface(const SkFontStyle& style, SkFontID fontID,
IDWriteFactory* factory,
IDWriteFontFace* fontFace,
IDWriteFont* font,
IDWriteFontFamily* fontFamily,
IDWriteFont* font = nullptr,
IDWriteFontFamily* fontFamily = nullptr,
IDWriteFontFileLoader* fontFileLoader = nullptr,
IDWriteFontCollectionLoader* fontCollectionLoader = nullptr)
: SkTypeface(style, fontID, false)
, fFactory(SkRefComPtr(factory))
, fDWriteFontCollectionLoader(SkSafeRefComPtr(fontCollectionLoader))
, fDWriteFontFileLoader(SkSafeRefComPtr(fontFileLoader))
, fDWriteFontFamily(SkRefComPtr(fontFamily))
, fDWriteFont(SkRefComPtr(font))
, fDWriteFontFamily(SkSafeRefComPtr(fontFamily))
, fDWriteFont(SkSafeRefComPtr(font))
, fDWriteFontFace(SkRefComPtr(fontFace))
{
#if SK_HAS_DWRITE_1_H
@ -71,6 +71,15 @@ public:
SkTScopedComPtr<IDWriteFontFace1> fDWriteFontFace1;
#endif
static DWriteFontTypeface* Create(IDWriteFactory* factory,
IDWriteFontFace* fontFace,
SkFontStyle aStyle) {
SkFontID fontID = SkTypefaceCache::NewFontID();
return new DWriteFontTypeface(aStyle, fontID, factory, fontFace,
nullptr, nullptr,
nullptr, nullptr);
}
static DWriteFontTypeface* Create(IDWriteFactory* factory,
IDWriteFontFace* fontFace,
IDWriteFont* font,

Просмотреть файл

@ -349,24 +349,6 @@ gfxDWriteFontFamily::AddSizeOfIncludingThis(MallocSizeOf aMallocSizeOf,
AddSizeOfExcludingThis(aMallocSizeOf, aSizes);
}
already_AddRefed<IDWriteFont>
gfxDWriteFontFamily::GetDefaultFont()
{
RefPtr<IDWriteFont> font;
for (UINT32 i = 0; i < mDWFamily->GetFontCount(); i++) {
HRESULT hr = mDWFamily->GetFont(i, getter_AddRefs(font));
if (FAILED(hr)) {
NS_WARNING("Failed to get default font from existing family");
continue;
}
return font.forget();
}
NS_WARNING("No available DWrite fonts. Returning null");
return nullptr;
}
////////////////////////////////////////////////////////////////////////////////
// gfxDWriteFontEntry

Просмотреть файл

@ -58,7 +58,6 @@ public:
void AddSizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf,
FontListSizes* aSizes) const final;
already_AddRefed<IDWriteFont> GetDefaultFont();
protected:
/** This font family's directwrite fontfamily object */
RefPtr<IDWriteFontFamily> mDWFamily;
@ -167,10 +166,6 @@ public:
virtual void AddSizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf,
FontListSizes* aSizes) const;
IDWriteFont* GetFont() {
return mFont;
}
protected:
friend class gfxDWriteFont;
friend class gfxDWriteFontList;

Просмотреть файл

@ -103,21 +103,6 @@ gfxDWriteFont::gfxDWriteFont(gfxFontEntry *aFontEntry,
return;
}
mFont = fe->GetFont();
if (!mFont) {
gfxPlatformFontList* fontList = gfxPlatformFontList::PlatformFontList();
gfxDWriteFontFamily* defaultFontFamily =
static_cast<gfxDWriteFontFamily*>(fontList->GetDefaultFont(aFontStyle));
mFont = defaultFontFamily->GetDefaultFont();
MOZ_ASSERT(mFont);
}
HRESULT hr = mFont->GetFontFamily(getter_AddRefs(mFontFamily));
if (FAILED(hr)) {
MOZ_ASSERT(false);
}
ComputeMetrics(anAAOption);
}
@ -706,9 +691,10 @@ gfxDWriteFont::GetScaledFont(mozilla::gfx::DrawTarget *aTarget)
static_cast<gfxDWriteFontEntry*>(mFontEntry.get());
bool useEmbeddedBitmap = (fe->IsCJKFont() && HasBitmapStrikeForSize(NS_lround(mAdjustedSize)));
const gfxFontStyle* fontStyle = GetStyle();
mAzureScaledFont =
Factory::CreateScaledFontForDWriteFont(mFont, mFontFamily,
mFontFace, GetAdjustedSize(),
Factory::CreateScaledFontForDWriteFont(mFontFace, fontStyle,
GetAdjustedSize(),
useEmbeddedBitmap,
GetForceGDIClassic());
} else {

Просмотреть файл

@ -88,8 +88,6 @@ protected:
bool GetForceGDIClassic();
RefPtr<IDWriteFontFace> mFontFace;
RefPtr<IDWriteFont> mFont;
RefPtr<IDWriteFontFamily> mFontFamily;
cairo_font_face_t *mCairoFontFace;
Metrics *mMetrics;