зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1397458 - part 2 - refactor ScaledFontMac font variation collection for easier reuse r=kats
MozReview-Commit-ID: C2L8tZe4jEa --HG-- extra : rebase_source : 3b86bd91828cef581a25af65a0d056c5a352f2a2
This commit is contained in:
Родитель
4467a6148b
Коммит
5161c570ac
|
@ -235,24 +235,6 @@ struct writeBuf
|
|||
int offset;
|
||||
};
|
||||
|
||||
static void CollectVariationSetting(const void *key, const void *value, void *context)
|
||||
{
|
||||
auto keyPtr = static_cast<const CFTypeRef>(key);
|
||||
auto valuePtr = static_cast<const CFTypeRef>(value);
|
||||
auto vpp = static_cast<FontVariation**>(context);
|
||||
if (CFGetTypeID(keyPtr) == CFNumberGetTypeID() &&
|
||||
CFGetTypeID(valuePtr) == CFNumberGetTypeID()) {
|
||||
uint64_t t;
|
||||
double v;
|
||||
if (CFNumberGetValue(static_cast<CFNumberRef>(keyPtr), kCFNumberSInt64Type, &t) &&
|
||||
CFNumberGetValue(static_cast<CFNumberRef>(valuePtr), kCFNumberDoubleType, &v)) {
|
||||
(*vpp)->mTag = t;
|
||||
(*vpp)->mValue = v;
|
||||
(*vpp)++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool
|
||||
UnscaledFontMac::GetFontFileData(FontFileDataOutput aDataCallback, void *aBaton)
|
||||
{
|
||||
|
@ -327,33 +309,52 @@ UnscaledFontMac::GetFontFileData(FontFileDataOutput aDataCallback, void *aBaton)
|
|||
return true;
|
||||
}
|
||||
|
||||
static void
|
||||
CollectVariationsFromDictionary(const void* aKey, const void* aValue, void* aContext)
|
||||
{
|
||||
auto keyPtr = static_cast<const CFTypeRef>(aKey);
|
||||
auto valuePtr = static_cast<const CFTypeRef>(aValue);
|
||||
auto outVariations = static_cast<std::vector<FontVariation>*>(aContext);
|
||||
if (CFGetTypeID(keyPtr) == CFNumberGetTypeID() &&
|
||||
CFGetTypeID(valuePtr) == CFNumberGetTypeID()) {
|
||||
uint64_t t;
|
||||
double v;
|
||||
if (CFNumberGetValue(static_cast<CFNumberRef>(keyPtr), kCFNumberSInt64Type, &t) &&
|
||||
CFNumberGetValue(static_cast<CFNumberRef>(valuePtr), kCFNumberDoubleType, &v)) {
|
||||
outVariations->push_back(FontVariation{uint32_t(t), float(v)});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static bool
|
||||
GetVariationsForCTFont(CTFontRef aCTFont, std::vector<FontVariation>* aOutVariations)
|
||||
{
|
||||
// Avoid calling potentially buggy variation APIs on pre-Sierra macOS
|
||||
// versions (see bug 1331683)
|
||||
if (!nsCocoaFeatures::OnSierraOrLater()) {
|
||||
return true;
|
||||
}
|
||||
if (!aCTFont) {
|
||||
return true;
|
||||
}
|
||||
AutoRelease<CFDictionaryRef> dict(CTFontCopyVariation(aCTFont));
|
||||
CFIndex count = dict ? CFDictionaryGetCount(dict) : 0;
|
||||
if (count > 0) {
|
||||
aOutVariations->reserve(count);
|
||||
CFDictionaryApplyFunction(dict, CollectVariationsFromDictionary, aOutVariations);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
ScaledFontMac::GetFontInstanceData(FontInstanceDataOutput aCb, void* aBaton)
|
||||
{
|
||||
// Collect any variation settings that were incorporated into the CTFont.
|
||||
uint32_t variationCount = 0;
|
||||
FontVariation* variations = nullptr;
|
||||
// Avoid calling potentially buggy variation APIs on pre-Sierra macOS
|
||||
// versions (see bug 1331683)
|
||||
if (nsCocoaFeatures::OnSierraOrLater()) {
|
||||
if (mCTFont) {
|
||||
CFDictionaryRef dict = CTFontCopyVariation(mCTFont);
|
||||
if (dict) {
|
||||
CFIndex count = CFDictionaryGetCount(dict);
|
||||
if (count > 0) {
|
||||
variations = new FontVariation[count];
|
||||
FontVariation* vPtr = variations;
|
||||
CFDictionaryApplyFunction(dict, CollectVariationSetting, &vPtr);
|
||||
variationCount = vPtr - variations;
|
||||
}
|
||||
CFRelease(dict);
|
||||
}
|
||||
}
|
||||
std::vector<FontVariation> variations;
|
||||
if (!GetVariationsForCTFont(mCTFont, &variations)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
aCb(nullptr, 0, variations, variationCount, aBaton);
|
||||
delete[] variations;
|
||||
|
||||
aCb(nullptr, 0, variations.data(), variations.size(), aBaton);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче