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:
Lee Salzman 2017-09-19 23:08:16 -04:00
Родитель 4467a6148b
Коммит 5161c570ac
1 изменённых файлов: 41 добавлений и 40 удалений

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

@ -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;
}