зеркало из https://github.com/mozilla/gecko-dev.git
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:
Родитель
b585bd3438
Коммит
6648f1fbf8
|
@ -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'
|
||||
|
|
Загрузка…
Ссылка в новой задаче