Bug 1364628 - give each webrender blob image renderer thread its own thread-local FT_Library to work around unsafe FT_Face rasterization/metrics calls. r=jrmuizel

MozReview-Commit-ID: 5sJznRRV3bq
This commit is contained in:
Lee Salzman 2017-05-17 21:56:58 -04:00
Родитель b585bd3438
Коммит 6648f1fbf8
10 изменённых файлов: 51 добавлений и 14 удалений

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

@ -1499,10 +1499,11 @@ public:
* @param aData Pointer to the data
* @param aSize Size of the TrueType data
* @param aType Type of NativeFontResource that should be created.
* @param aFontContext Optional native font context to be used to create the NativeFontResource.
* @return a NativeFontResource of nullptr if failed.
*/
static already_AddRefed<NativeFontResource>
CreateNativeFontResource(uint8_t *aData, uint32_t aSize, FontType aType);
CreateNativeFontResource(uint8_t *aData, uint32_t aSize, FontType aType, void* aFontContext = nullptr);
/**
* This creates an unscaled font of the given type based on font descriptor

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

@ -546,7 +546,7 @@ Factory::CreateScaledFontForNativeFont(const NativeFont &aNativeFont,
}
already_AddRefed<NativeFontResource>
Factory::CreateNativeFontResource(uint8_t *aData, uint32_t aSize, FontType aType)
Factory::CreateNativeFontResource(uint8_t *aData, uint32_t aSize, FontType aType, void* aFontContext)
{
switch (aType) {
#ifdef WIN32
@ -571,7 +571,8 @@ Factory::CreateNativeFontResource(uint8_t *aData, uint32_t aSize, FontType aType
#elif defined(XP_DARWIN)
return NativeFontResourceMac::Create(aData, aSize);
#elif defined(MOZ_WIDGET_GTK)
return NativeFontResourceFontconfig::Create(aData, aSize);
return NativeFontResourceFontconfig::Create(aData, aSize,
static_cast<FT_Library>(aFontContext));
#else
gfxWarning() << "Unable to create cairo scaled font from truetype data";
return nullptr;

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

@ -17,10 +17,10 @@ using namespace mozilla::gfx;
namespace mozilla {
namespace gfx {
InlineTranslator::InlineTranslator(DrawTarget* aDT, Matrix aMatrix)
InlineTranslator::InlineTranslator(DrawTarget* aDT, void* aFontContext)
: mBaseDT(aDT)
, mFontContext(aFontContext)
{
mBaseDT = aDT;
mBaseTransform = aMatrix;
}
bool

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

@ -30,7 +30,7 @@ using gfx::NativeFontResource;
class InlineTranslator final : public Translator
{
public:
explicit InlineTranslator(DrawTarget* aDT, Matrix aMatrix);
explicit InlineTranslator(DrawTarget* aDT, void* aFontContext = nullptr);
bool TranslateRecording(std::istream& aRecording);
@ -175,9 +175,11 @@ public:
mozilla::gfx::FontType GetDesiredFontType() final;
void* GetFontContext() final { return mFontContext; }
private:
RefPtr<DrawTarget> mBaseDT;
Matrix mBaseTransform;
void* mFontContext;
nsRefPtrHashtable<nsPtrHashKey<void>, DrawTarget> mDrawTargets;
nsRefPtrHashtable<nsPtrHashKey<void>, Path> mPaths;

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

@ -27,7 +27,7 @@ NativeFontResourceFontconfig::~NativeFontResourceFontconfig()
}
already_AddRefed<NativeFontResourceFontconfig>
NativeFontResourceFontconfig::Create(uint8_t *aFontData, uint32_t aDataLength)
NativeFontResourceFontconfig::Create(uint8_t *aFontData, uint32_t aDataLength, FT_Library aFTLibrary)
{
if (!aFontData || !aDataLength) {
return nullptr;
@ -35,7 +35,7 @@ NativeFontResourceFontconfig::Create(uint8_t *aFontData, uint32_t aDataLength)
UniquePtr<uint8_t[]> fontData(new uint8_t[aDataLength]);
memcpy(fontData.get(), aFontData, aDataLength);
FT_Face face = Factory::NewFTFaceFromData(nullptr, fontData.get(), aDataLength, 0);
FT_Face face = Factory::NewFTFaceFromData(aFTLibrary, fontData.get(), aDataLength, 0);
if (!face) {
return nullptr;
}

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

@ -21,7 +21,7 @@ public:
MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(NativeFontResourceFontconfig)
static already_AddRefed<NativeFontResourceFontconfig>
Create(uint8_t *aFontData, uint32_t aDataLength);
Create(uint8_t *aFontData, uint32_t aDataLength, FT_Library aFTLibrary = nullptr);
already_AddRefed<UnscaledFont>
CreateUnscaledFont(uint32_t aIndex,

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

@ -1535,7 +1535,8 @@ RecordedFontData::PlayEvent(Translator *aTranslator) const
{
RefPtr<NativeFontResource> fontResource =
Factory::CreateNativeFontResource(mData, mFontDetails.size,
aTranslator->GetDesiredFontType());
aTranslator->GetDesiredFontType(),
aTranslator->GetFontContext());
if (!fontResource) {
return false;
}

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

@ -112,6 +112,7 @@ public:
SurfaceFormat aFormat);
virtual DrawTarget *GetReferenceDrawTarget() = 0;
virtual FontType GetDesiredFontType() = 0;
virtual void* GetFontContext() { return nullptr; }
};
struct ColorPatternStorage

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

@ -13,6 +13,13 @@
#include <iostream>
#ifdef MOZ_ENABLE_FREETYPE
#include "ft2build.h"
#include FT_FREETYPE_H
#include "mozilla/ThreadLocal.h"
#endif
namespace mozilla {
namespace wr {
@ -29,6 +36,10 @@ public:
}
};
#ifdef MOZ_ENABLE_FREETYPE
static MOZ_THREAD_LOCAL(FT_Library) sFTLibrary;
#endif
static bool Moz2DRenderCallback(const Range<const uint8_t> aBlob,
gfx::IntSize aSize,
gfx::SurfaceFormat aFormat,
@ -45,6 +56,19 @@ static bool Moz2DRenderCallback(const Range<const uint8_t> aBlob,
return false;
}
#ifdef MOZ_ENABLE_FREETYPE
if (!sFTLibrary.init()) {
return false;
}
if (!sFTLibrary.get()) {
FT_Library library;
if (FT_Init_FreeType(&library) != FT_Err_Ok) {
return false;
}
sFTLibrary.set(library);
}
#endif
// In bindings.rs we allocate a buffer filled with opaque white.
bool uninitialized = false;
@ -64,8 +88,11 @@ static bool Moz2DRenderCallback(const Range<const uint8_t> aBlob,
InMemoryStreamBuffer streamBuffer(aBlob);
std::istream stream(&streamBuffer);
gfx::Matrix baseTransform;
gfx::InlineTranslator translator(dt, baseTransform);
#ifdef MOZ_ENABLE_FREETYPE
gfx::InlineTranslator translator(dt, sFTLibrary.get());
#else
gfx::InlineTranslator translator(dt);
#endif
auto ret = translator.TranslateRecording(stream);

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

@ -37,6 +37,10 @@ if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'cocoa':
'RenderMacIOSurfaceTextureHostOGL.cpp',
]
if CONFIG['MOZ_WIDGET_TOOLKIT'] in ('android', 'gtk2', 'gtk3'):
DEFINES['MOZ_ENABLE_FREETYPE'] = True
CXXFLAGS += CONFIG['CAIRO_FT_CFLAGS']
include('/ipc/chromium/chromium-config.mozbuild')
FINAL_LIBRARY = 'xul'