зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1309917 - Stop defaulting to system wide default fonts if no IDWriteFont exists. r=jfkthame
This commit is contained in:
Родитель
52e2c45728
Коммит
b844183f9d
|
@ -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;
|
||||
|
|
Загрузка…
Ссылка в новой задаче