Bug 1341724 - Part 2: stylo: Add bindings for fetching font metrics from Gecko; r=heycam

MozReview-Commit-ID: BkPNq22ruwU
This commit is contained in:
Manish Goregaokar 2017-04-07 15:49:44 -07:00
Родитель 0f5f58cb55
Коммит 308b6ea838
4 изменённых файлов: 65 добавлений и 8 удалений

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

@ -132,7 +132,6 @@ using namespace mozilla::system;
#include "mozilla/ServoBindings.h"
#include "mozilla/StaticPresData.h"
#include "mozilla/dom/WebIDLGlobalNameHash.h"
#include "mozilla/URLExtraData.h"
using namespace mozilla;
using namespace mozilla::net;
@ -313,8 +312,7 @@ nsLayoutStatics::Initialize()
mozilla::dom::WebCryptoThreadPool::Initialize();
#ifdef MOZ_STYLO
URLExtraData::InitDummy();
Servo_Initialize(URLExtraData::Dummy());
InitializeServo();
#endif
#ifndef MOZ_WIDGET_ANDROID
@ -332,7 +330,7 @@ nsLayoutStatics::Shutdown()
// memory reporter manager.
#ifdef MOZ_STYLO
Servo_Shutdown();
ShutdownServo();
URLExtraData::ReleaseDummy();
#endif

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

@ -27,6 +27,7 @@
#include "nsIPresShell.h"
#include "nsIPresShellInlines.h"
#include "nsIPrincipal.h"
#include "nsFontMetrics.h"
#include "nsMappedAttributes.h"
#include "nsMediaFeatures.h"
#include "nsNameSpaceManager.h"
@ -41,6 +42,7 @@
#include "mozilla/EffectSet.h"
#include "mozilla/EventStates.h"
#include "mozilla/Keyframe.h"
#include "mozilla/Mutex.h"
#include "mozilla/ServoElementSnapshot.h"
#include "mozilla/ServoRestyleManager.h"
#include "mozilla/StyleAnimationValue.h"
@ -51,6 +53,7 @@
#include "mozilla/dom/HTMLTableCellElement.h"
#include "mozilla/dom/HTMLBodyElement.h"
#include "mozilla/LookAndFeel.h"
#include "mozilla/URLExtraData.h"
using namespace mozilla;
using namespace mozilla::dom;
@ -1609,6 +1612,48 @@ Gecko_GetBaseSize(nsIAtom* aLanguage)
return sizes;
}
static Mutex* sServoFontMetricsLock = nullptr;
void
InitializeServo()
{
URLExtraData::InitDummy();
Servo_Initialize(URLExtraData::Dummy());
sServoFontMetricsLock = new Mutex("Gecko_GetFontMetrics");
}
void
ShutdownServo()
{
delete sServoFontMetricsLock;
Servo_Shutdown();
}
GeckoFontMetrics
Gecko_GetFontMetrics(RawGeckoPresContextBorrowed aPresContext,
bool aIsVertical,
const nsStyleFont* aFont,
nscoord aFontSize,
bool aUseUserFontSet)
{
MutexAutoLock lock(*sServoFontMetricsLock);
aPresContext->SetUsesExChUnits(true);
GeckoFontMetrics ret;
// Safe because we are locked, and this function is only
// ever called from Servo parallel traversal
MOZ_ASSERT(ServoStyleSet::IsInServoTraversal());
nsPresContext* presContext = const_cast<nsPresContext*>(aPresContext);
RefPtr<nsFontMetrics> fm = nsRuleNode::GetMetricsFor(presContext, aIsVertical,
aFont, aFontSize,
aUseUserFontSet);
ret.mXSize = fm->XHeight();
gfxFloat zeroWidth = fm->GetThebesFontGroup()->GetFirstValidFont()->
GetMetrics(fm->Orientation()).zeroOrAveCharWidth;
ret.mChSize = ceil(aPresContext->AppUnitsPerDevPixel() * zeroWidth);
return ret;
}
void
Gecko_LoadStyleSheet(css::Loader* aLoader,
ServoStyleSheet* aParent,

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

@ -399,6 +399,20 @@ void Gecko_nsStyleFont_SetLang(nsStyleFont* font, nsIAtom* atom);
void Gecko_nsStyleFont_CopyLangFrom(nsStyleFont* aFont, const nsStyleFont* aSource);
FontSizePrefs Gecko_GetBaseSize(nsIAtom* lang);
struct GeckoFontMetrics
{
nscoord mChSize;
nscoord mXSize;
};
GeckoFontMetrics Gecko_GetFontMetrics(RawGeckoPresContextBorrowed pres_context,
bool is_vertical,
const nsStyleFont* font,
nscoord font_size,
bool use_user_font_set);
void InitializeServo();
void ShutdownServo();
const nsMediaFeature* Gecko_GetMediaFeatures();
// Font face rule

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

@ -614,16 +614,16 @@ static nscoord CalcLengthWith(const nsCSSValue& aValue,
case eCSSUnit_XHeight: {
aPresContext->SetUsesExChUnits(true);
RefPtr<nsFontMetrics> fm =
GetMetricsFor(aPresContext, aStyleContext, styleFont,
aFontSize, aUseUserFontSet);
nsRuleNode::GetMetricsFor(aPresContext, aStyleContext, styleFont,
aFontSize, aUseUserFontSet);
aConditions.SetUncacheable();
return ScaleCoordRound(aValue, float(fm->XHeight()));
}
case eCSSUnit_Char: {
aPresContext->SetUsesExChUnits(true);
RefPtr<nsFontMetrics> fm =
GetMetricsFor(aPresContext, aStyleContext, styleFont,
aFontSize, aUseUserFontSet);
nsRuleNode::GetMetricsFor(aPresContext, aStyleContext, styleFont,
aFontSize, aUseUserFontSet);
gfxFloat zeroWidth =
fm->GetThebesFontGroup()->GetFirstValidFont()->
GetMetrics(fm->Orientation()).zeroOrAveCharWidth;